cesnavarra 2008-boletín 7

52
Título Temas de Julio Texto Como estamos en período post-sanferminero, las cosas que uno pensaba hacer “antes de” se convierten en las que hay que hacer porque nada funciona como debiera “después de”. Así que este mes este artículo tratará sobre un par de temas con lo que he tenido que lidiar tras las fiestas. Pobre de mí… Problemas con Hyper-V en Windows Server2008 de Mayo Recientemente hemos tenido que "padecer" unos problemas en nuestros servidores Windows 2008, así como en algunos equipos Windows Vista, causados por nuestro interés en experimentar. A finales de Mayo o principios de Junio de 2008, las versiones de evaluación de los distintos Sistemas Operativos de Microsoft dejaron de ser utilizables, y para que eso se notara reaccionaron de una manera un tanto extrema: comenzaron a generar crashes, nuestros queridos "pantallazos azules" cada cierto tiempo y de manera aleatoria. Esto obligaba a un reinicio de las máquinas con estas versiones de evaluación instaladas y si no disponemos de copia de lo que estábamos haciendo… ¡adiós, muy buenas! Lógicamente hay que admitir que al tratarse de versiones de evaluación esto es normal y ya sabíamos que podía pasar. Además, Microsoft por lo menos nos concede unos "períodos de gracia" durante los cuales nuestros servidores y equipos funcionan y que podemos emplear para extraer la información importante que tuviéramos en ellos. Una vez detectada la fuente de nuestros males, procedemos a instalar las versiones correctas (y completas) de los sistemas operativos, sin problemas. En ambos casos, y siempre que dispongamos de espacio en nuestro disco duro, el instalador creará una carpeta llamada “Windows.old” donde copiará el contenido de nuestra instalación anterior que tuviéramos en las carpetas “Archivos de programa”, “Usuarios” y “Windows”. Normalmente lo que más nos interesará es el contenido de la carpeta “Usuarios”, ya que en ella tendremos nuestros Documentos, Descargas, Imágenes, Música, etc. que podremos mover sin peligro a la carpeta que ha creado la nueva instalación y casi todo volverá a ser como antes (casi todo, porque deberemos reinstalar uno por uno los programas que utilicemos, entre otras tareas). Pero en nuestro caso existía una nueva “trampa”: la instalación de Windows Server 2008 se realizó con la versión de Mayo, la cual incluye el servicio Hyper-V versión 6.0.6001.18016 pero en nuestra anterior versión empleábamos la versión 6.0.6001.17101. Un ligero cambio de números… pero un cambio que impide a nuestras antiguas máquinas virtuales funcionar correctamente: al arrancar cualquiera de nuestras máquinas virtuales se lanzaba el asistente de hardware nuevo encontrado:

Upload: cein

Post on 03-Jul-2015

956 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Cesnavarra 2008-boletín 7

Tiacutetulo Temas de Julio

Texto Como estamos en periacuteodo post-sanferminero las cosas que uno pensaba hacer ldquoantes derdquo se convierten en las que hay que

hacer porque nada funciona como debiera ldquodespueacutes derdquo Asiacute que este mes este artiacuteculo trataraacute sobre un par de temas con lo que

he tenido que lidiar tras las fiestas Pobre de miacutehellip Problemas con Hyper-V en Windows Server2008 de Mayo Recientemente hemos tenido que padecer unos problemas en nuestros servidores Windows 2008 asiacute como en algunos

equipos Windows Vista causados por nuestro intereacutes en experimentar A finales de Mayo o principios de Junio de 2008 las versiones de evaluacioacuten de los distintos Sistemas

Operativos de Microsoft dejaron de ser utilizables y para que eso se notara reaccionaron de una manera un tanto extrema

comenzaron a generar crashes nuestros queridos pantallazos azules cada cierto tiempo y de manera aleatoria Esto obligaba a un reinicio de las maacutequinas con estas versiones

de evaluacioacuten instaladas y si no disponemos de copia de lo que estaacutebamos haciendohellip iexcladioacutes muy buenas Loacutegicamente hay

que admitir que al tratarse de versiones de evaluacioacuten esto es normal y ya sabiacuteamos que podiacutea pasar Ademaacutes Microsoft por lo menos nos concede unos periacuteodos de gracia durante los

cuales nuestros servidores y equipos funcionan y que podemos emplear para extraer la informacioacuten importante que tuvieacuteramos

en ellos Una vez detectada la fuente de nuestros males procedemos a instalar las versiones correctas (y completas) de los sistemas

operativos sin problemas En ambos casos y siempre que dispongamos de espacio en nuestro disco duro el instalador

crearaacute una carpeta llamada ldquoWindowsoldrdquo donde copiaraacute el contenido de nuestra instalacioacuten anterior que tuvieacuteramos en las carpetas ldquoArchivos de programardquo ldquoUsuariosrdquo y ldquoWindowsrdquo

Normalmente lo que maacutes nos interesaraacute es el contenido de la carpeta ldquoUsuariosrdquo ya que en ella tendremos nuestros

Documentos Descargas Imaacutegenes Muacutesica etc que podremos mover sin peligro a la carpeta que ha creado la nueva

instalacioacuten y casi todo volveraacute a ser como antes (casi todo porque deberemos reinstalar uno por uno los programas que utilicemos entre otras tareas) Pero en nuestro caso existiacutea una nueva ldquotrampardquo la instalacioacuten de Windows Server 2008 se realizoacute con la versioacuten de Mayo la

cual incluye el servicio Hyper-V versioacuten 60600118016 pero en nuestra anterior versioacuten empleaacutebamos la versioacuten 60600117101 Un ligero cambio de nuacutemeroshellip pero

un cambio que impide a nuestras antiguas maacutequinas virtuales funcionar correctamente al arrancar cualquiera de nuestras

maacutequinas virtuales se lanzaba el asistente de hardware nuevo encontrado

Y como el hardware virtual no estaacute configurado correctamente

el resultado es que la instalacioacuten es mala

Como resultaraacute habitual a aquellos que ya se hayan peleado

con las maacutequinas virtuales de Microsoft a continuacioacuten deberemos insertar el Integration Services Setup Disk mediante el menuacute Accioacuten Este lanzaraacute el ejecutable que

pretende llevar a cabo la instalacioacuten como se ve a continuacioacuten

Normalmente todo iraacute bien y se actualizaraacute correctamente

Para terminar reiniciamos y todo estaraacute listo a falta de unas comprobaciones de IP y dominio Pero si nuestro sistema

virtualizado dispone de alguna actualizacioacuten o versioacuten de los drivers de VM que no gusta a nuestro instalador nos devolveraacute un mensaje de error tan poco expliacutecito como Error Error

grave durante la instalacioacuten Y nada maacutes

Para solucionarlo en vez de ejecutar el programa ldquoSetupexerdquo

del ldquoIntegration Services Setup diskrdquo tendremos que lanzar un ejecutable del mismo disco pero un poco maacutes oculto se trata

del ldquoupdateexerdquo que reside en ldquosupportx86en-usupdaterdquo

En esta imagen se puede ver que tambieacuten he ejecutado el

Administrador de tareas de Windows pero soacutelo como soporte desde el que lanzar el ldquoexplorerexerdquo mediante su menuacute ldquoArchivordquo ya que los problemas con la instalacioacuten de los

Servicios de Integracioacuten para esta versioacuten de Hyper-V impiden

el uso del ratoacutenhellip algo bastante molesto la verdad Una vez lanzado este update tendremos que reiniciar nuestro servidor

virtual y todo habraacute vuelto a funcionar normalmente sobre todo nuestro ratoacuten y la tarjeta de red

Finalmente soacutelo tendremos que corregir nuestra asignacioacuten de

IPs a la maacutequina virtual si no utilizamos asignacioacuten dinaacutemica

Recibiremos un aviso sobre si queremos asignar una direccioacuten

IP diferente ya que la anteriormente asignada todaviacutea estaacute

asociada a un dispositivo anterior (aunque sea a un dispositivo oculto porque ya no existe maacutes en el sistema la anterior tarjeta

de red virtualizada) Respondemos No para que confirme los valores que acabamos de introducir y recuperaremos la conectividad de nuestra maacutequina virtual

Por uacuteltimo soacutelo tendremos que volver a agregar el servidor al dominio si era parte de alguno y listo (bueno para 12 maacutequinas

se hace un poco pesadohellip pero funciona) Microsoft Office OneNote 2007 Como nota final queriacutea hablar un poco sobre una herramienta que he descubierto este mes oculta en la licencia de Office

2007 completa y que teniacutea olvidada por ahiacute llamada Microsoft Office OneNote La idea de Microsoft es que este producto pueda sustituir al

montoacuten de pequentildeos papelitos y notas que al final del diacutea reuniones llamadas mails etc vamos recopilando y que luego

no hay manera de encontrar OneNote es como un bloc de notas con esteroides (se carga muy raacutepido) ya que nos permite hacer mucho mucho maacutes que el viejo y querido bloc

- la capacidad de buscar informacioacuten en todas nuestras

notas al estilo de la que ofrece Outlook 2007 - si eso por siacute soacutelo ya es una bendicioacuten antildeadireacute que

OneNote nos permite emplear en cualquier nota imaacutegenes obtenidas desde caacutemaras o escaneadas (por

ejemplo tarjetas de negociohellip) archivos recortes de pantalla e incluso grabaciones de audio y video

- pero es que ademaacutes su buacutesqueda nos permite buscar

en los contenidos de estos elementos tambieacuten Es

decir podemos buscar en un archivo o imagen

importados

OneNote ofrece por defecto una organizacioacuten de notas dividida en profesionales y personales de manera que nos permite

emplear la aplicacioacuten para todo nuestro diacutea a diacutea Dentro de cada una establece unas sub-categoriacuteas como Notas de la reunioacuten Viajes Proyectos etc pero que son totalmente

modificables a nuestro gusto Incorpora tambieacuten una serie de plantillas para nuevas notas que se puede ampliar descargando

nuevas versiones desde la web de Microsoft Office Ademaacutes la gestioacuten de las notas es totalmente automaacutetica es decir que no perderemos nunca lo que estamos editando Ademaacutes mediante

un icono que situacutea en nuestra barra de tareas tenemos acceso inmediato a OneNote desde cualquier aplicacioacuten Por uacuteltimo OneNote permite compartir notas con otros usuarios exportarlas a Word (donde por ejemplo acabareacute de editar este artiacuteculo tras haberlo esbozado en

OneNote) enviarlas como correo en Outlook a cualquier destinatario o publicarlas en nuestros sitios de SharePoint para

tener una versioacuten colaborativa en Web Y algunas otras extravagancias como generar una Tarea de Outlook desde una nota de OneNote automaacuteticamente para sincronizarla con todos

nuestros dispositivos o asignar tiempo para hacer la tarea etiquetar nuestras notas con gran flexibilidad para poder

localizarlas luego maacutes faacutecilmente

Y por ultimo y no menos importante llevar a cabo sesiones de

trabajo compartidas entre varios miembros de un equipo sobre una misma nota remotamente (una manera muy uacutetil de llevar a

cabo tormentas de ideas) etcPor eso Por eso podemos llamar a OneNote la navaja suiza de los productos Office y recomiendo su utilizacioacuten

Categoriacuteas

CES Microsoft

Tema Varios

Autor Rafael Flores Yoldi

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo Strings StringBuffershellip y Ropes

Texto El manejo de las cadenas de caracteres es un aspecto fundamental en cualquier

lenguaje de programacioacuten En este artiacuteculo daremos un breve repaso al manejo

de cadenas en Java y a las clases maacutes importantes del lenguaje en este aspecto

como son String StringBuffer y StringBuilder

Ademaacutes introduciremos una libreriacutea para el manejo avanzado de

cadenas Ropes For Java

La clase String

La clase String representa una cadena de caracteres con una caracteriacutestica

fundamental es inmutable Es decir una vez creado un String no es posible

modificarlo Los meacutetodos que concatenan reemplazan caracteres etc

devuelven otro objeto con las modificaciones realizadas

Por ejemplo tras ejecutar el siguiente coacutedigo

String str = ldquoLa clase String es ldquo strconcat(ldquoinmutablerdquo)

el valor de la variable str sigue siendo ldquoLa clase String es ldquo

En cambio si hacemos

String str2 = strconcat(ldquoinmutablerdquo) el nuevo String str2 ya contendraacute la cadena completa ldquoLa clase String

es inmutableldquo

Por esta caracteriacutestica la clase String no es adecuada si lo que se necesita es

realizar muchas modificaciones sobre el texto ya que supone la creacioacuten de

muchos objetos temporales

StringBuffer y StringBuilder

La clase StringBuffer es la variante mutable de String Permite modificar su

contenido concatenar cadenas etc de forma mucho maacutes eficiente que la

claseString

En la versioacuten 5 de Java se incluyoacute la clase StringBuilder que es igual que la

clase StringBuilder pero no sincronizada Si el objeto no va a ser accedido por

maacutes de un hilo simultaacuteneamente se recomienda el uso de StringBuilder ya que

al no ser sincronizado mejora ligeramente el rendimiento

Al utilizar StringBuffer o StringBuilder hay un aspecto que muchas veces no se

tiene en cuenta y que puede tener un impacto importante en el rendimiento la

capacidad inicial

Estos objetos almacenan un array de caracteres que debe ser regenerado

cuando las operaciones hacen que se sobrepase la capacidad del array

Inicializar el objeto a un valor adecuado puede mejorar el rendimiento global

del objeto Por defecto se inicializan con una capacidad de 16 caracteres

Cada vez que debe crecer el nuevo tamantildeo es 2 + 2TamantildeoActual Si el

tamantildeo no va a ser muy grande la diferencia de rendimiento seraacute inapreciable

pero esta inicializacioacuten debe ser tenida en cuenta para el manejo de grandes

cadenas

Cadenas en tiempo de compilacioacuten y en tiempo de

ejecucioacuten

Como curiosidad cabe destacar la labor del compilador de Java en el manejo de

cadenas A veces para mejorar la legibilidad se escribe coacutedigo de este tipo

String sql = select col1 col2 col3 + from table1 t1+

join table2 t2 on t1col1 =

t2col1+ join table3 t3 on t2col3 =

t3col2+ where t1col1 = and t3col3 =

oacute

StringBuffer sbsql = new StringBuffer(select

col1 col2 col3 ) sbsqlappend(from table1 t1) sbsqlappend(join table2 t2 on t1col1 =

t2col1) sbsqlappend(join table3 t3 on t2col3 =

t3col2) sbsqlappend(where t1col1 = and t3col3 =

) String sql = sbsqltoString()

En este caso la primera opcioacuten con la suma de cadenas ofrece mejor

rendimiento que la que utiliza el StringBuffer La explicacioacuten estaacute en el

compilador de Java que realiza la suma de las cadenas en tiempo de

compilacioacuten

Cuando la concatenacioacuten se realiza en tiempo de ejecucioacuten (concatenacioacuten de

variables no de cadenas constantes) el rendimiento mejora

utilizandoStringBuffer como se ha comentado en el punto anterior En este

caso si se suman Strings el compilador genera un StringBuffer para cada suma

de cadenas penalizando el rendimiento frente a la utilizacioacuten de un solo

objeto StringBuffer

Las tres preguntas

Podemos resumir lo visto hasta ahora en tres preguntas que deberiacuteamos

hacernos antes de escribir String str = hellip

iquestVoy a modificar esta cadena Si la repuesta es no o simplemente voy a concatenar cadenas constantes para

mejorar la legibilidad del coacutedigo usareacute String

Si voy a modificarla en funcioacuten de la ejecucioacuten

usareacute StringBuffer o StringBuilder

iquestVa a acceder maacutes de un hilo a mi cadena simultaacuteneamente Si es asiacute usareacute un StringBuffer que asegura la sincronizacioacuten

Si no es asiacute algo que sucederaacute en la mayor parte de los casos

usareacute StringBuilder ya que es maacutes eficiente

iquestPuedo estimar la maacutexima longitud de la cadena Si es asiacute inicializareacute mi StringBuffer o StringBuilder con esa capacidad para

evitar que el objeto deba regenerar su buffer interno cada vez que sobrepase su

capacidad

Un paso maacutes Ropes

En aplicaciones donde el rendimiento es fundamental en el uso de cadenas

puede ser conveniente el uso de otro tipo de estructuras de datos para su

representacioacuten y manejo

Un ejemplo de ello es la estructura de datos denominada Rope

Este concepto no es nuevo se introdujo en un artiacuteculo de 1995(2) y representa

las cadenas con una estructura de aacuterbol de forma que mejora el rendimiento

en operaciones como la insercioacuten y la concatenacioacuten de cadenas El precio a

pagar por estas mejoras de rendimiento viene en forma de uso de memoria

que es sensiblemente superior usando Ropes frente al uso de Strings o

StringBuffers

Existe una implementacioacuten en Java de esta estructura llamada Ropes For

Java(4) Como ejemplo estas son algunas graacuteficas del rendimiento de esta

implementacioacuten publicadas en un artiacuteculo del autor Amin Ahmad(3)

Referencias 1 - Performance improvement techniques in String and StringBuffer

2 - Ropes an Alternative to Strings

3 - Ropes Theory and practice

4 - Ropes For Java

Categoriacute

as

CES OpenSouceJava

Tema Desarrollo

Autor Miguel Bacaicoa

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo Herramientas de gestioacuten de proyectos Open Source

Texto Haraacute unos meses nos vimos en la tesitura de buscar una

herramienta de gestioacuten de proyectos para el Centro Java y Open

Source

Hasta el momento habiacuteamos estado trabajando con dotproject

un sistema con bastante capacidad y funcionalidades No

obstante resultoacute ser una herramienta algo pesada en la creacioacuten

de planificaciones y tediosa en el mantenimiento diacutea a diacutea

Buscaacutebamos principalmente una herramienta que no solo

gestionase la parte de planificacioacuten sino tambieacuten la parte de

seguimiento posterior para mantener el control sobre el proyecto

Ademaacutes deseaacutebamos un entorno colaborativo multi-usuario y

participativo entre nosotros y cualquier colaborador externo Lo

cual maacutes que un requerimiento funcional supone un cambio

cultural la parte maacutes compleja

Todo esto en principio decantaba la decisioacuten por una opcioacuten on-

line en detrimento de una de escritorio No obstante decidimos

valorar tambieacuten las de escritorio no fuera que por empecinarnos

en unas funcionalidades descartaacutesemos otras importantes

A continuacioacuten describireacute brevemente algunas de las

herramientas valoradas

De escritorio

GanttProject

Aplicacioacuten de escritorio muy extendida y uacutetil que permite

planificar tareas y recursos sobre un diagrama Gantt Se trata de

una herramienta similar a MS Project pero maacutes sencilla lo cual

puede ser en algunos casos una ventaja Otra caracteriacutestica

interesante es que funciona tanto en Linux como en Windows y

tiene diversos formatos de exportacioacuten e importacioacuten

Planner

Aplicacioacuten de escritorio bastante extendida y algo maacutes completa

a la anterior (a pesat de tener menos opciones de importacioacuten y

exportacioacuten) pero muy similar En este caso estaacute desarrollada

para Linux aunque existe versioacuten beta para Windows

Open Workbench

Aplicacioacuten de escritorio muy completa Al igual que las anteriores

permite gestionar tareas y recursos sobre un diagrama Gantt

aunque tambieacuten permite otros diagramas como Pert camino

criacutetico y funcionalidades maacutes avanzadas Se vanagloria de ser

incluso mejor que MS Project

TaskJuggler

Se trata de una herramienta de escritorio disponible tanto para

Windows como para Linux un tanto peculiar Genera una serie de

informes bastante completos a partir de un fichero de texto El

interfaz es bastante amigable pero el hecho de andar editando

un fichero de texto que contiene la planificacioacuten no resulta muy

coacutemodo

OpenProj

Otro programa de escritorio sustitutivo de MS Project y de

apariencia muy similar Tiene versiones para Linux Unix Mac y

Windows y es compatible con ficheros MS Project y con todas sus

funcionalidades No obstante parece no estar indicado para

proyectos de grupo En estos casos te ofrecen una versioacuten on-

line (Project-ON-Demand) bajo demanda y de pago bastante

interesante

Entorno web

TeamSCOPE

Team Software for Collaborative Project Environments es una

herramienta web de colaboracioacuten Desarrollado para funcionar

sobre Debian fue creado por una universidad pero parece

haberse quedado bastante anticuado

NetOffice

Herramienta web basada en PHP sobre MySQL para gestionar proyectos tareas registros de tiempos incidenciaserrores

diagramas de Gantt (aunque un poco escondidos) etc similar pero algo maacutes agradable que dotProject Tiene ciertos tintes de herramienta de colaboracioacuten en grupo (groupware)

phpCollab

Herramienta web basada en PHP que ha sufrido un desarrollo

intermitente por lo que parece Sirve tanto para la gestioacuten de

tareas como para el seguimiento de incidenciaserrores Tiene un

aspecto similar a netOffice lo cual hace pensar que uno de los

dos proyectos deriva del otro Quizaacutes por esa razoacuten de elegir una

de las dos sea maacutes recomendable netOffice

Achievo

Herramienta web PHP sobre MySQL para la gestioacuten de proyectos

tareas recursos registro de tiempos agenda generacioacuten de

informes etc Bastante completo ademaacutes parece incluir seccioacuten

presupuestaria

XPlanner

Herramienta web Java sobre MySQL para la gestioacuten de proyectos

mediante XP y Scrum No obstante parece estancada en una

versioacuten beta desde el 2006

PPTS

Project Planning and Tracking System (PPTS) es una herramienta

Web para la gestioacuten de proyectos con metodologiacuteas XP y Scrum

al igual que la anterior Esta desarrollada en PHP contra MySQL

aunque parece tambieacuten largo tiempo abandonada

XPWeb

Al igual que las anteriores es una herramienta web para la

gestioacuten de proyectos aacutegiles incluyendo gestioacuten de tareas

calendarios informes etc Tambieacuten parece estancada

Trac

Herramienta web ampliamente extendida en la comunidad open

source para fundamentalmente el seguimiento proyectos Se

centra en la gestioacuten de incidencias y errores aunque tiene

funcionalidades antildeadidas interesantes como Wiki e integracioacuten

con Subversioacuten Hay que resentildear que se trata de una

herramienta mono-proyecto y que no cuenta con Gantt

OpenProject

Herramienta web de gestioacuten de proyectos muy completa Posee

todo lo necesario tanto que uno llega a perderse No obstante

pueden configurarse los moacutedulos que desean usarse y descartar

aquellos que no son necesarios calendario gestioacuten de tareas

seguimiento de incidencias control presupuestario Wiki foros

integracioacuten con ERPs diagramas Gantt y una larga lista de

funcionalidades

Tutos

The Ultimate Team Organization Software o eso pretende Se

trata de una herramienta web LAMP con muchas funcionalidades

calendario y agenda seguimiento de incidencias y errores

gestioacuten de tareas diagramas Gantt gestioacuten documental gestioacuten

de correos facturas e informes Interesante pero austera de

aspecto y un poco anticuada

Project Dune

Herramienta web desarrollada en Java contra MySQL que pareciacutea

prometer bastante Tiene lo necesario gestioacuten de tareas

recursos incidencias gestioacuten documental registro de tiempos

informes calendario y agenda RSS inspeccioacuten de coacutedigo

importacioacuten de MS Project etc No obstante en su evaluacioacuten

dejoacute bastante que desear resultando poco praacutectica y manejable

Collabtive

Se trata de una herramienta web LAMP para la gestioacuten de

proyectos Seguacuten se indica en la web cubre la gestioacuten de tareas e

incidencias gestioacuten documental y mensajeriacutea Es muy limpia

sencilla y aacutegil No obstante no parece contar con diagramas

Gantt ni con registro de tiempos o informes de estado En la

praacutectica parece quedarse un poco justa pero prometedora

Mindquarry

Herramienta web desarrollada en Java que pretende ser la

alternativa open source de soluciones propietarias como

Basecamp o Sharepoint para la gestioacuten de proyectos y grupos de

trabajo de forma colaborativa Tiene una versioacuten open source

para descarga y otra como servicio bajo demanda La pega es

que la empresa parece haber dejado de desarrollar su actividad

ClockingIT

Se trata de una herramienta Web desarrollada en Ruby como

servicio bajo demanda Permite una gestioacuten de tareas agenda

siguiendo el estaacutendar iCal seguimiento de tiempos generacioacuten

de informes notificaciones RSS foros Chat y Wiki repositorio

de ficheros etc

LibreSource

Se trata de una plataforma web colaborativa para el desarrollo de

software lo que se suele denominar forja y funcionalidades de

groupware archivado y publicacioacuten web Es open source y

altamente ajustable Permite alojar muacuteltiples proyectos varios

grupos de usuarios etc Estaacute desarrollada en J2EE e incorpora

entre otras cosas Wiki integracioacuten con Subversion zonas de

descarga gestioacuten documental mensajeriacutea instantaacutenea con

Jabber gestioacuten de incidencias etc No fue evaluada al ser

descubierta posteriormente a la implantacioacuten de la herramienta

elegida pero parece una buena alternativa

Aunque existen infinidad maacutes de entre todas nos decantamos

por dos que valoramos maacutes en profundidad

TeamWork

Se trata de una herramienta web desarrollada en Java por unos

Italianos Entre sus funcionalidades cabe destacar la gestioacuten de

proyectos y tareas con diversos diagramas de Gantt muy

logrados gestioacuten de incidencias gestioacuten documental entorno

colaborativo tipo groupware control de costes registros de

tiempos etc

Es muy completo raacutepido de respuesta y posee caracteriacutesticas

muy interesantes como una interesante y uacutetil navegacioacuten

contextual entre tareas del proyecto perfiles de usuario seguacuten

proyecto importacioacuten de planificaciones desde MS Project o

asociacioacuten entre incidencias y tareas

Cuenta con wizards para la configuracioacuten de la herramienta de

forma raacutepida y sencilla incluyendo la posibilidad de generar

plantillas para aplicar metodologiacuteas aacutegiles (Scrum)

El registro de horas por tarea para un desarrollador se realiza de

forma muy coacutemoda y raacutepida desde una simple vista facilitando

la participacioacuten del mismo

Se trataba de una aplicacioacuten muy completa quizaacutes demasiado

un poco compleja de entender en un comienzo pero con muchas

posibilidades

No obstante teniacutea alguna que otra pega aunque es open source

posee una licencia de pago para su uso que en cualquier caso era

muy pequentildea Tiene una versioacuten de evaluacioacuten de 30 diacuteas para

quien desee probarla antes de decidir Por otro lado no distingue

proyectos existe una tarea padre que agrupa toda la

planificacioacuten asociada tampoco cuenta con Wiki y no gestiona las

vacaciones del personal

La otra herramienta valorada maacutes en profundidad fue

Redmine

Se trata de otra herramienta web en este caso desarrollada en

Ruby on Rails con una gran cantidad de funcionalidades que la

acerca bastante a una forja pero sin tener la complejidad de la

misma Entre sus caracteriacutesticas cabe destacar la gestioacuten de

tareas incidencias diagramas de Gantt calendario de

actividades noticias foros wikis gestioacuten de ficheros y

documentos integracioacuten con Subversioacuten control de tiempos

generacioacuten de informes etc todo esto por proyecto Por

similitudes del interfaz y funcionalidades parece estar basado en

Trac pero con un lavado de cara y de coacutedigo importante ademaacutes

de ser multi-proyecto

Al igual que la anterior tambieacuten poseiacutea una serie de

caracteriacutesticas que la haciacutea diferente como la posible navegacioacuten

anoacutenima de lectura si asiacute se desea sobre los proyectos alojados

Interesante desde el punto de vista de filosofiacutea open source

Posibilidad de definir un perfil distinto por usuario seguacuten el

proyecto en el que participa

Tambieacuten cuenta con sindicacioacuten de RSS para las secciones de

noticias tareas incidencias etc y exportacioacuten a ficheros de texto

y HTML desde la Wiki los informes generados e incluso el

diagrama de Gantt

A parte se trata de un interfaz muy limpio intuitivo sencillo de

usar y rapidiacutesimo

La configuracioacuten de la herramienta resulta asiacute mismo muy

sencilla con un par de clics puedes empezar a funcionar

Cada proyecto puede configurarse con los moacutedulos que desees

que tenga ademaacutes de poder definir campos personalizados por

proyecto y tarea para permitir una mayor adaptacioacuten

Cabe destacar que para esta herramienta existe un uacutenico

concepto denominado peticioacuten que puede ser de tres tipos

tareas soporte o incidencia De esta forma todo se gestiona de

igual forma lo cual lo simplifica pero a su vez puede convertirse

en un volumen ingestionable de tareas Para evitar esto se

pueden definir categoriacuteas a las que pertenece una peticioacuten y

realizar posteriormente filtrados de peticiones en las vistas seguacuten

este y otros paraacutemetros

No obstante no todo iba a ser color de rosa tiene una serie de

limitaciones como el sistema un tanto engorroso de enlazar

peticiones o el hecho de que una vez creada una peticioacuten su

nombre y descripcioacuten no se pueden modificar tan solo ir

antildeadiendo nuevas descripciones

En este punto nos encontraacutebamos en una difiacutecil decisioacuten puesto

que ambas herramientas nos gustaban cubriacutean lo necesario pero

se trataban de herramientas muy distintas en concepcioacuten Para

facilitar la decisioacuten realizamos un cuadro comparando las

caracteriacutesticas y priorizaacutendolas seguacuten nuestro intereacutes El

resultado fue el siguiente

Prioridad Caracteriacutestica Redmine TeamWork

9 Integracioacuten con

LDAP Si Si

8 Integracioacuten con

Subversion Si Si

8 Traducido al espantildeol

Si No

7 Importacioacuten desde

Project No Si

7 Exportacioacuten a

Project No Si

7 Centros de coste Posible mediante los campos

personalizados

Si

7 Wikis de proyectos Si

7 Personalizacioacuten

extensioacuten Si Si

6 Gestioacuten de vacaciones

No Vacaciones a nivel de

empresa

6 Vida de la herramienta

Indeterminado al ser una

herramienta open source

Algo maacutes seguro

porque hay una empresa detraacutes

5 Facilidad de configuracioacuten

Si

5 Usuarios multi-

perfil Si Si

4 Acceso restringido a usuarios

Si Si

3 Sencillez de manejo

Si

2 Seguimiento de

incidencias Si Si

1 Asignacioacuten de tareas

Si Si

1 Imputacioacuten a tareas asignadas

Si Si

Tras una difiacutecil reflexioacuten puesto que ambas se encontraban muy

parejas decidimos decantarnos por Redmine primando la

sencillez y rapidez Existiacutea la posibilidad de que terceros la

empleasen y veiacuteamos que Redmine permitiacutea una mayor facilidad

en su manejo y resultaba maacutes intuitiva de cara a aprender a

utilizarla Posteriormente tras su uso hemos detectado algunos

inconvenientes importantes como la imposibilidad de asignar una

peticioacuten a maacutes de un usuario pero es que no hay herramienta

perfecta

Bibliografiacutea

httpwwwnavegapolisnetcontentview5649

httpwwwsimpleprojectmanagementcomhomehtml

httpwwwweb-based-softwarecomproject

httpenwikipediaorgwikiComparison_of_issue_tracking_syste

ms

httpenwikipediaorgwikiList_of_project_management_softwa

re

httpwwwpmdigestcomsoftware

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Rauacutel Sanz de Acedo

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo Lexers parsers JavaCC (y II)

Texto En este artiacuteculo vamos a utilizar JavaCC como herramienta para

implementar un moacutedulo que resuelva la casuiacutestica de la

impresioacuten de las diversas paacuteginas de un fichero Esto es lo que se

refleja en esta imagen

Para ello en el artiacuteculo anterior definimos esta gramaacutetica a la que

asociamos unas acciones semaacutenticas

inicio --gt inicializacionVariables

listaElementos

procesarDatos

listaElementos --gt elemento

restoListaElementos

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

restoListaElementos --gt SEPARADOR

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

listaElementos

|

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

restoListaElementos2 --gt GUION ENTERO

num2 = valor(ENTERO)

Si (num2 gt maxPaginas)

or (num2==0) ent error

|

JavaCC es una herramienta que dado un fichero de extensioacuten

jj que describe la gramaacutetica y sus acciones semaacutenticas

asociadas genera los ficheros java que la implementan

Estos ficheros java pueden luego obviamente incluirse en

aqueacutellos que conforman el resto de nuestra aplicacioacuten

JavaCC es una herramienta gratuita que puede descargarse

desde aquiacute Existe tambieacuten un plugin para Eclipse Y asimismo

existe una task de Ant para JavaCC

Vamos pues a construir nuestro parser

Lo denominaremos parserImprimePaginasCC y por lo tanto

vamos a editar el fichero parserImprimePaginasCCjj

Indicaremos coacutemo se traducen los tokens y las producciones a

formato JavaCC

TOKEN

ltENTERO([0-9])+gt

| ltGUION -gt

| ltSEPARADOR([ ])+ | ([ ])gt

Los tokens se describen praacutecticamente como lo indicamos en la

gramaacutetica

void inicio()throws elementoFueraLimitesException

resultado = new Vector()

num1 = -1

num2 = -1

inicializaFlags()

listaElementos()

void listaElementos()throws elementoFueraLimitesExcept

ion

elemento() restoListaElementos()

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

restoListaElementos2()

void restoListaElementos()throws elementoFueraLimitesE

xception

ltSEPARADORgt

insertaElemento(num1 num2)

num1 = -1

num2 = -1

listaElementos()

|

insertaElemento(num1 num2)

num1 = -1

num2 = -1

void restoListaElementos2()throws elementoFueraLimites

Exception

ltGUIONgtltENTEROgt

num2 = IntegervalueOf(tokenimage)intValue()

if ((num2gtmaximo)|| (num2 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num2))

|

Las producciones son algo diferentes lo que era

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

ahora es

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(IntegertoS

tring(num1))

restoListaElementos2()

El no terminal elemento se describe como void elemento() y

ademaacutes le hemos asociado una excepcioacuten para controlar el hecho

de que un usuario coloque 0 o un nuacutemero mayor que el

permitido Lo que en la parte derecha es ENTERO se indica

como ltENTEROgt y la invocacioacuten de restoListaElementos2

es restoListaElementos2()

Las acciones semaacutenticas

num1 = valor(ENTERO)

Si (num1 gt maxPaginas) or (num1==0) ent error

se indican en JavaCC asiacute

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

El valor del token actual es accesible a traveacutes de tokenimage

Si deseamos tener coacutedigo Java adicional fuera de las

producciones lo podemos antildeadir de esta forma con la palabra

reservada JAVACODE

JAVACODE void insertaElemento(int num1 int num2)

int aux i iFlag

if ((num1 = -1) ampamp (num2 = -1))

if (num1gtnum2)

aux = num1

num1 = num2

num2 = aux

for (i = num1

i lt= num2

i++)

iFlag = i-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(i))

flags[iFlag] = true

else if (num1 = -1)

iFlag = num1-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num1))

flags[iFlag] = true

else if (num2 = -1)

iFlag = num2-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num2))

flags[iFlag] = true

JAVACODE void inicializaFlags()

int i

flags = new boolean [maximo]

for (i = 0

iltmaximo

i++)

flags[i] = false

Ademaacutes podemos inicializar el parser e instanciarlo de esta

forma

PARSER_BEGIN(parserImprimePaginasCC)

import javaio

import javautilVector

public class parserImprimePaginasCC

public static int maximo

public static Vector resultado

private static int num1 num2

private static boolean flags[]

public static void main(String[]args)throws Exceptio

n

Reader r = new StringReader(args[0])

parserImprimePaginasCC p

= new parserImprimePaginasCC(r)

try

pmaximo = 50

Systemoutprintln(Maacuteximo +pmaximo)

pinicio()

Systemoutprintln(OKn)

for (int j = 0

jltpresultadosize()

j++)

Systemoutprint(presultadoelementAt(j)+

)

Systemoutprintln()

catch (ParseException e)

Systemoutprintln(Error de sintaxis)

catch (TokenMgrError e)

Systemoutprintln(Error leacutexico)

catch (elementoFueraLimitesException e)

Systemoutprintln(egetMessage())

PARSER_END(parserImprimePaginasCC)

En este caso tomaremos la entrada de lo que el usuario

introduzca por teclado pero se pueden tomar los datos a traveacutes

de ficheros o pasarlos como variables

Se hace referencia a una excepcioacuten que hemos definido asiacute en un

fichero llamado elementoFueraLimitesExceptionjava

public class elementoFueraLimitesException extends Exc

eption

Constructor

public elementoFueraLimitesException()

super()

public elementoFueraLimitesException(String msg)

super(msg)

Una vez salvado el fichero parserImprimePaginasCCjj podemos

generar la documentacioacuten de la gramaacutetica en formato HTML de

esta forma

Nota en la ejecucioacuten de estos ejemplos se ha utilizado la liacutenea de comandos de

Windows pero se podriacutea haber hecho a traveacutes de cualquier sistema que soporte

el lenguaje Java

gtjjdoc parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Documentation

Generator Version 014)

(type jjdoc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Grammar documentation generated successfully in

parserImprimePaginasCChtml

Se genera el fichero parserImprimePaginasCChtmlcuyo

contenido es

BNF for parserImprimePaginasCCjj NON-TERMINALS

inicio = listaElementos

listaElementos = elemento restoListaElementos

elemento = ltENTEROgt restoListaElementos2

restoListaElementos = ltSEPARADORgt listaElementos

|

restoListaElementos2 = ltGUIONgt ltENTEROgt

|

insertaElemento = java code

inicializaFlags = java code

Nota BNF es el tipo de notacioacuten que estamos utilizando a lo largo de estos

artiacuteculos

Compilamos el parser

gtjavacc parser ImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

File TokenMgrErrorjava does not exist Will create

one

File ParseExceptionjava does not exist Will

create one

File Tokenjava does not exist Will create one

File SimpleCharStreamjava does not exist Will

create one

Parser generated successfully

y entonces se generan estos ficheros

ParseExceptionjava --gt

Excepcioacuten generada por el parser cuando un error es encontrado

parserImprimePaginasCCjava --gt La

traduccioacuten de nuestro fichero jj a java

parserImprimePaginasCCConstantsjava --gt Los

valores de los tokens

parserImprimePaginasCCTokenManagerjava --gt El

analizador leacutexico

SimpleCharStreamjava --gt

Contiene coacutedigo para leer caracteres de cualquier

implementacioacuten de javaioInputStream o javaioReader

Tokenjava --gt

Definicioacuten de la clase Token

TokenMgrErrorjava --gt

Diversos errores que puede producir el lexer

Ahora los compilamos y antildeadimos el fichero

elementoFueraLimitesExceptionjava en dicha compilacioacuten

javac java

Y vamos a ejecutar el parser suponiendo que el maacuteximo nuacutemero

de paacuteginas a impmir es 50 (como hemos indicado con pmaximo =

50)

Lo que obtenemos como salida es la lista de paacuteginas a imprimir o

un mensaje de error

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

OK

2 5 6 7 8

java -classpath laboratorioParsers

parserImprimePaginasCC 28-3046

Num paginas 50

OK

28 29 30 4 6

java -classpath laboratorioParsers

parserImprimePaginasCC 43-51

Num paginas 50

Introdujo un numero superior al maximo51

java -classpath laboratorioParsers

parserImprimePaginasCC 43--51

Num paginas 50

Error de sintaxisEncountered - at line 1

column 4

Was expecting

ltENTEROgt

iquestQueacute pasa si algo ha ido mal iquestPodemos depurar el parser de

alguna forma

Por supuesto podemos compilar el parser asiacute para obtener una

traza de la ejecucioacuten

javacc -DEBUG_PARSER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Consumed token lt- at line 1 column 4gt

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

En la traza vemos coacutemo el parser va invocando la diferentes

producciones

Podemos tambieacuten depurar el lexer

javacc -DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Returning the ltEOFgt token

OK

2 5 6 7 8

O combinar ambas trazas

javacc -DEBUG_PARSER -

DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Consumed token lt- at line 1 column 4gt

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Returning the ltEOFgt token

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

Conclusioacuten los generadores de parsers son herramientas

potentes que sirven para resolver problemas de una manera

bdquolimpia‟ y elegante Puede que su nombre retraiga a los

desarrolladores (ldquoiquestPara queacute quiero un generador de

compiladoresrdquo) pero es una opcioacuten a tener en cuenta

Ficheros para descargar

Referencias

- Generating Parsers with JavaCC

- The JavaCC FAQ

Si quieres enviar alguacuten comentario o sugerir temas a tratar en otros artiacuteculos escribe a

curtasun[simboloArroba]ceines

Categor

iacuteas

CES OpenSouceJava

Tema Desarrollo

Autor Carlos Urtasun

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo XSL-FO (Parte 1)

Texto XSL-FO Introduccioacuten El estaacutendar XSL tal y como estaacute definido actualmente se

divide en dos grandes partes -XSLT transformacioacuten de un documento de entrada XML en

alguacuten tipo de documento de salida ya sea XML HTML PDF etc -Formatting Objects (FO) definen la visualizacioacuten final del

resultado de la transformacioacuten Son una implementacioacuten especiacutefica de un determinado XSLT y aplicados a un

fichero XML nos proporcionan otro fichero con la informacioacuten de eacuteste renderizada a alguacuten formato de visualizacioacuten impresa Eacutesta es quizaacute la principal diferencia entre un FO y

otros XSLT ambos transforman un documento XML en otro documento XML pero FO estaacute pensado para generar

directamente una renderizacioacuten

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 2: Cesnavarra 2008-boletín 7

Y como el hardware virtual no estaacute configurado correctamente

el resultado es que la instalacioacuten es mala

Como resultaraacute habitual a aquellos que ya se hayan peleado

con las maacutequinas virtuales de Microsoft a continuacioacuten deberemos insertar el Integration Services Setup Disk mediante el menuacute Accioacuten Este lanzaraacute el ejecutable que

pretende llevar a cabo la instalacioacuten como se ve a continuacioacuten

Normalmente todo iraacute bien y se actualizaraacute correctamente

Para terminar reiniciamos y todo estaraacute listo a falta de unas comprobaciones de IP y dominio Pero si nuestro sistema

virtualizado dispone de alguna actualizacioacuten o versioacuten de los drivers de VM que no gusta a nuestro instalador nos devolveraacute un mensaje de error tan poco expliacutecito como Error Error

grave durante la instalacioacuten Y nada maacutes

Para solucionarlo en vez de ejecutar el programa ldquoSetupexerdquo

del ldquoIntegration Services Setup diskrdquo tendremos que lanzar un ejecutable del mismo disco pero un poco maacutes oculto se trata

del ldquoupdateexerdquo que reside en ldquosupportx86en-usupdaterdquo

En esta imagen se puede ver que tambieacuten he ejecutado el

Administrador de tareas de Windows pero soacutelo como soporte desde el que lanzar el ldquoexplorerexerdquo mediante su menuacute ldquoArchivordquo ya que los problemas con la instalacioacuten de los

Servicios de Integracioacuten para esta versioacuten de Hyper-V impiden

el uso del ratoacutenhellip algo bastante molesto la verdad Una vez lanzado este update tendremos que reiniciar nuestro servidor

virtual y todo habraacute vuelto a funcionar normalmente sobre todo nuestro ratoacuten y la tarjeta de red

Finalmente soacutelo tendremos que corregir nuestra asignacioacuten de

IPs a la maacutequina virtual si no utilizamos asignacioacuten dinaacutemica

Recibiremos un aviso sobre si queremos asignar una direccioacuten

IP diferente ya que la anteriormente asignada todaviacutea estaacute

asociada a un dispositivo anterior (aunque sea a un dispositivo oculto porque ya no existe maacutes en el sistema la anterior tarjeta

de red virtualizada) Respondemos No para que confirme los valores que acabamos de introducir y recuperaremos la conectividad de nuestra maacutequina virtual

Por uacuteltimo soacutelo tendremos que volver a agregar el servidor al dominio si era parte de alguno y listo (bueno para 12 maacutequinas

se hace un poco pesadohellip pero funciona) Microsoft Office OneNote 2007 Como nota final queriacutea hablar un poco sobre una herramienta que he descubierto este mes oculta en la licencia de Office

2007 completa y que teniacutea olvidada por ahiacute llamada Microsoft Office OneNote La idea de Microsoft es que este producto pueda sustituir al

montoacuten de pequentildeos papelitos y notas que al final del diacutea reuniones llamadas mails etc vamos recopilando y que luego

no hay manera de encontrar OneNote es como un bloc de notas con esteroides (se carga muy raacutepido) ya que nos permite hacer mucho mucho maacutes que el viejo y querido bloc

- la capacidad de buscar informacioacuten en todas nuestras

notas al estilo de la que ofrece Outlook 2007 - si eso por siacute soacutelo ya es una bendicioacuten antildeadireacute que

OneNote nos permite emplear en cualquier nota imaacutegenes obtenidas desde caacutemaras o escaneadas (por

ejemplo tarjetas de negociohellip) archivos recortes de pantalla e incluso grabaciones de audio y video

- pero es que ademaacutes su buacutesqueda nos permite buscar

en los contenidos de estos elementos tambieacuten Es

decir podemos buscar en un archivo o imagen

importados

OneNote ofrece por defecto una organizacioacuten de notas dividida en profesionales y personales de manera que nos permite

emplear la aplicacioacuten para todo nuestro diacutea a diacutea Dentro de cada una establece unas sub-categoriacuteas como Notas de la reunioacuten Viajes Proyectos etc pero que son totalmente

modificables a nuestro gusto Incorpora tambieacuten una serie de plantillas para nuevas notas que se puede ampliar descargando

nuevas versiones desde la web de Microsoft Office Ademaacutes la gestioacuten de las notas es totalmente automaacutetica es decir que no perderemos nunca lo que estamos editando Ademaacutes mediante

un icono que situacutea en nuestra barra de tareas tenemos acceso inmediato a OneNote desde cualquier aplicacioacuten Por uacuteltimo OneNote permite compartir notas con otros usuarios exportarlas a Word (donde por ejemplo acabareacute de editar este artiacuteculo tras haberlo esbozado en

OneNote) enviarlas como correo en Outlook a cualquier destinatario o publicarlas en nuestros sitios de SharePoint para

tener una versioacuten colaborativa en Web Y algunas otras extravagancias como generar una Tarea de Outlook desde una nota de OneNote automaacuteticamente para sincronizarla con todos

nuestros dispositivos o asignar tiempo para hacer la tarea etiquetar nuestras notas con gran flexibilidad para poder

localizarlas luego maacutes faacutecilmente

Y por ultimo y no menos importante llevar a cabo sesiones de

trabajo compartidas entre varios miembros de un equipo sobre una misma nota remotamente (una manera muy uacutetil de llevar a

cabo tormentas de ideas) etcPor eso Por eso podemos llamar a OneNote la navaja suiza de los productos Office y recomiendo su utilizacioacuten

Categoriacuteas

CES Microsoft

Tema Varios

Autor Rafael Flores Yoldi

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo Strings StringBuffershellip y Ropes

Texto El manejo de las cadenas de caracteres es un aspecto fundamental en cualquier

lenguaje de programacioacuten En este artiacuteculo daremos un breve repaso al manejo

de cadenas en Java y a las clases maacutes importantes del lenguaje en este aspecto

como son String StringBuffer y StringBuilder

Ademaacutes introduciremos una libreriacutea para el manejo avanzado de

cadenas Ropes For Java

La clase String

La clase String representa una cadena de caracteres con una caracteriacutestica

fundamental es inmutable Es decir una vez creado un String no es posible

modificarlo Los meacutetodos que concatenan reemplazan caracteres etc

devuelven otro objeto con las modificaciones realizadas

Por ejemplo tras ejecutar el siguiente coacutedigo

String str = ldquoLa clase String es ldquo strconcat(ldquoinmutablerdquo)

el valor de la variable str sigue siendo ldquoLa clase String es ldquo

En cambio si hacemos

String str2 = strconcat(ldquoinmutablerdquo) el nuevo String str2 ya contendraacute la cadena completa ldquoLa clase String

es inmutableldquo

Por esta caracteriacutestica la clase String no es adecuada si lo que se necesita es

realizar muchas modificaciones sobre el texto ya que supone la creacioacuten de

muchos objetos temporales

StringBuffer y StringBuilder

La clase StringBuffer es la variante mutable de String Permite modificar su

contenido concatenar cadenas etc de forma mucho maacutes eficiente que la

claseString

En la versioacuten 5 de Java se incluyoacute la clase StringBuilder que es igual que la

clase StringBuilder pero no sincronizada Si el objeto no va a ser accedido por

maacutes de un hilo simultaacuteneamente se recomienda el uso de StringBuilder ya que

al no ser sincronizado mejora ligeramente el rendimiento

Al utilizar StringBuffer o StringBuilder hay un aspecto que muchas veces no se

tiene en cuenta y que puede tener un impacto importante en el rendimiento la

capacidad inicial

Estos objetos almacenan un array de caracteres que debe ser regenerado

cuando las operaciones hacen que se sobrepase la capacidad del array

Inicializar el objeto a un valor adecuado puede mejorar el rendimiento global

del objeto Por defecto se inicializan con una capacidad de 16 caracteres

Cada vez que debe crecer el nuevo tamantildeo es 2 + 2TamantildeoActual Si el

tamantildeo no va a ser muy grande la diferencia de rendimiento seraacute inapreciable

pero esta inicializacioacuten debe ser tenida en cuenta para el manejo de grandes

cadenas

Cadenas en tiempo de compilacioacuten y en tiempo de

ejecucioacuten

Como curiosidad cabe destacar la labor del compilador de Java en el manejo de

cadenas A veces para mejorar la legibilidad se escribe coacutedigo de este tipo

String sql = select col1 col2 col3 + from table1 t1+

join table2 t2 on t1col1 =

t2col1+ join table3 t3 on t2col3 =

t3col2+ where t1col1 = and t3col3 =

oacute

StringBuffer sbsql = new StringBuffer(select

col1 col2 col3 ) sbsqlappend(from table1 t1) sbsqlappend(join table2 t2 on t1col1 =

t2col1) sbsqlappend(join table3 t3 on t2col3 =

t3col2) sbsqlappend(where t1col1 = and t3col3 =

) String sql = sbsqltoString()

En este caso la primera opcioacuten con la suma de cadenas ofrece mejor

rendimiento que la que utiliza el StringBuffer La explicacioacuten estaacute en el

compilador de Java que realiza la suma de las cadenas en tiempo de

compilacioacuten

Cuando la concatenacioacuten se realiza en tiempo de ejecucioacuten (concatenacioacuten de

variables no de cadenas constantes) el rendimiento mejora

utilizandoStringBuffer como se ha comentado en el punto anterior En este

caso si se suman Strings el compilador genera un StringBuffer para cada suma

de cadenas penalizando el rendimiento frente a la utilizacioacuten de un solo

objeto StringBuffer

Las tres preguntas

Podemos resumir lo visto hasta ahora en tres preguntas que deberiacuteamos

hacernos antes de escribir String str = hellip

iquestVoy a modificar esta cadena Si la repuesta es no o simplemente voy a concatenar cadenas constantes para

mejorar la legibilidad del coacutedigo usareacute String

Si voy a modificarla en funcioacuten de la ejecucioacuten

usareacute StringBuffer o StringBuilder

iquestVa a acceder maacutes de un hilo a mi cadena simultaacuteneamente Si es asiacute usareacute un StringBuffer que asegura la sincronizacioacuten

Si no es asiacute algo que sucederaacute en la mayor parte de los casos

usareacute StringBuilder ya que es maacutes eficiente

iquestPuedo estimar la maacutexima longitud de la cadena Si es asiacute inicializareacute mi StringBuffer o StringBuilder con esa capacidad para

evitar que el objeto deba regenerar su buffer interno cada vez que sobrepase su

capacidad

Un paso maacutes Ropes

En aplicaciones donde el rendimiento es fundamental en el uso de cadenas

puede ser conveniente el uso de otro tipo de estructuras de datos para su

representacioacuten y manejo

Un ejemplo de ello es la estructura de datos denominada Rope

Este concepto no es nuevo se introdujo en un artiacuteculo de 1995(2) y representa

las cadenas con una estructura de aacuterbol de forma que mejora el rendimiento

en operaciones como la insercioacuten y la concatenacioacuten de cadenas El precio a

pagar por estas mejoras de rendimiento viene en forma de uso de memoria

que es sensiblemente superior usando Ropes frente al uso de Strings o

StringBuffers

Existe una implementacioacuten en Java de esta estructura llamada Ropes For

Java(4) Como ejemplo estas son algunas graacuteficas del rendimiento de esta

implementacioacuten publicadas en un artiacuteculo del autor Amin Ahmad(3)

Referencias 1 - Performance improvement techniques in String and StringBuffer

2 - Ropes an Alternative to Strings

3 - Ropes Theory and practice

4 - Ropes For Java

Categoriacute

as

CES OpenSouceJava

Tema Desarrollo

Autor Miguel Bacaicoa

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo Herramientas de gestioacuten de proyectos Open Source

Texto Haraacute unos meses nos vimos en la tesitura de buscar una

herramienta de gestioacuten de proyectos para el Centro Java y Open

Source

Hasta el momento habiacuteamos estado trabajando con dotproject

un sistema con bastante capacidad y funcionalidades No

obstante resultoacute ser una herramienta algo pesada en la creacioacuten

de planificaciones y tediosa en el mantenimiento diacutea a diacutea

Buscaacutebamos principalmente una herramienta que no solo

gestionase la parte de planificacioacuten sino tambieacuten la parte de

seguimiento posterior para mantener el control sobre el proyecto

Ademaacutes deseaacutebamos un entorno colaborativo multi-usuario y

participativo entre nosotros y cualquier colaborador externo Lo

cual maacutes que un requerimiento funcional supone un cambio

cultural la parte maacutes compleja

Todo esto en principio decantaba la decisioacuten por una opcioacuten on-

line en detrimento de una de escritorio No obstante decidimos

valorar tambieacuten las de escritorio no fuera que por empecinarnos

en unas funcionalidades descartaacutesemos otras importantes

A continuacioacuten describireacute brevemente algunas de las

herramientas valoradas

De escritorio

GanttProject

Aplicacioacuten de escritorio muy extendida y uacutetil que permite

planificar tareas y recursos sobre un diagrama Gantt Se trata de

una herramienta similar a MS Project pero maacutes sencilla lo cual

puede ser en algunos casos una ventaja Otra caracteriacutestica

interesante es que funciona tanto en Linux como en Windows y

tiene diversos formatos de exportacioacuten e importacioacuten

Planner

Aplicacioacuten de escritorio bastante extendida y algo maacutes completa

a la anterior (a pesat de tener menos opciones de importacioacuten y

exportacioacuten) pero muy similar En este caso estaacute desarrollada

para Linux aunque existe versioacuten beta para Windows

Open Workbench

Aplicacioacuten de escritorio muy completa Al igual que las anteriores

permite gestionar tareas y recursos sobre un diagrama Gantt

aunque tambieacuten permite otros diagramas como Pert camino

criacutetico y funcionalidades maacutes avanzadas Se vanagloria de ser

incluso mejor que MS Project

TaskJuggler

Se trata de una herramienta de escritorio disponible tanto para

Windows como para Linux un tanto peculiar Genera una serie de

informes bastante completos a partir de un fichero de texto El

interfaz es bastante amigable pero el hecho de andar editando

un fichero de texto que contiene la planificacioacuten no resulta muy

coacutemodo

OpenProj

Otro programa de escritorio sustitutivo de MS Project y de

apariencia muy similar Tiene versiones para Linux Unix Mac y

Windows y es compatible con ficheros MS Project y con todas sus

funcionalidades No obstante parece no estar indicado para

proyectos de grupo En estos casos te ofrecen una versioacuten on-

line (Project-ON-Demand) bajo demanda y de pago bastante

interesante

Entorno web

TeamSCOPE

Team Software for Collaborative Project Environments es una

herramienta web de colaboracioacuten Desarrollado para funcionar

sobre Debian fue creado por una universidad pero parece

haberse quedado bastante anticuado

NetOffice

Herramienta web basada en PHP sobre MySQL para gestionar proyectos tareas registros de tiempos incidenciaserrores

diagramas de Gantt (aunque un poco escondidos) etc similar pero algo maacutes agradable que dotProject Tiene ciertos tintes de herramienta de colaboracioacuten en grupo (groupware)

phpCollab

Herramienta web basada en PHP que ha sufrido un desarrollo

intermitente por lo que parece Sirve tanto para la gestioacuten de

tareas como para el seguimiento de incidenciaserrores Tiene un

aspecto similar a netOffice lo cual hace pensar que uno de los

dos proyectos deriva del otro Quizaacutes por esa razoacuten de elegir una

de las dos sea maacutes recomendable netOffice

Achievo

Herramienta web PHP sobre MySQL para la gestioacuten de proyectos

tareas recursos registro de tiempos agenda generacioacuten de

informes etc Bastante completo ademaacutes parece incluir seccioacuten

presupuestaria

XPlanner

Herramienta web Java sobre MySQL para la gestioacuten de proyectos

mediante XP y Scrum No obstante parece estancada en una

versioacuten beta desde el 2006

PPTS

Project Planning and Tracking System (PPTS) es una herramienta

Web para la gestioacuten de proyectos con metodologiacuteas XP y Scrum

al igual que la anterior Esta desarrollada en PHP contra MySQL

aunque parece tambieacuten largo tiempo abandonada

XPWeb

Al igual que las anteriores es una herramienta web para la

gestioacuten de proyectos aacutegiles incluyendo gestioacuten de tareas

calendarios informes etc Tambieacuten parece estancada

Trac

Herramienta web ampliamente extendida en la comunidad open

source para fundamentalmente el seguimiento proyectos Se

centra en la gestioacuten de incidencias y errores aunque tiene

funcionalidades antildeadidas interesantes como Wiki e integracioacuten

con Subversioacuten Hay que resentildear que se trata de una

herramienta mono-proyecto y que no cuenta con Gantt

OpenProject

Herramienta web de gestioacuten de proyectos muy completa Posee

todo lo necesario tanto que uno llega a perderse No obstante

pueden configurarse los moacutedulos que desean usarse y descartar

aquellos que no son necesarios calendario gestioacuten de tareas

seguimiento de incidencias control presupuestario Wiki foros

integracioacuten con ERPs diagramas Gantt y una larga lista de

funcionalidades

Tutos

The Ultimate Team Organization Software o eso pretende Se

trata de una herramienta web LAMP con muchas funcionalidades

calendario y agenda seguimiento de incidencias y errores

gestioacuten de tareas diagramas Gantt gestioacuten documental gestioacuten

de correos facturas e informes Interesante pero austera de

aspecto y un poco anticuada

Project Dune

Herramienta web desarrollada en Java contra MySQL que pareciacutea

prometer bastante Tiene lo necesario gestioacuten de tareas

recursos incidencias gestioacuten documental registro de tiempos

informes calendario y agenda RSS inspeccioacuten de coacutedigo

importacioacuten de MS Project etc No obstante en su evaluacioacuten

dejoacute bastante que desear resultando poco praacutectica y manejable

Collabtive

Se trata de una herramienta web LAMP para la gestioacuten de

proyectos Seguacuten se indica en la web cubre la gestioacuten de tareas e

incidencias gestioacuten documental y mensajeriacutea Es muy limpia

sencilla y aacutegil No obstante no parece contar con diagramas

Gantt ni con registro de tiempos o informes de estado En la

praacutectica parece quedarse un poco justa pero prometedora

Mindquarry

Herramienta web desarrollada en Java que pretende ser la

alternativa open source de soluciones propietarias como

Basecamp o Sharepoint para la gestioacuten de proyectos y grupos de

trabajo de forma colaborativa Tiene una versioacuten open source

para descarga y otra como servicio bajo demanda La pega es

que la empresa parece haber dejado de desarrollar su actividad

ClockingIT

Se trata de una herramienta Web desarrollada en Ruby como

servicio bajo demanda Permite una gestioacuten de tareas agenda

siguiendo el estaacutendar iCal seguimiento de tiempos generacioacuten

de informes notificaciones RSS foros Chat y Wiki repositorio

de ficheros etc

LibreSource

Se trata de una plataforma web colaborativa para el desarrollo de

software lo que se suele denominar forja y funcionalidades de

groupware archivado y publicacioacuten web Es open source y

altamente ajustable Permite alojar muacuteltiples proyectos varios

grupos de usuarios etc Estaacute desarrollada en J2EE e incorpora

entre otras cosas Wiki integracioacuten con Subversion zonas de

descarga gestioacuten documental mensajeriacutea instantaacutenea con

Jabber gestioacuten de incidencias etc No fue evaluada al ser

descubierta posteriormente a la implantacioacuten de la herramienta

elegida pero parece una buena alternativa

Aunque existen infinidad maacutes de entre todas nos decantamos

por dos que valoramos maacutes en profundidad

TeamWork

Se trata de una herramienta web desarrollada en Java por unos

Italianos Entre sus funcionalidades cabe destacar la gestioacuten de

proyectos y tareas con diversos diagramas de Gantt muy

logrados gestioacuten de incidencias gestioacuten documental entorno

colaborativo tipo groupware control de costes registros de

tiempos etc

Es muy completo raacutepido de respuesta y posee caracteriacutesticas

muy interesantes como una interesante y uacutetil navegacioacuten

contextual entre tareas del proyecto perfiles de usuario seguacuten

proyecto importacioacuten de planificaciones desde MS Project o

asociacioacuten entre incidencias y tareas

Cuenta con wizards para la configuracioacuten de la herramienta de

forma raacutepida y sencilla incluyendo la posibilidad de generar

plantillas para aplicar metodologiacuteas aacutegiles (Scrum)

El registro de horas por tarea para un desarrollador se realiza de

forma muy coacutemoda y raacutepida desde una simple vista facilitando

la participacioacuten del mismo

Se trataba de una aplicacioacuten muy completa quizaacutes demasiado

un poco compleja de entender en un comienzo pero con muchas

posibilidades

No obstante teniacutea alguna que otra pega aunque es open source

posee una licencia de pago para su uso que en cualquier caso era

muy pequentildea Tiene una versioacuten de evaluacioacuten de 30 diacuteas para

quien desee probarla antes de decidir Por otro lado no distingue

proyectos existe una tarea padre que agrupa toda la

planificacioacuten asociada tampoco cuenta con Wiki y no gestiona las

vacaciones del personal

La otra herramienta valorada maacutes en profundidad fue

Redmine

Se trata de otra herramienta web en este caso desarrollada en

Ruby on Rails con una gran cantidad de funcionalidades que la

acerca bastante a una forja pero sin tener la complejidad de la

misma Entre sus caracteriacutesticas cabe destacar la gestioacuten de

tareas incidencias diagramas de Gantt calendario de

actividades noticias foros wikis gestioacuten de ficheros y

documentos integracioacuten con Subversioacuten control de tiempos

generacioacuten de informes etc todo esto por proyecto Por

similitudes del interfaz y funcionalidades parece estar basado en

Trac pero con un lavado de cara y de coacutedigo importante ademaacutes

de ser multi-proyecto

Al igual que la anterior tambieacuten poseiacutea una serie de

caracteriacutesticas que la haciacutea diferente como la posible navegacioacuten

anoacutenima de lectura si asiacute se desea sobre los proyectos alojados

Interesante desde el punto de vista de filosofiacutea open source

Posibilidad de definir un perfil distinto por usuario seguacuten el

proyecto en el que participa

Tambieacuten cuenta con sindicacioacuten de RSS para las secciones de

noticias tareas incidencias etc y exportacioacuten a ficheros de texto

y HTML desde la Wiki los informes generados e incluso el

diagrama de Gantt

A parte se trata de un interfaz muy limpio intuitivo sencillo de

usar y rapidiacutesimo

La configuracioacuten de la herramienta resulta asiacute mismo muy

sencilla con un par de clics puedes empezar a funcionar

Cada proyecto puede configurarse con los moacutedulos que desees

que tenga ademaacutes de poder definir campos personalizados por

proyecto y tarea para permitir una mayor adaptacioacuten

Cabe destacar que para esta herramienta existe un uacutenico

concepto denominado peticioacuten que puede ser de tres tipos

tareas soporte o incidencia De esta forma todo se gestiona de

igual forma lo cual lo simplifica pero a su vez puede convertirse

en un volumen ingestionable de tareas Para evitar esto se

pueden definir categoriacuteas a las que pertenece una peticioacuten y

realizar posteriormente filtrados de peticiones en las vistas seguacuten

este y otros paraacutemetros

No obstante no todo iba a ser color de rosa tiene una serie de

limitaciones como el sistema un tanto engorroso de enlazar

peticiones o el hecho de que una vez creada una peticioacuten su

nombre y descripcioacuten no se pueden modificar tan solo ir

antildeadiendo nuevas descripciones

En este punto nos encontraacutebamos en una difiacutecil decisioacuten puesto

que ambas herramientas nos gustaban cubriacutean lo necesario pero

se trataban de herramientas muy distintas en concepcioacuten Para

facilitar la decisioacuten realizamos un cuadro comparando las

caracteriacutesticas y priorizaacutendolas seguacuten nuestro intereacutes El

resultado fue el siguiente

Prioridad Caracteriacutestica Redmine TeamWork

9 Integracioacuten con

LDAP Si Si

8 Integracioacuten con

Subversion Si Si

8 Traducido al espantildeol

Si No

7 Importacioacuten desde

Project No Si

7 Exportacioacuten a

Project No Si

7 Centros de coste Posible mediante los campos

personalizados

Si

7 Wikis de proyectos Si

7 Personalizacioacuten

extensioacuten Si Si

6 Gestioacuten de vacaciones

No Vacaciones a nivel de

empresa

6 Vida de la herramienta

Indeterminado al ser una

herramienta open source

Algo maacutes seguro

porque hay una empresa detraacutes

5 Facilidad de configuracioacuten

Si

5 Usuarios multi-

perfil Si Si

4 Acceso restringido a usuarios

Si Si

3 Sencillez de manejo

Si

2 Seguimiento de

incidencias Si Si

1 Asignacioacuten de tareas

Si Si

1 Imputacioacuten a tareas asignadas

Si Si

Tras una difiacutecil reflexioacuten puesto que ambas se encontraban muy

parejas decidimos decantarnos por Redmine primando la

sencillez y rapidez Existiacutea la posibilidad de que terceros la

empleasen y veiacuteamos que Redmine permitiacutea una mayor facilidad

en su manejo y resultaba maacutes intuitiva de cara a aprender a

utilizarla Posteriormente tras su uso hemos detectado algunos

inconvenientes importantes como la imposibilidad de asignar una

peticioacuten a maacutes de un usuario pero es que no hay herramienta

perfecta

Bibliografiacutea

httpwwwnavegapolisnetcontentview5649

httpwwwsimpleprojectmanagementcomhomehtml

httpwwwweb-based-softwarecomproject

httpenwikipediaorgwikiComparison_of_issue_tracking_syste

ms

httpenwikipediaorgwikiList_of_project_management_softwa

re

httpwwwpmdigestcomsoftware

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Rauacutel Sanz de Acedo

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo Lexers parsers JavaCC (y II)

Texto En este artiacuteculo vamos a utilizar JavaCC como herramienta para

implementar un moacutedulo que resuelva la casuiacutestica de la

impresioacuten de las diversas paacuteginas de un fichero Esto es lo que se

refleja en esta imagen

Para ello en el artiacuteculo anterior definimos esta gramaacutetica a la que

asociamos unas acciones semaacutenticas

inicio --gt inicializacionVariables

listaElementos

procesarDatos

listaElementos --gt elemento

restoListaElementos

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

restoListaElementos --gt SEPARADOR

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

listaElementos

|

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

restoListaElementos2 --gt GUION ENTERO

num2 = valor(ENTERO)

Si (num2 gt maxPaginas)

or (num2==0) ent error

|

JavaCC es una herramienta que dado un fichero de extensioacuten

jj que describe la gramaacutetica y sus acciones semaacutenticas

asociadas genera los ficheros java que la implementan

Estos ficheros java pueden luego obviamente incluirse en

aqueacutellos que conforman el resto de nuestra aplicacioacuten

JavaCC es una herramienta gratuita que puede descargarse

desde aquiacute Existe tambieacuten un plugin para Eclipse Y asimismo

existe una task de Ant para JavaCC

Vamos pues a construir nuestro parser

Lo denominaremos parserImprimePaginasCC y por lo tanto

vamos a editar el fichero parserImprimePaginasCCjj

Indicaremos coacutemo se traducen los tokens y las producciones a

formato JavaCC

TOKEN

ltENTERO([0-9])+gt

| ltGUION -gt

| ltSEPARADOR([ ])+ | ([ ])gt

Los tokens se describen praacutecticamente como lo indicamos en la

gramaacutetica

void inicio()throws elementoFueraLimitesException

resultado = new Vector()

num1 = -1

num2 = -1

inicializaFlags()

listaElementos()

void listaElementos()throws elementoFueraLimitesExcept

ion

elemento() restoListaElementos()

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

restoListaElementos2()

void restoListaElementos()throws elementoFueraLimitesE

xception

ltSEPARADORgt

insertaElemento(num1 num2)

num1 = -1

num2 = -1

listaElementos()

|

insertaElemento(num1 num2)

num1 = -1

num2 = -1

void restoListaElementos2()throws elementoFueraLimites

Exception

ltGUIONgtltENTEROgt

num2 = IntegervalueOf(tokenimage)intValue()

if ((num2gtmaximo)|| (num2 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num2))

|

Las producciones son algo diferentes lo que era

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

ahora es

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(IntegertoS

tring(num1))

restoListaElementos2()

El no terminal elemento se describe como void elemento() y

ademaacutes le hemos asociado una excepcioacuten para controlar el hecho

de que un usuario coloque 0 o un nuacutemero mayor que el

permitido Lo que en la parte derecha es ENTERO se indica

como ltENTEROgt y la invocacioacuten de restoListaElementos2

es restoListaElementos2()

Las acciones semaacutenticas

num1 = valor(ENTERO)

Si (num1 gt maxPaginas) or (num1==0) ent error

se indican en JavaCC asiacute

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

El valor del token actual es accesible a traveacutes de tokenimage

Si deseamos tener coacutedigo Java adicional fuera de las

producciones lo podemos antildeadir de esta forma con la palabra

reservada JAVACODE

JAVACODE void insertaElemento(int num1 int num2)

int aux i iFlag

if ((num1 = -1) ampamp (num2 = -1))

if (num1gtnum2)

aux = num1

num1 = num2

num2 = aux

for (i = num1

i lt= num2

i++)

iFlag = i-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(i))

flags[iFlag] = true

else if (num1 = -1)

iFlag = num1-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num1))

flags[iFlag] = true

else if (num2 = -1)

iFlag = num2-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num2))

flags[iFlag] = true

JAVACODE void inicializaFlags()

int i

flags = new boolean [maximo]

for (i = 0

iltmaximo

i++)

flags[i] = false

Ademaacutes podemos inicializar el parser e instanciarlo de esta

forma

PARSER_BEGIN(parserImprimePaginasCC)

import javaio

import javautilVector

public class parserImprimePaginasCC

public static int maximo

public static Vector resultado

private static int num1 num2

private static boolean flags[]

public static void main(String[]args)throws Exceptio

n

Reader r = new StringReader(args[0])

parserImprimePaginasCC p

= new parserImprimePaginasCC(r)

try

pmaximo = 50

Systemoutprintln(Maacuteximo +pmaximo)

pinicio()

Systemoutprintln(OKn)

for (int j = 0

jltpresultadosize()

j++)

Systemoutprint(presultadoelementAt(j)+

)

Systemoutprintln()

catch (ParseException e)

Systemoutprintln(Error de sintaxis)

catch (TokenMgrError e)

Systemoutprintln(Error leacutexico)

catch (elementoFueraLimitesException e)

Systemoutprintln(egetMessage())

PARSER_END(parserImprimePaginasCC)

En este caso tomaremos la entrada de lo que el usuario

introduzca por teclado pero se pueden tomar los datos a traveacutes

de ficheros o pasarlos como variables

Se hace referencia a una excepcioacuten que hemos definido asiacute en un

fichero llamado elementoFueraLimitesExceptionjava

public class elementoFueraLimitesException extends Exc

eption

Constructor

public elementoFueraLimitesException()

super()

public elementoFueraLimitesException(String msg)

super(msg)

Una vez salvado el fichero parserImprimePaginasCCjj podemos

generar la documentacioacuten de la gramaacutetica en formato HTML de

esta forma

Nota en la ejecucioacuten de estos ejemplos se ha utilizado la liacutenea de comandos de

Windows pero se podriacutea haber hecho a traveacutes de cualquier sistema que soporte

el lenguaje Java

gtjjdoc parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Documentation

Generator Version 014)

(type jjdoc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Grammar documentation generated successfully in

parserImprimePaginasCChtml

Se genera el fichero parserImprimePaginasCChtmlcuyo

contenido es

BNF for parserImprimePaginasCCjj NON-TERMINALS

inicio = listaElementos

listaElementos = elemento restoListaElementos

elemento = ltENTEROgt restoListaElementos2

restoListaElementos = ltSEPARADORgt listaElementos

|

restoListaElementos2 = ltGUIONgt ltENTEROgt

|

insertaElemento = java code

inicializaFlags = java code

Nota BNF es el tipo de notacioacuten que estamos utilizando a lo largo de estos

artiacuteculos

Compilamos el parser

gtjavacc parser ImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

File TokenMgrErrorjava does not exist Will create

one

File ParseExceptionjava does not exist Will

create one

File Tokenjava does not exist Will create one

File SimpleCharStreamjava does not exist Will

create one

Parser generated successfully

y entonces se generan estos ficheros

ParseExceptionjava --gt

Excepcioacuten generada por el parser cuando un error es encontrado

parserImprimePaginasCCjava --gt La

traduccioacuten de nuestro fichero jj a java

parserImprimePaginasCCConstantsjava --gt Los

valores de los tokens

parserImprimePaginasCCTokenManagerjava --gt El

analizador leacutexico

SimpleCharStreamjava --gt

Contiene coacutedigo para leer caracteres de cualquier

implementacioacuten de javaioInputStream o javaioReader

Tokenjava --gt

Definicioacuten de la clase Token

TokenMgrErrorjava --gt

Diversos errores que puede producir el lexer

Ahora los compilamos y antildeadimos el fichero

elementoFueraLimitesExceptionjava en dicha compilacioacuten

javac java

Y vamos a ejecutar el parser suponiendo que el maacuteximo nuacutemero

de paacuteginas a impmir es 50 (como hemos indicado con pmaximo =

50)

Lo que obtenemos como salida es la lista de paacuteginas a imprimir o

un mensaje de error

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

OK

2 5 6 7 8

java -classpath laboratorioParsers

parserImprimePaginasCC 28-3046

Num paginas 50

OK

28 29 30 4 6

java -classpath laboratorioParsers

parserImprimePaginasCC 43-51

Num paginas 50

Introdujo un numero superior al maximo51

java -classpath laboratorioParsers

parserImprimePaginasCC 43--51

Num paginas 50

Error de sintaxisEncountered - at line 1

column 4

Was expecting

ltENTEROgt

iquestQueacute pasa si algo ha ido mal iquestPodemos depurar el parser de

alguna forma

Por supuesto podemos compilar el parser asiacute para obtener una

traza de la ejecucioacuten

javacc -DEBUG_PARSER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Consumed token lt- at line 1 column 4gt

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

En la traza vemos coacutemo el parser va invocando la diferentes

producciones

Podemos tambieacuten depurar el lexer

javacc -DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Returning the ltEOFgt token

OK

2 5 6 7 8

O combinar ambas trazas

javacc -DEBUG_PARSER -

DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Consumed token lt- at line 1 column 4gt

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Returning the ltEOFgt token

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

Conclusioacuten los generadores de parsers son herramientas

potentes que sirven para resolver problemas de una manera

bdquolimpia‟ y elegante Puede que su nombre retraiga a los

desarrolladores (ldquoiquestPara queacute quiero un generador de

compiladoresrdquo) pero es una opcioacuten a tener en cuenta

Ficheros para descargar

Referencias

- Generating Parsers with JavaCC

- The JavaCC FAQ

Si quieres enviar alguacuten comentario o sugerir temas a tratar en otros artiacuteculos escribe a

curtasun[simboloArroba]ceines

Categor

iacuteas

CES OpenSouceJava

Tema Desarrollo

Autor Carlos Urtasun

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo XSL-FO (Parte 1)

Texto XSL-FO Introduccioacuten El estaacutendar XSL tal y como estaacute definido actualmente se

divide en dos grandes partes -XSLT transformacioacuten de un documento de entrada XML en

alguacuten tipo de documento de salida ya sea XML HTML PDF etc -Formatting Objects (FO) definen la visualizacioacuten final del

resultado de la transformacioacuten Son una implementacioacuten especiacutefica de un determinado XSLT y aplicados a un

fichero XML nos proporcionan otro fichero con la informacioacuten de eacuteste renderizada a alguacuten formato de visualizacioacuten impresa Eacutesta es quizaacute la principal diferencia entre un FO y

otros XSLT ambos transforman un documento XML en otro documento XML pero FO estaacute pensado para generar

directamente una renderizacioacuten

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 3: Cesnavarra 2008-boletín 7

Normalmente todo iraacute bien y se actualizaraacute correctamente

Para terminar reiniciamos y todo estaraacute listo a falta de unas comprobaciones de IP y dominio Pero si nuestro sistema

virtualizado dispone de alguna actualizacioacuten o versioacuten de los drivers de VM que no gusta a nuestro instalador nos devolveraacute un mensaje de error tan poco expliacutecito como Error Error

grave durante la instalacioacuten Y nada maacutes

Para solucionarlo en vez de ejecutar el programa ldquoSetupexerdquo

del ldquoIntegration Services Setup diskrdquo tendremos que lanzar un ejecutable del mismo disco pero un poco maacutes oculto se trata

del ldquoupdateexerdquo que reside en ldquosupportx86en-usupdaterdquo

En esta imagen se puede ver que tambieacuten he ejecutado el

Administrador de tareas de Windows pero soacutelo como soporte desde el que lanzar el ldquoexplorerexerdquo mediante su menuacute ldquoArchivordquo ya que los problemas con la instalacioacuten de los

Servicios de Integracioacuten para esta versioacuten de Hyper-V impiden

el uso del ratoacutenhellip algo bastante molesto la verdad Una vez lanzado este update tendremos que reiniciar nuestro servidor

virtual y todo habraacute vuelto a funcionar normalmente sobre todo nuestro ratoacuten y la tarjeta de red

Finalmente soacutelo tendremos que corregir nuestra asignacioacuten de

IPs a la maacutequina virtual si no utilizamos asignacioacuten dinaacutemica

Recibiremos un aviso sobre si queremos asignar una direccioacuten

IP diferente ya que la anteriormente asignada todaviacutea estaacute

asociada a un dispositivo anterior (aunque sea a un dispositivo oculto porque ya no existe maacutes en el sistema la anterior tarjeta

de red virtualizada) Respondemos No para que confirme los valores que acabamos de introducir y recuperaremos la conectividad de nuestra maacutequina virtual

Por uacuteltimo soacutelo tendremos que volver a agregar el servidor al dominio si era parte de alguno y listo (bueno para 12 maacutequinas

se hace un poco pesadohellip pero funciona) Microsoft Office OneNote 2007 Como nota final queriacutea hablar un poco sobre una herramienta que he descubierto este mes oculta en la licencia de Office

2007 completa y que teniacutea olvidada por ahiacute llamada Microsoft Office OneNote La idea de Microsoft es que este producto pueda sustituir al

montoacuten de pequentildeos papelitos y notas que al final del diacutea reuniones llamadas mails etc vamos recopilando y que luego

no hay manera de encontrar OneNote es como un bloc de notas con esteroides (se carga muy raacutepido) ya que nos permite hacer mucho mucho maacutes que el viejo y querido bloc

- la capacidad de buscar informacioacuten en todas nuestras

notas al estilo de la que ofrece Outlook 2007 - si eso por siacute soacutelo ya es una bendicioacuten antildeadireacute que

OneNote nos permite emplear en cualquier nota imaacutegenes obtenidas desde caacutemaras o escaneadas (por

ejemplo tarjetas de negociohellip) archivos recortes de pantalla e incluso grabaciones de audio y video

- pero es que ademaacutes su buacutesqueda nos permite buscar

en los contenidos de estos elementos tambieacuten Es

decir podemos buscar en un archivo o imagen

importados

OneNote ofrece por defecto una organizacioacuten de notas dividida en profesionales y personales de manera que nos permite

emplear la aplicacioacuten para todo nuestro diacutea a diacutea Dentro de cada una establece unas sub-categoriacuteas como Notas de la reunioacuten Viajes Proyectos etc pero que son totalmente

modificables a nuestro gusto Incorpora tambieacuten una serie de plantillas para nuevas notas que se puede ampliar descargando

nuevas versiones desde la web de Microsoft Office Ademaacutes la gestioacuten de las notas es totalmente automaacutetica es decir que no perderemos nunca lo que estamos editando Ademaacutes mediante

un icono que situacutea en nuestra barra de tareas tenemos acceso inmediato a OneNote desde cualquier aplicacioacuten Por uacuteltimo OneNote permite compartir notas con otros usuarios exportarlas a Word (donde por ejemplo acabareacute de editar este artiacuteculo tras haberlo esbozado en

OneNote) enviarlas como correo en Outlook a cualquier destinatario o publicarlas en nuestros sitios de SharePoint para

tener una versioacuten colaborativa en Web Y algunas otras extravagancias como generar una Tarea de Outlook desde una nota de OneNote automaacuteticamente para sincronizarla con todos

nuestros dispositivos o asignar tiempo para hacer la tarea etiquetar nuestras notas con gran flexibilidad para poder

localizarlas luego maacutes faacutecilmente

Y por ultimo y no menos importante llevar a cabo sesiones de

trabajo compartidas entre varios miembros de un equipo sobre una misma nota remotamente (una manera muy uacutetil de llevar a

cabo tormentas de ideas) etcPor eso Por eso podemos llamar a OneNote la navaja suiza de los productos Office y recomiendo su utilizacioacuten

Categoriacuteas

CES Microsoft

Tema Varios

Autor Rafael Flores Yoldi

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo Strings StringBuffershellip y Ropes

Texto El manejo de las cadenas de caracteres es un aspecto fundamental en cualquier

lenguaje de programacioacuten En este artiacuteculo daremos un breve repaso al manejo

de cadenas en Java y a las clases maacutes importantes del lenguaje en este aspecto

como son String StringBuffer y StringBuilder

Ademaacutes introduciremos una libreriacutea para el manejo avanzado de

cadenas Ropes For Java

La clase String

La clase String representa una cadena de caracteres con una caracteriacutestica

fundamental es inmutable Es decir una vez creado un String no es posible

modificarlo Los meacutetodos que concatenan reemplazan caracteres etc

devuelven otro objeto con las modificaciones realizadas

Por ejemplo tras ejecutar el siguiente coacutedigo

String str = ldquoLa clase String es ldquo strconcat(ldquoinmutablerdquo)

el valor de la variable str sigue siendo ldquoLa clase String es ldquo

En cambio si hacemos

String str2 = strconcat(ldquoinmutablerdquo) el nuevo String str2 ya contendraacute la cadena completa ldquoLa clase String

es inmutableldquo

Por esta caracteriacutestica la clase String no es adecuada si lo que se necesita es

realizar muchas modificaciones sobre el texto ya que supone la creacioacuten de

muchos objetos temporales

StringBuffer y StringBuilder

La clase StringBuffer es la variante mutable de String Permite modificar su

contenido concatenar cadenas etc de forma mucho maacutes eficiente que la

claseString

En la versioacuten 5 de Java se incluyoacute la clase StringBuilder que es igual que la

clase StringBuilder pero no sincronizada Si el objeto no va a ser accedido por

maacutes de un hilo simultaacuteneamente se recomienda el uso de StringBuilder ya que

al no ser sincronizado mejora ligeramente el rendimiento

Al utilizar StringBuffer o StringBuilder hay un aspecto que muchas veces no se

tiene en cuenta y que puede tener un impacto importante en el rendimiento la

capacidad inicial

Estos objetos almacenan un array de caracteres que debe ser regenerado

cuando las operaciones hacen que se sobrepase la capacidad del array

Inicializar el objeto a un valor adecuado puede mejorar el rendimiento global

del objeto Por defecto se inicializan con una capacidad de 16 caracteres

Cada vez que debe crecer el nuevo tamantildeo es 2 + 2TamantildeoActual Si el

tamantildeo no va a ser muy grande la diferencia de rendimiento seraacute inapreciable

pero esta inicializacioacuten debe ser tenida en cuenta para el manejo de grandes

cadenas

Cadenas en tiempo de compilacioacuten y en tiempo de

ejecucioacuten

Como curiosidad cabe destacar la labor del compilador de Java en el manejo de

cadenas A veces para mejorar la legibilidad se escribe coacutedigo de este tipo

String sql = select col1 col2 col3 + from table1 t1+

join table2 t2 on t1col1 =

t2col1+ join table3 t3 on t2col3 =

t3col2+ where t1col1 = and t3col3 =

oacute

StringBuffer sbsql = new StringBuffer(select

col1 col2 col3 ) sbsqlappend(from table1 t1) sbsqlappend(join table2 t2 on t1col1 =

t2col1) sbsqlappend(join table3 t3 on t2col3 =

t3col2) sbsqlappend(where t1col1 = and t3col3 =

) String sql = sbsqltoString()

En este caso la primera opcioacuten con la suma de cadenas ofrece mejor

rendimiento que la que utiliza el StringBuffer La explicacioacuten estaacute en el

compilador de Java que realiza la suma de las cadenas en tiempo de

compilacioacuten

Cuando la concatenacioacuten se realiza en tiempo de ejecucioacuten (concatenacioacuten de

variables no de cadenas constantes) el rendimiento mejora

utilizandoStringBuffer como se ha comentado en el punto anterior En este

caso si se suman Strings el compilador genera un StringBuffer para cada suma

de cadenas penalizando el rendimiento frente a la utilizacioacuten de un solo

objeto StringBuffer

Las tres preguntas

Podemos resumir lo visto hasta ahora en tres preguntas que deberiacuteamos

hacernos antes de escribir String str = hellip

iquestVoy a modificar esta cadena Si la repuesta es no o simplemente voy a concatenar cadenas constantes para

mejorar la legibilidad del coacutedigo usareacute String

Si voy a modificarla en funcioacuten de la ejecucioacuten

usareacute StringBuffer o StringBuilder

iquestVa a acceder maacutes de un hilo a mi cadena simultaacuteneamente Si es asiacute usareacute un StringBuffer que asegura la sincronizacioacuten

Si no es asiacute algo que sucederaacute en la mayor parte de los casos

usareacute StringBuilder ya que es maacutes eficiente

iquestPuedo estimar la maacutexima longitud de la cadena Si es asiacute inicializareacute mi StringBuffer o StringBuilder con esa capacidad para

evitar que el objeto deba regenerar su buffer interno cada vez que sobrepase su

capacidad

Un paso maacutes Ropes

En aplicaciones donde el rendimiento es fundamental en el uso de cadenas

puede ser conveniente el uso de otro tipo de estructuras de datos para su

representacioacuten y manejo

Un ejemplo de ello es la estructura de datos denominada Rope

Este concepto no es nuevo se introdujo en un artiacuteculo de 1995(2) y representa

las cadenas con una estructura de aacuterbol de forma que mejora el rendimiento

en operaciones como la insercioacuten y la concatenacioacuten de cadenas El precio a

pagar por estas mejoras de rendimiento viene en forma de uso de memoria

que es sensiblemente superior usando Ropes frente al uso de Strings o

StringBuffers

Existe una implementacioacuten en Java de esta estructura llamada Ropes For

Java(4) Como ejemplo estas son algunas graacuteficas del rendimiento de esta

implementacioacuten publicadas en un artiacuteculo del autor Amin Ahmad(3)

Referencias 1 - Performance improvement techniques in String and StringBuffer

2 - Ropes an Alternative to Strings

3 - Ropes Theory and practice

4 - Ropes For Java

Categoriacute

as

CES OpenSouceJava

Tema Desarrollo

Autor Miguel Bacaicoa

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo Herramientas de gestioacuten de proyectos Open Source

Texto Haraacute unos meses nos vimos en la tesitura de buscar una

herramienta de gestioacuten de proyectos para el Centro Java y Open

Source

Hasta el momento habiacuteamos estado trabajando con dotproject

un sistema con bastante capacidad y funcionalidades No

obstante resultoacute ser una herramienta algo pesada en la creacioacuten

de planificaciones y tediosa en el mantenimiento diacutea a diacutea

Buscaacutebamos principalmente una herramienta que no solo

gestionase la parte de planificacioacuten sino tambieacuten la parte de

seguimiento posterior para mantener el control sobre el proyecto

Ademaacutes deseaacutebamos un entorno colaborativo multi-usuario y

participativo entre nosotros y cualquier colaborador externo Lo

cual maacutes que un requerimiento funcional supone un cambio

cultural la parte maacutes compleja

Todo esto en principio decantaba la decisioacuten por una opcioacuten on-

line en detrimento de una de escritorio No obstante decidimos

valorar tambieacuten las de escritorio no fuera que por empecinarnos

en unas funcionalidades descartaacutesemos otras importantes

A continuacioacuten describireacute brevemente algunas de las

herramientas valoradas

De escritorio

GanttProject

Aplicacioacuten de escritorio muy extendida y uacutetil que permite

planificar tareas y recursos sobre un diagrama Gantt Se trata de

una herramienta similar a MS Project pero maacutes sencilla lo cual

puede ser en algunos casos una ventaja Otra caracteriacutestica

interesante es que funciona tanto en Linux como en Windows y

tiene diversos formatos de exportacioacuten e importacioacuten

Planner

Aplicacioacuten de escritorio bastante extendida y algo maacutes completa

a la anterior (a pesat de tener menos opciones de importacioacuten y

exportacioacuten) pero muy similar En este caso estaacute desarrollada

para Linux aunque existe versioacuten beta para Windows

Open Workbench

Aplicacioacuten de escritorio muy completa Al igual que las anteriores

permite gestionar tareas y recursos sobre un diagrama Gantt

aunque tambieacuten permite otros diagramas como Pert camino

criacutetico y funcionalidades maacutes avanzadas Se vanagloria de ser

incluso mejor que MS Project

TaskJuggler

Se trata de una herramienta de escritorio disponible tanto para

Windows como para Linux un tanto peculiar Genera una serie de

informes bastante completos a partir de un fichero de texto El

interfaz es bastante amigable pero el hecho de andar editando

un fichero de texto que contiene la planificacioacuten no resulta muy

coacutemodo

OpenProj

Otro programa de escritorio sustitutivo de MS Project y de

apariencia muy similar Tiene versiones para Linux Unix Mac y

Windows y es compatible con ficheros MS Project y con todas sus

funcionalidades No obstante parece no estar indicado para

proyectos de grupo En estos casos te ofrecen una versioacuten on-

line (Project-ON-Demand) bajo demanda y de pago bastante

interesante

Entorno web

TeamSCOPE

Team Software for Collaborative Project Environments es una

herramienta web de colaboracioacuten Desarrollado para funcionar

sobre Debian fue creado por una universidad pero parece

haberse quedado bastante anticuado

NetOffice

Herramienta web basada en PHP sobre MySQL para gestionar proyectos tareas registros de tiempos incidenciaserrores

diagramas de Gantt (aunque un poco escondidos) etc similar pero algo maacutes agradable que dotProject Tiene ciertos tintes de herramienta de colaboracioacuten en grupo (groupware)

phpCollab

Herramienta web basada en PHP que ha sufrido un desarrollo

intermitente por lo que parece Sirve tanto para la gestioacuten de

tareas como para el seguimiento de incidenciaserrores Tiene un

aspecto similar a netOffice lo cual hace pensar que uno de los

dos proyectos deriva del otro Quizaacutes por esa razoacuten de elegir una

de las dos sea maacutes recomendable netOffice

Achievo

Herramienta web PHP sobre MySQL para la gestioacuten de proyectos

tareas recursos registro de tiempos agenda generacioacuten de

informes etc Bastante completo ademaacutes parece incluir seccioacuten

presupuestaria

XPlanner

Herramienta web Java sobre MySQL para la gestioacuten de proyectos

mediante XP y Scrum No obstante parece estancada en una

versioacuten beta desde el 2006

PPTS

Project Planning and Tracking System (PPTS) es una herramienta

Web para la gestioacuten de proyectos con metodologiacuteas XP y Scrum

al igual que la anterior Esta desarrollada en PHP contra MySQL

aunque parece tambieacuten largo tiempo abandonada

XPWeb

Al igual que las anteriores es una herramienta web para la

gestioacuten de proyectos aacutegiles incluyendo gestioacuten de tareas

calendarios informes etc Tambieacuten parece estancada

Trac

Herramienta web ampliamente extendida en la comunidad open

source para fundamentalmente el seguimiento proyectos Se

centra en la gestioacuten de incidencias y errores aunque tiene

funcionalidades antildeadidas interesantes como Wiki e integracioacuten

con Subversioacuten Hay que resentildear que se trata de una

herramienta mono-proyecto y que no cuenta con Gantt

OpenProject

Herramienta web de gestioacuten de proyectos muy completa Posee

todo lo necesario tanto que uno llega a perderse No obstante

pueden configurarse los moacutedulos que desean usarse y descartar

aquellos que no son necesarios calendario gestioacuten de tareas

seguimiento de incidencias control presupuestario Wiki foros

integracioacuten con ERPs diagramas Gantt y una larga lista de

funcionalidades

Tutos

The Ultimate Team Organization Software o eso pretende Se

trata de una herramienta web LAMP con muchas funcionalidades

calendario y agenda seguimiento de incidencias y errores

gestioacuten de tareas diagramas Gantt gestioacuten documental gestioacuten

de correos facturas e informes Interesante pero austera de

aspecto y un poco anticuada

Project Dune

Herramienta web desarrollada en Java contra MySQL que pareciacutea

prometer bastante Tiene lo necesario gestioacuten de tareas

recursos incidencias gestioacuten documental registro de tiempos

informes calendario y agenda RSS inspeccioacuten de coacutedigo

importacioacuten de MS Project etc No obstante en su evaluacioacuten

dejoacute bastante que desear resultando poco praacutectica y manejable

Collabtive

Se trata de una herramienta web LAMP para la gestioacuten de

proyectos Seguacuten se indica en la web cubre la gestioacuten de tareas e

incidencias gestioacuten documental y mensajeriacutea Es muy limpia

sencilla y aacutegil No obstante no parece contar con diagramas

Gantt ni con registro de tiempos o informes de estado En la

praacutectica parece quedarse un poco justa pero prometedora

Mindquarry

Herramienta web desarrollada en Java que pretende ser la

alternativa open source de soluciones propietarias como

Basecamp o Sharepoint para la gestioacuten de proyectos y grupos de

trabajo de forma colaborativa Tiene una versioacuten open source

para descarga y otra como servicio bajo demanda La pega es

que la empresa parece haber dejado de desarrollar su actividad

ClockingIT

Se trata de una herramienta Web desarrollada en Ruby como

servicio bajo demanda Permite una gestioacuten de tareas agenda

siguiendo el estaacutendar iCal seguimiento de tiempos generacioacuten

de informes notificaciones RSS foros Chat y Wiki repositorio

de ficheros etc

LibreSource

Se trata de una plataforma web colaborativa para el desarrollo de

software lo que se suele denominar forja y funcionalidades de

groupware archivado y publicacioacuten web Es open source y

altamente ajustable Permite alojar muacuteltiples proyectos varios

grupos de usuarios etc Estaacute desarrollada en J2EE e incorpora

entre otras cosas Wiki integracioacuten con Subversion zonas de

descarga gestioacuten documental mensajeriacutea instantaacutenea con

Jabber gestioacuten de incidencias etc No fue evaluada al ser

descubierta posteriormente a la implantacioacuten de la herramienta

elegida pero parece una buena alternativa

Aunque existen infinidad maacutes de entre todas nos decantamos

por dos que valoramos maacutes en profundidad

TeamWork

Se trata de una herramienta web desarrollada en Java por unos

Italianos Entre sus funcionalidades cabe destacar la gestioacuten de

proyectos y tareas con diversos diagramas de Gantt muy

logrados gestioacuten de incidencias gestioacuten documental entorno

colaborativo tipo groupware control de costes registros de

tiempos etc

Es muy completo raacutepido de respuesta y posee caracteriacutesticas

muy interesantes como una interesante y uacutetil navegacioacuten

contextual entre tareas del proyecto perfiles de usuario seguacuten

proyecto importacioacuten de planificaciones desde MS Project o

asociacioacuten entre incidencias y tareas

Cuenta con wizards para la configuracioacuten de la herramienta de

forma raacutepida y sencilla incluyendo la posibilidad de generar

plantillas para aplicar metodologiacuteas aacutegiles (Scrum)

El registro de horas por tarea para un desarrollador se realiza de

forma muy coacutemoda y raacutepida desde una simple vista facilitando

la participacioacuten del mismo

Se trataba de una aplicacioacuten muy completa quizaacutes demasiado

un poco compleja de entender en un comienzo pero con muchas

posibilidades

No obstante teniacutea alguna que otra pega aunque es open source

posee una licencia de pago para su uso que en cualquier caso era

muy pequentildea Tiene una versioacuten de evaluacioacuten de 30 diacuteas para

quien desee probarla antes de decidir Por otro lado no distingue

proyectos existe una tarea padre que agrupa toda la

planificacioacuten asociada tampoco cuenta con Wiki y no gestiona las

vacaciones del personal

La otra herramienta valorada maacutes en profundidad fue

Redmine

Se trata de otra herramienta web en este caso desarrollada en

Ruby on Rails con una gran cantidad de funcionalidades que la

acerca bastante a una forja pero sin tener la complejidad de la

misma Entre sus caracteriacutesticas cabe destacar la gestioacuten de

tareas incidencias diagramas de Gantt calendario de

actividades noticias foros wikis gestioacuten de ficheros y

documentos integracioacuten con Subversioacuten control de tiempos

generacioacuten de informes etc todo esto por proyecto Por

similitudes del interfaz y funcionalidades parece estar basado en

Trac pero con un lavado de cara y de coacutedigo importante ademaacutes

de ser multi-proyecto

Al igual que la anterior tambieacuten poseiacutea una serie de

caracteriacutesticas que la haciacutea diferente como la posible navegacioacuten

anoacutenima de lectura si asiacute se desea sobre los proyectos alojados

Interesante desde el punto de vista de filosofiacutea open source

Posibilidad de definir un perfil distinto por usuario seguacuten el

proyecto en el que participa

Tambieacuten cuenta con sindicacioacuten de RSS para las secciones de

noticias tareas incidencias etc y exportacioacuten a ficheros de texto

y HTML desde la Wiki los informes generados e incluso el

diagrama de Gantt

A parte se trata de un interfaz muy limpio intuitivo sencillo de

usar y rapidiacutesimo

La configuracioacuten de la herramienta resulta asiacute mismo muy

sencilla con un par de clics puedes empezar a funcionar

Cada proyecto puede configurarse con los moacutedulos que desees

que tenga ademaacutes de poder definir campos personalizados por

proyecto y tarea para permitir una mayor adaptacioacuten

Cabe destacar que para esta herramienta existe un uacutenico

concepto denominado peticioacuten que puede ser de tres tipos

tareas soporte o incidencia De esta forma todo se gestiona de

igual forma lo cual lo simplifica pero a su vez puede convertirse

en un volumen ingestionable de tareas Para evitar esto se

pueden definir categoriacuteas a las que pertenece una peticioacuten y

realizar posteriormente filtrados de peticiones en las vistas seguacuten

este y otros paraacutemetros

No obstante no todo iba a ser color de rosa tiene una serie de

limitaciones como el sistema un tanto engorroso de enlazar

peticiones o el hecho de que una vez creada una peticioacuten su

nombre y descripcioacuten no se pueden modificar tan solo ir

antildeadiendo nuevas descripciones

En este punto nos encontraacutebamos en una difiacutecil decisioacuten puesto

que ambas herramientas nos gustaban cubriacutean lo necesario pero

se trataban de herramientas muy distintas en concepcioacuten Para

facilitar la decisioacuten realizamos un cuadro comparando las

caracteriacutesticas y priorizaacutendolas seguacuten nuestro intereacutes El

resultado fue el siguiente

Prioridad Caracteriacutestica Redmine TeamWork

9 Integracioacuten con

LDAP Si Si

8 Integracioacuten con

Subversion Si Si

8 Traducido al espantildeol

Si No

7 Importacioacuten desde

Project No Si

7 Exportacioacuten a

Project No Si

7 Centros de coste Posible mediante los campos

personalizados

Si

7 Wikis de proyectos Si

7 Personalizacioacuten

extensioacuten Si Si

6 Gestioacuten de vacaciones

No Vacaciones a nivel de

empresa

6 Vida de la herramienta

Indeterminado al ser una

herramienta open source

Algo maacutes seguro

porque hay una empresa detraacutes

5 Facilidad de configuracioacuten

Si

5 Usuarios multi-

perfil Si Si

4 Acceso restringido a usuarios

Si Si

3 Sencillez de manejo

Si

2 Seguimiento de

incidencias Si Si

1 Asignacioacuten de tareas

Si Si

1 Imputacioacuten a tareas asignadas

Si Si

Tras una difiacutecil reflexioacuten puesto que ambas se encontraban muy

parejas decidimos decantarnos por Redmine primando la

sencillez y rapidez Existiacutea la posibilidad de que terceros la

empleasen y veiacuteamos que Redmine permitiacutea una mayor facilidad

en su manejo y resultaba maacutes intuitiva de cara a aprender a

utilizarla Posteriormente tras su uso hemos detectado algunos

inconvenientes importantes como la imposibilidad de asignar una

peticioacuten a maacutes de un usuario pero es que no hay herramienta

perfecta

Bibliografiacutea

httpwwwnavegapolisnetcontentview5649

httpwwwsimpleprojectmanagementcomhomehtml

httpwwwweb-based-softwarecomproject

httpenwikipediaorgwikiComparison_of_issue_tracking_syste

ms

httpenwikipediaorgwikiList_of_project_management_softwa

re

httpwwwpmdigestcomsoftware

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Rauacutel Sanz de Acedo

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo Lexers parsers JavaCC (y II)

Texto En este artiacuteculo vamos a utilizar JavaCC como herramienta para

implementar un moacutedulo que resuelva la casuiacutestica de la

impresioacuten de las diversas paacuteginas de un fichero Esto es lo que se

refleja en esta imagen

Para ello en el artiacuteculo anterior definimos esta gramaacutetica a la que

asociamos unas acciones semaacutenticas

inicio --gt inicializacionVariables

listaElementos

procesarDatos

listaElementos --gt elemento

restoListaElementos

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

restoListaElementos --gt SEPARADOR

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

listaElementos

|

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

restoListaElementos2 --gt GUION ENTERO

num2 = valor(ENTERO)

Si (num2 gt maxPaginas)

or (num2==0) ent error

|

JavaCC es una herramienta que dado un fichero de extensioacuten

jj que describe la gramaacutetica y sus acciones semaacutenticas

asociadas genera los ficheros java que la implementan

Estos ficheros java pueden luego obviamente incluirse en

aqueacutellos que conforman el resto de nuestra aplicacioacuten

JavaCC es una herramienta gratuita que puede descargarse

desde aquiacute Existe tambieacuten un plugin para Eclipse Y asimismo

existe una task de Ant para JavaCC

Vamos pues a construir nuestro parser

Lo denominaremos parserImprimePaginasCC y por lo tanto

vamos a editar el fichero parserImprimePaginasCCjj

Indicaremos coacutemo se traducen los tokens y las producciones a

formato JavaCC

TOKEN

ltENTERO([0-9])+gt

| ltGUION -gt

| ltSEPARADOR([ ])+ | ([ ])gt

Los tokens se describen praacutecticamente como lo indicamos en la

gramaacutetica

void inicio()throws elementoFueraLimitesException

resultado = new Vector()

num1 = -1

num2 = -1

inicializaFlags()

listaElementos()

void listaElementos()throws elementoFueraLimitesExcept

ion

elemento() restoListaElementos()

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

restoListaElementos2()

void restoListaElementos()throws elementoFueraLimitesE

xception

ltSEPARADORgt

insertaElemento(num1 num2)

num1 = -1

num2 = -1

listaElementos()

|

insertaElemento(num1 num2)

num1 = -1

num2 = -1

void restoListaElementos2()throws elementoFueraLimites

Exception

ltGUIONgtltENTEROgt

num2 = IntegervalueOf(tokenimage)intValue()

if ((num2gtmaximo)|| (num2 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num2))

|

Las producciones son algo diferentes lo que era

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

ahora es

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(IntegertoS

tring(num1))

restoListaElementos2()

El no terminal elemento se describe como void elemento() y

ademaacutes le hemos asociado una excepcioacuten para controlar el hecho

de que un usuario coloque 0 o un nuacutemero mayor que el

permitido Lo que en la parte derecha es ENTERO se indica

como ltENTEROgt y la invocacioacuten de restoListaElementos2

es restoListaElementos2()

Las acciones semaacutenticas

num1 = valor(ENTERO)

Si (num1 gt maxPaginas) or (num1==0) ent error

se indican en JavaCC asiacute

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

El valor del token actual es accesible a traveacutes de tokenimage

Si deseamos tener coacutedigo Java adicional fuera de las

producciones lo podemos antildeadir de esta forma con la palabra

reservada JAVACODE

JAVACODE void insertaElemento(int num1 int num2)

int aux i iFlag

if ((num1 = -1) ampamp (num2 = -1))

if (num1gtnum2)

aux = num1

num1 = num2

num2 = aux

for (i = num1

i lt= num2

i++)

iFlag = i-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(i))

flags[iFlag] = true

else if (num1 = -1)

iFlag = num1-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num1))

flags[iFlag] = true

else if (num2 = -1)

iFlag = num2-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num2))

flags[iFlag] = true

JAVACODE void inicializaFlags()

int i

flags = new boolean [maximo]

for (i = 0

iltmaximo

i++)

flags[i] = false

Ademaacutes podemos inicializar el parser e instanciarlo de esta

forma

PARSER_BEGIN(parserImprimePaginasCC)

import javaio

import javautilVector

public class parserImprimePaginasCC

public static int maximo

public static Vector resultado

private static int num1 num2

private static boolean flags[]

public static void main(String[]args)throws Exceptio

n

Reader r = new StringReader(args[0])

parserImprimePaginasCC p

= new parserImprimePaginasCC(r)

try

pmaximo = 50

Systemoutprintln(Maacuteximo +pmaximo)

pinicio()

Systemoutprintln(OKn)

for (int j = 0

jltpresultadosize()

j++)

Systemoutprint(presultadoelementAt(j)+

)

Systemoutprintln()

catch (ParseException e)

Systemoutprintln(Error de sintaxis)

catch (TokenMgrError e)

Systemoutprintln(Error leacutexico)

catch (elementoFueraLimitesException e)

Systemoutprintln(egetMessage())

PARSER_END(parserImprimePaginasCC)

En este caso tomaremos la entrada de lo que el usuario

introduzca por teclado pero se pueden tomar los datos a traveacutes

de ficheros o pasarlos como variables

Se hace referencia a una excepcioacuten que hemos definido asiacute en un

fichero llamado elementoFueraLimitesExceptionjava

public class elementoFueraLimitesException extends Exc

eption

Constructor

public elementoFueraLimitesException()

super()

public elementoFueraLimitesException(String msg)

super(msg)

Una vez salvado el fichero parserImprimePaginasCCjj podemos

generar la documentacioacuten de la gramaacutetica en formato HTML de

esta forma

Nota en la ejecucioacuten de estos ejemplos se ha utilizado la liacutenea de comandos de

Windows pero se podriacutea haber hecho a traveacutes de cualquier sistema que soporte

el lenguaje Java

gtjjdoc parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Documentation

Generator Version 014)

(type jjdoc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Grammar documentation generated successfully in

parserImprimePaginasCChtml

Se genera el fichero parserImprimePaginasCChtmlcuyo

contenido es

BNF for parserImprimePaginasCCjj NON-TERMINALS

inicio = listaElementos

listaElementos = elemento restoListaElementos

elemento = ltENTEROgt restoListaElementos2

restoListaElementos = ltSEPARADORgt listaElementos

|

restoListaElementos2 = ltGUIONgt ltENTEROgt

|

insertaElemento = java code

inicializaFlags = java code

Nota BNF es el tipo de notacioacuten que estamos utilizando a lo largo de estos

artiacuteculos

Compilamos el parser

gtjavacc parser ImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

File TokenMgrErrorjava does not exist Will create

one

File ParseExceptionjava does not exist Will

create one

File Tokenjava does not exist Will create one

File SimpleCharStreamjava does not exist Will

create one

Parser generated successfully

y entonces se generan estos ficheros

ParseExceptionjava --gt

Excepcioacuten generada por el parser cuando un error es encontrado

parserImprimePaginasCCjava --gt La

traduccioacuten de nuestro fichero jj a java

parserImprimePaginasCCConstantsjava --gt Los

valores de los tokens

parserImprimePaginasCCTokenManagerjava --gt El

analizador leacutexico

SimpleCharStreamjava --gt

Contiene coacutedigo para leer caracteres de cualquier

implementacioacuten de javaioInputStream o javaioReader

Tokenjava --gt

Definicioacuten de la clase Token

TokenMgrErrorjava --gt

Diversos errores que puede producir el lexer

Ahora los compilamos y antildeadimos el fichero

elementoFueraLimitesExceptionjava en dicha compilacioacuten

javac java

Y vamos a ejecutar el parser suponiendo que el maacuteximo nuacutemero

de paacuteginas a impmir es 50 (como hemos indicado con pmaximo =

50)

Lo que obtenemos como salida es la lista de paacuteginas a imprimir o

un mensaje de error

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

OK

2 5 6 7 8

java -classpath laboratorioParsers

parserImprimePaginasCC 28-3046

Num paginas 50

OK

28 29 30 4 6

java -classpath laboratorioParsers

parserImprimePaginasCC 43-51

Num paginas 50

Introdujo un numero superior al maximo51

java -classpath laboratorioParsers

parserImprimePaginasCC 43--51

Num paginas 50

Error de sintaxisEncountered - at line 1

column 4

Was expecting

ltENTEROgt

iquestQueacute pasa si algo ha ido mal iquestPodemos depurar el parser de

alguna forma

Por supuesto podemos compilar el parser asiacute para obtener una

traza de la ejecucioacuten

javacc -DEBUG_PARSER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Consumed token lt- at line 1 column 4gt

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

En la traza vemos coacutemo el parser va invocando la diferentes

producciones

Podemos tambieacuten depurar el lexer

javacc -DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Returning the ltEOFgt token

OK

2 5 6 7 8

O combinar ambas trazas

javacc -DEBUG_PARSER -

DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Consumed token lt- at line 1 column 4gt

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Returning the ltEOFgt token

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

Conclusioacuten los generadores de parsers son herramientas

potentes que sirven para resolver problemas de una manera

bdquolimpia‟ y elegante Puede que su nombre retraiga a los

desarrolladores (ldquoiquestPara queacute quiero un generador de

compiladoresrdquo) pero es una opcioacuten a tener en cuenta

Ficheros para descargar

Referencias

- Generating Parsers with JavaCC

- The JavaCC FAQ

Si quieres enviar alguacuten comentario o sugerir temas a tratar en otros artiacuteculos escribe a

curtasun[simboloArroba]ceines

Categor

iacuteas

CES OpenSouceJava

Tema Desarrollo

Autor Carlos Urtasun

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo XSL-FO (Parte 1)

Texto XSL-FO Introduccioacuten El estaacutendar XSL tal y como estaacute definido actualmente se

divide en dos grandes partes -XSLT transformacioacuten de un documento de entrada XML en

alguacuten tipo de documento de salida ya sea XML HTML PDF etc -Formatting Objects (FO) definen la visualizacioacuten final del

resultado de la transformacioacuten Son una implementacioacuten especiacutefica de un determinado XSLT y aplicados a un

fichero XML nos proporcionan otro fichero con la informacioacuten de eacuteste renderizada a alguacuten formato de visualizacioacuten impresa Eacutesta es quizaacute la principal diferencia entre un FO y

otros XSLT ambos transforman un documento XML en otro documento XML pero FO estaacute pensado para generar

directamente una renderizacioacuten

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 4: Cesnavarra 2008-boletín 7

Para solucionarlo en vez de ejecutar el programa ldquoSetupexerdquo

del ldquoIntegration Services Setup diskrdquo tendremos que lanzar un ejecutable del mismo disco pero un poco maacutes oculto se trata

del ldquoupdateexerdquo que reside en ldquosupportx86en-usupdaterdquo

En esta imagen se puede ver que tambieacuten he ejecutado el

Administrador de tareas de Windows pero soacutelo como soporte desde el que lanzar el ldquoexplorerexerdquo mediante su menuacute ldquoArchivordquo ya que los problemas con la instalacioacuten de los

Servicios de Integracioacuten para esta versioacuten de Hyper-V impiden

el uso del ratoacutenhellip algo bastante molesto la verdad Una vez lanzado este update tendremos que reiniciar nuestro servidor

virtual y todo habraacute vuelto a funcionar normalmente sobre todo nuestro ratoacuten y la tarjeta de red

Finalmente soacutelo tendremos que corregir nuestra asignacioacuten de

IPs a la maacutequina virtual si no utilizamos asignacioacuten dinaacutemica

Recibiremos un aviso sobre si queremos asignar una direccioacuten

IP diferente ya que la anteriormente asignada todaviacutea estaacute

asociada a un dispositivo anterior (aunque sea a un dispositivo oculto porque ya no existe maacutes en el sistema la anterior tarjeta

de red virtualizada) Respondemos No para que confirme los valores que acabamos de introducir y recuperaremos la conectividad de nuestra maacutequina virtual

Por uacuteltimo soacutelo tendremos que volver a agregar el servidor al dominio si era parte de alguno y listo (bueno para 12 maacutequinas

se hace un poco pesadohellip pero funciona) Microsoft Office OneNote 2007 Como nota final queriacutea hablar un poco sobre una herramienta que he descubierto este mes oculta en la licencia de Office

2007 completa y que teniacutea olvidada por ahiacute llamada Microsoft Office OneNote La idea de Microsoft es que este producto pueda sustituir al

montoacuten de pequentildeos papelitos y notas que al final del diacutea reuniones llamadas mails etc vamos recopilando y que luego

no hay manera de encontrar OneNote es como un bloc de notas con esteroides (se carga muy raacutepido) ya que nos permite hacer mucho mucho maacutes que el viejo y querido bloc

- la capacidad de buscar informacioacuten en todas nuestras

notas al estilo de la que ofrece Outlook 2007 - si eso por siacute soacutelo ya es una bendicioacuten antildeadireacute que

OneNote nos permite emplear en cualquier nota imaacutegenes obtenidas desde caacutemaras o escaneadas (por

ejemplo tarjetas de negociohellip) archivos recortes de pantalla e incluso grabaciones de audio y video

- pero es que ademaacutes su buacutesqueda nos permite buscar

en los contenidos de estos elementos tambieacuten Es

decir podemos buscar en un archivo o imagen

importados

OneNote ofrece por defecto una organizacioacuten de notas dividida en profesionales y personales de manera que nos permite

emplear la aplicacioacuten para todo nuestro diacutea a diacutea Dentro de cada una establece unas sub-categoriacuteas como Notas de la reunioacuten Viajes Proyectos etc pero que son totalmente

modificables a nuestro gusto Incorpora tambieacuten una serie de plantillas para nuevas notas que se puede ampliar descargando

nuevas versiones desde la web de Microsoft Office Ademaacutes la gestioacuten de las notas es totalmente automaacutetica es decir que no perderemos nunca lo que estamos editando Ademaacutes mediante

un icono que situacutea en nuestra barra de tareas tenemos acceso inmediato a OneNote desde cualquier aplicacioacuten Por uacuteltimo OneNote permite compartir notas con otros usuarios exportarlas a Word (donde por ejemplo acabareacute de editar este artiacuteculo tras haberlo esbozado en

OneNote) enviarlas como correo en Outlook a cualquier destinatario o publicarlas en nuestros sitios de SharePoint para

tener una versioacuten colaborativa en Web Y algunas otras extravagancias como generar una Tarea de Outlook desde una nota de OneNote automaacuteticamente para sincronizarla con todos

nuestros dispositivos o asignar tiempo para hacer la tarea etiquetar nuestras notas con gran flexibilidad para poder

localizarlas luego maacutes faacutecilmente

Y por ultimo y no menos importante llevar a cabo sesiones de

trabajo compartidas entre varios miembros de un equipo sobre una misma nota remotamente (una manera muy uacutetil de llevar a

cabo tormentas de ideas) etcPor eso Por eso podemos llamar a OneNote la navaja suiza de los productos Office y recomiendo su utilizacioacuten

Categoriacuteas

CES Microsoft

Tema Varios

Autor Rafael Flores Yoldi

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo Strings StringBuffershellip y Ropes

Texto El manejo de las cadenas de caracteres es un aspecto fundamental en cualquier

lenguaje de programacioacuten En este artiacuteculo daremos un breve repaso al manejo

de cadenas en Java y a las clases maacutes importantes del lenguaje en este aspecto

como son String StringBuffer y StringBuilder

Ademaacutes introduciremos una libreriacutea para el manejo avanzado de

cadenas Ropes For Java

La clase String

La clase String representa una cadena de caracteres con una caracteriacutestica

fundamental es inmutable Es decir una vez creado un String no es posible

modificarlo Los meacutetodos que concatenan reemplazan caracteres etc

devuelven otro objeto con las modificaciones realizadas

Por ejemplo tras ejecutar el siguiente coacutedigo

String str = ldquoLa clase String es ldquo strconcat(ldquoinmutablerdquo)

el valor de la variable str sigue siendo ldquoLa clase String es ldquo

En cambio si hacemos

String str2 = strconcat(ldquoinmutablerdquo) el nuevo String str2 ya contendraacute la cadena completa ldquoLa clase String

es inmutableldquo

Por esta caracteriacutestica la clase String no es adecuada si lo que se necesita es

realizar muchas modificaciones sobre el texto ya que supone la creacioacuten de

muchos objetos temporales

StringBuffer y StringBuilder

La clase StringBuffer es la variante mutable de String Permite modificar su

contenido concatenar cadenas etc de forma mucho maacutes eficiente que la

claseString

En la versioacuten 5 de Java se incluyoacute la clase StringBuilder que es igual que la

clase StringBuilder pero no sincronizada Si el objeto no va a ser accedido por

maacutes de un hilo simultaacuteneamente se recomienda el uso de StringBuilder ya que

al no ser sincronizado mejora ligeramente el rendimiento

Al utilizar StringBuffer o StringBuilder hay un aspecto que muchas veces no se

tiene en cuenta y que puede tener un impacto importante en el rendimiento la

capacidad inicial

Estos objetos almacenan un array de caracteres que debe ser regenerado

cuando las operaciones hacen que se sobrepase la capacidad del array

Inicializar el objeto a un valor adecuado puede mejorar el rendimiento global

del objeto Por defecto se inicializan con una capacidad de 16 caracteres

Cada vez que debe crecer el nuevo tamantildeo es 2 + 2TamantildeoActual Si el

tamantildeo no va a ser muy grande la diferencia de rendimiento seraacute inapreciable

pero esta inicializacioacuten debe ser tenida en cuenta para el manejo de grandes

cadenas

Cadenas en tiempo de compilacioacuten y en tiempo de

ejecucioacuten

Como curiosidad cabe destacar la labor del compilador de Java en el manejo de

cadenas A veces para mejorar la legibilidad se escribe coacutedigo de este tipo

String sql = select col1 col2 col3 + from table1 t1+

join table2 t2 on t1col1 =

t2col1+ join table3 t3 on t2col3 =

t3col2+ where t1col1 = and t3col3 =

oacute

StringBuffer sbsql = new StringBuffer(select

col1 col2 col3 ) sbsqlappend(from table1 t1) sbsqlappend(join table2 t2 on t1col1 =

t2col1) sbsqlappend(join table3 t3 on t2col3 =

t3col2) sbsqlappend(where t1col1 = and t3col3 =

) String sql = sbsqltoString()

En este caso la primera opcioacuten con la suma de cadenas ofrece mejor

rendimiento que la que utiliza el StringBuffer La explicacioacuten estaacute en el

compilador de Java que realiza la suma de las cadenas en tiempo de

compilacioacuten

Cuando la concatenacioacuten se realiza en tiempo de ejecucioacuten (concatenacioacuten de

variables no de cadenas constantes) el rendimiento mejora

utilizandoStringBuffer como se ha comentado en el punto anterior En este

caso si se suman Strings el compilador genera un StringBuffer para cada suma

de cadenas penalizando el rendimiento frente a la utilizacioacuten de un solo

objeto StringBuffer

Las tres preguntas

Podemos resumir lo visto hasta ahora en tres preguntas que deberiacuteamos

hacernos antes de escribir String str = hellip

iquestVoy a modificar esta cadena Si la repuesta es no o simplemente voy a concatenar cadenas constantes para

mejorar la legibilidad del coacutedigo usareacute String

Si voy a modificarla en funcioacuten de la ejecucioacuten

usareacute StringBuffer o StringBuilder

iquestVa a acceder maacutes de un hilo a mi cadena simultaacuteneamente Si es asiacute usareacute un StringBuffer que asegura la sincronizacioacuten

Si no es asiacute algo que sucederaacute en la mayor parte de los casos

usareacute StringBuilder ya que es maacutes eficiente

iquestPuedo estimar la maacutexima longitud de la cadena Si es asiacute inicializareacute mi StringBuffer o StringBuilder con esa capacidad para

evitar que el objeto deba regenerar su buffer interno cada vez que sobrepase su

capacidad

Un paso maacutes Ropes

En aplicaciones donde el rendimiento es fundamental en el uso de cadenas

puede ser conveniente el uso de otro tipo de estructuras de datos para su

representacioacuten y manejo

Un ejemplo de ello es la estructura de datos denominada Rope

Este concepto no es nuevo se introdujo en un artiacuteculo de 1995(2) y representa

las cadenas con una estructura de aacuterbol de forma que mejora el rendimiento

en operaciones como la insercioacuten y la concatenacioacuten de cadenas El precio a

pagar por estas mejoras de rendimiento viene en forma de uso de memoria

que es sensiblemente superior usando Ropes frente al uso de Strings o

StringBuffers

Existe una implementacioacuten en Java de esta estructura llamada Ropes For

Java(4) Como ejemplo estas son algunas graacuteficas del rendimiento de esta

implementacioacuten publicadas en un artiacuteculo del autor Amin Ahmad(3)

Referencias 1 - Performance improvement techniques in String and StringBuffer

2 - Ropes an Alternative to Strings

3 - Ropes Theory and practice

4 - Ropes For Java

Categoriacute

as

CES OpenSouceJava

Tema Desarrollo

Autor Miguel Bacaicoa

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo Herramientas de gestioacuten de proyectos Open Source

Texto Haraacute unos meses nos vimos en la tesitura de buscar una

herramienta de gestioacuten de proyectos para el Centro Java y Open

Source

Hasta el momento habiacuteamos estado trabajando con dotproject

un sistema con bastante capacidad y funcionalidades No

obstante resultoacute ser una herramienta algo pesada en la creacioacuten

de planificaciones y tediosa en el mantenimiento diacutea a diacutea

Buscaacutebamos principalmente una herramienta que no solo

gestionase la parte de planificacioacuten sino tambieacuten la parte de

seguimiento posterior para mantener el control sobre el proyecto

Ademaacutes deseaacutebamos un entorno colaborativo multi-usuario y

participativo entre nosotros y cualquier colaborador externo Lo

cual maacutes que un requerimiento funcional supone un cambio

cultural la parte maacutes compleja

Todo esto en principio decantaba la decisioacuten por una opcioacuten on-

line en detrimento de una de escritorio No obstante decidimos

valorar tambieacuten las de escritorio no fuera que por empecinarnos

en unas funcionalidades descartaacutesemos otras importantes

A continuacioacuten describireacute brevemente algunas de las

herramientas valoradas

De escritorio

GanttProject

Aplicacioacuten de escritorio muy extendida y uacutetil que permite

planificar tareas y recursos sobre un diagrama Gantt Se trata de

una herramienta similar a MS Project pero maacutes sencilla lo cual

puede ser en algunos casos una ventaja Otra caracteriacutestica

interesante es que funciona tanto en Linux como en Windows y

tiene diversos formatos de exportacioacuten e importacioacuten

Planner

Aplicacioacuten de escritorio bastante extendida y algo maacutes completa

a la anterior (a pesat de tener menos opciones de importacioacuten y

exportacioacuten) pero muy similar En este caso estaacute desarrollada

para Linux aunque existe versioacuten beta para Windows

Open Workbench

Aplicacioacuten de escritorio muy completa Al igual que las anteriores

permite gestionar tareas y recursos sobre un diagrama Gantt

aunque tambieacuten permite otros diagramas como Pert camino

criacutetico y funcionalidades maacutes avanzadas Se vanagloria de ser

incluso mejor que MS Project

TaskJuggler

Se trata de una herramienta de escritorio disponible tanto para

Windows como para Linux un tanto peculiar Genera una serie de

informes bastante completos a partir de un fichero de texto El

interfaz es bastante amigable pero el hecho de andar editando

un fichero de texto que contiene la planificacioacuten no resulta muy

coacutemodo

OpenProj

Otro programa de escritorio sustitutivo de MS Project y de

apariencia muy similar Tiene versiones para Linux Unix Mac y

Windows y es compatible con ficheros MS Project y con todas sus

funcionalidades No obstante parece no estar indicado para

proyectos de grupo En estos casos te ofrecen una versioacuten on-

line (Project-ON-Demand) bajo demanda y de pago bastante

interesante

Entorno web

TeamSCOPE

Team Software for Collaborative Project Environments es una

herramienta web de colaboracioacuten Desarrollado para funcionar

sobre Debian fue creado por una universidad pero parece

haberse quedado bastante anticuado

NetOffice

Herramienta web basada en PHP sobre MySQL para gestionar proyectos tareas registros de tiempos incidenciaserrores

diagramas de Gantt (aunque un poco escondidos) etc similar pero algo maacutes agradable que dotProject Tiene ciertos tintes de herramienta de colaboracioacuten en grupo (groupware)

phpCollab

Herramienta web basada en PHP que ha sufrido un desarrollo

intermitente por lo que parece Sirve tanto para la gestioacuten de

tareas como para el seguimiento de incidenciaserrores Tiene un

aspecto similar a netOffice lo cual hace pensar que uno de los

dos proyectos deriva del otro Quizaacutes por esa razoacuten de elegir una

de las dos sea maacutes recomendable netOffice

Achievo

Herramienta web PHP sobre MySQL para la gestioacuten de proyectos

tareas recursos registro de tiempos agenda generacioacuten de

informes etc Bastante completo ademaacutes parece incluir seccioacuten

presupuestaria

XPlanner

Herramienta web Java sobre MySQL para la gestioacuten de proyectos

mediante XP y Scrum No obstante parece estancada en una

versioacuten beta desde el 2006

PPTS

Project Planning and Tracking System (PPTS) es una herramienta

Web para la gestioacuten de proyectos con metodologiacuteas XP y Scrum

al igual que la anterior Esta desarrollada en PHP contra MySQL

aunque parece tambieacuten largo tiempo abandonada

XPWeb

Al igual que las anteriores es una herramienta web para la

gestioacuten de proyectos aacutegiles incluyendo gestioacuten de tareas

calendarios informes etc Tambieacuten parece estancada

Trac

Herramienta web ampliamente extendida en la comunidad open

source para fundamentalmente el seguimiento proyectos Se

centra en la gestioacuten de incidencias y errores aunque tiene

funcionalidades antildeadidas interesantes como Wiki e integracioacuten

con Subversioacuten Hay que resentildear que se trata de una

herramienta mono-proyecto y que no cuenta con Gantt

OpenProject

Herramienta web de gestioacuten de proyectos muy completa Posee

todo lo necesario tanto que uno llega a perderse No obstante

pueden configurarse los moacutedulos que desean usarse y descartar

aquellos que no son necesarios calendario gestioacuten de tareas

seguimiento de incidencias control presupuestario Wiki foros

integracioacuten con ERPs diagramas Gantt y una larga lista de

funcionalidades

Tutos

The Ultimate Team Organization Software o eso pretende Se

trata de una herramienta web LAMP con muchas funcionalidades

calendario y agenda seguimiento de incidencias y errores

gestioacuten de tareas diagramas Gantt gestioacuten documental gestioacuten

de correos facturas e informes Interesante pero austera de

aspecto y un poco anticuada

Project Dune

Herramienta web desarrollada en Java contra MySQL que pareciacutea

prometer bastante Tiene lo necesario gestioacuten de tareas

recursos incidencias gestioacuten documental registro de tiempos

informes calendario y agenda RSS inspeccioacuten de coacutedigo

importacioacuten de MS Project etc No obstante en su evaluacioacuten

dejoacute bastante que desear resultando poco praacutectica y manejable

Collabtive

Se trata de una herramienta web LAMP para la gestioacuten de

proyectos Seguacuten se indica en la web cubre la gestioacuten de tareas e

incidencias gestioacuten documental y mensajeriacutea Es muy limpia

sencilla y aacutegil No obstante no parece contar con diagramas

Gantt ni con registro de tiempos o informes de estado En la

praacutectica parece quedarse un poco justa pero prometedora

Mindquarry

Herramienta web desarrollada en Java que pretende ser la

alternativa open source de soluciones propietarias como

Basecamp o Sharepoint para la gestioacuten de proyectos y grupos de

trabajo de forma colaborativa Tiene una versioacuten open source

para descarga y otra como servicio bajo demanda La pega es

que la empresa parece haber dejado de desarrollar su actividad

ClockingIT

Se trata de una herramienta Web desarrollada en Ruby como

servicio bajo demanda Permite una gestioacuten de tareas agenda

siguiendo el estaacutendar iCal seguimiento de tiempos generacioacuten

de informes notificaciones RSS foros Chat y Wiki repositorio

de ficheros etc

LibreSource

Se trata de una plataforma web colaborativa para el desarrollo de

software lo que se suele denominar forja y funcionalidades de

groupware archivado y publicacioacuten web Es open source y

altamente ajustable Permite alojar muacuteltiples proyectos varios

grupos de usuarios etc Estaacute desarrollada en J2EE e incorpora

entre otras cosas Wiki integracioacuten con Subversion zonas de

descarga gestioacuten documental mensajeriacutea instantaacutenea con

Jabber gestioacuten de incidencias etc No fue evaluada al ser

descubierta posteriormente a la implantacioacuten de la herramienta

elegida pero parece una buena alternativa

Aunque existen infinidad maacutes de entre todas nos decantamos

por dos que valoramos maacutes en profundidad

TeamWork

Se trata de una herramienta web desarrollada en Java por unos

Italianos Entre sus funcionalidades cabe destacar la gestioacuten de

proyectos y tareas con diversos diagramas de Gantt muy

logrados gestioacuten de incidencias gestioacuten documental entorno

colaborativo tipo groupware control de costes registros de

tiempos etc

Es muy completo raacutepido de respuesta y posee caracteriacutesticas

muy interesantes como una interesante y uacutetil navegacioacuten

contextual entre tareas del proyecto perfiles de usuario seguacuten

proyecto importacioacuten de planificaciones desde MS Project o

asociacioacuten entre incidencias y tareas

Cuenta con wizards para la configuracioacuten de la herramienta de

forma raacutepida y sencilla incluyendo la posibilidad de generar

plantillas para aplicar metodologiacuteas aacutegiles (Scrum)

El registro de horas por tarea para un desarrollador se realiza de

forma muy coacutemoda y raacutepida desde una simple vista facilitando

la participacioacuten del mismo

Se trataba de una aplicacioacuten muy completa quizaacutes demasiado

un poco compleja de entender en un comienzo pero con muchas

posibilidades

No obstante teniacutea alguna que otra pega aunque es open source

posee una licencia de pago para su uso que en cualquier caso era

muy pequentildea Tiene una versioacuten de evaluacioacuten de 30 diacuteas para

quien desee probarla antes de decidir Por otro lado no distingue

proyectos existe una tarea padre que agrupa toda la

planificacioacuten asociada tampoco cuenta con Wiki y no gestiona las

vacaciones del personal

La otra herramienta valorada maacutes en profundidad fue

Redmine

Se trata de otra herramienta web en este caso desarrollada en

Ruby on Rails con una gran cantidad de funcionalidades que la

acerca bastante a una forja pero sin tener la complejidad de la

misma Entre sus caracteriacutesticas cabe destacar la gestioacuten de

tareas incidencias diagramas de Gantt calendario de

actividades noticias foros wikis gestioacuten de ficheros y

documentos integracioacuten con Subversioacuten control de tiempos

generacioacuten de informes etc todo esto por proyecto Por

similitudes del interfaz y funcionalidades parece estar basado en

Trac pero con un lavado de cara y de coacutedigo importante ademaacutes

de ser multi-proyecto

Al igual que la anterior tambieacuten poseiacutea una serie de

caracteriacutesticas que la haciacutea diferente como la posible navegacioacuten

anoacutenima de lectura si asiacute se desea sobre los proyectos alojados

Interesante desde el punto de vista de filosofiacutea open source

Posibilidad de definir un perfil distinto por usuario seguacuten el

proyecto en el que participa

Tambieacuten cuenta con sindicacioacuten de RSS para las secciones de

noticias tareas incidencias etc y exportacioacuten a ficheros de texto

y HTML desde la Wiki los informes generados e incluso el

diagrama de Gantt

A parte se trata de un interfaz muy limpio intuitivo sencillo de

usar y rapidiacutesimo

La configuracioacuten de la herramienta resulta asiacute mismo muy

sencilla con un par de clics puedes empezar a funcionar

Cada proyecto puede configurarse con los moacutedulos que desees

que tenga ademaacutes de poder definir campos personalizados por

proyecto y tarea para permitir una mayor adaptacioacuten

Cabe destacar que para esta herramienta existe un uacutenico

concepto denominado peticioacuten que puede ser de tres tipos

tareas soporte o incidencia De esta forma todo se gestiona de

igual forma lo cual lo simplifica pero a su vez puede convertirse

en un volumen ingestionable de tareas Para evitar esto se

pueden definir categoriacuteas a las que pertenece una peticioacuten y

realizar posteriormente filtrados de peticiones en las vistas seguacuten

este y otros paraacutemetros

No obstante no todo iba a ser color de rosa tiene una serie de

limitaciones como el sistema un tanto engorroso de enlazar

peticiones o el hecho de que una vez creada una peticioacuten su

nombre y descripcioacuten no se pueden modificar tan solo ir

antildeadiendo nuevas descripciones

En este punto nos encontraacutebamos en una difiacutecil decisioacuten puesto

que ambas herramientas nos gustaban cubriacutean lo necesario pero

se trataban de herramientas muy distintas en concepcioacuten Para

facilitar la decisioacuten realizamos un cuadro comparando las

caracteriacutesticas y priorizaacutendolas seguacuten nuestro intereacutes El

resultado fue el siguiente

Prioridad Caracteriacutestica Redmine TeamWork

9 Integracioacuten con

LDAP Si Si

8 Integracioacuten con

Subversion Si Si

8 Traducido al espantildeol

Si No

7 Importacioacuten desde

Project No Si

7 Exportacioacuten a

Project No Si

7 Centros de coste Posible mediante los campos

personalizados

Si

7 Wikis de proyectos Si

7 Personalizacioacuten

extensioacuten Si Si

6 Gestioacuten de vacaciones

No Vacaciones a nivel de

empresa

6 Vida de la herramienta

Indeterminado al ser una

herramienta open source

Algo maacutes seguro

porque hay una empresa detraacutes

5 Facilidad de configuracioacuten

Si

5 Usuarios multi-

perfil Si Si

4 Acceso restringido a usuarios

Si Si

3 Sencillez de manejo

Si

2 Seguimiento de

incidencias Si Si

1 Asignacioacuten de tareas

Si Si

1 Imputacioacuten a tareas asignadas

Si Si

Tras una difiacutecil reflexioacuten puesto que ambas se encontraban muy

parejas decidimos decantarnos por Redmine primando la

sencillez y rapidez Existiacutea la posibilidad de que terceros la

empleasen y veiacuteamos que Redmine permitiacutea una mayor facilidad

en su manejo y resultaba maacutes intuitiva de cara a aprender a

utilizarla Posteriormente tras su uso hemos detectado algunos

inconvenientes importantes como la imposibilidad de asignar una

peticioacuten a maacutes de un usuario pero es que no hay herramienta

perfecta

Bibliografiacutea

httpwwwnavegapolisnetcontentview5649

httpwwwsimpleprojectmanagementcomhomehtml

httpwwwweb-based-softwarecomproject

httpenwikipediaorgwikiComparison_of_issue_tracking_syste

ms

httpenwikipediaorgwikiList_of_project_management_softwa

re

httpwwwpmdigestcomsoftware

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Rauacutel Sanz de Acedo

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo Lexers parsers JavaCC (y II)

Texto En este artiacuteculo vamos a utilizar JavaCC como herramienta para

implementar un moacutedulo que resuelva la casuiacutestica de la

impresioacuten de las diversas paacuteginas de un fichero Esto es lo que se

refleja en esta imagen

Para ello en el artiacuteculo anterior definimos esta gramaacutetica a la que

asociamos unas acciones semaacutenticas

inicio --gt inicializacionVariables

listaElementos

procesarDatos

listaElementos --gt elemento

restoListaElementos

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

restoListaElementos --gt SEPARADOR

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

listaElementos

|

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

restoListaElementos2 --gt GUION ENTERO

num2 = valor(ENTERO)

Si (num2 gt maxPaginas)

or (num2==0) ent error

|

JavaCC es una herramienta que dado un fichero de extensioacuten

jj que describe la gramaacutetica y sus acciones semaacutenticas

asociadas genera los ficheros java que la implementan

Estos ficheros java pueden luego obviamente incluirse en

aqueacutellos que conforman el resto de nuestra aplicacioacuten

JavaCC es una herramienta gratuita que puede descargarse

desde aquiacute Existe tambieacuten un plugin para Eclipse Y asimismo

existe una task de Ant para JavaCC

Vamos pues a construir nuestro parser

Lo denominaremos parserImprimePaginasCC y por lo tanto

vamos a editar el fichero parserImprimePaginasCCjj

Indicaremos coacutemo se traducen los tokens y las producciones a

formato JavaCC

TOKEN

ltENTERO([0-9])+gt

| ltGUION -gt

| ltSEPARADOR([ ])+ | ([ ])gt

Los tokens se describen praacutecticamente como lo indicamos en la

gramaacutetica

void inicio()throws elementoFueraLimitesException

resultado = new Vector()

num1 = -1

num2 = -1

inicializaFlags()

listaElementos()

void listaElementos()throws elementoFueraLimitesExcept

ion

elemento() restoListaElementos()

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

restoListaElementos2()

void restoListaElementos()throws elementoFueraLimitesE

xception

ltSEPARADORgt

insertaElemento(num1 num2)

num1 = -1

num2 = -1

listaElementos()

|

insertaElemento(num1 num2)

num1 = -1

num2 = -1

void restoListaElementos2()throws elementoFueraLimites

Exception

ltGUIONgtltENTEROgt

num2 = IntegervalueOf(tokenimage)intValue()

if ((num2gtmaximo)|| (num2 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num2))

|

Las producciones son algo diferentes lo que era

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

ahora es

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(IntegertoS

tring(num1))

restoListaElementos2()

El no terminal elemento se describe como void elemento() y

ademaacutes le hemos asociado una excepcioacuten para controlar el hecho

de que un usuario coloque 0 o un nuacutemero mayor que el

permitido Lo que en la parte derecha es ENTERO se indica

como ltENTEROgt y la invocacioacuten de restoListaElementos2

es restoListaElementos2()

Las acciones semaacutenticas

num1 = valor(ENTERO)

Si (num1 gt maxPaginas) or (num1==0) ent error

se indican en JavaCC asiacute

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

El valor del token actual es accesible a traveacutes de tokenimage

Si deseamos tener coacutedigo Java adicional fuera de las

producciones lo podemos antildeadir de esta forma con la palabra

reservada JAVACODE

JAVACODE void insertaElemento(int num1 int num2)

int aux i iFlag

if ((num1 = -1) ampamp (num2 = -1))

if (num1gtnum2)

aux = num1

num1 = num2

num2 = aux

for (i = num1

i lt= num2

i++)

iFlag = i-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(i))

flags[iFlag] = true

else if (num1 = -1)

iFlag = num1-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num1))

flags[iFlag] = true

else if (num2 = -1)

iFlag = num2-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num2))

flags[iFlag] = true

JAVACODE void inicializaFlags()

int i

flags = new boolean [maximo]

for (i = 0

iltmaximo

i++)

flags[i] = false

Ademaacutes podemos inicializar el parser e instanciarlo de esta

forma

PARSER_BEGIN(parserImprimePaginasCC)

import javaio

import javautilVector

public class parserImprimePaginasCC

public static int maximo

public static Vector resultado

private static int num1 num2

private static boolean flags[]

public static void main(String[]args)throws Exceptio

n

Reader r = new StringReader(args[0])

parserImprimePaginasCC p

= new parserImprimePaginasCC(r)

try

pmaximo = 50

Systemoutprintln(Maacuteximo +pmaximo)

pinicio()

Systemoutprintln(OKn)

for (int j = 0

jltpresultadosize()

j++)

Systemoutprint(presultadoelementAt(j)+

)

Systemoutprintln()

catch (ParseException e)

Systemoutprintln(Error de sintaxis)

catch (TokenMgrError e)

Systemoutprintln(Error leacutexico)

catch (elementoFueraLimitesException e)

Systemoutprintln(egetMessage())

PARSER_END(parserImprimePaginasCC)

En este caso tomaremos la entrada de lo que el usuario

introduzca por teclado pero se pueden tomar los datos a traveacutes

de ficheros o pasarlos como variables

Se hace referencia a una excepcioacuten que hemos definido asiacute en un

fichero llamado elementoFueraLimitesExceptionjava

public class elementoFueraLimitesException extends Exc

eption

Constructor

public elementoFueraLimitesException()

super()

public elementoFueraLimitesException(String msg)

super(msg)

Una vez salvado el fichero parserImprimePaginasCCjj podemos

generar la documentacioacuten de la gramaacutetica en formato HTML de

esta forma

Nota en la ejecucioacuten de estos ejemplos se ha utilizado la liacutenea de comandos de

Windows pero se podriacutea haber hecho a traveacutes de cualquier sistema que soporte

el lenguaje Java

gtjjdoc parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Documentation

Generator Version 014)

(type jjdoc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Grammar documentation generated successfully in

parserImprimePaginasCChtml

Se genera el fichero parserImprimePaginasCChtmlcuyo

contenido es

BNF for parserImprimePaginasCCjj NON-TERMINALS

inicio = listaElementos

listaElementos = elemento restoListaElementos

elemento = ltENTEROgt restoListaElementos2

restoListaElementos = ltSEPARADORgt listaElementos

|

restoListaElementos2 = ltGUIONgt ltENTEROgt

|

insertaElemento = java code

inicializaFlags = java code

Nota BNF es el tipo de notacioacuten que estamos utilizando a lo largo de estos

artiacuteculos

Compilamos el parser

gtjavacc parser ImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

File TokenMgrErrorjava does not exist Will create

one

File ParseExceptionjava does not exist Will

create one

File Tokenjava does not exist Will create one

File SimpleCharStreamjava does not exist Will

create one

Parser generated successfully

y entonces se generan estos ficheros

ParseExceptionjava --gt

Excepcioacuten generada por el parser cuando un error es encontrado

parserImprimePaginasCCjava --gt La

traduccioacuten de nuestro fichero jj a java

parserImprimePaginasCCConstantsjava --gt Los

valores de los tokens

parserImprimePaginasCCTokenManagerjava --gt El

analizador leacutexico

SimpleCharStreamjava --gt

Contiene coacutedigo para leer caracteres de cualquier

implementacioacuten de javaioInputStream o javaioReader

Tokenjava --gt

Definicioacuten de la clase Token

TokenMgrErrorjava --gt

Diversos errores que puede producir el lexer

Ahora los compilamos y antildeadimos el fichero

elementoFueraLimitesExceptionjava en dicha compilacioacuten

javac java

Y vamos a ejecutar el parser suponiendo que el maacuteximo nuacutemero

de paacuteginas a impmir es 50 (como hemos indicado con pmaximo =

50)

Lo que obtenemos como salida es la lista de paacuteginas a imprimir o

un mensaje de error

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

OK

2 5 6 7 8

java -classpath laboratorioParsers

parserImprimePaginasCC 28-3046

Num paginas 50

OK

28 29 30 4 6

java -classpath laboratorioParsers

parserImprimePaginasCC 43-51

Num paginas 50

Introdujo un numero superior al maximo51

java -classpath laboratorioParsers

parserImprimePaginasCC 43--51

Num paginas 50

Error de sintaxisEncountered - at line 1

column 4

Was expecting

ltENTEROgt

iquestQueacute pasa si algo ha ido mal iquestPodemos depurar el parser de

alguna forma

Por supuesto podemos compilar el parser asiacute para obtener una

traza de la ejecucioacuten

javacc -DEBUG_PARSER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Consumed token lt- at line 1 column 4gt

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

En la traza vemos coacutemo el parser va invocando la diferentes

producciones

Podemos tambieacuten depurar el lexer

javacc -DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Returning the ltEOFgt token

OK

2 5 6 7 8

O combinar ambas trazas

javacc -DEBUG_PARSER -

DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Consumed token lt- at line 1 column 4gt

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Returning the ltEOFgt token

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

Conclusioacuten los generadores de parsers son herramientas

potentes que sirven para resolver problemas de una manera

bdquolimpia‟ y elegante Puede que su nombre retraiga a los

desarrolladores (ldquoiquestPara queacute quiero un generador de

compiladoresrdquo) pero es una opcioacuten a tener en cuenta

Ficheros para descargar

Referencias

- Generating Parsers with JavaCC

- The JavaCC FAQ

Si quieres enviar alguacuten comentario o sugerir temas a tratar en otros artiacuteculos escribe a

curtasun[simboloArroba]ceines

Categor

iacuteas

CES OpenSouceJava

Tema Desarrollo

Autor Carlos Urtasun

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo XSL-FO (Parte 1)

Texto XSL-FO Introduccioacuten El estaacutendar XSL tal y como estaacute definido actualmente se

divide en dos grandes partes -XSLT transformacioacuten de un documento de entrada XML en

alguacuten tipo de documento de salida ya sea XML HTML PDF etc -Formatting Objects (FO) definen la visualizacioacuten final del

resultado de la transformacioacuten Son una implementacioacuten especiacutefica de un determinado XSLT y aplicados a un

fichero XML nos proporcionan otro fichero con la informacioacuten de eacuteste renderizada a alguacuten formato de visualizacioacuten impresa Eacutesta es quizaacute la principal diferencia entre un FO y

otros XSLT ambos transforman un documento XML en otro documento XML pero FO estaacute pensado para generar

directamente una renderizacioacuten

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 5: Cesnavarra 2008-boletín 7

Servicios de Integracioacuten para esta versioacuten de Hyper-V impiden

el uso del ratoacutenhellip algo bastante molesto la verdad Una vez lanzado este update tendremos que reiniciar nuestro servidor

virtual y todo habraacute vuelto a funcionar normalmente sobre todo nuestro ratoacuten y la tarjeta de red

Finalmente soacutelo tendremos que corregir nuestra asignacioacuten de

IPs a la maacutequina virtual si no utilizamos asignacioacuten dinaacutemica

Recibiremos un aviso sobre si queremos asignar una direccioacuten

IP diferente ya que la anteriormente asignada todaviacutea estaacute

asociada a un dispositivo anterior (aunque sea a un dispositivo oculto porque ya no existe maacutes en el sistema la anterior tarjeta

de red virtualizada) Respondemos No para que confirme los valores que acabamos de introducir y recuperaremos la conectividad de nuestra maacutequina virtual

Por uacuteltimo soacutelo tendremos que volver a agregar el servidor al dominio si era parte de alguno y listo (bueno para 12 maacutequinas

se hace un poco pesadohellip pero funciona) Microsoft Office OneNote 2007 Como nota final queriacutea hablar un poco sobre una herramienta que he descubierto este mes oculta en la licencia de Office

2007 completa y que teniacutea olvidada por ahiacute llamada Microsoft Office OneNote La idea de Microsoft es que este producto pueda sustituir al

montoacuten de pequentildeos papelitos y notas que al final del diacutea reuniones llamadas mails etc vamos recopilando y que luego

no hay manera de encontrar OneNote es como un bloc de notas con esteroides (se carga muy raacutepido) ya que nos permite hacer mucho mucho maacutes que el viejo y querido bloc

- la capacidad de buscar informacioacuten en todas nuestras

notas al estilo de la que ofrece Outlook 2007 - si eso por siacute soacutelo ya es una bendicioacuten antildeadireacute que

OneNote nos permite emplear en cualquier nota imaacutegenes obtenidas desde caacutemaras o escaneadas (por

ejemplo tarjetas de negociohellip) archivos recortes de pantalla e incluso grabaciones de audio y video

- pero es que ademaacutes su buacutesqueda nos permite buscar

en los contenidos de estos elementos tambieacuten Es

decir podemos buscar en un archivo o imagen

importados

OneNote ofrece por defecto una organizacioacuten de notas dividida en profesionales y personales de manera que nos permite

emplear la aplicacioacuten para todo nuestro diacutea a diacutea Dentro de cada una establece unas sub-categoriacuteas como Notas de la reunioacuten Viajes Proyectos etc pero que son totalmente

modificables a nuestro gusto Incorpora tambieacuten una serie de plantillas para nuevas notas que se puede ampliar descargando

nuevas versiones desde la web de Microsoft Office Ademaacutes la gestioacuten de las notas es totalmente automaacutetica es decir que no perderemos nunca lo que estamos editando Ademaacutes mediante

un icono que situacutea en nuestra barra de tareas tenemos acceso inmediato a OneNote desde cualquier aplicacioacuten Por uacuteltimo OneNote permite compartir notas con otros usuarios exportarlas a Word (donde por ejemplo acabareacute de editar este artiacuteculo tras haberlo esbozado en

OneNote) enviarlas como correo en Outlook a cualquier destinatario o publicarlas en nuestros sitios de SharePoint para

tener una versioacuten colaborativa en Web Y algunas otras extravagancias como generar una Tarea de Outlook desde una nota de OneNote automaacuteticamente para sincronizarla con todos

nuestros dispositivos o asignar tiempo para hacer la tarea etiquetar nuestras notas con gran flexibilidad para poder

localizarlas luego maacutes faacutecilmente

Y por ultimo y no menos importante llevar a cabo sesiones de

trabajo compartidas entre varios miembros de un equipo sobre una misma nota remotamente (una manera muy uacutetil de llevar a

cabo tormentas de ideas) etcPor eso Por eso podemos llamar a OneNote la navaja suiza de los productos Office y recomiendo su utilizacioacuten

Categoriacuteas

CES Microsoft

Tema Varios

Autor Rafael Flores Yoldi

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo Strings StringBuffershellip y Ropes

Texto El manejo de las cadenas de caracteres es un aspecto fundamental en cualquier

lenguaje de programacioacuten En este artiacuteculo daremos un breve repaso al manejo

de cadenas en Java y a las clases maacutes importantes del lenguaje en este aspecto

como son String StringBuffer y StringBuilder

Ademaacutes introduciremos una libreriacutea para el manejo avanzado de

cadenas Ropes For Java

La clase String

La clase String representa una cadena de caracteres con una caracteriacutestica

fundamental es inmutable Es decir una vez creado un String no es posible

modificarlo Los meacutetodos que concatenan reemplazan caracteres etc

devuelven otro objeto con las modificaciones realizadas

Por ejemplo tras ejecutar el siguiente coacutedigo

String str = ldquoLa clase String es ldquo strconcat(ldquoinmutablerdquo)

el valor de la variable str sigue siendo ldquoLa clase String es ldquo

En cambio si hacemos

String str2 = strconcat(ldquoinmutablerdquo) el nuevo String str2 ya contendraacute la cadena completa ldquoLa clase String

es inmutableldquo

Por esta caracteriacutestica la clase String no es adecuada si lo que se necesita es

realizar muchas modificaciones sobre el texto ya que supone la creacioacuten de

muchos objetos temporales

StringBuffer y StringBuilder

La clase StringBuffer es la variante mutable de String Permite modificar su

contenido concatenar cadenas etc de forma mucho maacutes eficiente que la

claseString

En la versioacuten 5 de Java se incluyoacute la clase StringBuilder que es igual que la

clase StringBuilder pero no sincronizada Si el objeto no va a ser accedido por

maacutes de un hilo simultaacuteneamente se recomienda el uso de StringBuilder ya que

al no ser sincronizado mejora ligeramente el rendimiento

Al utilizar StringBuffer o StringBuilder hay un aspecto que muchas veces no se

tiene en cuenta y que puede tener un impacto importante en el rendimiento la

capacidad inicial

Estos objetos almacenan un array de caracteres que debe ser regenerado

cuando las operaciones hacen que se sobrepase la capacidad del array

Inicializar el objeto a un valor adecuado puede mejorar el rendimiento global

del objeto Por defecto se inicializan con una capacidad de 16 caracteres

Cada vez que debe crecer el nuevo tamantildeo es 2 + 2TamantildeoActual Si el

tamantildeo no va a ser muy grande la diferencia de rendimiento seraacute inapreciable

pero esta inicializacioacuten debe ser tenida en cuenta para el manejo de grandes

cadenas

Cadenas en tiempo de compilacioacuten y en tiempo de

ejecucioacuten

Como curiosidad cabe destacar la labor del compilador de Java en el manejo de

cadenas A veces para mejorar la legibilidad se escribe coacutedigo de este tipo

String sql = select col1 col2 col3 + from table1 t1+

join table2 t2 on t1col1 =

t2col1+ join table3 t3 on t2col3 =

t3col2+ where t1col1 = and t3col3 =

oacute

StringBuffer sbsql = new StringBuffer(select

col1 col2 col3 ) sbsqlappend(from table1 t1) sbsqlappend(join table2 t2 on t1col1 =

t2col1) sbsqlappend(join table3 t3 on t2col3 =

t3col2) sbsqlappend(where t1col1 = and t3col3 =

) String sql = sbsqltoString()

En este caso la primera opcioacuten con la suma de cadenas ofrece mejor

rendimiento que la que utiliza el StringBuffer La explicacioacuten estaacute en el

compilador de Java que realiza la suma de las cadenas en tiempo de

compilacioacuten

Cuando la concatenacioacuten se realiza en tiempo de ejecucioacuten (concatenacioacuten de

variables no de cadenas constantes) el rendimiento mejora

utilizandoStringBuffer como se ha comentado en el punto anterior En este

caso si se suman Strings el compilador genera un StringBuffer para cada suma

de cadenas penalizando el rendimiento frente a la utilizacioacuten de un solo

objeto StringBuffer

Las tres preguntas

Podemos resumir lo visto hasta ahora en tres preguntas que deberiacuteamos

hacernos antes de escribir String str = hellip

iquestVoy a modificar esta cadena Si la repuesta es no o simplemente voy a concatenar cadenas constantes para

mejorar la legibilidad del coacutedigo usareacute String

Si voy a modificarla en funcioacuten de la ejecucioacuten

usareacute StringBuffer o StringBuilder

iquestVa a acceder maacutes de un hilo a mi cadena simultaacuteneamente Si es asiacute usareacute un StringBuffer que asegura la sincronizacioacuten

Si no es asiacute algo que sucederaacute en la mayor parte de los casos

usareacute StringBuilder ya que es maacutes eficiente

iquestPuedo estimar la maacutexima longitud de la cadena Si es asiacute inicializareacute mi StringBuffer o StringBuilder con esa capacidad para

evitar que el objeto deba regenerar su buffer interno cada vez que sobrepase su

capacidad

Un paso maacutes Ropes

En aplicaciones donde el rendimiento es fundamental en el uso de cadenas

puede ser conveniente el uso de otro tipo de estructuras de datos para su

representacioacuten y manejo

Un ejemplo de ello es la estructura de datos denominada Rope

Este concepto no es nuevo se introdujo en un artiacuteculo de 1995(2) y representa

las cadenas con una estructura de aacuterbol de forma que mejora el rendimiento

en operaciones como la insercioacuten y la concatenacioacuten de cadenas El precio a

pagar por estas mejoras de rendimiento viene en forma de uso de memoria

que es sensiblemente superior usando Ropes frente al uso de Strings o

StringBuffers

Existe una implementacioacuten en Java de esta estructura llamada Ropes For

Java(4) Como ejemplo estas son algunas graacuteficas del rendimiento de esta

implementacioacuten publicadas en un artiacuteculo del autor Amin Ahmad(3)

Referencias 1 - Performance improvement techniques in String and StringBuffer

2 - Ropes an Alternative to Strings

3 - Ropes Theory and practice

4 - Ropes For Java

Categoriacute

as

CES OpenSouceJava

Tema Desarrollo

Autor Miguel Bacaicoa

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo Herramientas de gestioacuten de proyectos Open Source

Texto Haraacute unos meses nos vimos en la tesitura de buscar una

herramienta de gestioacuten de proyectos para el Centro Java y Open

Source

Hasta el momento habiacuteamos estado trabajando con dotproject

un sistema con bastante capacidad y funcionalidades No

obstante resultoacute ser una herramienta algo pesada en la creacioacuten

de planificaciones y tediosa en el mantenimiento diacutea a diacutea

Buscaacutebamos principalmente una herramienta que no solo

gestionase la parte de planificacioacuten sino tambieacuten la parte de

seguimiento posterior para mantener el control sobre el proyecto

Ademaacutes deseaacutebamos un entorno colaborativo multi-usuario y

participativo entre nosotros y cualquier colaborador externo Lo

cual maacutes que un requerimiento funcional supone un cambio

cultural la parte maacutes compleja

Todo esto en principio decantaba la decisioacuten por una opcioacuten on-

line en detrimento de una de escritorio No obstante decidimos

valorar tambieacuten las de escritorio no fuera que por empecinarnos

en unas funcionalidades descartaacutesemos otras importantes

A continuacioacuten describireacute brevemente algunas de las

herramientas valoradas

De escritorio

GanttProject

Aplicacioacuten de escritorio muy extendida y uacutetil que permite

planificar tareas y recursos sobre un diagrama Gantt Se trata de

una herramienta similar a MS Project pero maacutes sencilla lo cual

puede ser en algunos casos una ventaja Otra caracteriacutestica

interesante es que funciona tanto en Linux como en Windows y

tiene diversos formatos de exportacioacuten e importacioacuten

Planner

Aplicacioacuten de escritorio bastante extendida y algo maacutes completa

a la anterior (a pesat de tener menos opciones de importacioacuten y

exportacioacuten) pero muy similar En este caso estaacute desarrollada

para Linux aunque existe versioacuten beta para Windows

Open Workbench

Aplicacioacuten de escritorio muy completa Al igual que las anteriores

permite gestionar tareas y recursos sobre un diagrama Gantt

aunque tambieacuten permite otros diagramas como Pert camino

criacutetico y funcionalidades maacutes avanzadas Se vanagloria de ser

incluso mejor que MS Project

TaskJuggler

Se trata de una herramienta de escritorio disponible tanto para

Windows como para Linux un tanto peculiar Genera una serie de

informes bastante completos a partir de un fichero de texto El

interfaz es bastante amigable pero el hecho de andar editando

un fichero de texto que contiene la planificacioacuten no resulta muy

coacutemodo

OpenProj

Otro programa de escritorio sustitutivo de MS Project y de

apariencia muy similar Tiene versiones para Linux Unix Mac y

Windows y es compatible con ficheros MS Project y con todas sus

funcionalidades No obstante parece no estar indicado para

proyectos de grupo En estos casos te ofrecen una versioacuten on-

line (Project-ON-Demand) bajo demanda y de pago bastante

interesante

Entorno web

TeamSCOPE

Team Software for Collaborative Project Environments es una

herramienta web de colaboracioacuten Desarrollado para funcionar

sobre Debian fue creado por una universidad pero parece

haberse quedado bastante anticuado

NetOffice

Herramienta web basada en PHP sobre MySQL para gestionar proyectos tareas registros de tiempos incidenciaserrores

diagramas de Gantt (aunque un poco escondidos) etc similar pero algo maacutes agradable que dotProject Tiene ciertos tintes de herramienta de colaboracioacuten en grupo (groupware)

phpCollab

Herramienta web basada en PHP que ha sufrido un desarrollo

intermitente por lo que parece Sirve tanto para la gestioacuten de

tareas como para el seguimiento de incidenciaserrores Tiene un

aspecto similar a netOffice lo cual hace pensar que uno de los

dos proyectos deriva del otro Quizaacutes por esa razoacuten de elegir una

de las dos sea maacutes recomendable netOffice

Achievo

Herramienta web PHP sobre MySQL para la gestioacuten de proyectos

tareas recursos registro de tiempos agenda generacioacuten de

informes etc Bastante completo ademaacutes parece incluir seccioacuten

presupuestaria

XPlanner

Herramienta web Java sobre MySQL para la gestioacuten de proyectos

mediante XP y Scrum No obstante parece estancada en una

versioacuten beta desde el 2006

PPTS

Project Planning and Tracking System (PPTS) es una herramienta

Web para la gestioacuten de proyectos con metodologiacuteas XP y Scrum

al igual que la anterior Esta desarrollada en PHP contra MySQL

aunque parece tambieacuten largo tiempo abandonada

XPWeb

Al igual que las anteriores es una herramienta web para la

gestioacuten de proyectos aacutegiles incluyendo gestioacuten de tareas

calendarios informes etc Tambieacuten parece estancada

Trac

Herramienta web ampliamente extendida en la comunidad open

source para fundamentalmente el seguimiento proyectos Se

centra en la gestioacuten de incidencias y errores aunque tiene

funcionalidades antildeadidas interesantes como Wiki e integracioacuten

con Subversioacuten Hay que resentildear que se trata de una

herramienta mono-proyecto y que no cuenta con Gantt

OpenProject

Herramienta web de gestioacuten de proyectos muy completa Posee

todo lo necesario tanto que uno llega a perderse No obstante

pueden configurarse los moacutedulos que desean usarse y descartar

aquellos que no son necesarios calendario gestioacuten de tareas

seguimiento de incidencias control presupuestario Wiki foros

integracioacuten con ERPs diagramas Gantt y una larga lista de

funcionalidades

Tutos

The Ultimate Team Organization Software o eso pretende Se

trata de una herramienta web LAMP con muchas funcionalidades

calendario y agenda seguimiento de incidencias y errores

gestioacuten de tareas diagramas Gantt gestioacuten documental gestioacuten

de correos facturas e informes Interesante pero austera de

aspecto y un poco anticuada

Project Dune

Herramienta web desarrollada en Java contra MySQL que pareciacutea

prometer bastante Tiene lo necesario gestioacuten de tareas

recursos incidencias gestioacuten documental registro de tiempos

informes calendario y agenda RSS inspeccioacuten de coacutedigo

importacioacuten de MS Project etc No obstante en su evaluacioacuten

dejoacute bastante que desear resultando poco praacutectica y manejable

Collabtive

Se trata de una herramienta web LAMP para la gestioacuten de

proyectos Seguacuten se indica en la web cubre la gestioacuten de tareas e

incidencias gestioacuten documental y mensajeriacutea Es muy limpia

sencilla y aacutegil No obstante no parece contar con diagramas

Gantt ni con registro de tiempos o informes de estado En la

praacutectica parece quedarse un poco justa pero prometedora

Mindquarry

Herramienta web desarrollada en Java que pretende ser la

alternativa open source de soluciones propietarias como

Basecamp o Sharepoint para la gestioacuten de proyectos y grupos de

trabajo de forma colaborativa Tiene una versioacuten open source

para descarga y otra como servicio bajo demanda La pega es

que la empresa parece haber dejado de desarrollar su actividad

ClockingIT

Se trata de una herramienta Web desarrollada en Ruby como

servicio bajo demanda Permite una gestioacuten de tareas agenda

siguiendo el estaacutendar iCal seguimiento de tiempos generacioacuten

de informes notificaciones RSS foros Chat y Wiki repositorio

de ficheros etc

LibreSource

Se trata de una plataforma web colaborativa para el desarrollo de

software lo que se suele denominar forja y funcionalidades de

groupware archivado y publicacioacuten web Es open source y

altamente ajustable Permite alojar muacuteltiples proyectos varios

grupos de usuarios etc Estaacute desarrollada en J2EE e incorpora

entre otras cosas Wiki integracioacuten con Subversion zonas de

descarga gestioacuten documental mensajeriacutea instantaacutenea con

Jabber gestioacuten de incidencias etc No fue evaluada al ser

descubierta posteriormente a la implantacioacuten de la herramienta

elegida pero parece una buena alternativa

Aunque existen infinidad maacutes de entre todas nos decantamos

por dos que valoramos maacutes en profundidad

TeamWork

Se trata de una herramienta web desarrollada en Java por unos

Italianos Entre sus funcionalidades cabe destacar la gestioacuten de

proyectos y tareas con diversos diagramas de Gantt muy

logrados gestioacuten de incidencias gestioacuten documental entorno

colaborativo tipo groupware control de costes registros de

tiempos etc

Es muy completo raacutepido de respuesta y posee caracteriacutesticas

muy interesantes como una interesante y uacutetil navegacioacuten

contextual entre tareas del proyecto perfiles de usuario seguacuten

proyecto importacioacuten de planificaciones desde MS Project o

asociacioacuten entre incidencias y tareas

Cuenta con wizards para la configuracioacuten de la herramienta de

forma raacutepida y sencilla incluyendo la posibilidad de generar

plantillas para aplicar metodologiacuteas aacutegiles (Scrum)

El registro de horas por tarea para un desarrollador se realiza de

forma muy coacutemoda y raacutepida desde una simple vista facilitando

la participacioacuten del mismo

Se trataba de una aplicacioacuten muy completa quizaacutes demasiado

un poco compleja de entender en un comienzo pero con muchas

posibilidades

No obstante teniacutea alguna que otra pega aunque es open source

posee una licencia de pago para su uso que en cualquier caso era

muy pequentildea Tiene una versioacuten de evaluacioacuten de 30 diacuteas para

quien desee probarla antes de decidir Por otro lado no distingue

proyectos existe una tarea padre que agrupa toda la

planificacioacuten asociada tampoco cuenta con Wiki y no gestiona las

vacaciones del personal

La otra herramienta valorada maacutes en profundidad fue

Redmine

Se trata de otra herramienta web en este caso desarrollada en

Ruby on Rails con una gran cantidad de funcionalidades que la

acerca bastante a una forja pero sin tener la complejidad de la

misma Entre sus caracteriacutesticas cabe destacar la gestioacuten de

tareas incidencias diagramas de Gantt calendario de

actividades noticias foros wikis gestioacuten de ficheros y

documentos integracioacuten con Subversioacuten control de tiempos

generacioacuten de informes etc todo esto por proyecto Por

similitudes del interfaz y funcionalidades parece estar basado en

Trac pero con un lavado de cara y de coacutedigo importante ademaacutes

de ser multi-proyecto

Al igual que la anterior tambieacuten poseiacutea una serie de

caracteriacutesticas que la haciacutea diferente como la posible navegacioacuten

anoacutenima de lectura si asiacute se desea sobre los proyectos alojados

Interesante desde el punto de vista de filosofiacutea open source

Posibilidad de definir un perfil distinto por usuario seguacuten el

proyecto en el que participa

Tambieacuten cuenta con sindicacioacuten de RSS para las secciones de

noticias tareas incidencias etc y exportacioacuten a ficheros de texto

y HTML desde la Wiki los informes generados e incluso el

diagrama de Gantt

A parte se trata de un interfaz muy limpio intuitivo sencillo de

usar y rapidiacutesimo

La configuracioacuten de la herramienta resulta asiacute mismo muy

sencilla con un par de clics puedes empezar a funcionar

Cada proyecto puede configurarse con los moacutedulos que desees

que tenga ademaacutes de poder definir campos personalizados por

proyecto y tarea para permitir una mayor adaptacioacuten

Cabe destacar que para esta herramienta existe un uacutenico

concepto denominado peticioacuten que puede ser de tres tipos

tareas soporte o incidencia De esta forma todo se gestiona de

igual forma lo cual lo simplifica pero a su vez puede convertirse

en un volumen ingestionable de tareas Para evitar esto se

pueden definir categoriacuteas a las que pertenece una peticioacuten y

realizar posteriormente filtrados de peticiones en las vistas seguacuten

este y otros paraacutemetros

No obstante no todo iba a ser color de rosa tiene una serie de

limitaciones como el sistema un tanto engorroso de enlazar

peticiones o el hecho de que una vez creada una peticioacuten su

nombre y descripcioacuten no se pueden modificar tan solo ir

antildeadiendo nuevas descripciones

En este punto nos encontraacutebamos en una difiacutecil decisioacuten puesto

que ambas herramientas nos gustaban cubriacutean lo necesario pero

se trataban de herramientas muy distintas en concepcioacuten Para

facilitar la decisioacuten realizamos un cuadro comparando las

caracteriacutesticas y priorizaacutendolas seguacuten nuestro intereacutes El

resultado fue el siguiente

Prioridad Caracteriacutestica Redmine TeamWork

9 Integracioacuten con

LDAP Si Si

8 Integracioacuten con

Subversion Si Si

8 Traducido al espantildeol

Si No

7 Importacioacuten desde

Project No Si

7 Exportacioacuten a

Project No Si

7 Centros de coste Posible mediante los campos

personalizados

Si

7 Wikis de proyectos Si

7 Personalizacioacuten

extensioacuten Si Si

6 Gestioacuten de vacaciones

No Vacaciones a nivel de

empresa

6 Vida de la herramienta

Indeterminado al ser una

herramienta open source

Algo maacutes seguro

porque hay una empresa detraacutes

5 Facilidad de configuracioacuten

Si

5 Usuarios multi-

perfil Si Si

4 Acceso restringido a usuarios

Si Si

3 Sencillez de manejo

Si

2 Seguimiento de

incidencias Si Si

1 Asignacioacuten de tareas

Si Si

1 Imputacioacuten a tareas asignadas

Si Si

Tras una difiacutecil reflexioacuten puesto que ambas se encontraban muy

parejas decidimos decantarnos por Redmine primando la

sencillez y rapidez Existiacutea la posibilidad de que terceros la

empleasen y veiacuteamos que Redmine permitiacutea una mayor facilidad

en su manejo y resultaba maacutes intuitiva de cara a aprender a

utilizarla Posteriormente tras su uso hemos detectado algunos

inconvenientes importantes como la imposibilidad de asignar una

peticioacuten a maacutes de un usuario pero es que no hay herramienta

perfecta

Bibliografiacutea

httpwwwnavegapolisnetcontentview5649

httpwwwsimpleprojectmanagementcomhomehtml

httpwwwweb-based-softwarecomproject

httpenwikipediaorgwikiComparison_of_issue_tracking_syste

ms

httpenwikipediaorgwikiList_of_project_management_softwa

re

httpwwwpmdigestcomsoftware

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Rauacutel Sanz de Acedo

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo Lexers parsers JavaCC (y II)

Texto En este artiacuteculo vamos a utilizar JavaCC como herramienta para

implementar un moacutedulo que resuelva la casuiacutestica de la

impresioacuten de las diversas paacuteginas de un fichero Esto es lo que se

refleja en esta imagen

Para ello en el artiacuteculo anterior definimos esta gramaacutetica a la que

asociamos unas acciones semaacutenticas

inicio --gt inicializacionVariables

listaElementos

procesarDatos

listaElementos --gt elemento

restoListaElementos

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

restoListaElementos --gt SEPARADOR

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

listaElementos

|

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

restoListaElementos2 --gt GUION ENTERO

num2 = valor(ENTERO)

Si (num2 gt maxPaginas)

or (num2==0) ent error

|

JavaCC es una herramienta que dado un fichero de extensioacuten

jj que describe la gramaacutetica y sus acciones semaacutenticas

asociadas genera los ficheros java que la implementan

Estos ficheros java pueden luego obviamente incluirse en

aqueacutellos que conforman el resto de nuestra aplicacioacuten

JavaCC es una herramienta gratuita que puede descargarse

desde aquiacute Existe tambieacuten un plugin para Eclipse Y asimismo

existe una task de Ant para JavaCC

Vamos pues a construir nuestro parser

Lo denominaremos parserImprimePaginasCC y por lo tanto

vamos a editar el fichero parserImprimePaginasCCjj

Indicaremos coacutemo se traducen los tokens y las producciones a

formato JavaCC

TOKEN

ltENTERO([0-9])+gt

| ltGUION -gt

| ltSEPARADOR([ ])+ | ([ ])gt

Los tokens se describen praacutecticamente como lo indicamos en la

gramaacutetica

void inicio()throws elementoFueraLimitesException

resultado = new Vector()

num1 = -1

num2 = -1

inicializaFlags()

listaElementos()

void listaElementos()throws elementoFueraLimitesExcept

ion

elemento() restoListaElementos()

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

restoListaElementos2()

void restoListaElementos()throws elementoFueraLimitesE

xception

ltSEPARADORgt

insertaElemento(num1 num2)

num1 = -1

num2 = -1

listaElementos()

|

insertaElemento(num1 num2)

num1 = -1

num2 = -1

void restoListaElementos2()throws elementoFueraLimites

Exception

ltGUIONgtltENTEROgt

num2 = IntegervalueOf(tokenimage)intValue()

if ((num2gtmaximo)|| (num2 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num2))

|

Las producciones son algo diferentes lo que era

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

ahora es

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(IntegertoS

tring(num1))

restoListaElementos2()

El no terminal elemento se describe como void elemento() y

ademaacutes le hemos asociado una excepcioacuten para controlar el hecho

de que un usuario coloque 0 o un nuacutemero mayor que el

permitido Lo que en la parte derecha es ENTERO se indica

como ltENTEROgt y la invocacioacuten de restoListaElementos2

es restoListaElementos2()

Las acciones semaacutenticas

num1 = valor(ENTERO)

Si (num1 gt maxPaginas) or (num1==0) ent error

se indican en JavaCC asiacute

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

El valor del token actual es accesible a traveacutes de tokenimage

Si deseamos tener coacutedigo Java adicional fuera de las

producciones lo podemos antildeadir de esta forma con la palabra

reservada JAVACODE

JAVACODE void insertaElemento(int num1 int num2)

int aux i iFlag

if ((num1 = -1) ampamp (num2 = -1))

if (num1gtnum2)

aux = num1

num1 = num2

num2 = aux

for (i = num1

i lt= num2

i++)

iFlag = i-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(i))

flags[iFlag] = true

else if (num1 = -1)

iFlag = num1-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num1))

flags[iFlag] = true

else if (num2 = -1)

iFlag = num2-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num2))

flags[iFlag] = true

JAVACODE void inicializaFlags()

int i

flags = new boolean [maximo]

for (i = 0

iltmaximo

i++)

flags[i] = false

Ademaacutes podemos inicializar el parser e instanciarlo de esta

forma

PARSER_BEGIN(parserImprimePaginasCC)

import javaio

import javautilVector

public class parserImprimePaginasCC

public static int maximo

public static Vector resultado

private static int num1 num2

private static boolean flags[]

public static void main(String[]args)throws Exceptio

n

Reader r = new StringReader(args[0])

parserImprimePaginasCC p

= new parserImprimePaginasCC(r)

try

pmaximo = 50

Systemoutprintln(Maacuteximo +pmaximo)

pinicio()

Systemoutprintln(OKn)

for (int j = 0

jltpresultadosize()

j++)

Systemoutprint(presultadoelementAt(j)+

)

Systemoutprintln()

catch (ParseException e)

Systemoutprintln(Error de sintaxis)

catch (TokenMgrError e)

Systemoutprintln(Error leacutexico)

catch (elementoFueraLimitesException e)

Systemoutprintln(egetMessage())

PARSER_END(parserImprimePaginasCC)

En este caso tomaremos la entrada de lo que el usuario

introduzca por teclado pero se pueden tomar los datos a traveacutes

de ficheros o pasarlos como variables

Se hace referencia a una excepcioacuten que hemos definido asiacute en un

fichero llamado elementoFueraLimitesExceptionjava

public class elementoFueraLimitesException extends Exc

eption

Constructor

public elementoFueraLimitesException()

super()

public elementoFueraLimitesException(String msg)

super(msg)

Una vez salvado el fichero parserImprimePaginasCCjj podemos

generar la documentacioacuten de la gramaacutetica en formato HTML de

esta forma

Nota en la ejecucioacuten de estos ejemplos se ha utilizado la liacutenea de comandos de

Windows pero se podriacutea haber hecho a traveacutes de cualquier sistema que soporte

el lenguaje Java

gtjjdoc parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Documentation

Generator Version 014)

(type jjdoc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Grammar documentation generated successfully in

parserImprimePaginasCChtml

Se genera el fichero parserImprimePaginasCChtmlcuyo

contenido es

BNF for parserImprimePaginasCCjj NON-TERMINALS

inicio = listaElementos

listaElementos = elemento restoListaElementos

elemento = ltENTEROgt restoListaElementos2

restoListaElementos = ltSEPARADORgt listaElementos

|

restoListaElementos2 = ltGUIONgt ltENTEROgt

|

insertaElemento = java code

inicializaFlags = java code

Nota BNF es el tipo de notacioacuten que estamos utilizando a lo largo de estos

artiacuteculos

Compilamos el parser

gtjavacc parser ImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

File TokenMgrErrorjava does not exist Will create

one

File ParseExceptionjava does not exist Will

create one

File Tokenjava does not exist Will create one

File SimpleCharStreamjava does not exist Will

create one

Parser generated successfully

y entonces se generan estos ficheros

ParseExceptionjava --gt

Excepcioacuten generada por el parser cuando un error es encontrado

parserImprimePaginasCCjava --gt La

traduccioacuten de nuestro fichero jj a java

parserImprimePaginasCCConstantsjava --gt Los

valores de los tokens

parserImprimePaginasCCTokenManagerjava --gt El

analizador leacutexico

SimpleCharStreamjava --gt

Contiene coacutedigo para leer caracteres de cualquier

implementacioacuten de javaioInputStream o javaioReader

Tokenjava --gt

Definicioacuten de la clase Token

TokenMgrErrorjava --gt

Diversos errores que puede producir el lexer

Ahora los compilamos y antildeadimos el fichero

elementoFueraLimitesExceptionjava en dicha compilacioacuten

javac java

Y vamos a ejecutar el parser suponiendo que el maacuteximo nuacutemero

de paacuteginas a impmir es 50 (como hemos indicado con pmaximo =

50)

Lo que obtenemos como salida es la lista de paacuteginas a imprimir o

un mensaje de error

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

OK

2 5 6 7 8

java -classpath laboratorioParsers

parserImprimePaginasCC 28-3046

Num paginas 50

OK

28 29 30 4 6

java -classpath laboratorioParsers

parserImprimePaginasCC 43-51

Num paginas 50

Introdujo un numero superior al maximo51

java -classpath laboratorioParsers

parserImprimePaginasCC 43--51

Num paginas 50

Error de sintaxisEncountered - at line 1

column 4

Was expecting

ltENTEROgt

iquestQueacute pasa si algo ha ido mal iquestPodemos depurar el parser de

alguna forma

Por supuesto podemos compilar el parser asiacute para obtener una

traza de la ejecucioacuten

javacc -DEBUG_PARSER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Consumed token lt- at line 1 column 4gt

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

En la traza vemos coacutemo el parser va invocando la diferentes

producciones

Podemos tambieacuten depurar el lexer

javacc -DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Returning the ltEOFgt token

OK

2 5 6 7 8

O combinar ambas trazas

javacc -DEBUG_PARSER -

DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Consumed token lt- at line 1 column 4gt

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Returning the ltEOFgt token

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

Conclusioacuten los generadores de parsers son herramientas

potentes que sirven para resolver problemas de una manera

bdquolimpia‟ y elegante Puede que su nombre retraiga a los

desarrolladores (ldquoiquestPara queacute quiero un generador de

compiladoresrdquo) pero es una opcioacuten a tener en cuenta

Ficheros para descargar

Referencias

- Generating Parsers with JavaCC

- The JavaCC FAQ

Si quieres enviar alguacuten comentario o sugerir temas a tratar en otros artiacuteculos escribe a

curtasun[simboloArroba]ceines

Categor

iacuteas

CES OpenSouceJava

Tema Desarrollo

Autor Carlos Urtasun

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo XSL-FO (Parte 1)

Texto XSL-FO Introduccioacuten El estaacutendar XSL tal y como estaacute definido actualmente se

divide en dos grandes partes -XSLT transformacioacuten de un documento de entrada XML en

alguacuten tipo de documento de salida ya sea XML HTML PDF etc -Formatting Objects (FO) definen la visualizacioacuten final del

resultado de la transformacioacuten Son una implementacioacuten especiacutefica de un determinado XSLT y aplicados a un

fichero XML nos proporcionan otro fichero con la informacioacuten de eacuteste renderizada a alguacuten formato de visualizacioacuten impresa Eacutesta es quizaacute la principal diferencia entre un FO y

otros XSLT ambos transforman un documento XML en otro documento XML pero FO estaacute pensado para generar

directamente una renderizacioacuten

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 6: Cesnavarra 2008-boletín 7

IP diferente ya que la anteriormente asignada todaviacutea estaacute

asociada a un dispositivo anterior (aunque sea a un dispositivo oculto porque ya no existe maacutes en el sistema la anterior tarjeta

de red virtualizada) Respondemos No para que confirme los valores que acabamos de introducir y recuperaremos la conectividad de nuestra maacutequina virtual

Por uacuteltimo soacutelo tendremos que volver a agregar el servidor al dominio si era parte de alguno y listo (bueno para 12 maacutequinas

se hace un poco pesadohellip pero funciona) Microsoft Office OneNote 2007 Como nota final queriacutea hablar un poco sobre una herramienta que he descubierto este mes oculta en la licencia de Office

2007 completa y que teniacutea olvidada por ahiacute llamada Microsoft Office OneNote La idea de Microsoft es que este producto pueda sustituir al

montoacuten de pequentildeos papelitos y notas que al final del diacutea reuniones llamadas mails etc vamos recopilando y que luego

no hay manera de encontrar OneNote es como un bloc de notas con esteroides (se carga muy raacutepido) ya que nos permite hacer mucho mucho maacutes que el viejo y querido bloc

- la capacidad de buscar informacioacuten en todas nuestras

notas al estilo de la que ofrece Outlook 2007 - si eso por siacute soacutelo ya es una bendicioacuten antildeadireacute que

OneNote nos permite emplear en cualquier nota imaacutegenes obtenidas desde caacutemaras o escaneadas (por

ejemplo tarjetas de negociohellip) archivos recortes de pantalla e incluso grabaciones de audio y video

- pero es que ademaacutes su buacutesqueda nos permite buscar

en los contenidos de estos elementos tambieacuten Es

decir podemos buscar en un archivo o imagen

importados

OneNote ofrece por defecto una organizacioacuten de notas dividida en profesionales y personales de manera que nos permite

emplear la aplicacioacuten para todo nuestro diacutea a diacutea Dentro de cada una establece unas sub-categoriacuteas como Notas de la reunioacuten Viajes Proyectos etc pero que son totalmente

modificables a nuestro gusto Incorpora tambieacuten una serie de plantillas para nuevas notas que se puede ampliar descargando

nuevas versiones desde la web de Microsoft Office Ademaacutes la gestioacuten de las notas es totalmente automaacutetica es decir que no perderemos nunca lo que estamos editando Ademaacutes mediante

un icono que situacutea en nuestra barra de tareas tenemos acceso inmediato a OneNote desde cualquier aplicacioacuten Por uacuteltimo OneNote permite compartir notas con otros usuarios exportarlas a Word (donde por ejemplo acabareacute de editar este artiacuteculo tras haberlo esbozado en

OneNote) enviarlas como correo en Outlook a cualquier destinatario o publicarlas en nuestros sitios de SharePoint para

tener una versioacuten colaborativa en Web Y algunas otras extravagancias como generar una Tarea de Outlook desde una nota de OneNote automaacuteticamente para sincronizarla con todos

nuestros dispositivos o asignar tiempo para hacer la tarea etiquetar nuestras notas con gran flexibilidad para poder

localizarlas luego maacutes faacutecilmente

Y por ultimo y no menos importante llevar a cabo sesiones de

trabajo compartidas entre varios miembros de un equipo sobre una misma nota remotamente (una manera muy uacutetil de llevar a

cabo tormentas de ideas) etcPor eso Por eso podemos llamar a OneNote la navaja suiza de los productos Office y recomiendo su utilizacioacuten

Categoriacuteas

CES Microsoft

Tema Varios

Autor Rafael Flores Yoldi

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo Strings StringBuffershellip y Ropes

Texto El manejo de las cadenas de caracteres es un aspecto fundamental en cualquier

lenguaje de programacioacuten En este artiacuteculo daremos un breve repaso al manejo

de cadenas en Java y a las clases maacutes importantes del lenguaje en este aspecto

como son String StringBuffer y StringBuilder

Ademaacutes introduciremos una libreriacutea para el manejo avanzado de

cadenas Ropes For Java

La clase String

La clase String representa una cadena de caracteres con una caracteriacutestica

fundamental es inmutable Es decir una vez creado un String no es posible

modificarlo Los meacutetodos que concatenan reemplazan caracteres etc

devuelven otro objeto con las modificaciones realizadas

Por ejemplo tras ejecutar el siguiente coacutedigo

String str = ldquoLa clase String es ldquo strconcat(ldquoinmutablerdquo)

el valor de la variable str sigue siendo ldquoLa clase String es ldquo

En cambio si hacemos

String str2 = strconcat(ldquoinmutablerdquo) el nuevo String str2 ya contendraacute la cadena completa ldquoLa clase String

es inmutableldquo

Por esta caracteriacutestica la clase String no es adecuada si lo que se necesita es

realizar muchas modificaciones sobre el texto ya que supone la creacioacuten de

muchos objetos temporales

StringBuffer y StringBuilder

La clase StringBuffer es la variante mutable de String Permite modificar su

contenido concatenar cadenas etc de forma mucho maacutes eficiente que la

claseString

En la versioacuten 5 de Java se incluyoacute la clase StringBuilder que es igual que la

clase StringBuilder pero no sincronizada Si el objeto no va a ser accedido por

maacutes de un hilo simultaacuteneamente se recomienda el uso de StringBuilder ya que

al no ser sincronizado mejora ligeramente el rendimiento

Al utilizar StringBuffer o StringBuilder hay un aspecto que muchas veces no se

tiene en cuenta y que puede tener un impacto importante en el rendimiento la

capacidad inicial

Estos objetos almacenan un array de caracteres que debe ser regenerado

cuando las operaciones hacen que se sobrepase la capacidad del array

Inicializar el objeto a un valor adecuado puede mejorar el rendimiento global

del objeto Por defecto se inicializan con una capacidad de 16 caracteres

Cada vez que debe crecer el nuevo tamantildeo es 2 + 2TamantildeoActual Si el

tamantildeo no va a ser muy grande la diferencia de rendimiento seraacute inapreciable

pero esta inicializacioacuten debe ser tenida en cuenta para el manejo de grandes

cadenas

Cadenas en tiempo de compilacioacuten y en tiempo de

ejecucioacuten

Como curiosidad cabe destacar la labor del compilador de Java en el manejo de

cadenas A veces para mejorar la legibilidad se escribe coacutedigo de este tipo

String sql = select col1 col2 col3 + from table1 t1+

join table2 t2 on t1col1 =

t2col1+ join table3 t3 on t2col3 =

t3col2+ where t1col1 = and t3col3 =

oacute

StringBuffer sbsql = new StringBuffer(select

col1 col2 col3 ) sbsqlappend(from table1 t1) sbsqlappend(join table2 t2 on t1col1 =

t2col1) sbsqlappend(join table3 t3 on t2col3 =

t3col2) sbsqlappend(where t1col1 = and t3col3 =

) String sql = sbsqltoString()

En este caso la primera opcioacuten con la suma de cadenas ofrece mejor

rendimiento que la que utiliza el StringBuffer La explicacioacuten estaacute en el

compilador de Java que realiza la suma de las cadenas en tiempo de

compilacioacuten

Cuando la concatenacioacuten se realiza en tiempo de ejecucioacuten (concatenacioacuten de

variables no de cadenas constantes) el rendimiento mejora

utilizandoStringBuffer como se ha comentado en el punto anterior En este

caso si se suman Strings el compilador genera un StringBuffer para cada suma

de cadenas penalizando el rendimiento frente a la utilizacioacuten de un solo

objeto StringBuffer

Las tres preguntas

Podemos resumir lo visto hasta ahora en tres preguntas que deberiacuteamos

hacernos antes de escribir String str = hellip

iquestVoy a modificar esta cadena Si la repuesta es no o simplemente voy a concatenar cadenas constantes para

mejorar la legibilidad del coacutedigo usareacute String

Si voy a modificarla en funcioacuten de la ejecucioacuten

usareacute StringBuffer o StringBuilder

iquestVa a acceder maacutes de un hilo a mi cadena simultaacuteneamente Si es asiacute usareacute un StringBuffer que asegura la sincronizacioacuten

Si no es asiacute algo que sucederaacute en la mayor parte de los casos

usareacute StringBuilder ya que es maacutes eficiente

iquestPuedo estimar la maacutexima longitud de la cadena Si es asiacute inicializareacute mi StringBuffer o StringBuilder con esa capacidad para

evitar que el objeto deba regenerar su buffer interno cada vez que sobrepase su

capacidad

Un paso maacutes Ropes

En aplicaciones donde el rendimiento es fundamental en el uso de cadenas

puede ser conveniente el uso de otro tipo de estructuras de datos para su

representacioacuten y manejo

Un ejemplo de ello es la estructura de datos denominada Rope

Este concepto no es nuevo se introdujo en un artiacuteculo de 1995(2) y representa

las cadenas con una estructura de aacuterbol de forma que mejora el rendimiento

en operaciones como la insercioacuten y la concatenacioacuten de cadenas El precio a

pagar por estas mejoras de rendimiento viene en forma de uso de memoria

que es sensiblemente superior usando Ropes frente al uso de Strings o

StringBuffers

Existe una implementacioacuten en Java de esta estructura llamada Ropes For

Java(4) Como ejemplo estas son algunas graacuteficas del rendimiento de esta

implementacioacuten publicadas en un artiacuteculo del autor Amin Ahmad(3)

Referencias 1 - Performance improvement techniques in String and StringBuffer

2 - Ropes an Alternative to Strings

3 - Ropes Theory and practice

4 - Ropes For Java

Categoriacute

as

CES OpenSouceJava

Tema Desarrollo

Autor Miguel Bacaicoa

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo Herramientas de gestioacuten de proyectos Open Source

Texto Haraacute unos meses nos vimos en la tesitura de buscar una

herramienta de gestioacuten de proyectos para el Centro Java y Open

Source

Hasta el momento habiacuteamos estado trabajando con dotproject

un sistema con bastante capacidad y funcionalidades No

obstante resultoacute ser una herramienta algo pesada en la creacioacuten

de planificaciones y tediosa en el mantenimiento diacutea a diacutea

Buscaacutebamos principalmente una herramienta que no solo

gestionase la parte de planificacioacuten sino tambieacuten la parte de

seguimiento posterior para mantener el control sobre el proyecto

Ademaacutes deseaacutebamos un entorno colaborativo multi-usuario y

participativo entre nosotros y cualquier colaborador externo Lo

cual maacutes que un requerimiento funcional supone un cambio

cultural la parte maacutes compleja

Todo esto en principio decantaba la decisioacuten por una opcioacuten on-

line en detrimento de una de escritorio No obstante decidimos

valorar tambieacuten las de escritorio no fuera que por empecinarnos

en unas funcionalidades descartaacutesemos otras importantes

A continuacioacuten describireacute brevemente algunas de las

herramientas valoradas

De escritorio

GanttProject

Aplicacioacuten de escritorio muy extendida y uacutetil que permite

planificar tareas y recursos sobre un diagrama Gantt Se trata de

una herramienta similar a MS Project pero maacutes sencilla lo cual

puede ser en algunos casos una ventaja Otra caracteriacutestica

interesante es que funciona tanto en Linux como en Windows y

tiene diversos formatos de exportacioacuten e importacioacuten

Planner

Aplicacioacuten de escritorio bastante extendida y algo maacutes completa

a la anterior (a pesat de tener menos opciones de importacioacuten y

exportacioacuten) pero muy similar En este caso estaacute desarrollada

para Linux aunque existe versioacuten beta para Windows

Open Workbench

Aplicacioacuten de escritorio muy completa Al igual que las anteriores

permite gestionar tareas y recursos sobre un diagrama Gantt

aunque tambieacuten permite otros diagramas como Pert camino

criacutetico y funcionalidades maacutes avanzadas Se vanagloria de ser

incluso mejor que MS Project

TaskJuggler

Se trata de una herramienta de escritorio disponible tanto para

Windows como para Linux un tanto peculiar Genera una serie de

informes bastante completos a partir de un fichero de texto El

interfaz es bastante amigable pero el hecho de andar editando

un fichero de texto que contiene la planificacioacuten no resulta muy

coacutemodo

OpenProj

Otro programa de escritorio sustitutivo de MS Project y de

apariencia muy similar Tiene versiones para Linux Unix Mac y

Windows y es compatible con ficheros MS Project y con todas sus

funcionalidades No obstante parece no estar indicado para

proyectos de grupo En estos casos te ofrecen una versioacuten on-

line (Project-ON-Demand) bajo demanda y de pago bastante

interesante

Entorno web

TeamSCOPE

Team Software for Collaborative Project Environments es una

herramienta web de colaboracioacuten Desarrollado para funcionar

sobre Debian fue creado por una universidad pero parece

haberse quedado bastante anticuado

NetOffice

Herramienta web basada en PHP sobre MySQL para gestionar proyectos tareas registros de tiempos incidenciaserrores

diagramas de Gantt (aunque un poco escondidos) etc similar pero algo maacutes agradable que dotProject Tiene ciertos tintes de herramienta de colaboracioacuten en grupo (groupware)

phpCollab

Herramienta web basada en PHP que ha sufrido un desarrollo

intermitente por lo que parece Sirve tanto para la gestioacuten de

tareas como para el seguimiento de incidenciaserrores Tiene un

aspecto similar a netOffice lo cual hace pensar que uno de los

dos proyectos deriva del otro Quizaacutes por esa razoacuten de elegir una

de las dos sea maacutes recomendable netOffice

Achievo

Herramienta web PHP sobre MySQL para la gestioacuten de proyectos

tareas recursos registro de tiempos agenda generacioacuten de

informes etc Bastante completo ademaacutes parece incluir seccioacuten

presupuestaria

XPlanner

Herramienta web Java sobre MySQL para la gestioacuten de proyectos

mediante XP y Scrum No obstante parece estancada en una

versioacuten beta desde el 2006

PPTS

Project Planning and Tracking System (PPTS) es una herramienta

Web para la gestioacuten de proyectos con metodologiacuteas XP y Scrum

al igual que la anterior Esta desarrollada en PHP contra MySQL

aunque parece tambieacuten largo tiempo abandonada

XPWeb

Al igual que las anteriores es una herramienta web para la

gestioacuten de proyectos aacutegiles incluyendo gestioacuten de tareas

calendarios informes etc Tambieacuten parece estancada

Trac

Herramienta web ampliamente extendida en la comunidad open

source para fundamentalmente el seguimiento proyectos Se

centra en la gestioacuten de incidencias y errores aunque tiene

funcionalidades antildeadidas interesantes como Wiki e integracioacuten

con Subversioacuten Hay que resentildear que se trata de una

herramienta mono-proyecto y que no cuenta con Gantt

OpenProject

Herramienta web de gestioacuten de proyectos muy completa Posee

todo lo necesario tanto que uno llega a perderse No obstante

pueden configurarse los moacutedulos que desean usarse y descartar

aquellos que no son necesarios calendario gestioacuten de tareas

seguimiento de incidencias control presupuestario Wiki foros

integracioacuten con ERPs diagramas Gantt y una larga lista de

funcionalidades

Tutos

The Ultimate Team Organization Software o eso pretende Se

trata de una herramienta web LAMP con muchas funcionalidades

calendario y agenda seguimiento de incidencias y errores

gestioacuten de tareas diagramas Gantt gestioacuten documental gestioacuten

de correos facturas e informes Interesante pero austera de

aspecto y un poco anticuada

Project Dune

Herramienta web desarrollada en Java contra MySQL que pareciacutea

prometer bastante Tiene lo necesario gestioacuten de tareas

recursos incidencias gestioacuten documental registro de tiempos

informes calendario y agenda RSS inspeccioacuten de coacutedigo

importacioacuten de MS Project etc No obstante en su evaluacioacuten

dejoacute bastante que desear resultando poco praacutectica y manejable

Collabtive

Se trata de una herramienta web LAMP para la gestioacuten de

proyectos Seguacuten se indica en la web cubre la gestioacuten de tareas e

incidencias gestioacuten documental y mensajeriacutea Es muy limpia

sencilla y aacutegil No obstante no parece contar con diagramas

Gantt ni con registro de tiempos o informes de estado En la

praacutectica parece quedarse un poco justa pero prometedora

Mindquarry

Herramienta web desarrollada en Java que pretende ser la

alternativa open source de soluciones propietarias como

Basecamp o Sharepoint para la gestioacuten de proyectos y grupos de

trabajo de forma colaborativa Tiene una versioacuten open source

para descarga y otra como servicio bajo demanda La pega es

que la empresa parece haber dejado de desarrollar su actividad

ClockingIT

Se trata de una herramienta Web desarrollada en Ruby como

servicio bajo demanda Permite una gestioacuten de tareas agenda

siguiendo el estaacutendar iCal seguimiento de tiempos generacioacuten

de informes notificaciones RSS foros Chat y Wiki repositorio

de ficheros etc

LibreSource

Se trata de una plataforma web colaborativa para el desarrollo de

software lo que se suele denominar forja y funcionalidades de

groupware archivado y publicacioacuten web Es open source y

altamente ajustable Permite alojar muacuteltiples proyectos varios

grupos de usuarios etc Estaacute desarrollada en J2EE e incorpora

entre otras cosas Wiki integracioacuten con Subversion zonas de

descarga gestioacuten documental mensajeriacutea instantaacutenea con

Jabber gestioacuten de incidencias etc No fue evaluada al ser

descubierta posteriormente a la implantacioacuten de la herramienta

elegida pero parece una buena alternativa

Aunque existen infinidad maacutes de entre todas nos decantamos

por dos que valoramos maacutes en profundidad

TeamWork

Se trata de una herramienta web desarrollada en Java por unos

Italianos Entre sus funcionalidades cabe destacar la gestioacuten de

proyectos y tareas con diversos diagramas de Gantt muy

logrados gestioacuten de incidencias gestioacuten documental entorno

colaborativo tipo groupware control de costes registros de

tiempos etc

Es muy completo raacutepido de respuesta y posee caracteriacutesticas

muy interesantes como una interesante y uacutetil navegacioacuten

contextual entre tareas del proyecto perfiles de usuario seguacuten

proyecto importacioacuten de planificaciones desde MS Project o

asociacioacuten entre incidencias y tareas

Cuenta con wizards para la configuracioacuten de la herramienta de

forma raacutepida y sencilla incluyendo la posibilidad de generar

plantillas para aplicar metodologiacuteas aacutegiles (Scrum)

El registro de horas por tarea para un desarrollador se realiza de

forma muy coacutemoda y raacutepida desde una simple vista facilitando

la participacioacuten del mismo

Se trataba de una aplicacioacuten muy completa quizaacutes demasiado

un poco compleja de entender en un comienzo pero con muchas

posibilidades

No obstante teniacutea alguna que otra pega aunque es open source

posee una licencia de pago para su uso que en cualquier caso era

muy pequentildea Tiene una versioacuten de evaluacioacuten de 30 diacuteas para

quien desee probarla antes de decidir Por otro lado no distingue

proyectos existe una tarea padre que agrupa toda la

planificacioacuten asociada tampoco cuenta con Wiki y no gestiona las

vacaciones del personal

La otra herramienta valorada maacutes en profundidad fue

Redmine

Se trata de otra herramienta web en este caso desarrollada en

Ruby on Rails con una gran cantidad de funcionalidades que la

acerca bastante a una forja pero sin tener la complejidad de la

misma Entre sus caracteriacutesticas cabe destacar la gestioacuten de

tareas incidencias diagramas de Gantt calendario de

actividades noticias foros wikis gestioacuten de ficheros y

documentos integracioacuten con Subversioacuten control de tiempos

generacioacuten de informes etc todo esto por proyecto Por

similitudes del interfaz y funcionalidades parece estar basado en

Trac pero con un lavado de cara y de coacutedigo importante ademaacutes

de ser multi-proyecto

Al igual que la anterior tambieacuten poseiacutea una serie de

caracteriacutesticas que la haciacutea diferente como la posible navegacioacuten

anoacutenima de lectura si asiacute se desea sobre los proyectos alojados

Interesante desde el punto de vista de filosofiacutea open source

Posibilidad de definir un perfil distinto por usuario seguacuten el

proyecto en el que participa

Tambieacuten cuenta con sindicacioacuten de RSS para las secciones de

noticias tareas incidencias etc y exportacioacuten a ficheros de texto

y HTML desde la Wiki los informes generados e incluso el

diagrama de Gantt

A parte se trata de un interfaz muy limpio intuitivo sencillo de

usar y rapidiacutesimo

La configuracioacuten de la herramienta resulta asiacute mismo muy

sencilla con un par de clics puedes empezar a funcionar

Cada proyecto puede configurarse con los moacutedulos que desees

que tenga ademaacutes de poder definir campos personalizados por

proyecto y tarea para permitir una mayor adaptacioacuten

Cabe destacar que para esta herramienta existe un uacutenico

concepto denominado peticioacuten que puede ser de tres tipos

tareas soporte o incidencia De esta forma todo se gestiona de

igual forma lo cual lo simplifica pero a su vez puede convertirse

en un volumen ingestionable de tareas Para evitar esto se

pueden definir categoriacuteas a las que pertenece una peticioacuten y

realizar posteriormente filtrados de peticiones en las vistas seguacuten

este y otros paraacutemetros

No obstante no todo iba a ser color de rosa tiene una serie de

limitaciones como el sistema un tanto engorroso de enlazar

peticiones o el hecho de que una vez creada una peticioacuten su

nombre y descripcioacuten no se pueden modificar tan solo ir

antildeadiendo nuevas descripciones

En este punto nos encontraacutebamos en una difiacutecil decisioacuten puesto

que ambas herramientas nos gustaban cubriacutean lo necesario pero

se trataban de herramientas muy distintas en concepcioacuten Para

facilitar la decisioacuten realizamos un cuadro comparando las

caracteriacutesticas y priorizaacutendolas seguacuten nuestro intereacutes El

resultado fue el siguiente

Prioridad Caracteriacutestica Redmine TeamWork

9 Integracioacuten con

LDAP Si Si

8 Integracioacuten con

Subversion Si Si

8 Traducido al espantildeol

Si No

7 Importacioacuten desde

Project No Si

7 Exportacioacuten a

Project No Si

7 Centros de coste Posible mediante los campos

personalizados

Si

7 Wikis de proyectos Si

7 Personalizacioacuten

extensioacuten Si Si

6 Gestioacuten de vacaciones

No Vacaciones a nivel de

empresa

6 Vida de la herramienta

Indeterminado al ser una

herramienta open source

Algo maacutes seguro

porque hay una empresa detraacutes

5 Facilidad de configuracioacuten

Si

5 Usuarios multi-

perfil Si Si

4 Acceso restringido a usuarios

Si Si

3 Sencillez de manejo

Si

2 Seguimiento de

incidencias Si Si

1 Asignacioacuten de tareas

Si Si

1 Imputacioacuten a tareas asignadas

Si Si

Tras una difiacutecil reflexioacuten puesto que ambas se encontraban muy

parejas decidimos decantarnos por Redmine primando la

sencillez y rapidez Existiacutea la posibilidad de que terceros la

empleasen y veiacuteamos que Redmine permitiacutea una mayor facilidad

en su manejo y resultaba maacutes intuitiva de cara a aprender a

utilizarla Posteriormente tras su uso hemos detectado algunos

inconvenientes importantes como la imposibilidad de asignar una

peticioacuten a maacutes de un usuario pero es que no hay herramienta

perfecta

Bibliografiacutea

httpwwwnavegapolisnetcontentview5649

httpwwwsimpleprojectmanagementcomhomehtml

httpwwwweb-based-softwarecomproject

httpenwikipediaorgwikiComparison_of_issue_tracking_syste

ms

httpenwikipediaorgwikiList_of_project_management_softwa

re

httpwwwpmdigestcomsoftware

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Rauacutel Sanz de Acedo

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo Lexers parsers JavaCC (y II)

Texto En este artiacuteculo vamos a utilizar JavaCC como herramienta para

implementar un moacutedulo que resuelva la casuiacutestica de la

impresioacuten de las diversas paacuteginas de un fichero Esto es lo que se

refleja en esta imagen

Para ello en el artiacuteculo anterior definimos esta gramaacutetica a la que

asociamos unas acciones semaacutenticas

inicio --gt inicializacionVariables

listaElementos

procesarDatos

listaElementos --gt elemento

restoListaElementos

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

restoListaElementos --gt SEPARADOR

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

listaElementos

|

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

restoListaElementos2 --gt GUION ENTERO

num2 = valor(ENTERO)

Si (num2 gt maxPaginas)

or (num2==0) ent error

|

JavaCC es una herramienta que dado un fichero de extensioacuten

jj que describe la gramaacutetica y sus acciones semaacutenticas

asociadas genera los ficheros java que la implementan

Estos ficheros java pueden luego obviamente incluirse en

aqueacutellos que conforman el resto de nuestra aplicacioacuten

JavaCC es una herramienta gratuita que puede descargarse

desde aquiacute Existe tambieacuten un plugin para Eclipse Y asimismo

existe una task de Ant para JavaCC

Vamos pues a construir nuestro parser

Lo denominaremos parserImprimePaginasCC y por lo tanto

vamos a editar el fichero parserImprimePaginasCCjj

Indicaremos coacutemo se traducen los tokens y las producciones a

formato JavaCC

TOKEN

ltENTERO([0-9])+gt

| ltGUION -gt

| ltSEPARADOR([ ])+ | ([ ])gt

Los tokens se describen praacutecticamente como lo indicamos en la

gramaacutetica

void inicio()throws elementoFueraLimitesException

resultado = new Vector()

num1 = -1

num2 = -1

inicializaFlags()

listaElementos()

void listaElementos()throws elementoFueraLimitesExcept

ion

elemento() restoListaElementos()

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

restoListaElementos2()

void restoListaElementos()throws elementoFueraLimitesE

xception

ltSEPARADORgt

insertaElemento(num1 num2)

num1 = -1

num2 = -1

listaElementos()

|

insertaElemento(num1 num2)

num1 = -1

num2 = -1

void restoListaElementos2()throws elementoFueraLimites

Exception

ltGUIONgtltENTEROgt

num2 = IntegervalueOf(tokenimage)intValue()

if ((num2gtmaximo)|| (num2 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num2))

|

Las producciones son algo diferentes lo que era

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

ahora es

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(IntegertoS

tring(num1))

restoListaElementos2()

El no terminal elemento se describe como void elemento() y

ademaacutes le hemos asociado una excepcioacuten para controlar el hecho

de que un usuario coloque 0 o un nuacutemero mayor que el

permitido Lo que en la parte derecha es ENTERO se indica

como ltENTEROgt y la invocacioacuten de restoListaElementos2

es restoListaElementos2()

Las acciones semaacutenticas

num1 = valor(ENTERO)

Si (num1 gt maxPaginas) or (num1==0) ent error

se indican en JavaCC asiacute

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

El valor del token actual es accesible a traveacutes de tokenimage

Si deseamos tener coacutedigo Java adicional fuera de las

producciones lo podemos antildeadir de esta forma con la palabra

reservada JAVACODE

JAVACODE void insertaElemento(int num1 int num2)

int aux i iFlag

if ((num1 = -1) ampamp (num2 = -1))

if (num1gtnum2)

aux = num1

num1 = num2

num2 = aux

for (i = num1

i lt= num2

i++)

iFlag = i-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(i))

flags[iFlag] = true

else if (num1 = -1)

iFlag = num1-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num1))

flags[iFlag] = true

else if (num2 = -1)

iFlag = num2-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num2))

flags[iFlag] = true

JAVACODE void inicializaFlags()

int i

flags = new boolean [maximo]

for (i = 0

iltmaximo

i++)

flags[i] = false

Ademaacutes podemos inicializar el parser e instanciarlo de esta

forma

PARSER_BEGIN(parserImprimePaginasCC)

import javaio

import javautilVector

public class parserImprimePaginasCC

public static int maximo

public static Vector resultado

private static int num1 num2

private static boolean flags[]

public static void main(String[]args)throws Exceptio

n

Reader r = new StringReader(args[0])

parserImprimePaginasCC p

= new parserImprimePaginasCC(r)

try

pmaximo = 50

Systemoutprintln(Maacuteximo +pmaximo)

pinicio()

Systemoutprintln(OKn)

for (int j = 0

jltpresultadosize()

j++)

Systemoutprint(presultadoelementAt(j)+

)

Systemoutprintln()

catch (ParseException e)

Systemoutprintln(Error de sintaxis)

catch (TokenMgrError e)

Systemoutprintln(Error leacutexico)

catch (elementoFueraLimitesException e)

Systemoutprintln(egetMessage())

PARSER_END(parserImprimePaginasCC)

En este caso tomaremos la entrada de lo que el usuario

introduzca por teclado pero se pueden tomar los datos a traveacutes

de ficheros o pasarlos como variables

Se hace referencia a una excepcioacuten que hemos definido asiacute en un

fichero llamado elementoFueraLimitesExceptionjava

public class elementoFueraLimitesException extends Exc

eption

Constructor

public elementoFueraLimitesException()

super()

public elementoFueraLimitesException(String msg)

super(msg)

Una vez salvado el fichero parserImprimePaginasCCjj podemos

generar la documentacioacuten de la gramaacutetica en formato HTML de

esta forma

Nota en la ejecucioacuten de estos ejemplos se ha utilizado la liacutenea de comandos de

Windows pero se podriacutea haber hecho a traveacutes de cualquier sistema que soporte

el lenguaje Java

gtjjdoc parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Documentation

Generator Version 014)

(type jjdoc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Grammar documentation generated successfully in

parserImprimePaginasCChtml

Se genera el fichero parserImprimePaginasCChtmlcuyo

contenido es

BNF for parserImprimePaginasCCjj NON-TERMINALS

inicio = listaElementos

listaElementos = elemento restoListaElementos

elemento = ltENTEROgt restoListaElementos2

restoListaElementos = ltSEPARADORgt listaElementos

|

restoListaElementos2 = ltGUIONgt ltENTEROgt

|

insertaElemento = java code

inicializaFlags = java code

Nota BNF es el tipo de notacioacuten que estamos utilizando a lo largo de estos

artiacuteculos

Compilamos el parser

gtjavacc parser ImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

File TokenMgrErrorjava does not exist Will create

one

File ParseExceptionjava does not exist Will

create one

File Tokenjava does not exist Will create one

File SimpleCharStreamjava does not exist Will

create one

Parser generated successfully

y entonces se generan estos ficheros

ParseExceptionjava --gt

Excepcioacuten generada por el parser cuando un error es encontrado

parserImprimePaginasCCjava --gt La

traduccioacuten de nuestro fichero jj a java

parserImprimePaginasCCConstantsjava --gt Los

valores de los tokens

parserImprimePaginasCCTokenManagerjava --gt El

analizador leacutexico

SimpleCharStreamjava --gt

Contiene coacutedigo para leer caracteres de cualquier

implementacioacuten de javaioInputStream o javaioReader

Tokenjava --gt

Definicioacuten de la clase Token

TokenMgrErrorjava --gt

Diversos errores que puede producir el lexer

Ahora los compilamos y antildeadimos el fichero

elementoFueraLimitesExceptionjava en dicha compilacioacuten

javac java

Y vamos a ejecutar el parser suponiendo que el maacuteximo nuacutemero

de paacuteginas a impmir es 50 (como hemos indicado con pmaximo =

50)

Lo que obtenemos como salida es la lista de paacuteginas a imprimir o

un mensaje de error

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

OK

2 5 6 7 8

java -classpath laboratorioParsers

parserImprimePaginasCC 28-3046

Num paginas 50

OK

28 29 30 4 6

java -classpath laboratorioParsers

parserImprimePaginasCC 43-51

Num paginas 50

Introdujo un numero superior al maximo51

java -classpath laboratorioParsers

parserImprimePaginasCC 43--51

Num paginas 50

Error de sintaxisEncountered - at line 1

column 4

Was expecting

ltENTEROgt

iquestQueacute pasa si algo ha ido mal iquestPodemos depurar el parser de

alguna forma

Por supuesto podemos compilar el parser asiacute para obtener una

traza de la ejecucioacuten

javacc -DEBUG_PARSER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Consumed token lt- at line 1 column 4gt

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

En la traza vemos coacutemo el parser va invocando la diferentes

producciones

Podemos tambieacuten depurar el lexer

javacc -DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Returning the ltEOFgt token

OK

2 5 6 7 8

O combinar ambas trazas

javacc -DEBUG_PARSER -

DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Consumed token lt- at line 1 column 4gt

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Returning the ltEOFgt token

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

Conclusioacuten los generadores de parsers son herramientas

potentes que sirven para resolver problemas de una manera

bdquolimpia‟ y elegante Puede que su nombre retraiga a los

desarrolladores (ldquoiquestPara queacute quiero un generador de

compiladoresrdquo) pero es una opcioacuten a tener en cuenta

Ficheros para descargar

Referencias

- Generating Parsers with JavaCC

- The JavaCC FAQ

Si quieres enviar alguacuten comentario o sugerir temas a tratar en otros artiacuteculos escribe a

curtasun[simboloArroba]ceines

Categor

iacuteas

CES OpenSouceJava

Tema Desarrollo

Autor Carlos Urtasun

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo XSL-FO (Parte 1)

Texto XSL-FO Introduccioacuten El estaacutendar XSL tal y como estaacute definido actualmente se

divide en dos grandes partes -XSLT transformacioacuten de un documento de entrada XML en

alguacuten tipo de documento de salida ya sea XML HTML PDF etc -Formatting Objects (FO) definen la visualizacioacuten final del

resultado de la transformacioacuten Son una implementacioacuten especiacutefica de un determinado XSLT y aplicados a un

fichero XML nos proporcionan otro fichero con la informacioacuten de eacuteste renderizada a alguacuten formato de visualizacioacuten impresa Eacutesta es quizaacute la principal diferencia entre un FO y

otros XSLT ambos transforman un documento XML en otro documento XML pero FO estaacute pensado para generar

directamente una renderizacioacuten

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 7: Cesnavarra 2008-boletín 7

decir podemos buscar en un archivo o imagen

importados

OneNote ofrece por defecto una organizacioacuten de notas dividida en profesionales y personales de manera que nos permite

emplear la aplicacioacuten para todo nuestro diacutea a diacutea Dentro de cada una establece unas sub-categoriacuteas como Notas de la reunioacuten Viajes Proyectos etc pero que son totalmente

modificables a nuestro gusto Incorpora tambieacuten una serie de plantillas para nuevas notas que se puede ampliar descargando

nuevas versiones desde la web de Microsoft Office Ademaacutes la gestioacuten de las notas es totalmente automaacutetica es decir que no perderemos nunca lo que estamos editando Ademaacutes mediante

un icono que situacutea en nuestra barra de tareas tenemos acceso inmediato a OneNote desde cualquier aplicacioacuten Por uacuteltimo OneNote permite compartir notas con otros usuarios exportarlas a Word (donde por ejemplo acabareacute de editar este artiacuteculo tras haberlo esbozado en

OneNote) enviarlas como correo en Outlook a cualquier destinatario o publicarlas en nuestros sitios de SharePoint para

tener una versioacuten colaborativa en Web Y algunas otras extravagancias como generar una Tarea de Outlook desde una nota de OneNote automaacuteticamente para sincronizarla con todos

nuestros dispositivos o asignar tiempo para hacer la tarea etiquetar nuestras notas con gran flexibilidad para poder

localizarlas luego maacutes faacutecilmente

Y por ultimo y no menos importante llevar a cabo sesiones de

trabajo compartidas entre varios miembros de un equipo sobre una misma nota remotamente (una manera muy uacutetil de llevar a

cabo tormentas de ideas) etcPor eso Por eso podemos llamar a OneNote la navaja suiza de los productos Office y recomiendo su utilizacioacuten

Categoriacuteas

CES Microsoft

Tema Varios

Autor Rafael Flores Yoldi

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo Strings StringBuffershellip y Ropes

Texto El manejo de las cadenas de caracteres es un aspecto fundamental en cualquier

lenguaje de programacioacuten En este artiacuteculo daremos un breve repaso al manejo

de cadenas en Java y a las clases maacutes importantes del lenguaje en este aspecto

como son String StringBuffer y StringBuilder

Ademaacutes introduciremos una libreriacutea para el manejo avanzado de

cadenas Ropes For Java

La clase String

La clase String representa una cadena de caracteres con una caracteriacutestica

fundamental es inmutable Es decir una vez creado un String no es posible

modificarlo Los meacutetodos que concatenan reemplazan caracteres etc

devuelven otro objeto con las modificaciones realizadas

Por ejemplo tras ejecutar el siguiente coacutedigo

String str = ldquoLa clase String es ldquo strconcat(ldquoinmutablerdquo)

el valor de la variable str sigue siendo ldquoLa clase String es ldquo

En cambio si hacemos

String str2 = strconcat(ldquoinmutablerdquo) el nuevo String str2 ya contendraacute la cadena completa ldquoLa clase String

es inmutableldquo

Por esta caracteriacutestica la clase String no es adecuada si lo que se necesita es

realizar muchas modificaciones sobre el texto ya que supone la creacioacuten de

muchos objetos temporales

StringBuffer y StringBuilder

La clase StringBuffer es la variante mutable de String Permite modificar su

contenido concatenar cadenas etc de forma mucho maacutes eficiente que la

claseString

En la versioacuten 5 de Java se incluyoacute la clase StringBuilder que es igual que la

clase StringBuilder pero no sincronizada Si el objeto no va a ser accedido por

maacutes de un hilo simultaacuteneamente se recomienda el uso de StringBuilder ya que

al no ser sincronizado mejora ligeramente el rendimiento

Al utilizar StringBuffer o StringBuilder hay un aspecto que muchas veces no se

tiene en cuenta y que puede tener un impacto importante en el rendimiento la

capacidad inicial

Estos objetos almacenan un array de caracteres que debe ser regenerado

cuando las operaciones hacen que se sobrepase la capacidad del array

Inicializar el objeto a un valor adecuado puede mejorar el rendimiento global

del objeto Por defecto se inicializan con una capacidad de 16 caracteres

Cada vez que debe crecer el nuevo tamantildeo es 2 + 2TamantildeoActual Si el

tamantildeo no va a ser muy grande la diferencia de rendimiento seraacute inapreciable

pero esta inicializacioacuten debe ser tenida en cuenta para el manejo de grandes

cadenas

Cadenas en tiempo de compilacioacuten y en tiempo de

ejecucioacuten

Como curiosidad cabe destacar la labor del compilador de Java en el manejo de

cadenas A veces para mejorar la legibilidad se escribe coacutedigo de este tipo

String sql = select col1 col2 col3 + from table1 t1+

join table2 t2 on t1col1 =

t2col1+ join table3 t3 on t2col3 =

t3col2+ where t1col1 = and t3col3 =

oacute

StringBuffer sbsql = new StringBuffer(select

col1 col2 col3 ) sbsqlappend(from table1 t1) sbsqlappend(join table2 t2 on t1col1 =

t2col1) sbsqlappend(join table3 t3 on t2col3 =

t3col2) sbsqlappend(where t1col1 = and t3col3 =

) String sql = sbsqltoString()

En este caso la primera opcioacuten con la suma de cadenas ofrece mejor

rendimiento que la que utiliza el StringBuffer La explicacioacuten estaacute en el

compilador de Java que realiza la suma de las cadenas en tiempo de

compilacioacuten

Cuando la concatenacioacuten se realiza en tiempo de ejecucioacuten (concatenacioacuten de

variables no de cadenas constantes) el rendimiento mejora

utilizandoStringBuffer como se ha comentado en el punto anterior En este

caso si se suman Strings el compilador genera un StringBuffer para cada suma

de cadenas penalizando el rendimiento frente a la utilizacioacuten de un solo

objeto StringBuffer

Las tres preguntas

Podemos resumir lo visto hasta ahora en tres preguntas que deberiacuteamos

hacernos antes de escribir String str = hellip

iquestVoy a modificar esta cadena Si la repuesta es no o simplemente voy a concatenar cadenas constantes para

mejorar la legibilidad del coacutedigo usareacute String

Si voy a modificarla en funcioacuten de la ejecucioacuten

usareacute StringBuffer o StringBuilder

iquestVa a acceder maacutes de un hilo a mi cadena simultaacuteneamente Si es asiacute usareacute un StringBuffer que asegura la sincronizacioacuten

Si no es asiacute algo que sucederaacute en la mayor parte de los casos

usareacute StringBuilder ya que es maacutes eficiente

iquestPuedo estimar la maacutexima longitud de la cadena Si es asiacute inicializareacute mi StringBuffer o StringBuilder con esa capacidad para

evitar que el objeto deba regenerar su buffer interno cada vez que sobrepase su

capacidad

Un paso maacutes Ropes

En aplicaciones donde el rendimiento es fundamental en el uso de cadenas

puede ser conveniente el uso de otro tipo de estructuras de datos para su

representacioacuten y manejo

Un ejemplo de ello es la estructura de datos denominada Rope

Este concepto no es nuevo se introdujo en un artiacuteculo de 1995(2) y representa

las cadenas con una estructura de aacuterbol de forma que mejora el rendimiento

en operaciones como la insercioacuten y la concatenacioacuten de cadenas El precio a

pagar por estas mejoras de rendimiento viene en forma de uso de memoria

que es sensiblemente superior usando Ropes frente al uso de Strings o

StringBuffers

Existe una implementacioacuten en Java de esta estructura llamada Ropes For

Java(4) Como ejemplo estas son algunas graacuteficas del rendimiento de esta

implementacioacuten publicadas en un artiacuteculo del autor Amin Ahmad(3)

Referencias 1 - Performance improvement techniques in String and StringBuffer

2 - Ropes an Alternative to Strings

3 - Ropes Theory and practice

4 - Ropes For Java

Categoriacute

as

CES OpenSouceJava

Tema Desarrollo

Autor Miguel Bacaicoa

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo Herramientas de gestioacuten de proyectos Open Source

Texto Haraacute unos meses nos vimos en la tesitura de buscar una

herramienta de gestioacuten de proyectos para el Centro Java y Open

Source

Hasta el momento habiacuteamos estado trabajando con dotproject

un sistema con bastante capacidad y funcionalidades No

obstante resultoacute ser una herramienta algo pesada en la creacioacuten

de planificaciones y tediosa en el mantenimiento diacutea a diacutea

Buscaacutebamos principalmente una herramienta que no solo

gestionase la parte de planificacioacuten sino tambieacuten la parte de

seguimiento posterior para mantener el control sobre el proyecto

Ademaacutes deseaacutebamos un entorno colaborativo multi-usuario y

participativo entre nosotros y cualquier colaborador externo Lo

cual maacutes que un requerimiento funcional supone un cambio

cultural la parte maacutes compleja

Todo esto en principio decantaba la decisioacuten por una opcioacuten on-

line en detrimento de una de escritorio No obstante decidimos

valorar tambieacuten las de escritorio no fuera que por empecinarnos

en unas funcionalidades descartaacutesemos otras importantes

A continuacioacuten describireacute brevemente algunas de las

herramientas valoradas

De escritorio

GanttProject

Aplicacioacuten de escritorio muy extendida y uacutetil que permite

planificar tareas y recursos sobre un diagrama Gantt Se trata de

una herramienta similar a MS Project pero maacutes sencilla lo cual

puede ser en algunos casos una ventaja Otra caracteriacutestica

interesante es que funciona tanto en Linux como en Windows y

tiene diversos formatos de exportacioacuten e importacioacuten

Planner

Aplicacioacuten de escritorio bastante extendida y algo maacutes completa

a la anterior (a pesat de tener menos opciones de importacioacuten y

exportacioacuten) pero muy similar En este caso estaacute desarrollada

para Linux aunque existe versioacuten beta para Windows

Open Workbench

Aplicacioacuten de escritorio muy completa Al igual que las anteriores

permite gestionar tareas y recursos sobre un diagrama Gantt

aunque tambieacuten permite otros diagramas como Pert camino

criacutetico y funcionalidades maacutes avanzadas Se vanagloria de ser

incluso mejor que MS Project

TaskJuggler

Se trata de una herramienta de escritorio disponible tanto para

Windows como para Linux un tanto peculiar Genera una serie de

informes bastante completos a partir de un fichero de texto El

interfaz es bastante amigable pero el hecho de andar editando

un fichero de texto que contiene la planificacioacuten no resulta muy

coacutemodo

OpenProj

Otro programa de escritorio sustitutivo de MS Project y de

apariencia muy similar Tiene versiones para Linux Unix Mac y

Windows y es compatible con ficheros MS Project y con todas sus

funcionalidades No obstante parece no estar indicado para

proyectos de grupo En estos casos te ofrecen una versioacuten on-

line (Project-ON-Demand) bajo demanda y de pago bastante

interesante

Entorno web

TeamSCOPE

Team Software for Collaborative Project Environments es una

herramienta web de colaboracioacuten Desarrollado para funcionar

sobre Debian fue creado por una universidad pero parece

haberse quedado bastante anticuado

NetOffice

Herramienta web basada en PHP sobre MySQL para gestionar proyectos tareas registros de tiempos incidenciaserrores

diagramas de Gantt (aunque un poco escondidos) etc similar pero algo maacutes agradable que dotProject Tiene ciertos tintes de herramienta de colaboracioacuten en grupo (groupware)

phpCollab

Herramienta web basada en PHP que ha sufrido un desarrollo

intermitente por lo que parece Sirve tanto para la gestioacuten de

tareas como para el seguimiento de incidenciaserrores Tiene un

aspecto similar a netOffice lo cual hace pensar que uno de los

dos proyectos deriva del otro Quizaacutes por esa razoacuten de elegir una

de las dos sea maacutes recomendable netOffice

Achievo

Herramienta web PHP sobre MySQL para la gestioacuten de proyectos

tareas recursos registro de tiempos agenda generacioacuten de

informes etc Bastante completo ademaacutes parece incluir seccioacuten

presupuestaria

XPlanner

Herramienta web Java sobre MySQL para la gestioacuten de proyectos

mediante XP y Scrum No obstante parece estancada en una

versioacuten beta desde el 2006

PPTS

Project Planning and Tracking System (PPTS) es una herramienta

Web para la gestioacuten de proyectos con metodologiacuteas XP y Scrum

al igual que la anterior Esta desarrollada en PHP contra MySQL

aunque parece tambieacuten largo tiempo abandonada

XPWeb

Al igual que las anteriores es una herramienta web para la

gestioacuten de proyectos aacutegiles incluyendo gestioacuten de tareas

calendarios informes etc Tambieacuten parece estancada

Trac

Herramienta web ampliamente extendida en la comunidad open

source para fundamentalmente el seguimiento proyectos Se

centra en la gestioacuten de incidencias y errores aunque tiene

funcionalidades antildeadidas interesantes como Wiki e integracioacuten

con Subversioacuten Hay que resentildear que se trata de una

herramienta mono-proyecto y que no cuenta con Gantt

OpenProject

Herramienta web de gestioacuten de proyectos muy completa Posee

todo lo necesario tanto que uno llega a perderse No obstante

pueden configurarse los moacutedulos que desean usarse y descartar

aquellos que no son necesarios calendario gestioacuten de tareas

seguimiento de incidencias control presupuestario Wiki foros

integracioacuten con ERPs diagramas Gantt y una larga lista de

funcionalidades

Tutos

The Ultimate Team Organization Software o eso pretende Se

trata de una herramienta web LAMP con muchas funcionalidades

calendario y agenda seguimiento de incidencias y errores

gestioacuten de tareas diagramas Gantt gestioacuten documental gestioacuten

de correos facturas e informes Interesante pero austera de

aspecto y un poco anticuada

Project Dune

Herramienta web desarrollada en Java contra MySQL que pareciacutea

prometer bastante Tiene lo necesario gestioacuten de tareas

recursos incidencias gestioacuten documental registro de tiempos

informes calendario y agenda RSS inspeccioacuten de coacutedigo

importacioacuten de MS Project etc No obstante en su evaluacioacuten

dejoacute bastante que desear resultando poco praacutectica y manejable

Collabtive

Se trata de una herramienta web LAMP para la gestioacuten de

proyectos Seguacuten se indica en la web cubre la gestioacuten de tareas e

incidencias gestioacuten documental y mensajeriacutea Es muy limpia

sencilla y aacutegil No obstante no parece contar con diagramas

Gantt ni con registro de tiempos o informes de estado En la

praacutectica parece quedarse un poco justa pero prometedora

Mindquarry

Herramienta web desarrollada en Java que pretende ser la

alternativa open source de soluciones propietarias como

Basecamp o Sharepoint para la gestioacuten de proyectos y grupos de

trabajo de forma colaborativa Tiene una versioacuten open source

para descarga y otra como servicio bajo demanda La pega es

que la empresa parece haber dejado de desarrollar su actividad

ClockingIT

Se trata de una herramienta Web desarrollada en Ruby como

servicio bajo demanda Permite una gestioacuten de tareas agenda

siguiendo el estaacutendar iCal seguimiento de tiempos generacioacuten

de informes notificaciones RSS foros Chat y Wiki repositorio

de ficheros etc

LibreSource

Se trata de una plataforma web colaborativa para el desarrollo de

software lo que se suele denominar forja y funcionalidades de

groupware archivado y publicacioacuten web Es open source y

altamente ajustable Permite alojar muacuteltiples proyectos varios

grupos de usuarios etc Estaacute desarrollada en J2EE e incorpora

entre otras cosas Wiki integracioacuten con Subversion zonas de

descarga gestioacuten documental mensajeriacutea instantaacutenea con

Jabber gestioacuten de incidencias etc No fue evaluada al ser

descubierta posteriormente a la implantacioacuten de la herramienta

elegida pero parece una buena alternativa

Aunque existen infinidad maacutes de entre todas nos decantamos

por dos que valoramos maacutes en profundidad

TeamWork

Se trata de una herramienta web desarrollada en Java por unos

Italianos Entre sus funcionalidades cabe destacar la gestioacuten de

proyectos y tareas con diversos diagramas de Gantt muy

logrados gestioacuten de incidencias gestioacuten documental entorno

colaborativo tipo groupware control de costes registros de

tiempos etc

Es muy completo raacutepido de respuesta y posee caracteriacutesticas

muy interesantes como una interesante y uacutetil navegacioacuten

contextual entre tareas del proyecto perfiles de usuario seguacuten

proyecto importacioacuten de planificaciones desde MS Project o

asociacioacuten entre incidencias y tareas

Cuenta con wizards para la configuracioacuten de la herramienta de

forma raacutepida y sencilla incluyendo la posibilidad de generar

plantillas para aplicar metodologiacuteas aacutegiles (Scrum)

El registro de horas por tarea para un desarrollador se realiza de

forma muy coacutemoda y raacutepida desde una simple vista facilitando

la participacioacuten del mismo

Se trataba de una aplicacioacuten muy completa quizaacutes demasiado

un poco compleja de entender en un comienzo pero con muchas

posibilidades

No obstante teniacutea alguna que otra pega aunque es open source

posee una licencia de pago para su uso que en cualquier caso era

muy pequentildea Tiene una versioacuten de evaluacioacuten de 30 diacuteas para

quien desee probarla antes de decidir Por otro lado no distingue

proyectos existe una tarea padre que agrupa toda la

planificacioacuten asociada tampoco cuenta con Wiki y no gestiona las

vacaciones del personal

La otra herramienta valorada maacutes en profundidad fue

Redmine

Se trata de otra herramienta web en este caso desarrollada en

Ruby on Rails con una gran cantidad de funcionalidades que la

acerca bastante a una forja pero sin tener la complejidad de la

misma Entre sus caracteriacutesticas cabe destacar la gestioacuten de

tareas incidencias diagramas de Gantt calendario de

actividades noticias foros wikis gestioacuten de ficheros y

documentos integracioacuten con Subversioacuten control de tiempos

generacioacuten de informes etc todo esto por proyecto Por

similitudes del interfaz y funcionalidades parece estar basado en

Trac pero con un lavado de cara y de coacutedigo importante ademaacutes

de ser multi-proyecto

Al igual que la anterior tambieacuten poseiacutea una serie de

caracteriacutesticas que la haciacutea diferente como la posible navegacioacuten

anoacutenima de lectura si asiacute se desea sobre los proyectos alojados

Interesante desde el punto de vista de filosofiacutea open source

Posibilidad de definir un perfil distinto por usuario seguacuten el

proyecto en el que participa

Tambieacuten cuenta con sindicacioacuten de RSS para las secciones de

noticias tareas incidencias etc y exportacioacuten a ficheros de texto

y HTML desde la Wiki los informes generados e incluso el

diagrama de Gantt

A parte se trata de un interfaz muy limpio intuitivo sencillo de

usar y rapidiacutesimo

La configuracioacuten de la herramienta resulta asiacute mismo muy

sencilla con un par de clics puedes empezar a funcionar

Cada proyecto puede configurarse con los moacutedulos que desees

que tenga ademaacutes de poder definir campos personalizados por

proyecto y tarea para permitir una mayor adaptacioacuten

Cabe destacar que para esta herramienta existe un uacutenico

concepto denominado peticioacuten que puede ser de tres tipos

tareas soporte o incidencia De esta forma todo se gestiona de

igual forma lo cual lo simplifica pero a su vez puede convertirse

en un volumen ingestionable de tareas Para evitar esto se

pueden definir categoriacuteas a las que pertenece una peticioacuten y

realizar posteriormente filtrados de peticiones en las vistas seguacuten

este y otros paraacutemetros

No obstante no todo iba a ser color de rosa tiene una serie de

limitaciones como el sistema un tanto engorroso de enlazar

peticiones o el hecho de que una vez creada una peticioacuten su

nombre y descripcioacuten no se pueden modificar tan solo ir

antildeadiendo nuevas descripciones

En este punto nos encontraacutebamos en una difiacutecil decisioacuten puesto

que ambas herramientas nos gustaban cubriacutean lo necesario pero

se trataban de herramientas muy distintas en concepcioacuten Para

facilitar la decisioacuten realizamos un cuadro comparando las

caracteriacutesticas y priorizaacutendolas seguacuten nuestro intereacutes El

resultado fue el siguiente

Prioridad Caracteriacutestica Redmine TeamWork

9 Integracioacuten con

LDAP Si Si

8 Integracioacuten con

Subversion Si Si

8 Traducido al espantildeol

Si No

7 Importacioacuten desde

Project No Si

7 Exportacioacuten a

Project No Si

7 Centros de coste Posible mediante los campos

personalizados

Si

7 Wikis de proyectos Si

7 Personalizacioacuten

extensioacuten Si Si

6 Gestioacuten de vacaciones

No Vacaciones a nivel de

empresa

6 Vida de la herramienta

Indeterminado al ser una

herramienta open source

Algo maacutes seguro

porque hay una empresa detraacutes

5 Facilidad de configuracioacuten

Si

5 Usuarios multi-

perfil Si Si

4 Acceso restringido a usuarios

Si Si

3 Sencillez de manejo

Si

2 Seguimiento de

incidencias Si Si

1 Asignacioacuten de tareas

Si Si

1 Imputacioacuten a tareas asignadas

Si Si

Tras una difiacutecil reflexioacuten puesto que ambas se encontraban muy

parejas decidimos decantarnos por Redmine primando la

sencillez y rapidez Existiacutea la posibilidad de que terceros la

empleasen y veiacuteamos que Redmine permitiacutea una mayor facilidad

en su manejo y resultaba maacutes intuitiva de cara a aprender a

utilizarla Posteriormente tras su uso hemos detectado algunos

inconvenientes importantes como la imposibilidad de asignar una

peticioacuten a maacutes de un usuario pero es que no hay herramienta

perfecta

Bibliografiacutea

httpwwwnavegapolisnetcontentview5649

httpwwwsimpleprojectmanagementcomhomehtml

httpwwwweb-based-softwarecomproject

httpenwikipediaorgwikiComparison_of_issue_tracking_syste

ms

httpenwikipediaorgwikiList_of_project_management_softwa

re

httpwwwpmdigestcomsoftware

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Rauacutel Sanz de Acedo

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo Lexers parsers JavaCC (y II)

Texto En este artiacuteculo vamos a utilizar JavaCC como herramienta para

implementar un moacutedulo que resuelva la casuiacutestica de la

impresioacuten de las diversas paacuteginas de un fichero Esto es lo que se

refleja en esta imagen

Para ello en el artiacuteculo anterior definimos esta gramaacutetica a la que

asociamos unas acciones semaacutenticas

inicio --gt inicializacionVariables

listaElementos

procesarDatos

listaElementos --gt elemento

restoListaElementos

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

restoListaElementos --gt SEPARADOR

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

listaElementos

|

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

restoListaElementos2 --gt GUION ENTERO

num2 = valor(ENTERO)

Si (num2 gt maxPaginas)

or (num2==0) ent error

|

JavaCC es una herramienta que dado un fichero de extensioacuten

jj que describe la gramaacutetica y sus acciones semaacutenticas

asociadas genera los ficheros java que la implementan

Estos ficheros java pueden luego obviamente incluirse en

aqueacutellos que conforman el resto de nuestra aplicacioacuten

JavaCC es una herramienta gratuita que puede descargarse

desde aquiacute Existe tambieacuten un plugin para Eclipse Y asimismo

existe una task de Ant para JavaCC

Vamos pues a construir nuestro parser

Lo denominaremos parserImprimePaginasCC y por lo tanto

vamos a editar el fichero parserImprimePaginasCCjj

Indicaremos coacutemo se traducen los tokens y las producciones a

formato JavaCC

TOKEN

ltENTERO([0-9])+gt

| ltGUION -gt

| ltSEPARADOR([ ])+ | ([ ])gt

Los tokens se describen praacutecticamente como lo indicamos en la

gramaacutetica

void inicio()throws elementoFueraLimitesException

resultado = new Vector()

num1 = -1

num2 = -1

inicializaFlags()

listaElementos()

void listaElementos()throws elementoFueraLimitesExcept

ion

elemento() restoListaElementos()

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

restoListaElementos2()

void restoListaElementos()throws elementoFueraLimitesE

xception

ltSEPARADORgt

insertaElemento(num1 num2)

num1 = -1

num2 = -1

listaElementos()

|

insertaElemento(num1 num2)

num1 = -1

num2 = -1

void restoListaElementos2()throws elementoFueraLimites

Exception

ltGUIONgtltENTEROgt

num2 = IntegervalueOf(tokenimage)intValue()

if ((num2gtmaximo)|| (num2 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num2))

|

Las producciones son algo diferentes lo que era

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

ahora es

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(IntegertoS

tring(num1))

restoListaElementos2()

El no terminal elemento se describe como void elemento() y

ademaacutes le hemos asociado una excepcioacuten para controlar el hecho

de que un usuario coloque 0 o un nuacutemero mayor que el

permitido Lo que en la parte derecha es ENTERO se indica

como ltENTEROgt y la invocacioacuten de restoListaElementos2

es restoListaElementos2()

Las acciones semaacutenticas

num1 = valor(ENTERO)

Si (num1 gt maxPaginas) or (num1==0) ent error

se indican en JavaCC asiacute

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

El valor del token actual es accesible a traveacutes de tokenimage

Si deseamos tener coacutedigo Java adicional fuera de las

producciones lo podemos antildeadir de esta forma con la palabra

reservada JAVACODE

JAVACODE void insertaElemento(int num1 int num2)

int aux i iFlag

if ((num1 = -1) ampamp (num2 = -1))

if (num1gtnum2)

aux = num1

num1 = num2

num2 = aux

for (i = num1

i lt= num2

i++)

iFlag = i-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(i))

flags[iFlag] = true

else if (num1 = -1)

iFlag = num1-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num1))

flags[iFlag] = true

else if (num2 = -1)

iFlag = num2-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num2))

flags[iFlag] = true

JAVACODE void inicializaFlags()

int i

flags = new boolean [maximo]

for (i = 0

iltmaximo

i++)

flags[i] = false

Ademaacutes podemos inicializar el parser e instanciarlo de esta

forma

PARSER_BEGIN(parserImprimePaginasCC)

import javaio

import javautilVector

public class parserImprimePaginasCC

public static int maximo

public static Vector resultado

private static int num1 num2

private static boolean flags[]

public static void main(String[]args)throws Exceptio

n

Reader r = new StringReader(args[0])

parserImprimePaginasCC p

= new parserImprimePaginasCC(r)

try

pmaximo = 50

Systemoutprintln(Maacuteximo +pmaximo)

pinicio()

Systemoutprintln(OKn)

for (int j = 0

jltpresultadosize()

j++)

Systemoutprint(presultadoelementAt(j)+

)

Systemoutprintln()

catch (ParseException e)

Systemoutprintln(Error de sintaxis)

catch (TokenMgrError e)

Systemoutprintln(Error leacutexico)

catch (elementoFueraLimitesException e)

Systemoutprintln(egetMessage())

PARSER_END(parserImprimePaginasCC)

En este caso tomaremos la entrada de lo que el usuario

introduzca por teclado pero se pueden tomar los datos a traveacutes

de ficheros o pasarlos como variables

Se hace referencia a una excepcioacuten que hemos definido asiacute en un

fichero llamado elementoFueraLimitesExceptionjava

public class elementoFueraLimitesException extends Exc

eption

Constructor

public elementoFueraLimitesException()

super()

public elementoFueraLimitesException(String msg)

super(msg)

Una vez salvado el fichero parserImprimePaginasCCjj podemos

generar la documentacioacuten de la gramaacutetica en formato HTML de

esta forma

Nota en la ejecucioacuten de estos ejemplos se ha utilizado la liacutenea de comandos de

Windows pero se podriacutea haber hecho a traveacutes de cualquier sistema que soporte

el lenguaje Java

gtjjdoc parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Documentation

Generator Version 014)

(type jjdoc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Grammar documentation generated successfully in

parserImprimePaginasCChtml

Se genera el fichero parserImprimePaginasCChtmlcuyo

contenido es

BNF for parserImprimePaginasCCjj NON-TERMINALS

inicio = listaElementos

listaElementos = elemento restoListaElementos

elemento = ltENTEROgt restoListaElementos2

restoListaElementos = ltSEPARADORgt listaElementos

|

restoListaElementos2 = ltGUIONgt ltENTEROgt

|

insertaElemento = java code

inicializaFlags = java code

Nota BNF es el tipo de notacioacuten que estamos utilizando a lo largo de estos

artiacuteculos

Compilamos el parser

gtjavacc parser ImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

File TokenMgrErrorjava does not exist Will create

one

File ParseExceptionjava does not exist Will

create one

File Tokenjava does not exist Will create one

File SimpleCharStreamjava does not exist Will

create one

Parser generated successfully

y entonces se generan estos ficheros

ParseExceptionjava --gt

Excepcioacuten generada por el parser cuando un error es encontrado

parserImprimePaginasCCjava --gt La

traduccioacuten de nuestro fichero jj a java

parserImprimePaginasCCConstantsjava --gt Los

valores de los tokens

parserImprimePaginasCCTokenManagerjava --gt El

analizador leacutexico

SimpleCharStreamjava --gt

Contiene coacutedigo para leer caracteres de cualquier

implementacioacuten de javaioInputStream o javaioReader

Tokenjava --gt

Definicioacuten de la clase Token

TokenMgrErrorjava --gt

Diversos errores que puede producir el lexer

Ahora los compilamos y antildeadimos el fichero

elementoFueraLimitesExceptionjava en dicha compilacioacuten

javac java

Y vamos a ejecutar el parser suponiendo que el maacuteximo nuacutemero

de paacuteginas a impmir es 50 (como hemos indicado con pmaximo =

50)

Lo que obtenemos como salida es la lista de paacuteginas a imprimir o

un mensaje de error

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

OK

2 5 6 7 8

java -classpath laboratorioParsers

parserImprimePaginasCC 28-3046

Num paginas 50

OK

28 29 30 4 6

java -classpath laboratorioParsers

parserImprimePaginasCC 43-51

Num paginas 50

Introdujo un numero superior al maximo51

java -classpath laboratorioParsers

parserImprimePaginasCC 43--51

Num paginas 50

Error de sintaxisEncountered - at line 1

column 4

Was expecting

ltENTEROgt

iquestQueacute pasa si algo ha ido mal iquestPodemos depurar el parser de

alguna forma

Por supuesto podemos compilar el parser asiacute para obtener una

traza de la ejecucioacuten

javacc -DEBUG_PARSER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Consumed token lt- at line 1 column 4gt

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

En la traza vemos coacutemo el parser va invocando la diferentes

producciones

Podemos tambieacuten depurar el lexer

javacc -DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Returning the ltEOFgt token

OK

2 5 6 7 8

O combinar ambas trazas

javacc -DEBUG_PARSER -

DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Consumed token lt- at line 1 column 4gt

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Returning the ltEOFgt token

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

Conclusioacuten los generadores de parsers son herramientas

potentes que sirven para resolver problemas de una manera

bdquolimpia‟ y elegante Puede que su nombre retraiga a los

desarrolladores (ldquoiquestPara queacute quiero un generador de

compiladoresrdquo) pero es una opcioacuten a tener en cuenta

Ficheros para descargar

Referencias

- Generating Parsers with JavaCC

- The JavaCC FAQ

Si quieres enviar alguacuten comentario o sugerir temas a tratar en otros artiacuteculos escribe a

curtasun[simboloArroba]ceines

Categor

iacuteas

CES OpenSouceJava

Tema Desarrollo

Autor Carlos Urtasun

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo XSL-FO (Parte 1)

Texto XSL-FO Introduccioacuten El estaacutendar XSL tal y como estaacute definido actualmente se

divide en dos grandes partes -XSLT transformacioacuten de un documento de entrada XML en

alguacuten tipo de documento de salida ya sea XML HTML PDF etc -Formatting Objects (FO) definen la visualizacioacuten final del

resultado de la transformacioacuten Son una implementacioacuten especiacutefica de un determinado XSLT y aplicados a un

fichero XML nos proporcionan otro fichero con la informacioacuten de eacuteste renderizada a alguacuten formato de visualizacioacuten impresa Eacutesta es quizaacute la principal diferencia entre un FO y

otros XSLT ambos transforman un documento XML en otro documento XML pero FO estaacute pensado para generar

directamente una renderizacioacuten

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 8: Cesnavarra 2008-boletín 7

Y por ultimo y no menos importante llevar a cabo sesiones de

trabajo compartidas entre varios miembros de un equipo sobre una misma nota remotamente (una manera muy uacutetil de llevar a

cabo tormentas de ideas) etcPor eso Por eso podemos llamar a OneNote la navaja suiza de los productos Office y recomiendo su utilizacioacuten

Categoriacuteas

CES Microsoft

Tema Varios

Autor Rafael Flores Yoldi

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo Strings StringBuffershellip y Ropes

Texto El manejo de las cadenas de caracteres es un aspecto fundamental en cualquier

lenguaje de programacioacuten En este artiacuteculo daremos un breve repaso al manejo

de cadenas en Java y a las clases maacutes importantes del lenguaje en este aspecto

como son String StringBuffer y StringBuilder

Ademaacutes introduciremos una libreriacutea para el manejo avanzado de

cadenas Ropes For Java

La clase String

La clase String representa una cadena de caracteres con una caracteriacutestica

fundamental es inmutable Es decir una vez creado un String no es posible

modificarlo Los meacutetodos que concatenan reemplazan caracteres etc

devuelven otro objeto con las modificaciones realizadas

Por ejemplo tras ejecutar el siguiente coacutedigo

String str = ldquoLa clase String es ldquo strconcat(ldquoinmutablerdquo)

el valor de la variable str sigue siendo ldquoLa clase String es ldquo

En cambio si hacemos

String str2 = strconcat(ldquoinmutablerdquo) el nuevo String str2 ya contendraacute la cadena completa ldquoLa clase String

es inmutableldquo

Por esta caracteriacutestica la clase String no es adecuada si lo que se necesita es

realizar muchas modificaciones sobre el texto ya que supone la creacioacuten de

muchos objetos temporales

StringBuffer y StringBuilder

La clase StringBuffer es la variante mutable de String Permite modificar su

contenido concatenar cadenas etc de forma mucho maacutes eficiente que la

claseString

En la versioacuten 5 de Java se incluyoacute la clase StringBuilder que es igual que la

clase StringBuilder pero no sincronizada Si el objeto no va a ser accedido por

maacutes de un hilo simultaacuteneamente se recomienda el uso de StringBuilder ya que

al no ser sincronizado mejora ligeramente el rendimiento

Al utilizar StringBuffer o StringBuilder hay un aspecto que muchas veces no se

tiene en cuenta y que puede tener un impacto importante en el rendimiento la

capacidad inicial

Estos objetos almacenan un array de caracteres que debe ser regenerado

cuando las operaciones hacen que se sobrepase la capacidad del array

Inicializar el objeto a un valor adecuado puede mejorar el rendimiento global

del objeto Por defecto se inicializan con una capacidad de 16 caracteres

Cada vez que debe crecer el nuevo tamantildeo es 2 + 2TamantildeoActual Si el

tamantildeo no va a ser muy grande la diferencia de rendimiento seraacute inapreciable

pero esta inicializacioacuten debe ser tenida en cuenta para el manejo de grandes

cadenas

Cadenas en tiempo de compilacioacuten y en tiempo de

ejecucioacuten

Como curiosidad cabe destacar la labor del compilador de Java en el manejo de

cadenas A veces para mejorar la legibilidad se escribe coacutedigo de este tipo

String sql = select col1 col2 col3 + from table1 t1+

join table2 t2 on t1col1 =

t2col1+ join table3 t3 on t2col3 =

t3col2+ where t1col1 = and t3col3 =

oacute

StringBuffer sbsql = new StringBuffer(select

col1 col2 col3 ) sbsqlappend(from table1 t1) sbsqlappend(join table2 t2 on t1col1 =

t2col1) sbsqlappend(join table3 t3 on t2col3 =

t3col2) sbsqlappend(where t1col1 = and t3col3 =

) String sql = sbsqltoString()

En este caso la primera opcioacuten con la suma de cadenas ofrece mejor

rendimiento que la que utiliza el StringBuffer La explicacioacuten estaacute en el

compilador de Java que realiza la suma de las cadenas en tiempo de

compilacioacuten

Cuando la concatenacioacuten se realiza en tiempo de ejecucioacuten (concatenacioacuten de

variables no de cadenas constantes) el rendimiento mejora

utilizandoStringBuffer como se ha comentado en el punto anterior En este

caso si se suman Strings el compilador genera un StringBuffer para cada suma

de cadenas penalizando el rendimiento frente a la utilizacioacuten de un solo

objeto StringBuffer

Las tres preguntas

Podemos resumir lo visto hasta ahora en tres preguntas que deberiacuteamos

hacernos antes de escribir String str = hellip

iquestVoy a modificar esta cadena Si la repuesta es no o simplemente voy a concatenar cadenas constantes para

mejorar la legibilidad del coacutedigo usareacute String

Si voy a modificarla en funcioacuten de la ejecucioacuten

usareacute StringBuffer o StringBuilder

iquestVa a acceder maacutes de un hilo a mi cadena simultaacuteneamente Si es asiacute usareacute un StringBuffer que asegura la sincronizacioacuten

Si no es asiacute algo que sucederaacute en la mayor parte de los casos

usareacute StringBuilder ya que es maacutes eficiente

iquestPuedo estimar la maacutexima longitud de la cadena Si es asiacute inicializareacute mi StringBuffer o StringBuilder con esa capacidad para

evitar que el objeto deba regenerar su buffer interno cada vez que sobrepase su

capacidad

Un paso maacutes Ropes

En aplicaciones donde el rendimiento es fundamental en el uso de cadenas

puede ser conveniente el uso de otro tipo de estructuras de datos para su

representacioacuten y manejo

Un ejemplo de ello es la estructura de datos denominada Rope

Este concepto no es nuevo se introdujo en un artiacuteculo de 1995(2) y representa

las cadenas con una estructura de aacuterbol de forma que mejora el rendimiento

en operaciones como la insercioacuten y la concatenacioacuten de cadenas El precio a

pagar por estas mejoras de rendimiento viene en forma de uso de memoria

que es sensiblemente superior usando Ropes frente al uso de Strings o

StringBuffers

Existe una implementacioacuten en Java de esta estructura llamada Ropes For

Java(4) Como ejemplo estas son algunas graacuteficas del rendimiento de esta

implementacioacuten publicadas en un artiacuteculo del autor Amin Ahmad(3)

Referencias 1 - Performance improvement techniques in String and StringBuffer

2 - Ropes an Alternative to Strings

3 - Ropes Theory and practice

4 - Ropes For Java

Categoriacute

as

CES OpenSouceJava

Tema Desarrollo

Autor Miguel Bacaicoa

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo Herramientas de gestioacuten de proyectos Open Source

Texto Haraacute unos meses nos vimos en la tesitura de buscar una

herramienta de gestioacuten de proyectos para el Centro Java y Open

Source

Hasta el momento habiacuteamos estado trabajando con dotproject

un sistema con bastante capacidad y funcionalidades No

obstante resultoacute ser una herramienta algo pesada en la creacioacuten

de planificaciones y tediosa en el mantenimiento diacutea a diacutea

Buscaacutebamos principalmente una herramienta que no solo

gestionase la parte de planificacioacuten sino tambieacuten la parte de

seguimiento posterior para mantener el control sobre el proyecto

Ademaacutes deseaacutebamos un entorno colaborativo multi-usuario y

participativo entre nosotros y cualquier colaborador externo Lo

cual maacutes que un requerimiento funcional supone un cambio

cultural la parte maacutes compleja

Todo esto en principio decantaba la decisioacuten por una opcioacuten on-

line en detrimento de una de escritorio No obstante decidimos

valorar tambieacuten las de escritorio no fuera que por empecinarnos

en unas funcionalidades descartaacutesemos otras importantes

A continuacioacuten describireacute brevemente algunas de las

herramientas valoradas

De escritorio

GanttProject

Aplicacioacuten de escritorio muy extendida y uacutetil que permite

planificar tareas y recursos sobre un diagrama Gantt Se trata de

una herramienta similar a MS Project pero maacutes sencilla lo cual

puede ser en algunos casos una ventaja Otra caracteriacutestica

interesante es que funciona tanto en Linux como en Windows y

tiene diversos formatos de exportacioacuten e importacioacuten

Planner

Aplicacioacuten de escritorio bastante extendida y algo maacutes completa

a la anterior (a pesat de tener menos opciones de importacioacuten y

exportacioacuten) pero muy similar En este caso estaacute desarrollada

para Linux aunque existe versioacuten beta para Windows

Open Workbench

Aplicacioacuten de escritorio muy completa Al igual que las anteriores

permite gestionar tareas y recursos sobre un diagrama Gantt

aunque tambieacuten permite otros diagramas como Pert camino

criacutetico y funcionalidades maacutes avanzadas Se vanagloria de ser

incluso mejor que MS Project

TaskJuggler

Se trata de una herramienta de escritorio disponible tanto para

Windows como para Linux un tanto peculiar Genera una serie de

informes bastante completos a partir de un fichero de texto El

interfaz es bastante amigable pero el hecho de andar editando

un fichero de texto que contiene la planificacioacuten no resulta muy

coacutemodo

OpenProj

Otro programa de escritorio sustitutivo de MS Project y de

apariencia muy similar Tiene versiones para Linux Unix Mac y

Windows y es compatible con ficheros MS Project y con todas sus

funcionalidades No obstante parece no estar indicado para

proyectos de grupo En estos casos te ofrecen una versioacuten on-

line (Project-ON-Demand) bajo demanda y de pago bastante

interesante

Entorno web

TeamSCOPE

Team Software for Collaborative Project Environments es una

herramienta web de colaboracioacuten Desarrollado para funcionar

sobre Debian fue creado por una universidad pero parece

haberse quedado bastante anticuado

NetOffice

Herramienta web basada en PHP sobre MySQL para gestionar proyectos tareas registros de tiempos incidenciaserrores

diagramas de Gantt (aunque un poco escondidos) etc similar pero algo maacutes agradable que dotProject Tiene ciertos tintes de herramienta de colaboracioacuten en grupo (groupware)

phpCollab

Herramienta web basada en PHP que ha sufrido un desarrollo

intermitente por lo que parece Sirve tanto para la gestioacuten de

tareas como para el seguimiento de incidenciaserrores Tiene un

aspecto similar a netOffice lo cual hace pensar que uno de los

dos proyectos deriva del otro Quizaacutes por esa razoacuten de elegir una

de las dos sea maacutes recomendable netOffice

Achievo

Herramienta web PHP sobre MySQL para la gestioacuten de proyectos

tareas recursos registro de tiempos agenda generacioacuten de

informes etc Bastante completo ademaacutes parece incluir seccioacuten

presupuestaria

XPlanner

Herramienta web Java sobre MySQL para la gestioacuten de proyectos

mediante XP y Scrum No obstante parece estancada en una

versioacuten beta desde el 2006

PPTS

Project Planning and Tracking System (PPTS) es una herramienta

Web para la gestioacuten de proyectos con metodologiacuteas XP y Scrum

al igual que la anterior Esta desarrollada en PHP contra MySQL

aunque parece tambieacuten largo tiempo abandonada

XPWeb

Al igual que las anteriores es una herramienta web para la

gestioacuten de proyectos aacutegiles incluyendo gestioacuten de tareas

calendarios informes etc Tambieacuten parece estancada

Trac

Herramienta web ampliamente extendida en la comunidad open

source para fundamentalmente el seguimiento proyectos Se

centra en la gestioacuten de incidencias y errores aunque tiene

funcionalidades antildeadidas interesantes como Wiki e integracioacuten

con Subversioacuten Hay que resentildear que se trata de una

herramienta mono-proyecto y que no cuenta con Gantt

OpenProject

Herramienta web de gestioacuten de proyectos muy completa Posee

todo lo necesario tanto que uno llega a perderse No obstante

pueden configurarse los moacutedulos que desean usarse y descartar

aquellos que no son necesarios calendario gestioacuten de tareas

seguimiento de incidencias control presupuestario Wiki foros

integracioacuten con ERPs diagramas Gantt y una larga lista de

funcionalidades

Tutos

The Ultimate Team Organization Software o eso pretende Se

trata de una herramienta web LAMP con muchas funcionalidades

calendario y agenda seguimiento de incidencias y errores

gestioacuten de tareas diagramas Gantt gestioacuten documental gestioacuten

de correos facturas e informes Interesante pero austera de

aspecto y un poco anticuada

Project Dune

Herramienta web desarrollada en Java contra MySQL que pareciacutea

prometer bastante Tiene lo necesario gestioacuten de tareas

recursos incidencias gestioacuten documental registro de tiempos

informes calendario y agenda RSS inspeccioacuten de coacutedigo

importacioacuten de MS Project etc No obstante en su evaluacioacuten

dejoacute bastante que desear resultando poco praacutectica y manejable

Collabtive

Se trata de una herramienta web LAMP para la gestioacuten de

proyectos Seguacuten se indica en la web cubre la gestioacuten de tareas e

incidencias gestioacuten documental y mensajeriacutea Es muy limpia

sencilla y aacutegil No obstante no parece contar con diagramas

Gantt ni con registro de tiempos o informes de estado En la

praacutectica parece quedarse un poco justa pero prometedora

Mindquarry

Herramienta web desarrollada en Java que pretende ser la

alternativa open source de soluciones propietarias como

Basecamp o Sharepoint para la gestioacuten de proyectos y grupos de

trabajo de forma colaborativa Tiene una versioacuten open source

para descarga y otra como servicio bajo demanda La pega es

que la empresa parece haber dejado de desarrollar su actividad

ClockingIT

Se trata de una herramienta Web desarrollada en Ruby como

servicio bajo demanda Permite una gestioacuten de tareas agenda

siguiendo el estaacutendar iCal seguimiento de tiempos generacioacuten

de informes notificaciones RSS foros Chat y Wiki repositorio

de ficheros etc

LibreSource

Se trata de una plataforma web colaborativa para el desarrollo de

software lo que se suele denominar forja y funcionalidades de

groupware archivado y publicacioacuten web Es open source y

altamente ajustable Permite alojar muacuteltiples proyectos varios

grupos de usuarios etc Estaacute desarrollada en J2EE e incorpora

entre otras cosas Wiki integracioacuten con Subversion zonas de

descarga gestioacuten documental mensajeriacutea instantaacutenea con

Jabber gestioacuten de incidencias etc No fue evaluada al ser

descubierta posteriormente a la implantacioacuten de la herramienta

elegida pero parece una buena alternativa

Aunque existen infinidad maacutes de entre todas nos decantamos

por dos que valoramos maacutes en profundidad

TeamWork

Se trata de una herramienta web desarrollada en Java por unos

Italianos Entre sus funcionalidades cabe destacar la gestioacuten de

proyectos y tareas con diversos diagramas de Gantt muy

logrados gestioacuten de incidencias gestioacuten documental entorno

colaborativo tipo groupware control de costes registros de

tiempos etc

Es muy completo raacutepido de respuesta y posee caracteriacutesticas

muy interesantes como una interesante y uacutetil navegacioacuten

contextual entre tareas del proyecto perfiles de usuario seguacuten

proyecto importacioacuten de planificaciones desde MS Project o

asociacioacuten entre incidencias y tareas

Cuenta con wizards para la configuracioacuten de la herramienta de

forma raacutepida y sencilla incluyendo la posibilidad de generar

plantillas para aplicar metodologiacuteas aacutegiles (Scrum)

El registro de horas por tarea para un desarrollador se realiza de

forma muy coacutemoda y raacutepida desde una simple vista facilitando

la participacioacuten del mismo

Se trataba de una aplicacioacuten muy completa quizaacutes demasiado

un poco compleja de entender en un comienzo pero con muchas

posibilidades

No obstante teniacutea alguna que otra pega aunque es open source

posee una licencia de pago para su uso que en cualquier caso era

muy pequentildea Tiene una versioacuten de evaluacioacuten de 30 diacuteas para

quien desee probarla antes de decidir Por otro lado no distingue

proyectos existe una tarea padre que agrupa toda la

planificacioacuten asociada tampoco cuenta con Wiki y no gestiona las

vacaciones del personal

La otra herramienta valorada maacutes en profundidad fue

Redmine

Se trata de otra herramienta web en este caso desarrollada en

Ruby on Rails con una gran cantidad de funcionalidades que la

acerca bastante a una forja pero sin tener la complejidad de la

misma Entre sus caracteriacutesticas cabe destacar la gestioacuten de

tareas incidencias diagramas de Gantt calendario de

actividades noticias foros wikis gestioacuten de ficheros y

documentos integracioacuten con Subversioacuten control de tiempos

generacioacuten de informes etc todo esto por proyecto Por

similitudes del interfaz y funcionalidades parece estar basado en

Trac pero con un lavado de cara y de coacutedigo importante ademaacutes

de ser multi-proyecto

Al igual que la anterior tambieacuten poseiacutea una serie de

caracteriacutesticas que la haciacutea diferente como la posible navegacioacuten

anoacutenima de lectura si asiacute se desea sobre los proyectos alojados

Interesante desde el punto de vista de filosofiacutea open source

Posibilidad de definir un perfil distinto por usuario seguacuten el

proyecto en el que participa

Tambieacuten cuenta con sindicacioacuten de RSS para las secciones de

noticias tareas incidencias etc y exportacioacuten a ficheros de texto

y HTML desde la Wiki los informes generados e incluso el

diagrama de Gantt

A parte se trata de un interfaz muy limpio intuitivo sencillo de

usar y rapidiacutesimo

La configuracioacuten de la herramienta resulta asiacute mismo muy

sencilla con un par de clics puedes empezar a funcionar

Cada proyecto puede configurarse con los moacutedulos que desees

que tenga ademaacutes de poder definir campos personalizados por

proyecto y tarea para permitir una mayor adaptacioacuten

Cabe destacar que para esta herramienta existe un uacutenico

concepto denominado peticioacuten que puede ser de tres tipos

tareas soporte o incidencia De esta forma todo se gestiona de

igual forma lo cual lo simplifica pero a su vez puede convertirse

en un volumen ingestionable de tareas Para evitar esto se

pueden definir categoriacuteas a las que pertenece una peticioacuten y

realizar posteriormente filtrados de peticiones en las vistas seguacuten

este y otros paraacutemetros

No obstante no todo iba a ser color de rosa tiene una serie de

limitaciones como el sistema un tanto engorroso de enlazar

peticiones o el hecho de que una vez creada una peticioacuten su

nombre y descripcioacuten no se pueden modificar tan solo ir

antildeadiendo nuevas descripciones

En este punto nos encontraacutebamos en una difiacutecil decisioacuten puesto

que ambas herramientas nos gustaban cubriacutean lo necesario pero

se trataban de herramientas muy distintas en concepcioacuten Para

facilitar la decisioacuten realizamos un cuadro comparando las

caracteriacutesticas y priorizaacutendolas seguacuten nuestro intereacutes El

resultado fue el siguiente

Prioridad Caracteriacutestica Redmine TeamWork

9 Integracioacuten con

LDAP Si Si

8 Integracioacuten con

Subversion Si Si

8 Traducido al espantildeol

Si No

7 Importacioacuten desde

Project No Si

7 Exportacioacuten a

Project No Si

7 Centros de coste Posible mediante los campos

personalizados

Si

7 Wikis de proyectos Si

7 Personalizacioacuten

extensioacuten Si Si

6 Gestioacuten de vacaciones

No Vacaciones a nivel de

empresa

6 Vida de la herramienta

Indeterminado al ser una

herramienta open source

Algo maacutes seguro

porque hay una empresa detraacutes

5 Facilidad de configuracioacuten

Si

5 Usuarios multi-

perfil Si Si

4 Acceso restringido a usuarios

Si Si

3 Sencillez de manejo

Si

2 Seguimiento de

incidencias Si Si

1 Asignacioacuten de tareas

Si Si

1 Imputacioacuten a tareas asignadas

Si Si

Tras una difiacutecil reflexioacuten puesto que ambas se encontraban muy

parejas decidimos decantarnos por Redmine primando la

sencillez y rapidez Existiacutea la posibilidad de que terceros la

empleasen y veiacuteamos que Redmine permitiacutea una mayor facilidad

en su manejo y resultaba maacutes intuitiva de cara a aprender a

utilizarla Posteriormente tras su uso hemos detectado algunos

inconvenientes importantes como la imposibilidad de asignar una

peticioacuten a maacutes de un usuario pero es que no hay herramienta

perfecta

Bibliografiacutea

httpwwwnavegapolisnetcontentview5649

httpwwwsimpleprojectmanagementcomhomehtml

httpwwwweb-based-softwarecomproject

httpenwikipediaorgwikiComparison_of_issue_tracking_syste

ms

httpenwikipediaorgwikiList_of_project_management_softwa

re

httpwwwpmdigestcomsoftware

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Rauacutel Sanz de Acedo

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo Lexers parsers JavaCC (y II)

Texto En este artiacuteculo vamos a utilizar JavaCC como herramienta para

implementar un moacutedulo que resuelva la casuiacutestica de la

impresioacuten de las diversas paacuteginas de un fichero Esto es lo que se

refleja en esta imagen

Para ello en el artiacuteculo anterior definimos esta gramaacutetica a la que

asociamos unas acciones semaacutenticas

inicio --gt inicializacionVariables

listaElementos

procesarDatos

listaElementos --gt elemento

restoListaElementos

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

restoListaElementos --gt SEPARADOR

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

listaElementos

|

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

restoListaElementos2 --gt GUION ENTERO

num2 = valor(ENTERO)

Si (num2 gt maxPaginas)

or (num2==0) ent error

|

JavaCC es una herramienta que dado un fichero de extensioacuten

jj que describe la gramaacutetica y sus acciones semaacutenticas

asociadas genera los ficheros java que la implementan

Estos ficheros java pueden luego obviamente incluirse en

aqueacutellos que conforman el resto de nuestra aplicacioacuten

JavaCC es una herramienta gratuita que puede descargarse

desde aquiacute Existe tambieacuten un plugin para Eclipse Y asimismo

existe una task de Ant para JavaCC

Vamos pues a construir nuestro parser

Lo denominaremos parserImprimePaginasCC y por lo tanto

vamos a editar el fichero parserImprimePaginasCCjj

Indicaremos coacutemo se traducen los tokens y las producciones a

formato JavaCC

TOKEN

ltENTERO([0-9])+gt

| ltGUION -gt

| ltSEPARADOR([ ])+ | ([ ])gt

Los tokens se describen praacutecticamente como lo indicamos en la

gramaacutetica

void inicio()throws elementoFueraLimitesException

resultado = new Vector()

num1 = -1

num2 = -1

inicializaFlags()

listaElementos()

void listaElementos()throws elementoFueraLimitesExcept

ion

elemento() restoListaElementos()

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

restoListaElementos2()

void restoListaElementos()throws elementoFueraLimitesE

xception

ltSEPARADORgt

insertaElemento(num1 num2)

num1 = -1

num2 = -1

listaElementos()

|

insertaElemento(num1 num2)

num1 = -1

num2 = -1

void restoListaElementos2()throws elementoFueraLimites

Exception

ltGUIONgtltENTEROgt

num2 = IntegervalueOf(tokenimage)intValue()

if ((num2gtmaximo)|| (num2 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num2))

|

Las producciones son algo diferentes lo que era

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

ahora es

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(IntegertoS

tring(num1))

restoListaElementos2()

El no terminal elemento se describe como void elemento() y

ademaacutes le hemos asociado una excepcioacuten para controlar el hecho

de que un usuario coloque 0 o un nuacutemero mayor que el

permitido Lo que en la parte derecha es ENTERO se indica

como ltENTEROgt y la invocacioacuten de restoListaElementos2

es restoListaElementos2()

Las acciones semaacutenticas

num1 = valor(ENTERO)

Si (num1 gt maxPaginas) or (num1==0) ent error

se indican en JavaCC asiacute

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

El valor del token actual es accesible a traveacutes de tokenimage

Si deseamos tener coacutedigo Java adicional fuera de las

producciones lo podemos antildeadir de esta forma con la palabra

reservada JAVACODE

JAVACODE void insertaElemento(int num1 int num2)

int aux i iFlag

if ((num1 = -1) ampamp (num2 = -1))

if (num1gtnum2)

aux = num1

num1 = num2

num2 = aux

for (i = num1

i lt= num2

i++)

iFlag = i-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(i))

flags[iFlag] = true

else if (num1 = -1)

iFlag = num1-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num1))

flags[iFlag] = true

else if (num2 = -1)

iFlag = num2-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num2))

flags[iFlag] = true

JAVACODE void inicializaFlags()

int i

flags = new boolean [maximo]

for (i = 0

iltmaximo

i++)

flags[i] = false

Ademaacutes podemos inicializar el parser e instanciarlo de esta

forma

PARSER_BEGIN(parserImprimePaginasCC)

import javaio

import javautilVector

public class parserImprimePaginasCC

public static int maximo

public static Vector resultado

private static int num1 num2

private static boolean flags[]

public static void main(String[]args)throws Exceptio

n

Reader r = new StringReader(args[0])

parserImprimePaginasCC p

= new parserImprimePaginasCC(r)

try

pmaximo = 50

Systemoutprintln(Maacuteximo +pmaximo)

pinicio()

Systemoutprintln(OKn)

for (int j = 0

jltpresultadosize()

j++)

Systemoutprint(presultadoelementAt(j)+

)

Systemoutprintln()

catch (ParseException e)

Systemoutprintln(Error de sintaxis)

catch (TokenMgrError e)

Systemoutprintln(Error leacutexico)

catch (elementoFueraLimitesException e)

Systemoutprintln(egetMessage())

PARSER_END(parserImprimePaginasCC)

En este caso tomaremos la entrada de lo que el usuario

introduzca por teclado pero se pueden tomar los datos a traveacutes

de ficheros o pasarlos como variables

Se hace referencia a una excepcioacuten que hemos definido asiacute en un

fichero llamado elementoFueraLimitesExceptionjava

public class elementoFueraLimitesException extends Exc

eption

Constructor

public elementoFueraLimitesException()

super()

public elementoFueraLimitesException(String msg)

super(msg)

Una vez salvado el fichero parserImprimePaginasCCjj podemos

generar la documentacioacuten de la gramaacutetica en formato HTML de

esta forma

Nota en la ejecucioacuten de estos ejemplos se ha utilizado la liacutenea de comandos de

Windows pero se podriacutea haber hecho a traveacutes de cualquier sistema que soporte

el lenguaje Java

gtjjdoc parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Documentation

Generator Version 014)

(type jjdoc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Grammar documentation generated successfully in

parserImprimePaginasCChtml

Se genera el fichero parserImprimePaginasCChtmlcuyo

contenido es

BNF for parserImprimePaginasCCjj NON-TERMINALS

inicio = listaElementos

listaElementos = elemento restoListaElementos

elemento = ltENTEROgt restoListaElementos2

restoListaElementos = ltSEPARADORgt listaElementos

|

restoListaElementos2 = ltGUIONgt ltENTEROgt

|

insertaElemento = java code

inicializaFlags = java code

Nota BNF es el tipo de notacioacuten que estamos utilizando a lo largo de estos

artiacuteculos

Compilamos el parser

gtjavacc parser ImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

File TokenMgrErrorjava does not exist Will create

one

File ParseExceptionjava does not exist Will

create one

File Tokenjava does not exist Will create one

File SimpleCharStreamjava does not exist Will

create one

Parser generated successfully

y entonces se generan estos ficheros

ParseExceptionjava --gt

Excepcioacuten generada por el parser cuando un error es encontrado

parserImprimePaginasCCjava --gt La

traduccioacuten de nuestro fichero jj a java

parserImprimePaginasCCConstantsjava --gt Los

valores de los tokens

parserImprimePaginasCCTokenManagerjava --gt El

analizador leacutexico

SimpleCharStreamjava --gt

Contiene coacutedigo para leer caracteres de cualquier

implementacioacuten de javaioInputStream o javaioReader

Tokenjava --gt

Definicioacuten de la clase Token

TokenMgrErrorjava --gt

Diversos errores que puede producir el lexer

Ahora los compilamos y antildeadimos el fichero

elementoFueraLimitesExceptionjava en dicha compilacioacuten

javac java

Y vamos a ejecutar el parser suponiendo que el maacuteximo nuacutemero

de paacuteginas a impmir es 50 (como hemos indicado con pmaximo =

50)

Lo que obtenemos como salida es la lista de paacuteginas a imprimir o

un mensaje de error

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

OK

2 5 6 7 8

java -classpath laboratorioParsers

parserImprimePaginasCC 28-3046

Num paginas 50

OK

28 29 30 4 6

java -classpath laboratorioParsers

parserImprimePaginasCC 43-51

Num paginas 50

Introdujo un numero superior al maximo51

java -classpath laboratorioParsers

parserImprimePaginasCC 43--51

Num paginas 50

Error de sintaxisEncountered - at line 1

column 4

Was expecting

ltENTEROgt

iquestQueacute pasa si algo ha ido mal iquestPodemos depurar el parser de

alguna forma

Por supuesto podemos compilar el parser asiacute para obtener una

traza de la ejecucioacuten

javacc -DEBUG_PARSER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Consumed token lt- at line 1 column 4gt

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

En la traza vemos coacutemo el parser va invocando la diferentes

producciones

Podemos tambieacuten depurar el lexer

javacc -DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Returning the ltEOFgt token

OK

2 5 6 7 8

O combinar ambas trazas

javacc -DEBUG_PARSER -

DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Consumed token lt- at line 1 column 4gt

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Returning the ltEOFgt token

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

Conclusioacuten los generadores de parsers son herramientas

potentes que sirven para resolver problemas de una manera

bdquolimpia‟ y elegante Puede que su nombre retraiga a los

desarrolladores (ldquoiquestPara queacute quiero un generador de

compiladoresrdquo) pero es una opcioacuten a tener en cuenta

Ficheros para descargar

Referencias

- Generating Parsers with JavaCC

- The JavaCC FAQ

Si quieres enviar alguacuten comentario o sugerir temas a tratar en otros artiacuteculos escribe a

curtasun[simboloArroba]ceines

Categor

iacuteas

CES OpenSouceJava

Tema Desarrollo

Autor Carlos Urtasun

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo XSL-FO (Parte 1)

Texto XSL-FO Introduccioacuten El estaacutendar XSL tal y como estaacute definido actualmente se

divide en dos grandes partes -XSLT transformacioacuten de un documento de entrada XML en

alguacuten tipo de documento de salida ya sea XML HTML PDF etc -Formatting Objects (FO) definen la visualizacioacuten final del

resultado de la transformacioacuten Son una implementacioacuten especiacutefica de un determinado XSLT y aplicados a un

fichero XML nos proporcionan otro fichero con la informacioacuten de eacuteste renderizada a alguacuten formato de visualizacioacuten impresa Eacutesta es quizaacute la principal diferencia entre un FO y

otros XSLT ambos transforman un documento XML en otro documento XML pero FO estaacute pensado para generar

directamente una renderizacioacuten

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 9: Cesnavarra 2008-boletín 7

cadenas Ropes For Java

La clase String

La clase String representa una cadena de caracteres con una caracteriacutestica

fundamental es inmutable Es decir una vez creado un String no es posible

modificarlo Los meacutetodos que concatenan reemplazan caracteres etc

devuelven otro objeto con las modificaciones realizadas

Por ejemplo tras ejecutar el siguiente coacutedigo

String str = ldquoLa clase String es ldquo strconcat(ldquoinmutablerdquo)

el valor de la variable str sigue siendo ldquoLa clase String es ldquo

En cambio si hacemos

String str2 = strconcat(ldquoinmutablerdquo) el nuevo String str2 ya contendraacute la cadena completa ldquoLa clase String

es inmutableldquo

Por esta caracteriacutestica la clase String no es adecuada si lo que se necesita es

realizar muchas modificaciones sobre el texto ya que supone la creacioacuten de

muchos objetos temporales

StringBuffer y StringBuilder

La clase StringBuffer es la variante mutable de String Permite modificar su

contenido concatenar cadenas etc de forma mucho maacutes eficiente que la

claseString

En la versioacuten 5 de Java se incluyoacute la clase StringBuilder que es igual que la

clase StringBuilder pero no sincronizada Si el objeto no va a ser accedido por

maacutes de un hilo simultaacuteneamente se recomienda el uso de StringBuilder ya que

al no ser sincronizado mejora ligeramente el rendimiento

Al utilizar StringBuffer o StringBuilder hay un aspecto que muchas veces no se

tiene en cuenta y que puede tener un impacto importante en el rendimiento la

capacidad inicial

Estos objetos almacenan un array de caracteres que debe ser regenerado

cuando las operaciones hacen que se sobrepase la capacidad del array

Inicializar el objeto a un valor adecuado puede mejorar el rendimiento global

del objeto Por defecto se inicializan con una capacidad de 16 caracteres

Cada vez que debe crecer el nuevo tamantildeo es 2 + 2TamantildeoActual Si el

tamantildeo no va a ser muy grande la diferencia de rendimiento seraacute inapreciable

pero esta inicializacioacuten debe ser tenida en cuenta para el manejo de grandes

cadenas

Cadenas en tiempo de compilacioacuten y en tiempo de

ejecucioacuten

Como curiosidad cabe destacar la labor del compilador de Java en el manejo de

cadenas A veces para mejorar la legibilidad se escribe coacutedigo de este tipo

String sql = select col1 col2 col3 + from table1 t1+

join table2 t2 on t1col1 =

t2col1+ join table3 t3 on t2col3 =

t3col2+ where t1col1 = and t3col3 =

oacute

StringBuffer sbsql = new StringBuffer(select

col1 col2 col3 ) sbsqlappend(from table1 t1) sbsqlappend(join table2 t2 on t1col1 =

t2col1) sbsqlappend(join table3 t3 on t2col3 =

t3col2) sbsqlappend(where t1col1 = and t3col3 =

) String sql = sbsqltoString()

En este caso la primera opcioacuten con la suma de cadenas ofrece mejor

rendimiento que la que utiliza el StringBuffer La explicacioacuten estaacute en el

compilador de Java que realiza la suma de las cadenas en tiempo de

compilacioacuten

Cuando la concatenacioacuten se realiza en tiempo de ejecucioacuten (concatenacioacuten de

variables no de cadenas constantes) el rendimiento mejora

utilizandoStringBuffer como se ha comentado en el punto anterior En este

caso si se suman Strings el compilador genera un StringBuffer para cada suma

de cadenas penalizando el rendimiento frente a la utilizacioacuten de un solo

objeto StringBuffer

Las tres preguntas

Podemos resumir lo visto hasta ahora en tres preguntas que deberiacuteamos

hacernos antes de escribir String str = hellip

iquestVoy a modificar esta cadena Si la repuesta es no o simplemente voy a concatenar cadenas constantes para

mejorar la legibilidad del coacutedigo usareacute String

Si voy a modificarla en funcioacuten de la ejecucioacuten

usareacute StringBuffer o StringBuilder

iquestVa a acceder maacutes de un hilo a mi cadena simultaacuteneamente Si es asiacute usareacute un StringBuffer que asegura la sincronizacioacuten

Si no es asiacute algo que sucederaacute en la mayor parte de los casos

usareacute StringBuilder ya que es maacutes eficiente

iquestPuedo estimar la maacutexima longitud de la cadena Si es asiacute inicializareacute mi StringBuffer o StringBuilder con esa capacidad para

evitar que el objeto deba regenerar su buffer interno cada vez que sobrepase su

capacidad

Un paso maacutes Ropes

En aplicaciones donde el rendimiento es fundamental en el uso de cadenas

puede ser conveniente el uso de otro tipo de estructuras de datos para su

representacioacuten y manejo

Un ejemplo de ello es la estructura de datos denominada Rope

Este concepto no es nuevo se introdujo en un artiacuteculo de 1995(2) y representa

las cadenas con una estructura de aacuterbol de forma que mejora el rendimiento

en operaciones como la insercioacuten y la concatenacioacuten de cadenas El precio a

pagar por estas mejoras de rendimiento viene en forma de uso de memoria

que es sensiblemente superior usando Ropes frente al uso de Strings o

StringBuffers

Existe una implementacioacuten en Java de esta estructura llamada Ropes For

Java(4) Como ejemplo estas son algunas graacuteficas del rendimiento de esta

implementacioacuten publicadas en un artiacuteculo del autor Amin Ahmad(3)

Referencias 1 - Performance improvement techniques in String and StringBuffer

2 - Ropes an Alternative to Strings

3 - Ropes Theory and practice

4 - Ropes For Java

Categoriacute

as

CES OpenSouceJava

Tema Desarrollo

Autor Miguel Bacaicoa

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo Herramientas de gestioacuten de proyectos Open Source

Texto Haraacute unos meses nos vimos en la tesitura de buscar una

herramienta de gestioacuten de proyectos para el Centro Java y Open

Source

Hasta el momento habiacuteamos estado trabajando con dotproject

un sistema con bastante capacidad y funcionalidades No

obstante resultoacute ser una herramienta algo pesada en la creacioacuten

de planificaciones y tediosa en el mantenimiento diacutea a diacutea

Buscaacutebamos principalmente una herramienta que no solo

gestionase la parte de planificacioacuten sino tambieacuten la parte de

seguimiento posterior para mantener el control sobre el proyecto

Ademaacutes deseaacutebamos un entorno colaborativo multi-usuario y

participativo entre nosotros y cualquier colaborador externo Lo

cual maacutes que un requerimiento funcional supone un cambio

cultural la parte maacutes compleja

Todo esto en principio decantaba la decisioacuten por una opcioacuten on-

line en detrimento de una de escritorio No obstante decidimos

valorar tambieacuten las de escritorio no fuera que por empecinarnos

en unas funcionalidades descartaacutesemos otras importantes

A continuacioacuten describireacute brevemente algunas de las

herramientas valoradas

De escritorio

GanttProject

Aplicacioacuten de escritorio muy extendida y uacutetil que permite

planificar tareas y recursos sobre un diagrama Gantt Se trata de

una herramienta similar a MS Project pero maacutes sencilla lo cual

puede ser en algunos casos una ventaja Otra caracteriacutestica

interesante es que funciona tanto en Linux como en Windows y

tiene diversos formatos de exportacioacuten e importacioacuten

Planner

Aplicacioacuten de escritorio bastante extendida y algo maacutes completa

a la anterior (a pesat de tener menos opciones de importacioacuten y

exportacioacuten) pero muy similar En este caso estaacute desarrollada

para Linux aunque existe versioacuten beta para Windows

Open Workbench

Aplicacioacuten de escritorio muy completa Al igual que las anteriores

permite gestionar tareas y recursos sobre un diagrama Gantt

aunque tambieacuten permite otros diagramas como Pert camino

criacutetico y funcionalidades maacutes avanzadas Se vanagloria de ser

incluso mejor que MS Project

TaskJuggler

Se trata de una herramienta de escritorio disponible tanto para

Windows como para Linux un tanto peculiar Genera una serie de

informes bastante completos a partir de un fichero de texto El

interfaz es bastante amigable pero el hecho de andar editando

un fichero de texto que contiene la planificacioacuten no resulta muy

coacutemodo

OpenProj

Otro programa de escritorio sustitutivo de MS Project y de

apariencia muy similar Tiene versiones para Linux Unix Mac y

Windows y es compatible con ficheros MS Project y con todas sus

funcionalidades No obstante parece no estar indicado para

proyectos de grupo En estos casos te ofrecen una versioacuten on-

line (Project-ON-Demand) bajo demanda y de pago bastante

interesante

Entorno web

TeamSCOPE

Team Software for Collaborative Project Environments es una

herramienta web de colaboracioacuten Desarrollado para funcionar

sobre Debian fue creado por una universidad pero parece

haberse quedado bastante anticuado

NetOffice

Herramienta web basada en PHP sobre MySQL para gestionar proyectos tareas registros de tiempos incidenciaserrores

diagramas de Gantt (aunque un poco escondidos) etc similar pero algo maacutes agradable que dotProject Tiene ciertos tintes de herramienta de colaboracioacuten en grupo (groupware)

phpCollab

Herramienta web basada en PHP que ha sufrido un desarrollo

intermitente por lo que parece Sirve tanto para la gestioacuten de

tareas como para el seguimiento de incidenciaserrores Tiene un

aspecto similar a netOffice lo cual hace pensar que uno de los

dos proyectos deriva del otro Quizaacutes por esa razoacuten de elegir una

de las dos sea maacutes recomendable netOffice

Achievo

Herramienta web PHP sobre MySQL para la gestioacuten de proyectos

tareas recursos registro de tiempos agenda generacioacuten de

informes etc Bastante completo ademaacutes parece incluir seccioacuten

presupuestaria

XPlanner

Herramienta web Java sobre MySQL para la gestioacuten de proyectos

mediante XP y Scrum No obstante parece estancada en una

versioacuten beta desde el 2006

PPTS

Project Planning and Tracking System (PPTS) es una herramienta

Web para la gestioacuten de proyectos con metodologiacuteas XP y Scrum

al igual que la anterior Esta desarrollada en PHP contra MySQL

aunque parece tambieacuten largo tiempo abandonada

XPWeb

Al igual que las anteriores es una herramienta web para la

gestioacuten de proyectos aacutegiles incluyendo gestioacuten de tareas

calendarios informes etc Tambieacuten parece estancada

Trac

Herramienta web ampliamente extendida en la comunidad open

source para fundamentalmente el seguimiento proyectos Se

centra en la gestioacuten de incidencias y errores aunque tiene

funcionalidades antildeadidas interesantes como Wiki e integracioacuten

con Subversioacuten Hay que resentildear que se trata de una

herramienta mono-proyecto y que no cuenta con Gantt

OpenProject

Herramienta web de gestioacuten de proyectos muy completa Posee

todo lo necesario tanto que uno llega a perderse No obstante

pueden configurarse los moacutedulos que desean usarse y descartar

aquellos que no son necesarios calendario gestioacuten de tareas

seguimiento de incidencias control presupuestario Wiki foros

integracioacuten con ERPs diagramas Gantt y una larga lista de

funcionalidades

Tutos

The Ultimate Team Organization Software o eso pretende Se

trata de una herramienta web LAMP con muchas funcionalidades

calendario y agenda seguimiento de incidencias y errores

gestioacuten de tareas diagramas Gantt gestioacuten documental gestioacuten

de correos facturas e informes Interesante pero austera de

aspecto y un poco anticuada

Project Dune

Herramienta web desarrollada en Java contra MySQL que pareciacutea

prometer bastante Tiene lo necesario gestioacuten de tareas

recursos incidencias gestioacuten documental registro de tiempos

informes calendario y agenda RSS inspeccioacuten de coacutedigo

importacioacuten de MS Project etc No obstante en su evaluacioacuten

dejoacute bastante que desear resultando poco praacutectica y manejable

Collabtive

Se trata de una herramienta web LAMP para la gestioacuten de

proyectos Seguacuten se indica en la web cubre la gestioacuten de tareas e

incidencias gestioacuten documental y mensajeriacutea Es muy limpia

sencilla y aacutegil No obstante no parece contar con diagramas

Gantt ni con registro de tiempos o informes de estado En la

praacutectica parece quedarse un poco justa pero prometedora

Mindquarry

Herramienta web desarrollada en Java que pretende ser la

alternativa open source de soluciones propietarias como

Basecamp o Sharepoint para la gestioacuten de proyectos y grupos de

trabajo de forma colaborativa Tiene una versioacuten open source

para descarga y otra como servicio bajo demanda La pega es

que la empresa parece haber dejado de desarrollar su actividad

ClockingIT

Se trata de una herramienta Web desarrollada en Ruby como

servicio bajo demanda Permite una gestioacuten de tareas agenda

siguiendo el estaacutendar iCal seguimiento de tiempos generacioacuten

de informes notificaciones RSS foros Chat y Wiki repositorio

de ficheros etc

LibreSource

Se trata de una plataforma web colaborativa para el desarrollo de

software lo que se suele denominar forja y funcionalidades de

groupware archivado y publicacioacuten web Es open source y

altamente ajustable Permite alojar muacuteltiples proyectos varios

grupos de usuarios etc Estaacute desarrollada en J2EE e incorpora

entre otras cosas Wiki integracioacuten con Subversion zonas de

descarga gestioacuten documental mensajeriacutea instantaacutenea con

Jabber gestioacuten de incidencias etc No fue evaluada al ser

descubierta posteriormente a la implantacioacuten de la herramienta

elegida pero parece una buena alternativa

Aunque existen infinidad maacutes de entre todas nos decantamos

por dos que valoramos maacutes en profundidad

TeamWork

Se trata de una herramienta web desarrollada en Java por unos

Italianos Entre sus funcionalidades cabe destacar la gestioacuten de

proyectos y tareas con diversos diagramas de Gantt muy

logrados gestioacuten de incidencias gestioacuten documental entorno

colaborativo tipo groupware control de costes registros de

tiempos etc

Es muy completo raacutepido de respuesta y posee caracteriacutesticas

muy interesantes como una interesante y uacutetil navegacioacuten

contextual entre tareas del proyecto perfiles de usuario seguacuten

proyecto importacioacuten de planificaciones desde MS Project o

asociacioacuten entre incidencias y tareas

Cuenta con wizards para la configuracioacuten de la herramienta de

forma raacutepida y sencilla incluyendo la posibilidad de generar

plantillas para aplicar metodologiacuteas aacutegiles (Scrum)

El registro de horas por tarea para un desarrollador se realiza de

forma muy coacutemoda y raacutepida desde una simple vista facilitando

la participacioacuten del mismo

Se trataba de una aplicacioacuten muy completa quizaacutes demasiado

un poco compleja de entender en un comienzo pero con muchas

posibilidades

No obstante teniacutea alguna que otra pega aunque es open source

posee una licencia de pago para su uso que en cualquier caso era

muy pequentildea Tiene una versioacuten de evaluacioacuten de 30 diacuteas para

quien desee probarla antes de decidir Por otro lado no distingue

proyectos existe una tarea padre que agrupa toda la

planificacioacuten asociada tampoco cuenta con Wiki y no gestiona las

vacaciones del personal

La otra herramienta valorada maacutes en profundidad fue

Redmine

Se trata de otra herramienta web en este caso desarrollada en

Ruby on Rails con una gran cantidad de funcionalidades que la

acerca bastante a una forja pero sin tener la complejidad de la

misma Entre sus caracteriacutesticas cabe destacar la gestioacuten de

tareas incidencias diagramas de Gantt calendario de

actividades noticias foros wikis gestioacuten de ficheros y

documentos integracioacuten con Subversioacuten control de tiempos

generacioacuten de informes etc todo esto por proyecto Por

similitudes del interfaz y funcionalidades parece estar basado en

Trac pero con un lavado de cara y de coacutedigo importante ademaacutes

de ser multi-proyecto

Al igual que la anterior tambieacuten poseiacutea una serie de

caracteriacutesticas que la haciacutea diferente como la posible navegacioacuten

anoacutenima de lectura si asiacute se desea sobre los proyectos alojados

Interesante desde el punto de vista de filosofiacutea open source

Posibilidad de definir un perfil distinto por usuario seguacuten el

proyecto en el que participa

Tambieacuten cuenta con sindicacioacuten de RSS para las secciones de

noticias tareas incidencias etc y exportacioacuten a ficheros de texto

y HTML desde la Wiki los informes generados e incluso el

diagrama de Gantt

A parte se trata de un interfaz muy limpio intuitivo sencillo de

usar y rapidiacutesimo

La configuracioacuten de la herramienta resulta asiacute mismo muy

sencilla con un par de clics puedes empezar a funcionar

Cada proyecto puede configurarse con los moacutedulos que desees

que tenga ademaacutes de poder definir campos personalizados por

proyecto y tarea para permitir una mayor adaptacioacuten

Cabe destacar que para esta herramienta existe un uacutenico

concepto denominado peticioacuten que puede ser de tres tipos

tareas soporte o incidencia De esta forma todo se gestiona de

igual forma lo cual lo simplifica pero a su vez puede convertirse

en un volumen ingestionable de tareas Para evitar esto se

pueden definir categoriacuteas a las que pertenece una peticioacuten y

realizar posteriormente filtrados de peticiones en las vistas seguacuten

este y otros paraacutemetros

No obstante no todo iba a ser color de rosa tiene una serie de

limitaciones como el sistema un tanto engorroso de enlazar

peticiones o el hecho de que una vez creada una peticioacuten su

nombre y descripcioacuten no se pueden modificar tan solo ir

antildeadiendo nuevas descripciones

En este punto nos encontraacutebamos en una difiacutecil decisioacuten puesto

que ambas herramientas nos gustaban cubriacutean lo necesario pero

se trataban de herramientas muy distintas en concepcioacuten Para

facilitar la decisioacuten realizamos un cuadro comparando las

caracteriacutesticas y priorizaacutendolas seguacuten nuestro intereacutes El

resultado fue el siguiente

Prioridad Caracteriacutestica Redmine TeamWork

9 Integracioacuten con

LDAP Si Si

8 Integracioacuten con

Subversion Si Si

8 Traducido al espantildeol

Si No

7 Importacioacuten desde

Project No Si

7 Exportacioacuten a

Project No Si

7 Centros de coste Posible mediante los campos

personalizados

Si

7 Wikis de proyectos Si

7 Personalizacioacuten

extensioacuten Si Si

6 Gestioacuten de vacaciones

No Vacaciones a nivel de

empresa

6 Vida de la herramienta

Indeterminado al ser una

herramienta open source

Algo maacutes seguro

porque hay una empresa detraacutes

5 Facilidad de configuracioacuten

Si

5 Usuarios multi-

perfil Si Si

4 Acceso restringido a usuarios

Si Si

3 Sencillez de manejo

Si

2 Seguimiento de

incidencias Si Si

1 Asignacioacuten de tareas

Si Si

1 Imputacioacuten a tareas asignadas

Si Si

Tras una difiacutecil reflexioacuten puesto que ambas se encontraban muy

parejas decidimos decantarnos por Redmine primando la

sencillez y rapidez Existiacutea la posibilidad de que terceros la

empleasen y veiacuteamos que Redmine permitiacutea una mayor facilidad

en su manejo y resultaba maacutes intuitiva de cara a aprender a

utilizarla Posteriormente tras su uso hemos detectado algunos

inconvenientes importantes como la imposibilidad de asignar una

peticioacuten a maacutes de un usuario pero es que no hay herramienta

perfecta

Bibliografiacutea

httpwwwnavegapolisnetcontentview5649

httpwwwsimpleprojectmanagementcomhomehtml

httpwwwweb-based-softwarecomproject

httpenwikipediaorgwikiComparison_of_issue_tracking_syste

ms

httpenwikipediaorgwikiList_of_project_management_softwa

re

httpwwwpmdigestcomsoftware

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Rauacutel Sanz de Acedo

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo Lexers parsers JavaCC (y II)

Texto En este artiacuteculo vamos a utilizar JavaCC como herramienta para

implementar un moacutedulo que resuelva la casuiacutestica de la

impresioacuten de las diversas paacuteginas de un fichero Esto es lo que se

refleja en esta imagen

Para ello en el artiacuteculo anterior definimos esta gramaacutetica a la que

asociamos unas acciones semaacutenticas

inicio --gt inicializacionVariables

listaElementos

procesarDatos

listaElementos --gt elemento

restoListaElementos

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

restoListaElementos --gt SEPARADOR

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

listaElementos

|

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

restoListaElementos2 --gt GUION ENTERO

num2 = valor(ENTERO)

Si (num2 gt maxPaginas)

or (num2==0) ent error

|

JavaCC es una herramienta que dado un fichero de extensioacuten

jj que describe la gramaacutetica y sus acciones semaacutenticas

asociadas genera los ficheros java que la implementan

Estos ficheros java pueden luego obviamente incluirse en

aqueacutellos que conforman el resto de nuestra aplicacioacuten

JavaCC es una herramienta gratuita que puede descargarse

desde aquiacute Existe tambieacuten un plugin para Eclipse Y asimismo

existe una task de Ant para JavaCC

Vamos pues a construir nuestro parser

Lo denominaremos parserImprimePaginasCC y por lo tanto

vamos a editar el fichero parserImprimePaginasCCjj

Indicaremos coacutemo se traducen los tokens y las producciones a

formato JavaCC

TOKEN

ltENTERO([0-9])+gt

| ltGUION -gt

| ltSEPARADOR([ ])+ | ([ ])gt

Los tokens se describen praacutecticamente como lo indicamos en la

gramaacutetica

void inicio()throws elementoFueraLimitesException

resultado = new Vector()

num1 = -1

num2 = -1

inicializaFlags()

listaElementos()

void listaElementos()throws elementoFueraLimitesExcept

ion

elemento() restoListaElementos()

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

restoListaElementos2()

void restoListaElementos()throws elementoFueraLimitesE

xception

ltSEPARADORgt

insertaElemento(num1 num2)

num1 = -1

num2 = -1

listaElementos()

|

insertaElemento(num1 num2)

num1 = -1

num2 = -1

void restoListaElementos2()throws elementoFueraLimites

Exception

ltGUIONgtltENTEROgt

num2 = IntegervalueOf(tokenimage)intValue()

if ((num2gtmaximo)|| (num2 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num2))

|

Las producciones son algo diferentes lo que era

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

ahora es

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(IntegertoS

tring(num1))

restoListaElementos2()

El no terminal elemento se describe como void elemento() y

ademaacutes le hemos asociado una excepcioacuten para controlar el hecho

de que un usuario coloque 0 o un nuacutemero mayor que el

permitido Lo que en la parte derecha es ENTERO se indica

como ltENTEROgt y la invocacioacuten de restoListaElementos2

es restoListaElementos2()

Las acciones semaacutenticas

num1 = valor(ENTERO)

Si (num1 gt maxPaginas) or (num1==0) ent error

se indican en JavaCC asiacute

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

El valor del token actual es accesible a traveacutes de tokenimage

Si deseamos tener coacutedigo Java adicional fuera de las

producciones lo podemos antildeadir de esta forma con la palabra

reservada JAVACODE

JAVACODE void insertaElemento(int num1 int num2)

int aux i iFlag

if ((num1 = -1) ampamp (num2 = -1))

if (num1gtnum2)

aux = num1

num1 = num2

num2 = aux

for (i = num1

i lt= num2

i++)

iFlag = i-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(i))

flags[iFlag] = true

else if (num1 = -1)

iFlag = num1-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num1))

flags[iFlag] = true

else if (num2 = -1)

iFlag = num2-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num2))

flags[iFlag] = true

JAVACODE void inicializaFlags()

int i

flags = new boolean [maximo]

for (i = 0

iltmaximo

i++)

flags[i] = false

Ademaacutes podemos inicializar el parser e instanciarlo de esta

forma

PARSER_BEGIN(parserImprimePaginasCC)

import javaio

import javautilVector

public class parserImprimePaginasCC

public static int maximo

public static Vector resultado

private static int num1 num2

private static boolean flags[]

public static void main(String[]args)throws Exceptio

n

Reader r = new StringReader(args[0])

parserImprimePaginasCC p

= new parserImprimePaginasCC(r)

try

pmaximo = 50

Systemoutprintln(Maacuteximo +pmaximo)

pinicio()

Systemoutprintln(OKn)

for (int j = 0

jltpresultadosize()

j++)

Systemoutprint(presultadoelementAt(j)+

)

Systemoutprintln()

catch (ParseException e)

Systemoutprintln(Error de sintaxis)

catch (TokenMgrError e)

Systemoutprintln(Error leacutexico)

catch (elementoFueraLimitesException e)

Systemoutprintln(egetMessage())

PARSER_END(parserImprimePaginasCC)

En este caso tomaremos la entrada de lo que el usuario

introduzca por teclado pero se pueden tomar los datos a traveacutes

de ficheros o pasarlos como variables

Se hace referencia a una excepcioacuten que hemos definido asiacute en un

fichero llamado elementoFueraLimitesExceptionjava

public class elementoFueraLimitesException extends Exc

eption

Constructor

public elementoFueraLimitesException()

super()

public elementoFueraLimitesException(String msg)

super(msg)

Una vez salvado el fichero parserImprimePaginasCCjj podemos

generar la documentacioacuten de la gramaacutetica en formato HTML de

esta forma

Nota en la ejecucioacuten de estos ejemplos se ha utilizado la liacutenea de comandos de

Windows pero se podriacutea haber hecho a traveacutes de cualquier sistema que soporte

el lenguaje Java

gtjjdoc parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Documentation

Generator Version 014)

(type jjdoc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Grammar documentation generated successfully in

parserImprimePaginasCChtml

Se genera el fichero parserImprimePaginasCChtmlcuyo

contenido es

BNF for parserImprimePaginasCCjj NON-TERMINALS

inicio = listaElementos

listaElementos = elemento restoListaElementos

elemento = ltENTEROgt restoListaElementos2

restoListaElementos = ltSEPARADORgt listaElementos

|

restoListaElementos2 = ltGUIONgt ltENTEROgt

|

insertaElemento = java code

inicializaFlags = java code

Nota BNF es el tipo de notacioacuten que estamos utilizando a lo largo de estos

artiacuteculos

Compilamos el parser

gtjavacc parser ImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

File TokenMgrErrorjava does not exist Will create

one

File ParseExceptionjava does not exist Will

create one

File Tokenjava does not exist Will create one

File SimpleCharStreamjava does not exist Will

create one

Parser generated successfully

y entonces se generan estos ficheros

ParseExceptionjava --gt

Excepcioacuten generada por el parser cuando un error es encontrado

parserImprimePaginasCCjava --gt La

traduccioacuten de nuestro fichero jj a java

parserImprimePaginasCCConstantsjava --gt Los

valores de los tokens

parserImprimePaginasCCTokenManagerjava --gt El

analizador leacutexico

SimpleCharStreamjava --gt

Contiene coacutedigo para leer caracteres de cualquier

implementacioacuten de javaioInputStream o javaioReader

Tokenjava --gt

Definicioacuten de la clase Token

TokenMgrErrorjava --gt

Diversos errores que puede producir el lexer

Ahora los compilamos y antildeadimos el fichero

elementoFueraLimitesExceptionjava en dicha compilacioacuten

javac java

Y vamos a ejecutar el parser suponiendo que el maacuteximo nuacutemero

de paacuteginas a impmir es 50 (como hemos indicado con pmaximo =

50)

Lo que obtenemos como salida es la lista de paacuteginas a imprimir o

un mensaje de error

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

OK

2 5 6 7 8

java -classpath laboratorioParsers

parserImprimePaginasCC 28-3046

Num paginas 50

OK

28 29 30 4 6

java -classpath laboratorioParsers

parserImprimePaginasCC 43-51

Num paginas 50

Introdujo un numero superior al maximo51

java -classpath laboratorioParsers

parserImprimePaginasCC 43--51

Num paginas 50

Error de sintaxisEncountered - at line 1

column 4

Was expecting

ltENTEROgt

iquestQueacute pasa si algo ha ido mal iquestPodemos depurar el parser de

alguna forma

Por supuesto podemos compilar el parser asiacute para obtener una

traza de la ejecucioacuten

javacc -DEBUG_PARSER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Consumed token lt- at line 1 column 4gt

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

En la traza vemos coacutemo el parser va invocando la diferentes

producciones

Podemos tambieacuten depurar el lexer

javacc -DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Returning the ltEOFgt token

OK

2 5 6 7 8

O combinar ambas trazas

javacc -DEBUG_PARSER -

DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Consumed token lt- at line 1 column 4gt

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Returning the ltEOFgt token

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

Conclusioacuten los generadores de parsers son herramientas

potentes que sirven para resolver problemas de una manera

bdquolimpia‟ y elegante Puede que su nombre retraiga a los

desarrolladores (ldquoiquestPara queacute quiero un generador de

compiladoresrdquo) pero es una opcioacuten a tener en cuenta

Ficheros para descargar

Referencias

- Generating Parsers with JavaCC

- The JavaCC FAQ

Si quieres enviar alguacuten comentario o sugerir temas a tratar en otros artiacuteculos escribe a

curtasun[simboloArroba]ceines

Categor

iacuteas

CES OpenSouceJava

Tema Desarrollo

Autor Carlos Urtasun

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo XSL-FO (Parte 1)

Texto XSL-FO Introduccioacuten El estaacutendar XSL tal y como estaacute definido actualmente se

divide en dos grandes partes -XSLT transformacioacuten de un documento de entrada XML en

alguacuten tipo de documento de salida ya sea XML HTML PDF etc -Formatting Objects (FO) definen la visualizacioacuten final del

resultado de la transformacioacuten Son una implementacioacuten especiacutefica de un determinado XSLT y aplicados a un

fichero XML nos proporcionan otro fichero con la informacioacuten de eacuteste renderizada a alguacuten formato de visualizacioacuten impresa Eacutesta es quizaacute la principal diferencia entre un FO y

otros XSLT ambos transforman un documento XML en otro documento XML pero FO estaacute pensado para generar

directamente una renderizacioacuten

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 10: Cesnavarra 2008-boletín 7

Inicializar el objeto a un valor adecuado puede mejorar el rendimiento global

del objeto Por defecto se inicializan con una capacidad de 16 caracteres

Cada vez que debe crecer el nuevo tamantildeo es 2 + 2TamantildeoActual Si el

tamantildeo no va a ser muy grande la diferencia de rendimiento seraacute inapreciable

pero esta inicializacioacuten debe ser tenida en cuenta para el manejo de grandes

cadenas

Cadenas en tiempo de compilacioacuten y en tiempo de

ejecucioacuten

Como curiosidad cabe destacar la labor del compilador de Java en el manejo de

cadenas A veces para mejorar la legibilidad se escribe coacutedigo de este tipo

String sql = select col1 col2 col3 + from table1 t1+

join table2 t2 on t1col1 =

t2col1+ join table3 t3 on t2col3 =

t3col2+ where t1col1 = and t3col3 =

oacute

StringBuffer sbsql = new StringBuffer(select

col1 col2 col3 ) sbsqlappend(from table1 t1) sbsqlappend(join table2 t2 on t1col1 =

t2col1) sbsqlappend(join table3 t3 on t2col3 =

t3col2) sbsqlappend(where t1col1 = and t3col3 =

) String sql = sbsqltoString()

En este caso la primera opcioacuten con la suma de cadenas ofrece mejor

rendimiento que la que utiliza el StringBuffer La explicacioacuten estaacute en el

compilador de Java que realiza la suma de las cadenas en tiempo de

compilacioacuten

Cuando la concatenacioacuten se realiza en tiempo de ejecucioacuten (concatenacioacuten de

variables no de cadenas constantes) el rendimiento mejora

utilizandoStringBuffer como se ha comentado en el punto anterior En este

caso si se suman Strings el compilador genera un StringBuffer para cada suma

de cadenas penalizando el rendimiento frente a la utilizacioacuten de un solo

objeto StringBuffer

Las tres preguntas

Podemos resumir lo visto hasta ahora en tres preguntas que deberiacuteamos

hacernos antes de escribir String str = hellip

iquestVoy a modificar esta cadena Si la repuesta es no o simplemente voy a concatenar cadenas constantes para

mejorar la legibilidad del coacutedigo usareacute String

Si voy a modificarla en funcioacuten de la ejecucioacuten

usareacute StringBuffer o StringBuilder

iquestVa a acceder maacutes de un hilo a mi cadena simultaacuteneamente Si es asiacute usareacute un StringBuffer que asegura la sincronizacioacuten

Si no es asiacute algo que sucederaacute en la mayor parte de los casos

usareacute StringBuilder ya que es maacutes eficiente

iquestPuedo estimar la maacutexima longitud de la cadena Si es asiacute inicializareacute mi StringBuffer o StringBuilder con esa capacidad para

evitar que el objeto deba regenerar su buffer interno cada vez que sobrepase su

capacidad

Un paso maacutes Ropes

En aplicaciones donde el rendimiento es fundamental en el uso de cadenas

puede ser conveniente el uso de otro tipo de estructuras de datos para su

representacioacuten y manejo

Un ejemplo de ello es la estructura de datos denominada Rope

Este concepto no es nuevo se introdujo en un artiacuteculo de 1995(2) y representa

las cadenas con una estructura de aacuterbol de forma que mejora el rendimiento

en operaciones como la insercioacuten y la concatenacioacuten de cadenas El precio a

pagar por estas mejoras de rendimiento viene en forma de uso de memoria

que es sensiblemente superior usando Ropes frente al uso de Strings o

StringBuffers

Existe una implementacioacuten en Java de esta estructura llamada Ropes For

Java(4) Como ejemplo estas son algunas graacuteficas del rendimiento de esta

implementacioacuten publicadas en un artiacuteculo del autor Amin Ahmad(3)

Referencias 1 - Performance improvement techniques in String and StringBuffer

2 - Ropes an Alternative to Strings

3 - Ropes Theory and practice

4 - Ropes For Java

Categoriacute

as

CES OpenSouceJava

Tema Desarrollo

Autor Miguel Bacaicoa

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo Herramientas de gestioacuten de proyectos Open Source

Texto Haraacute unos meses nos vimos en la tesitura de buscar una

herramienta de gestioacuten de proyectos para el Centro Java y Open

Source

Hasta el momento habiacuteamos estado trabajando con dotproject

un sistema con bastante capacidad y funcionalidades No

obstante resultoacute ser una herramienta algo pesada en la creacioacuten

de planificaciones y tediosa en el mantenimiento diacutea a diacutea

Buscaacutebamos principalmente una herramienta que no solo

gestionase la parte de planificacioacuten sino tambieacuten la parte de

seguimiento posterior para mantener el control sobre el proyecto

Ademaacutes deseaacutebamos un entorno colaborativo multi-usuario y

participativo entre nosotros y cualquier colaborador externo Lo

cual maacutes que un requerimiento funcional supone un cambio

cultural la parte maacutes compleja

Todo esto en principio decantaba la decisioacuten por una opcioacuten on-

line en detrimento de una de escritorio No obstante decidimos

valorar tambieacuten las de escritorio no fuera que por empecinarnos

en unas funcionalidades descartaacutesemos otras importantes

A continuacioacuten describireacute brevemente algunas de las

herramientas valoradas

De escritorio

GanttProject

Aplicacioacuten de escritorio muy extendida y uacutetil que permite

planificar tareas y recursos sobre un diagrama Gantt Se trata de

una herramienta similar a MS Project pero maacutes sencilla lo cual

puede ser en algunos casos una ventaja Otra caracteriacutestica

interesante es que funciona tanto en Linux como en Windows y

tiene diversos formatos de exportacioacuten e importacioacuten

Planner

Aplicacioacuten de escritorio bastante extendida y algo maacutes completa

a la anterior (a pesat de tener menos opciones de importacioacuten y

exportacioacuten) pero muy similar En este caso estaacute desarrollada

para Linux aunque existe versioacuten beta para Windows

Open Workbench

Aplicacioacuten de escritorio muy completa Al igual que las anteriores

permite gestionar tareas y recursos sobre un diagrama Gantt

aunque tambieacuten permite otros diagramas como Pert camino

criacutetico y funcionalidades maacutes avanzadas Se vanagloria de ser

incluso mejor que MS Project

TaskJuggler

Se trata de una herramienta de escritorio disponible tanto para

Windows como para Linux un tanto peculiar Genera una serie de

informes bastante completos a partir de un fichero de texto El

interfaz es bastante amigable pero el hecho de andar editando

un fichero de texto que contiene la planificacioacuten no resulta muy

coacutemodo

OpenProj

Otro programa de escritorio sustitutivo de MS Project y de

apariencia muy similar Tiene versiones para Linux Unix Mac y

Windows y es compatible con ficheros MS Project y con todas sus

funcionalidades No obstante parece no estar indicado para

proyectos de grupo En estos casos te ofrecen una versioacuten on-

line (Project-ON-Demand) bajo demanda y de pago bastante

interesante

Entorno web

TeamSCOPE

Team Software for Collaborative Project Environments es una

herramienta web de colaboracioacuten Desarrollado para funcionar

sobre Debian fue creado por una universidad pero parece

haberse quedado bastante anticuado

NetOffice

Herramienta web basada en PHP sobre MySQL para gestionar proyectos tareas registros de tiempos incidenciaserrores

diagramas de Gantt (aunque un poco escondidos) etc similar pero algo maacutes agradable que dotProject Tiene ciertos tintes de herramienta de colaboracioacuten en grupo (groupware)

phpCollab

Herramienta web basada en PHP que ha sufrido un desarrollo

intermitente por lo que parece Sirve tanto para la gestioacuten de

tareas como para el seguimiento de incidenciaserrores Tiene un

aspecto similar a netOffice lo cual hace pensar que uno de los

dos proyectos deriva del otro Quizaacutes por esa razoacuten de elegir una

de las dos sea maacutes recomendable netOffice

Achievo

Herramienta web PHP sobre MySQL para la gestioacuten de proyectos

tareas recursos registro de tiempos agenda generacioacuten de

informes etc Bastante completo ademaacutes parece incluir seccioacuten

presupuestaria

XPlanner

Herramienta web Java sobre MySQL para la gestioacuten de proyectos

mediante XP y Scrum No obstante parece estancada en una

versioacuten beta desde el 2006

PPTS

Project Planning and Tracking System (PPTS) es una herramienta

Web para la gestioacuten de proyectos con metodologiacuteas XP y Scrum

al igual que la anterior Esta desarrollada en PHP contra MySQL

aunque parece tambieacuten largo tiempo abandonada

XPWeb

Al igual que las anteriores es una herramienta web para la

gestioacuten de proyectos aacutegiles incluyendo gestioacuten de tareas

calendarios informes etc Tambieacuten parece estancada

Trac

Herramienta web ampliamente extendida en la comunidad open

source para fundamentalmente el seguimiento proyectos Se

centra en la gestioacuten de incidencias y errores aunque tiene

funcionalidades antildeadidas interesantes como Wiki e integracioacuten

con Subversioacuten Hay que resentildear que se trata de una

herramienta mono-proyecto y que no cuenta con Gantt

OpenProject

Herramienta web de gestioacuten de proyectos muy completa Posee

todo lo necesario tanto que uno llega a perderse No obstante

pueden configurarse los moacutedulos que desean usarse y descartar

aquellos que no son necesarios calendario gestioacuten de tareas

seguimiento de incidencias control presupuestario Wiki foros

integracioacuten con ERPs diagramas Gantt y una larga lista de

funcionalidades

Tutos

The Ultimate Team Organization Software o eso pretende Se

trata de una herramienta web LAMP con muchas funcionalidades

calendario y agenda seguimiento de incidencias y errores

gestioacuten de tareas diagramas Gantt gestioacuten documental gestioacuten

de correos facturas e informes Interesante pero austera de

aspecto y un poco anticuada

Project Dune

Herramienta web desarrollada en Java contra MySQL que pareciacutea

prometer bastante Tiene lo necesario gestioacuten de tareas

recursos incidencias gestioacuten documental registro de tiempos

informes calendario y agenda RSS inspeccioacuten de coacutedigo

importacioacuten de MS Project etc No obstante en su evaluacioacuten

dejoacute bastante que desear resultando poco praacutectica y manejable

Collabtive

Se trata de una herramienta web LAMP para la gestioacuten de

proyectos Seguacuten se indica en la web cubre la gestioacuten de tareas e

incidencias gestioacuten documental y mensajeriacutea Es muy limpia

sencilla y aacutegil No obstante no parece contar con diagramas

Gantt ni con registro de tiempos o informes de estado En la

praacutectica parece quedarse un poco justa pero prometedora

Mindquarry

Herramienta web desarrollada en Java que pretende ser la

alternativa open source de soluciones propietarias como

Basecamp o Sharepoint para la gestioacuten de proyectos y grupos de

trabajo de forma colaborativa Tiene una versioacuten open source

para descarga y otra como servicio bajo demanda La pega es

que la empresa parece haber dejado de desarrollar su actividad

ClockingIT

Se trata de una herramienta Web desarrollada en Ruby como

servicio bajo demanda Permite una gestioacuten de tareas agenda

siguiendo el estaacutendar iCal seguimiento de tiempos generacioacuten

de informes notificaciones RSS foros Chat y Wiki repositorio

de ficheros etc

LibreSource

Se trata de una plataforma web colaborativa para el desarrollo de

software lo que se suele denominar forja y funcionalidades de

groupware archivado y publicacioacuten web Es open source y

altamente ajustable Permite alojar muacuteltiples proyectos varios

grupos de usuarios etc Estaacute desarrollada en J2EE e incorpora

entre otras cosas Wiki integracioacuten con Subversion zonas de

descarga gestioacuten documental mensajeriacutea instantaacutenea con

Jabber gestioacuten de incidencias etc No fue evaluada al ser

descubierta posteriormente a la implantacioacuten de la herramienta

elegida pero parece una buena alternativa

Aunque existen infinidad maacutes de entre todas nos decantamos

por dos que valoramos maacutes en profundidad

TeamWork

Se trata de una herramienta web desarrollada en Java por unos

Italianos Entre sus funcionalidades cabe destacar la gestioacuten de

proyectos y tareas con diversos diagramas de Gantt muy

logrados gestioacuten de incidencias gestioacuten documental entorno

colaborativo tipo groupware control de costes registros de

tiempos etc

Es muy completo raacutepido de respuesta y posee caracteriacutesticas

muy interesantes como una interesante y uacutetil navegacioacuten

contextual entre tareas del proyecto perfiles de usuario seguacuten

proyecto importacioacuten de planificaciones desde MS Project o

asociacioacuten entre incidencias y tareas

Cuenta con wizards para la configuracioacuten de la herramienta de

forma raacutepida y sencilla incluyendo la posibilidad de generar

plantillas para aplicar metodologiacuteas aacutegiles (Scrum)

El registro de horas por tarea para un desarrollador se realiza de

forma muy coacutemoda y raacutepida desde una simple vista facilitando

la participacioacuten del mismo

Se trataba de una aplicacioacuten muy completa quizaacutes demasiado

un poco compleja de entender en un comienzo pero con muchas

posibilidades

No obstante teniacutea alguna que otra pega aunque es open source

posee una licencia de pago para su uso que en cualquier caso era

muy pequentildea Tiene una versioacuten de evaluacioacuten de 30 diacuteas para

quien desee probarla antes de decidir Por otro lado no distingue

proyectos existe una tarea padre que agrupa toda la

planificacioacuten asociada tampoco cuenta con Wiki y no gestiona las

vacaciones del personal

La otra herramienta valorada maacutes en profundidad fue

Redmine

Se trata de otra herramienta web en este caso desarrollada en

Ruby on Rails con una gran cantidad de funcionalidades que la

acerca bastante a una forja pero sin tener la complejidad de la

misma Entre sus caracteriacutesticas cabe destacar la gestioacuten de

tareas incidencias diagramas de Gantt calendario de

actividades noticias foros wikis gestioacuten de ficheros y

documentos integracioacuten con Subversioacuten control de tiempos

generacioacuten de informes etc todo esto por proyecto Por

similitudes del interfaz y funcionalidades parece estar basado en

Trac pero con un lavado de cara y de coacutedigo importante ademaacutes

de ser multi-proyecto

Al igual que la anterior tambieacuten poseiacutea una serie de

caracteriacutesticas que la haciacutea diferente como la posible navegacioacuten

anoacutenima de lectura si asiacute se desea sobre los proyectos alojados

Interesante desde el punto de vista de filosofiacutea open source

Posibilidad de definir un perfil distinto por usuario seguacuten el

proyecto en el que participa

Tambieacuten cuenta con sindicacioacuten de RSS para las secciones de

noticias tareas incidencias etc y exportacioacuten a ficheros de texto

y HTML desde la Wiki los informes generados e incluso el

diagrama de Gantt

A parte se trata de un interfaz muy limpio intuitivo sencillo de

usar y rapidiacutesimo

La configuracioacuten de la herramienta resulta asiacute mismo muy

sencilla con un par de clics puedes empezar a funcionar

Cada proyecto puede configurarse con los moacutedulos que desees

que tenga ademaacutes de poder definir campos personalizados por

proyecto y tarea para permitir una mayor adaptacioacuten

Cabe destacar que para esta herramienta existe un uacutenico

concepto denominado peticioacuten que puede ser de tres tipos

tareas soporte o incidencia De esta forma todo se gestiona de

igual forma lo cual lo simplifica pero a su vez puede convertirse

en un volumen ingestionable de tareas Para evitar esto se

pueden definir categoriacuteas a las que pertenece una peticioacuten y

realizar posteriormente filtrados de peticiones en las vistas seguacuten

este y otros paraacutemetros

No obstante no todo iba a ser color de rosa tiene una serie de

limitaciones como el sistema un tanto engorroso de enlazar

peticiones o el hecho de que una vez creada una peticioacuten su

nombre y descripcioacuten no se pueden modificar tan solo ir

antildeadiendo nuevas descripciones

En este punto nos encontraacutebamos en una difiacutecil decisioacuten puesto

que ambas herramientas nos gustaban cubriacutean lo necesario pero

se trataban de herramientas muy distintas en concepcioacuten Para

facilitar la decisioacuten realizamos un cuadro comparando las

caracteriacutesticas y priorizaacutendolas seguacuten nuestro intereacutes El

resultado fue el siguiente

Prioridad Caracteriacutestica Redmine TeamWork

9 Integracioacuten con

LDAP Si Si

8 Integracioacuten con

Subversion Si Si

8 Traducido al espantildeol

Si No

7 Importacioacuten desde

Project No Si

7 Exportacioacuten a

Project No Si

7 Centros de coste Posible mediante los campos

personalizados

Si

7 Wikis de proyectos Si

7 Personalizacioacuten

extensioacuten Si Si

6 Gestioacuten de vacaciones

No Vacaciones a nivel de

empresa

6 Vida de la herramienta

Indeterminado al ser una

herramienta open source

Algo maacutes seguro

porque hay una empresa detraacutes

5 Facilidad de configuracioacuten

Si

5 Usuarios multi-

perfil Si Si

4 Acceso restringido a usuarios

Si Si

3 Sencillez de manejo

Si

2 Seguimiento de

incidencias Si Si

1 Asignacioacuten de tareas

Si Si

1 Imputacioacuten a tareas asignadas

Si Si

Tras una difiacutecil reflexioacuten puesto que ambas se encontraban muy

parejas decidimos decantarnos por Redmine primando la

sencillez y rapidez Existiacutea la posibilidad de que terceros la

empleasen y veiacuteamos que Redmine permitiacutea una mayor facilidad

en su manejo y resultaba maacutes intuitiva de cara a aprender a

utilizarla Posteriormente tras su uso hemos detectado algunos

inconvenientes importantes como la imposibilidad de asignar una

peticioacuten a maacutes de un usuario pero es que no hay herramienta

perfecta

Bibliografiacutea

httpwwwnavegapolisnetcontentview5649

httpwwwsimpleprojectmanagementcomhomehtml

httpwwwweb-based-softwarecomproject

httpenwikipediaorgwikiComparison_of_issue_tracking_syste

ms

httpenwikipediaorgwikiList_of_project_management_softwa

re

httpwwwpmdigestcomsoftware

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Rauacutel Sanz de Acedo

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo Lexers parsers JavaCC (y II)

Texto En este artiacuteculo vamos a utilizar JavaCC como herramienta para

implementar un moacutedulo que resuelva la casuiacutestica de la

impresioacuten de las diversas paacuteginas de un fichero Esto es lo que se

refleja en esta imagen

Para ello en el artiacuteculo anterior definimos esta gramaacutetica a la que

asociamos unas acciones semaacutenticas

inicio --gt inicializacionVariables

listaElementos

procesarDatos

listaElementos --gt elemento

restoListaElementos

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

restoListaElementos --gt SEPARADOR

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

listaElementos

|

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

restoListaElementos2 --gt GUION ENTERO

num2 = valor(ENTERO)

Si (num2 gt maxPaginas)

or (num2==0) ent error

|

JavaCC es una herramienta que dado un fichero de extensioacuten

jj que describe la gramaacutetica y sus acciones semaacutenticas

asociadas genera los ficheros java que la implementan

Estos ficheros java pueden luego obviamente incluirse en

aqueacutellos que conforman el resto de nuestra aplicacioacuten

JavaCC es una herramienta gratuita que puede descargarse

desde aquiacute Existe tambieacuten un plugin para Eclipse Y asimismo

existe una task de Ant para JavaCC

Vamos pues a construir nuestro parser

Lo denominaremos parserImprimePaginasCC y por lo tanto

vamos a editar el fichero parserImprimePaginasCCjj

Indicaremos coacutemo se traducen los tokens y las producciones a

formato JavaCC

TOKEN

ltENTERO([0-9])+gt

| ltGUION -gt

| ltSEPARADOR([ ])+ | ([ ])gt

Los tokens se describen praacutecticamente como lo indicamos en la

gramaacutetica

void inicio()throws elementoFueraLimitesException

resultado = new Vector()

num1 = -1

num2 = -1

inicializaFlags()

listaElementos()

void listaElementos()throws elementoFueraLimitesExcept

ion

elemento() restoListaElementos()

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

restoListaElementos2()

void restoListaElementos()throws elementoFueraLimitesE

xception

ltSEPARADORgt

insertaElemento(num1 num2)

num1 = -1

num2 = -1

listaElementos()

|

insertaElemento(num1 num2)

num1 = -1

num2 = -1

void restoListaElementos2()throws elementoFueraLimites

Exception

ltGUIONgtltENTEROgt

num2 = IntegervalueOf(tokenimage)intValue()

if ((num2gtmaximo)|| (num2 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num2))

|

Las producciones son algo diferentes lo que era

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

ahora es

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(IntegertoS

tring(num1))

restoListaElementos2()

El no terminal elemento se describe como void elemento() y

ademaacutes le hemos asociado una excepcioacuten para controlar el hecho

de que un usuario coloque 0 o un nuacutemero mayor que el

permitido Lo que en la parte derecha es ENTERO se indica

como ltENTEROgt y la invocacioacuten de restoListaElementos2

es restoListaElementos2()

Las acciones semaacutenticas

num1 = valor(ENTERO)

Si (num1 gt maxPaginas) or (num1==0) ent error

se indican en JavaCC asiacute

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

El valor del token actual es accesible a traveacutes de tokenimage

Si deseamos tener coacutedigo Java adicional fuera de las

producciones lo podemos antildeadir de esta forma con la palabra

reservada JAVACODE

JAVACODE void insertaElemento(int num1 int num2)

int aux i iFlag

if ((num1 = -1) ampamp (num2 = -1))

if (num1gtnum2)

aux = num1

num1 = num2

num2 = aux

for (i = num1

i lt= num2

i++)

iFlag = i-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(i))

flags[iFlag] = true

else if (num1 = -1)

iFlag = num1-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num1))

flags[iFlag] = true

else if (num2 = -1)

iFlag = num2-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num2))

flags[iFlag] = true

JAVACODE void inicializaFlags()

int i

flags = new boolean [maximo]

for (i = 0

iltmaximo

i++)

flags[i] = false

Ademaacutes podemos inicializar el parser e instanciarlo de esta

forma

PARSER_BEGIN(parserImprimePaginasCC)

import javaio

import javautilVector

public class parserImprimePaginasCC

public static int maximo

public static Vector resultado

private static int num1 num2

private static boolean flags[]

public static void main(String[]args)throws Exceptio

n

Reader r = new StringReader(args[0])

parserImprimePaginasCC p

= new parserImprimePaginasCC(r)

try

pmaximo = 50

Systemoutprintln(Maacuteximo +pmaximo)

pinicio()

Systemoutprintln(OKn)

for (int j = 0

jltpresultadosize()

j++)

Systemoutprint(presultadoelementAt(j)+

)

Systemoutprintln()

catch (ParseException e)

Systemoutprintln(Error de sintaxis)

catch (TokenMgrError e)

Systemoutprintln(Error leacutexico)

catch (elementoFueraLimitesException e)

Systemoutprintln(egetMessage())

PARSER_END(parserImprimePaginasCC)

En este caso tomaremos la entrada de lo que el usuario

introduzca por teclado pero se pueden tomar los datos a traveacutes

de ficheros o pasarlos como variables

Se hace referencia a una excepcioacuten que hemos definido asiacute en un

fichero llamado elementoFueraLimitesExceptionjava

public class elementoFueraLimitesException extends Exc

eption

Constructor

public elementoFueraLimitesException()

super()

public elementoFueraLimitesException(String msg)

super(msg)

Una vez salvado el fichero parserImprimePaginasCCjj podemos

generar la documentacioacuten de la gramaacutetica en formato HTML de

esta forma

Nota en la ejecucioacuten de estos ejemplos se ha utilizado la liacutenea de comandos de

Windows pero se podriacutea haber hecho a traveacutes de cualquier sistema que soporte

el lenguaje Java

gtjjdoc parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Documentation

Generator Version 014)

(type jjdoc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Grammar documentation generated successfully in

parserImprimePaginasCChtml

Se genera el fichero parserImprimePaginasCChtmlcuyo

contenido es

BNF for parserImprimePaginasCCjj NON-TERMINALS

inicio = listaElementos

listaElementos = elemento restoListaElementos

elemento = ltENTEROgt restoListaElementos2

restoListaElementos = ltSEPARADORgt listaElementos

|

restoListaElementos2 = ltGUIONgt ltENTEROgt

|

insertaElemento = java code

inicializaFlags = java code

Nota BNF es el tipo de notacioacuten que estamos utilizando a lo largo de estos

artiacuteculos

Compilamos el parser

gtjavacc parser ImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

File TokenMgrErrorjava does not exist Will create

one

File ParseExceptionjava does not exist Will

create one

File Tokenjava does not exist Will create one

File SimpleCharStreamjava does not exist Will

create one

Parser generated successfully

y entonces se generan estos ficheros

ParseExceptionjava --gt

Excepcioacuten generada por el parser cuando un error es encontrado

parserImprimePaginasCCjava --gt La

traduccioacuten de nuestro fichero jj a java

parserImprimePaginasCCConstantsjava --gt Los

valores de los tokens

parserImprimePaginasCCTokenManagerjava --gt El

analizador leacutexico

SimpleCharStreamjava --gt

Contiene coacutedigo para leer caracteres de cualquier

implementacioacuten de javaioInputStream o javaioReader

Tokenjava --gt

Definicioacuten de la clase Token

TokenMgrErrorjava --gt

Diversos errores que puede producir el lexer

Ahora los compilamos y antildeadimos el fichero

elementoFueraLimitesExceptionjava en dicha compilacioacuten

javac java

Y vamos a ejecutar el parser suponiendo que el maacuteximo nuacutemero

de paacuteginas a impmir es 50 (como hemos indicado con pmaximo =

50)

Lo que obtenemos como salida es la lista de paacuteginas a imprimir o

un mensaje de error

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

OK

2 5 6 7 8

java -classpath laboratorioParsers

parserImprimePaginasCC 28-3046

Num paginas 50

OK

28 29 30 4 6

java -classpath laboratorioParsers

parserImprimePaginasCC 43-51

Num paginas 50

Introdujo un numero superior al maximo51

java -classpath laboratorioParsers

parserImprimePaginasCC 43--51

Num paginas 50

Error de sintaxisEncountered - at line 1

column 4

Was expecting

ltENTEROgt

iquestQueacute pasa si algo ha ido mal iquestPodemos depurar el parser de

alguna forma

Por supuesto podemos compilar el parser asiacute para obtener una

traza de la ejecucioacuten

javacc -DEBUG_PARSER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Consumed token lt- at line 1 column 4gt

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

En la traza vemos coacutemo el parser va invocando la diferentes

producciones

Podemos tambieacuten depurar el lexer

javacc -DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Returning the ltEOFgt token

OK

2 5 6 7 8

O combinar ambas trazas

javacc -DEBUG_PARSER -

DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Consumed token lt- at line 1 column 4gt

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Returning the ltEOFgt token

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

Conclusioacuten los generadores de parsers son herramientas

potentes que sirven para resolver problemas de una manera

bdquolimpia‟ y elegante Puede que su nombre retraiga a los

desarrolladores (ldquoiquestPara queacute quiero un generador de

compiladoresrdquo) pero es una opcioacuten a tener en cuenta

Ficheros para descargar

Referencias

- Generating Parsers with JavaCC

- The JavaCC FAQ

Si quieres enviar alguacuten comentario o sugerir temas a tratar en otros artiacuteculos escribe a

curtasun[simboloArroba]ceines

Categor

iacuteas

CES OpenSouceJava

Tema Desarrollo

Autor Carlos Urtasun

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo XSL-FO (Parte 1)

Texto XSL-FO Introduccioacuten El estaacutendar XSL tal y como estaacute definido actualmente se

divide en dos grandes partes -XSLT transformacioacuten de un documento de entrada XML en

alguacuten tipo de documento de salida ya sea XML HTML PDF etc -Formatting Objects (FO) definen la visualizacioacuten final del

resultado de la transformacioacuten Son una implementacioacuten especiacutefica de un determinado XSLT y aplicados a un

fichero XML nos proporcionan otro fichero con la informacioacuten de eacuteste renderizada a alguacuten formato de visualizacioacuten impresa Eacutesta es quizaacute la principal diferencia entre un FO y

otros XSLT ambos transforman un documento XML en otro documento XML pero FO estaacute pensado para generar

directamente una renderizacioacuten

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 11: Cesnavarra 2008-boletín 7

Las tres preguntas

Podemos resumir lo visto hasta ahora en tres preguntas que deberiacuteamos

hacernos antes de escribir String str = hellip

iquestVoy a modificar esta cadena Si la repuesta es no o simplemente voy a concatenar cadenas constantes para

mejorar la legibilidad del coacutedigo usareacute String

Si voy a modificarla en funcioacuten de la ejecucioacuten

usareacute StringBuffer o StringBuilder

iquestVa a acceder maacutes de un hilo a mi cadena simultaacuteneamente Si es asiacute usareacute un StringBuffer que asegura la sincronizacioacuten

Si no es asiacute algo que sucederaacute en la mayor parte de los casos

usareacute StringBuilder ya que es maacutes eficiente

iquestPuedo estimar la maacutexima longitud de la cadena Si es asiacute inicializareacute mi StringBuffer o StringBuilder con esa capacidad para

evitar que el objeto deba regenerar su buffer interno cada vez que sobrepase su

capacidad

Un paso maacutes Ropes

En aplicaciones donde el rendimiento es fundamental en el uso de cadenas

puede ser conveniente el uso de otro tipo de estructuras de datos para su

representacioacuten y manejo

Un ejemplo de ello es la estructura de datos denominada Rope

Este concepto no es nuevo se introdujo en un artiacuteculo de 1995(2) y representa

las cadenas con una estructura de aacuterbol de forma que mejora el rendimiento

en operaciones como la insercioacuten y la concatenacioacuten de cadenas El precio a

pagar por estas mejoras de rendimiento viene en forma de uso de memoria

que es sensiblemente superior usando Ropes frente al uso de Strings o

StringBuffers

Existe una implementacioacuten en Java de esta estructura llamada Ropes For

Java(4) Como ejemplo estas son algunas graacuteficas del rendimiento de esta

implementacioacuten publicadas en un artiacuteculo del autor Amin Ahmad(3)

Referencias 1 - Performance improvement techniques in String and StringBuffer

2 - Ropes an Alternative to Strings

3 - Ropes Theory and practice

4 - Ropes For Java

Categoriacute

as

CES OpenSouceJava

Tema Desarrollo

Autor Miguel Bacaicoa

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo Herramientas de gestioacuten de proyectos Open Source

Texto Haraacute unos meses nos vimos en la tesitura de buscar una

herramienta de gestioacuten de proyectos para el Centro Java y Open

Source

Hasta el momento habiacuteamos estado trabajando con dotproject

un sistema con bastante capacidad y funcionalidades No

obstante resultoacute ser una herramienta algo pesada en la creacioacuten

de planificaciones y tediosa en el mantenimiento diacutea a diacutea

Buscaacutebamos principalmente una herramienta que no solo

gestionase la parte de planificacioacuten sino tambieacuten la parte de

seguimiento posterior para mantener el control sobre el proyecto

Ademaacutes deseaacutebamos un entorno colaborativo multi-usuario y

participativo entre nosotros y cualquier colaborador externo Lo

cual maacutes que un requerimiento funcional supone un cambio

cultural la parte maacutes compleja

Todo esto en principio decantaba la decisioacuten por una opcioacuten on-

line en detrimento de una de escritorio No obstante decidimos

valorar tambieacuten las de escritorio no fuera que por empecinarnos

en unas funcionalidades descartaacutesemos otras importantes

A continuacioacuten describireacute brevemente algunas de las

herramientas valoradas

De escritorio

GanttProject

Aplicacioacuten de escritorio muy extendida y uacutetil que permite

planificar tareas y recursos sobre un diagrama Gantt Se trata de

una herramienta similar a MS Project pero maacutes sencilla lo cual

puede ser en algunos casos una ventaja Otra caracteriacutestica

interesante es que funciona tanto en Linux como en Windows y

tiene diversos formatos de exportacioacuten e importacioacuten

Planner

Aplicacioacuten de escritorio bastante extendida y algo maacutes completa

a la anterior (a pesat de tener menos opciones de importacioacuten y

exportacioacuten) pero muy similar En este caso estaacute desarrollada

para Linux aunque existe versioacuten beta para Windows

Open Workbench

Aplicacioacuten de escritorio muy completa Al igual que las anteriores

permite gestionar tareas y recursos sobre un diagrama Gantt

aunque tambieacuten permite otros diagramas como Pert camino

criacutetico y funcionalidades maacutes avanzadas Se vanagloria de ser

incluso mejor que MS Project

TaskJuggler

Se trata de una herramienta de escritorio disponible tanto para

Windows como para Linux un tanto peculiar Genera una serie de

informes bastante completos a partir de un fichero de texto El

interfaz es bastante amigable pero el hecho de andar editando

un fichero de texto que contiene la planificacioacuten no resulta muy

coacutemodo

OpenProj

Otro programa de escritorio sustitutivo de MS Project y de

apariencia muy similar Tiene versiones para Linux Unix Mac y

Windows y es compatible con ficheros MS Project y con todas sus

funcionalidades No obstante parece no estar indicado para

proyectos de grupo En estos casos te ofrecen una versioacuten on-

line (Project-ON-Demand) bajo demanda y de pago bastante

interesante

Entorno web

TeamSCOPE

Team Software for Collaborative Project Environments es una

herramienta web de colaboracioacuten Desarrollado para funcionar

sobre Debian fue creado por una universidad pero parece

haberse quedado bastante anticuado

NetOffice

Herramienta web basada en PHP sobre MySQL para gestionar proyectos tareas registros de tiempos incidenciaserrores

diagramas de Gantt (aunque un poco escondidos) etc similar pero algo maacutes agradable que dotProject Tiene ciertos tintes de herramienta de colaboracioacuten en grupo (groupware)

phpCollab

Herramienta web basada en PHP que ha sufrido un desarrollo

intermitente por lo que parece Sirve tanto para la gestioacuten de

tareas como para el seguimiento de incidenciaserrores Tiene un

aspecto similar a netOffice lo cual hace pensar que uno de los

dos proyectos deriva del otro Quizaacutes por esa razoacuten de elegir una

de las dos sea maacutes recomendable netOffice

Achievo

Herramienta web PHP sobre MySQL para la gestioacuten de proyectos

tareas recursos registro de tiempos agenda generacioacuten de

informes etc Bastante completo ademaacutes parece incluir seccioacuten

presupuestaria

XPlanner

Herramienta web Java sobre MySQL para la gestioacuten de proyectos

mediante XP y Scrum No obstante parece estancada en una

versioacuten beta desde el 2006

PPTS

Project Planning and Tracking System (PPTS) es una herramienta

Web para la gestioacuten de proyectos con metodologiacuteas XP y Scrum

al igual que la anterior Esta desarrollada en PHP contra MySQL

aunque parece tambieacuten largo tiempo abandonada

XPWeb

Al igual que las anteriores es una herramienta web para la

gestioacuten de proyectos aacutegiles incluyendo gestioacuten de tareas

calendarios informes etc Tambieacuten parece estancada

Trac

Herramienta web ampliamente extendida en la comunidad open

source para fundamentalmente el seguimiento proyectos Se

centra en la gestioacuten de incidencias y errores aunque tiene

funcionalidades antildeadidas interesantes como Wiki e integracioacuten

con Subversioacuten Hay que resentildear que se trata de una

herramienta mono-proyecto y que no cuenta con Gantt

OpenProject

Herramienta web de gestioacuten de proyectos muy completa Posee

todo lo necesario tanto que uno llega a perderse No obstante

pueden configurarse los moacutedulos que desean usarse y descartar

aquellos que no son necesarios calendario gestioacuten de tareas

seguimiento de incidencias control presupuestario Wiki foros

integracioacuten con ERPs diagramas Gantt y una larga lista de

funcionalidades

Tutos

The Ultimate Team Organization Software o eso pretende Se

trata de una herramienta web LAMP con muchas funcionalidades

calendario y agenda seguimiento de incidencias y errores

gestioacuten de tareas diagramas Gantt gestioacuten documental gestioacuten

de correos facturas e informes Interesante pero austera de

aspecto y un poco anticuada

Project Dune

Herramienta web desarrollada en Java contra MySQL que pareciacutea

prometer bastante Tiene lo necesario gestioacuten de tareas

recursos incidencias gestioacuten documental registro de tiempos

informes calendario y agenda RSS inspeccioacuten de coacutedigo

importacioacuten de MS Project etc No obstante en su evaluacioacuten

dejoacute bastante que desear resultando poco praacutectica y manejable

Collabtive

Se trata de una herramienta web LAMP para la gestioacuten de

proyectos Seguacuten se indica en la web cubre la gestioacuten de tareas e

incidencias gestioacuten documental y mensajeriacutea Es muy limpia

sencilla y aacutegil No obstante no parece contar con diagramas

Gantt ni con registro de tiempos o informes de estado En la

praacutectica parece quedarse un poco justa pero prometedora

Mindquarry

Herramienta web desarrollada en Java que pretende ser la

alternativa open source de soluciones propietarias como

Basecamp o Sharepoint para la gestioacuten de proyectos y grupos de

trabajo de forma colaborativa Tiene una versioacuten open source

para descarga y otra como servicio bajo demanda La pega es

que la empresa parece haber dejado de desarrollar su actividad

ClockingIT

Se trata de una herramienta Web desarrollada en Ruby como

servicio bajo demanda Permite una gestioacuten de tareas agenda

siguiendo el estaacutendar iCal seguimiento de tiempos generacioacuten

de informes notificaciones RSS foros Chat y Wiki repositorio

de ficheros etc

LibreSource

Se trata de una plataforma web colaborativa para el desarrollo de

software lo que se suele denominar forja y funcionalidades de

groupware archivado y publicacioacuten web Es open source y

altamente ajustable Permite alojar muacuteltiples proyectos varios

grupos de usuarios etc Estaacute desarrollada en J2EE e incorpora

entre otras cosas Wiki integracioacuten con Subversion zonas de

descarga gestioacuten documental mensajeriacutea instantaacutenea con

Jabber gestioacuten de incidencias etc No fue evaluada al ser

descubierta posteriormente a la implantacioacuten de la herramienta

elegida pero parece una buena alternativa

Aunque existen infinidad maacutes de entre todas nos decantamos

por dos que valoramos maacutes en profundidad

TeamWork

Se trata de una herramienta web desarrollada en Java por unos

Italianos Entre sus funcionalidades cabe destacar la gestioacuten de

proyectos y tareas con diversos diagramas de Gantt muy

logrados gestioacuten de incidencias gestioacuten documental entorno

colaborativo tipo groupware control de costes registros de

tiempos etc

Es muy completo raacutepido de respuesta y posee caracteriacutesticas

muy interesantes como una interesante y uacutetil navegacioacuten

contextual entre tareas del proyecto perfiles de usuario seguacuten

proyecto importacioacuten de planificaciones desde MS Project o

asociacioacuten entre incidencias y tareas

Cuenta con wizards para la configuracioacuten de la herramienta de

forma raacutepida y sencilla incluyendo la posibilidad de generar

plantillas para aplicar metodologiacuteas aacutegiles (Scrum)

El registro de horas por tarea para un desarrollador se realiza de

forma muy coacutemoda y raacutepida desde una simple vista facilitando

la participacioacuten del mismo

Se trataba de una aplicacioacuten muy completa quizaacutes demasiado

un poco compleja de entender en un comienzo pero con muchas

posibilidades

No obstante teniacutea alguna que otra pega aunque es open source

posee una licencia de pago para su uso que en cualquier caso era

muy pequentildea Tiene una versioacuten de evaluacioacuten de 30 diacuteas para

quien desee probarla antes de decidir Por otro lado no distingue

proyectos existe una tarea padre que agrupa toda la

planificacioacuten asociada tampoco cuenta con Wiki y no gestiona las

vacaciones del personal

La otra herramienta valorada maacutes en profundidad fue

Redmine

Se trata de otra herramienta web en este caso desarrollada en

Ruby on Rails con una gran cantidad de funcionalidades que la

acerca bastante a una forja pero sin tener la complejidad de la

misma Entre sus caracteriacutesticas cabe destacar la gestioacuten de

tareas incidencias diagramas de Gantt calendario de

actividades noticias foros wikis gestioacuten de ficheros y

documentos integracioacuten con Subversioacuten control de tiempos

generacioacuten de informes etc todo esto por proyecto Por

similitudes del interfaz y funcionalidades parece estar basado en

Trac pero con un lavado de cara y de coacutedigo importante ademaacutes

de ser multi-proyecto

Al igual que la anterior tambieacuten poseiacutea una serie de

caracteriacutesticas que la haciacutea diferente como la posible navegacioacuten

anoacutenima de lectura si asiacute se desea sobre los proyectos alojados

Interesante desde el punto de vista de filosofiacutea open source

Posibilidad de definir un perfil distinto por usuario seguacuten el

proyecto en el que participa

Tambieacuten cuenta con sindicacioacuten de RSS para las secciones de

noticias tareas incidencias etc y exportacioacuten a ficheros de texto

y HTML desde la Wiki los informes generados e incluso el

diagrama de Gantt

A parte se trata de un interfaz muy limpio intuitivo sencillo de

usar y rapidiacutesimo

La configuracioacuten de la herramienta resulta asiacute mismo muy

sencilla con un par de clics puedes empezar a funcionar

Cada proyecto puede configurarse con los moacutedulos que desees

que tenga ademaacutes de poder definir campos personalizados por

proyecto y tarea para permitir una mayor adaptacioacuten

Cabe destacar que para esta herramienta existe un uacutenico

concepto denominado peticioacuten que puede ser de tres tipos

tareas soporte o incidencia De esta forma todo se gestiona de

igual forma lo cual lo simplifica pero a su vez puede convertirse

en un volumen ingestionable de tareas Para evitar esto se

pueden definir categoriacuteas a las que pertenece una peticioacuten y

realizar posteriormente filtrados de peticiones en las vistas seguacuten

este y otros paraacutemetros

No obstante no todo iba a ser color de rosa tiene una serie de

limitaciones como el sistema un tanto engorroso de enlazar

peticiones o el hecho de que una vez creada una peticioacuten su

nombre y descripcioacuten no se pueden modificar tan solo ir

antildeadiendo nuevas descripciones

En este punto nos encontraacutebamos en una difiacutecil decisioacuten puesto

que ambas herramientas nos gustaban cubriacutean lo necesario pero

se trataban de herramientas muy distintas en concepcioacuten Para

facilitar la decisioacuten realizamos un cuadro comparando las

caracteriacutesticas y priorizaacutendolas seguacuten nuestro intereacutes El

resultado fue el siguiente

Prioridad Caracteriacutestica Redmine TeamWork

9 Integracioacuten con

LDAP Si Si

8 Integracioacuten con

Subversion Si Si

8 Traducido al espantildeol

Si No

7 Importacioacuten desde

Project No Si

7 Exportacioacuten a

Project No Si

7 Centros de coste Posible mediante los campos

personalizados

Si

7 Wikis de proyectos Si

7 Personalizacioacuten

extensioacuten Si Si

6 Gestioacuten de vacaciones

No Vacaciones a nivel de

empresa

6 Vida de la herramienta

Indeterminado al ser una

herramienta open source

Algo maacutes seguro

porque hay una empresa detraacutes

5 Facilidad de configuracioacuten

Si

5 Usuarios multi-

perfil Si Si

4 Acceso restringido a usuarios

Si Si

3 Sencillez de manejo

Si

2 Seguimiento de

incidencias Si Si

1 Asignacioacuten de tareas

Si Si

1 Imputacioacuten a tareas asignadas

Si Si

Tras una difiacutecil reflexioacuten puesto que ambas se encontraban muy

parejas decidimos decantarnos por Redmine primando la

sencillez y rapidez Existiacutea la posibilidad de que terceros la

empleasen y veiacuteamos que Redmine permitiacutea una mayor facilidad

en su manejo y resultaba maacutes intuitiva de cara a aprender a

utilizarla Posteriormente tras su uso hemos detectado algunos

inconvenientes importantes como la imposibilidad de asignar una

peticioacuten a maacutes de un usuario pero es que no hay herramienta

perfecta

Bibliografiacutea

httpwwwnavegapolisnetcontentview5649

httpwwwsimpleprojectmanagementcomhomehtml

httpwwwweb-based-softwarecomproject

httpenwikipediaorgwikiComparison_of_issue_tracking_syste

ms

httpenwikipediaorgwikiList_of_project_management_softwa

re

httpwwwpmdigestcomsoftware

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Rauacutel Sanz de Acedo

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo Lexers parsers JavaCC (y II)

Texto En este artiacuteculo vamos a utilizar JavaCC como herramienta para

implementar un moacutedulo que resuelva la casuiacutestica de la

impresioacuten de las diversas paacuteginas de un fichero Esto es lo que se

refleja en esta imagen

Para ello en el artiacuteculo anterior definimos esta gramaacutetica a la que

asociamos unas acciones semaacutenticas

inicio --gt inicializacionVariables

listaElementos

procesarDatos

listaElementos --gt elemento

restoListaElementos

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

restoListaElementos --gt SEPARADOR

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

listaElementos

|

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

restoListaElementos2 --gt GUION ENTERO

num2 = valor(ENTERO)

Si (num2 gt maxPaginas)

or (num2==0) ent error

|

JavaCC es una herramienta que dado un fichero de extensioacuten

jj que describe la gramaacutetica y sus acciones semaacutenticas

asociadas genera los ficheros java que la implementan

Estos ficheros java pueden luego obviamente incluirse en

aqueacutellos que conforman el resto de nuestra aplicacioacuten

JavaCC es una herramienta gratuita que puede descargarse

desde aquiacute Existe tambieacuten un plugin para Eclipse Y asimismo

existe una task de Ant para JavaCC

Vamos pues a construir nuestro parser

Lo denominaremos parserImprimePaginasCC y por lo tanto

vamos a editar el fichero parserImprimePaginasCCjj

Indicaremos coacutemo se traducen los tokens y las producciones a

formato JavaCC

TOKEN

ltENTERO([0-9])+gt

| ltGUION -gt

| ltSEPARADOR([ ])+ | ([ ])gt

Los tokens se describen praacutecticamente como lo indicamos en la

gramaacutetica

void inicio()throws elementoFueraLimitesException

resultado = new Vector()

num1 = -1

num2 = -1

inicializaFlags()

listaElementos()

void listaElementos()throws elementoFueraLimitesExcept

ion

elemento() restoListaElementos()

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

restoListaElementos2()

void restoListaElementos()throws elementoFueraLimitesE

xception

ltSEPARADORgt

insertaElemento(num1 num2)

num1 = -1

num2 = -1

listaElementos()

|

insertaElemento(num1 num2)

num1 = -1

num2 = -1

void restoListaElementos2()throws elementoFueraLimites

Exception

ltGUIONgtltENTEROgt

num2 = IntegervalueOf(tokenimage)intValue()

if ((num2gtmaximo)|| (num2 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num2))

|

Las producciones son algo diferentes lo que era

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

ahora es

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(IntegertoS

tring(num1))

restoListaElementos2()

El no terminal elemento se describe como void elemento() y

ademaacutes le hemos asociado una excepcioacuten para controlar el hecho

de que un usuario coloque 0 o un nuacutemero mayor que el

permitido Lo que en la parte derecha es ENTERO se indica

como ltENTEROgt y la invocacioacuten de restoListaElementos2

es restoListaElementos2()

Las acciones semaacutenticas

num1 = valor(ENTERO)

Si (num1 gt maxPaginas) or (num1==0) ent error

se indican en JavaCC asiacute

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

El valor del token actual es accesible a traveacutes de tokenimage

Si deseamos tener coacutedigo Java adicional fuera de las

producciones lo podemos antildeadir de esta forma con la palabra

reservada JAVACODE

JAVACODE void insertaElemento(int num1 int num2)

int aux i iFlag

if ((num1 = -1) ampamp (num2 = -1))

if (num1gtnum2)

aux = num1

num1 = num2

num2 = aux

for (i = num1

i lt= num2

i++)

iFlag = i-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(i))

flags[iFlag] = true

else if (num1 = -1)

iFlag = num1-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num1))

flags[iFlag] = true

else if (num2 = -1)

iFlag = num2-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num2))

flags[iFlag] = true

JAVACODE void inicializaFlags()

int i

flags = new boolean [maximo]

for (i = 0

iltmaximo

i++)

flags[i] = false

Ademaacutes podemos inicializar el parser e instanciarlo de esta

forma

PARSER_BEGIN(parserImprimePaginasCC)

import javaio

import javautilVector

public class parserImprimePaginasCC

public static int maximo

public static Vector resultado

private static int num1 num2

private static boolean flags[]

public static void main(String[]args)throws Exceptio

n

Reader r = new StringReader(args[0])

parserImprimePaginasCC p

= new parserImprimePaginasCC(r)

try

pmaximo = 50

Systemoutprintln(Maacuteximo +pmaximo)

pinicio()

Systemoutprintln(OKn)

for (int j = 0

jltpresultadosize()

j++)

Systemoutprint(presultadoelementAt(j)+

)

Systemoutprintln()

catch (ParseException e)

Systemoutprintln(Error de sintaxis)

catch (TokenMgrError e)

Systemoutprintln(Error leacutexico)

catch (elementoFueraLimitesException e)

Systemoutprintln(egetMessage())

PARSER_END(parserImprimePaginasCC)

En este caso tomaremos la entrada de lo que el usuario

introduzca por teclado pero se pueden tomar los datos a traveacutes

de ficheros o pasarlos como variables

Se hace referencia a una excepcioacuten que hemos definido asiacute en un

fichero llamado elementoFueraLimitesExceptionjava

public class elementoFueraLimitesException extends Exc

eption

Constructor

public elementoFueraLimitesException()

super()

public elementoFueraLimitesException(String msg)

super(msg)

Una vez salvado el fichero parserImprimePaginasCCjj podemos

generar la documentacioacuten de la gramaacutetica en formato HTML de

esta forma

Nota en la ejecucioacuten de estos ejemplos se ha utilizado la liacutenea de comandos de

Windows pero se podriacutea haber hecho a traveacutes de cualquier sistema que soporte

el lenguaje Java

gtjjdoc parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Documentation

Generator Version 014)

(type jjdoc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Grammar documentation generated successfully in

parserImprimePaginasCChtml

Se genera el fichero parserImprimePaginasCChtmlcuyo

contenido es

BNF for parserImprimePaginasCCjj NON-TERMINALS

inicio = listaElementos

listaElementos = elemento restoListaElementos

elemento = ltENTEROgt restoListaElementos2

restoListaElementos = ltSEPARADORgt listaElementos

|

restoListaElementos2 = ltGUIONgt ltENTEROgt

|

insertaElemento = java code

inicializaFlags = java code

Nota BNF es el tipo de notacioacuten que estamos utilizando a lo largo de estos

artiacuteculos

Compilamos el parser

gtjavacc parser ImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

File TokenMgrErrorjava does not exist Will create

one

File ParseExceptionjava does not exist Will

create one

File Tokenjava does not exist Will create one

File SimpleCharStreamjava does not exist Will

create one

Parser generated successfully

y entonces se generan estos ficheros

ParseExceptionjava --gt

Excepcioacuten generada por el parser cuando un error es encontrado

parserImprimePaginasCCjava --gt La

traduccioacuten de nuestro fichero jj a java

parserImprimePaginasCCConstantsjava --gt Los

valores de los tokens

parserImprimePaginasCCTokenManagerjava --gt El

analizador leacutexico

SimpleCharStreamjava --gt

Contiene coacutedigo para leer caracteres de cualquier

implementacioacuten de javaioInputStream o javaioReader

Tokenjava --gt

Definicioacuten de la clase Token

TokenMgrErrorjava --gt

Diversos errores que puede producir el lexer

Ahora los compilamos y antildeadimos el fichero

elementoFueraLimitesExceptionjava en dicha compilacioacuten

javac java

Y vamos a ejecutar el parser suponiendo que el maacuteximo nuacutemero

de paacuteginas a impmir es 50 (como hemos indicado con pmaximo =

50)

Lo que obtenemos como salida es la lista de paacuteginas a imprimir o

un mensaje de error

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

OK

2 5 6 7 8

java -classpath laboratorioParsers

parserImprimePaginasCC 28-3046

Num paginas 50

OK

28 29 30 4 6

java -classpath laboratorioParsers

parserImprimePaginasCC 43-51

Num paginas 50

Introdujo un numero superior al maximo51

java -classpath laboratorioParsers

parserImprimePaginasCC 43--51

Num paginas 50

Error de sintaxisEncountered - at line 1

column 4

Was expecting

ltENTEROgt

iquestQueacute pasa si algo ha ido mal iquestPodemos depurar el parser de

alguna forma

Por supuesto podemos compilar el parser asiacute para obtener una

traza de la ejecucioacuten

javacc -DEBUG_PARSER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Consumed token lt- at line 1 column 4gt

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

En la traza vemos coacutemo el parser va invocando la diferentes

producciones

Podemos tambieacuten depurar el lexer

javacc -DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Returning the ltEOFgt token

OK

2 5 6 7 8

O combinar ambas trazas

javacc -DEBUG_PARSER -

DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Consumed token lt- at line 1 column 4gt

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Returning the ltEOFgt token

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

Conclusioacuten los generadores de parsers son herramientas

potentes que sirven para resolver problemas de una manera

bdquolimpia‟ y elegante Puede que su nombre retraiga a los

desarrolladores (ldquoiquestPara queacute quiero un generador de

compiladoresrdquo) pero es una opcioacuten a tener en cuenta

Ficheros para descargar

Referencias

- Generating Parsers with JavaCC

- The JavaCC FAQ

Si quieres enviar alguacuten comentario o sugerir temas a tratar en otros artiacuteculos escribe a

curtasun[simboloArroba]ceines

Categor

iacuteas

CES OpenSouceJava

Tema Desarrollo

Autor Carlos Urtasun

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo XSL-FO (Parte 1)

Texto XSL-FO Introduccioacuten El estaacutendar XSL tal y como estaacute definido actualmente se

divide en dos grandes partes -XSLT transformacioacuten de un documento de entrada XML en

alguacuten tipo de documento de salida ya sea XML HTML PDF etc -Formatting Objects (FO) definen la visualizacioacuten final del

resultado de la transformacioacuten Son una implementacioacuten especiacutefica de un determinado XSLT y aplicados a un

fichero XML nos proporcionan otro fichero con la informacioacuten de eacuteste renderizada a alguacuten formato de visualizacioacuten impresa Eacutesta es quizaacute la principal diferencia entre un FO y

otros XSLT ambos transforman un documento XML en otro documento XML pero FO estaacute pensado para generar

directamente una renderizacioacuten

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 12: Cesnavarra 2008-boletín 7

implementacioacuten publicadas en un artiacuteculo del autor Amin Ahmad(3)

Referencias 1 - Performance improvement techniques in String and StringBuffer

2 - Ropes an Alternative to Strings

3 - Ropes Theory and practice

4 - Ropes For Java

Categoriacute

as

CES OpenSouceJava

Tema Desarrollo

Autor Miguel Bacaicoa

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo Herramientas de gestioacuten de proyectos Open Source

Texto Haraacute unos meses nos vimos en la tesitura de buscar una

herramienta de gestioacuten de proyectos para el Centro Java y Open

Source

Hasta el momento habiacuteamos estado trabajando con dotproject

un sistema con bastante capacidad y funcionalidades No

obstante resultoacute ser una herramienta algo pesada en la creacioacuten

de planificaciones y tediosa en el mantenimiento diacutea a diacutea

Buscaacutebamos principalmente una herramienta que no solo

gestionase la parte de planificacioacuten sino tambieacuten la parte de

seguimiento posterior para mantener el control sobre el proyecto

Ademaacutes deseaacutebamos un entorno colaborativo multi-usuario y

participativo entre nosotros y cualquier colaborador externo Lo

cual maacutes que un requerimiento funcional supone un cambio

cultural la parte maacutes compleja

Todo esto en principio decantaba la decisioacuten por una opcioacuten on-

line en detrimento de una de escritorio No obstante decidimos

valorar tambieacuten las de escritorio no fuera que por empecinarnos

en unas funcionalidades descartaacutesemos otras importantes

A continuacioacuten describireacute brevemente algunas de las

herramientas valoradas

De escritorio

GanttProject

Aplicacioacuten de escritorio muy extendida y uacutetil que permite

planificar tareas y recursos sobre un diagrama Gantt Se trata de

una herramienta similar a MS Project pero maacutes sencilla lo cual

puede ser en algunos casos una ventaja Otra caracteriacutestica

interesante es que funciona tanto en Linux como en Windows y

tiene diversos formatos de exportacioacuten e importacioacuten

Planner

Aplicacioacuten de escritorio bastante extendida y algo maacutes completa

a la anterior (a pesat de tener menos opciones de importacioacuten y

exportacioacuten) pero muy similar En este caso estaacute desarrollada

para Linux aunque existe versioacuten beta para Windows

Open Workbench

Aplicacioacuten de escritorio muy completa Al igual que las anteriores

permite gestionar tareas y recursos sobre un diagrama Gantt

aunque tambieacuten permite otros diagramas como Pert camino

criacutetico y funcionalidades maacutes avanzadas Se vanagloria de ser

incluso mejor que MS Project

TaskJuggler

Se trata de una herramienta de escritorio disponible tanto para

Windows como para Linux un tanto peculiar Genera una serie de

informes bastante completos a partir de un fichero de texto El

interfaz es bastante amigable pero el hecho de andar editando

un fichero de texto que contiene la planificacioacuten no resulta muy

coacutemodo

OpenProj

Otro programa de escritorio sustitutivo de MS Project y de

apariencia muy similar Tiene versiones para Linux Unix Mac y

Windows y es compatible con ficheros MS Project y con todas sus

funcionalidades No obstante parece no estar indicado para

proyectos de grupo En estos casos te ofrecen una versioacuten on-

line (Project-ON-Demand) bajo demanda y de pago bastante

interesante

Entorno web

TeamSCOPE

Team Software for Collaborative Project Environments es una

herramienta web de colaboracioacuten Desarrollado para funcionar

sobre Debian fue creado por una universidad pero parece

haberse quedado bastante anticuado

NetOffice

Herramienta web basada en PHP sobre MySQL para gestionar proyectos tareas registros de tiempos incidenciaserrores

diagramas de Gantt (aunque un poco escondidos) etc similar pero algo maacutes agradable que dotProject Tiene ciertos tintes de herramienta de colaboracioacuten en grupo (groupware)

phpCollab

Herramienta web basada en PHP que ha sufrido un desarrollo

intermitente por lo que parece Sirve tanto para la gestioacuten de

tareas como para el seguimiento de incidenciaserrores Tiene un

aspecto similar a netOffice lo cual hace pensar que uno de los

dos proyectos deriva del otro Quizaacutes por esa razoacuten de elegir una

de las dos sea maacutes recomendable netOffice

Achievo

Herramienta web PHP sobre MySQL para la gestioacuten de proyectos

tareas recursos registro de tiempos agenda generacioacuten de

informes etc Bastante completo ademaacutes parece incluir seccioacuten

presupuestaria

XPlanner

Herramienta web Java sobre MySQL para la gestioacuten de proyectos

mediante XP y Scrum No obstante parece estancada en una

versioacuten beta desde el 2006

PPTS

Project Planning and Tracking System (PPTS) es una herramienta

Web para la gestioacuten de proyectos con metodologiacuteas XP y Scrum

al igual que la anterior Esta desarrollada en PHP contra MySQL

aunque parece tambieacuten largo tiempo abandonada

XPWeb

Al igual que las anteriores es una herramienta web para la

gestioacuten de proyectos aacutegiles incluyendo gestioacuten de tareas

calendarios informes etc Tambieacuten parece estancada

Trac

Herramienta web ampliamente extendida en la comunidad open

source para fundamentalmente el seguimiento proyectos Se

centra en la gestioacuten de incidencias y errores aunque tiene

funcionalidades antildeadidas interesantes como Wiki e integracioacuten

con Subversioacuten Hay que resentildear que se trata de una

herramienta mono-proyecto y que no cuenta con Gantt

OpenProject

Herramienta web de gestioacuten de proyectos muy completa Posee

todo lo necesario tanto que uno llega a perderse No obstante

pueden configurarse los moacutedulos que desean usarse y descartar

aquellos que no son necesarios calendario gestioacuten de tareas

seguimiento de incidencias control presupuestario Wiki foros

integracioacuten con ERPs diagramas Gantt y una larga lista de

funcionalidades

Tutos

The Ultimate Team Organization Software o eso pretende Se

trata de una herramienta web LAMP con muchas funcionalidades

calendario y agenda seguimiento de incidencias y errores

gestioacuten de tareas diagramas Gantt gestioacuten documental gestioacuten

de correos facturas e informes Interesante pero austera de

aspecto y un poco anticuada

Project Dune

Herramienta web desarrollada en Java contra MySQL que pareciacutea

prometer bastante Tiene lo necesario gestioacuten de tareas

recursos incidencias gestioacuten documental registro de tiempos

informes calendario y agenda RSS inspeccioacuten de coacutedigo

importacioacuten de MS Project etc No obstante en su evaluacioacuten

dejoacute bastante que desear resultando poco praacutectica y manejable

Collabtive

Se trata de una herramienta web LAMP para la gestioacuten de

proyectos Seguacuten se indica en la web cubre la gestioacuten de tareas e

incidencias gestioacuten documental y mensajeriacutea Es muy limpia

sencilla y aacutegil No obstante no parece contar con diagramas

Gantt ni con registro de tiempos o informes de estado En la

praacutectica parece quedarse un poco justa pero prometedora

Mindquarry

Herramienta web desarrollada en Java que pretende ser la

alternativa open source de soluciones propietarias como

Basecamp o Sharepoint para la gestioacuten de proyectos y grupos de

trabajo de forma colaborativa Tiene una versioacuten open source

para descarga y otra como servicio bajo demanda La pega es

que la empresa parece haber dejado de desarrollar su actividad

ClockingIT

Se trata de una herramienta Web desarrollada en Ruby como

servicio bajo demanda Permite una gestioacuten de tareas agenda

siguiendo el estaacutendar iCal seguimiento de tiempos generacioacuten

de informes notificaciones RSS foros Chat y Wiki repositorio

de ficheros etc

LibreSource

Se trata de una plataforma web colaborativa para el desarrollo de

software lo que se suele denominar forja y funcionalidades de

groupware archivado y publicacioacuten web Es open source y

altamente ajustable Permite alojar muacuteltiples proyectos varios

grupos de usuarios etc Estaacute desarrollada en J2EE e incorpora

entre otras cosas Wiki integracioacuten con Subversion zonas de

descarga gestioacuten documental mensajeriacutea instantaacutenea con

Jabber gestioacuten de incidencias etc No fue evaluada al ser

descubierta posteriormente a la implantacioacuten de la herramienta

elegida pero parece una buena alternativa

Aunque existen infinidad maacutes de entre todas nos decantamos

por dos que valoramos maacutes en profundidad

TeamWork

Se trata de una herramienta web desarrollada en Java por unos

Italianos Entre sus funcionalidades cabe destacar la gestioacuten de

proyectos y tareas con diversos diagramas de Gantt muy

logrados gestioacuten de incidencias gestioacuten documental entorno

colaborativo tipo groupware control de costes registros de

tiempos etc

Es muy completo raacutepido de respuesta y posee caracteriacutesticas

muy interesantes como una interesante y uacutetil navegacioacuten

contextual entre tareas del proyecto perfiles de usuario seguacuten

proyecto importacioacuten de planificaciones desde MS Project o

asociacioacuten entre incidencias y tareas

Cuenta con wizards para la configuracioacuten de la herramienta de

forma raacutepida y sencilla incluyendo la posibilidad de generar

plantillas para aplicar metodologiacuteas aacutegiles (Scrum)

El registro de horas por tarea para un desarrollador se realiza de

forma muy coacutemoda y raacutepida desde una simple vista facilitando

la participacioacuten del mismo

Se trataba de una aplicacioacuten muy completa quizaacutes demasiado

un poco compleja de entender en un comienzo pero con muchas

posibilidades

No obstante teniacutea alguna que otra pega aunque es open source

posee una licencia de pago para su uso que en cualquier caso era

muy pequentildea Tiene una versioacuten de evaluacioacuten de 30 diacuteas para

quien desee probarla antes de decidir Por otro lado no distingue

proyectos existe una tarea padre que agrupa toda la

planificacioacuten asociada tampoco cuenta con Wiki y no gestiona las

vacaciones del personal

La otra herramienta valorada maacutes en profundidad fue

Redmine

Se trata de otra herramienta web en este caso desarrollada en

Ruby on Rails con una gran cantidad de funcionalidades que la

acerca bastante a una forja pero sin tener la complejidad de la

misma Entre sus caracteriacutesticas cabe destacar la gestioacuten de

tareas incidencias diagramas de Gantt calendario de

actividades noticias foros wikis gestioacuten de ficheros y

documentos integracioacuten con Subversioacuten control de tiempos

generacioacuten de informes etc todo esto por proyecto Por

similitudes del interfaz y funcionalidades parece estar basado en

Trac pero con un lavado de cara y de coacutedigo importante ademaacutes

de ser multi-proyecto

Al igual que la anterior tambieacuten poseiacutea una serie de

caracteriacutesticas que la haciacutea diferente como la posible navegacioacuten

anoacutenima de lectura si asiacute se desea sobre los proyectos alojados

Interesante desde el punto de vista de filosofiacutea open source

Posibilidad de definir un perfil distinto por usuario seguacuten el

proyecto en el que participa

Tambieacuten cuenta con sindicacioacuten de RSS para las secciones de

noticias tareas incidencias etc y exportacioacuten a ficheros de texto

y HTML desde la Wiki los informes generados e incluso el

diagrama de Gantt

A parte se trata de un interfaz muy limpio intuitivo sencillo de

usar y rapidiacutesimo

La configuracioacuten de la herramienta resulta asiacute mismo muy

sencilla con un par de clics puedes empezar a funcionar

Cada proyecto puede configurarse con los moacutedulos que desees

que tenga ademaacutes de poder definir campos personalizados por

proyecto y tarea para permitir una mayor adaptacioacuten

Cabe destacar que para esta herramienta existe un uacutenico

concepto denominado peticioacuten que puede ser de tres tipos

tareas soporte o incidencia De esta forma todo se gestiona de

igual forma lo cual lo simplifica pero a su vez puede convertirse

en un volumen ingestionable de tareas Para evitar esto se

pueden definir categoriacuteas a las que pertenece una peticioacuten y

realizar posteriormente filtrados de peticiones en las vistas seguacuten

este y otros paraacutemetros

No obstante no todo iba a ser color de rosa tiene una serie de

limitaciones como el sistema un tanto engorroso de enlazar

peticiones o el hecho de que una vez creada una peticioacuten su

nombre y descripcioacuten no se pueden modificar tan solo ir

antildeadiendo nuevas descripciones

En este punto nos encontraacutebamos en una difiacutecil decisioacuten puesto

que ambas herramientas nos gustaban cubriacutean lo necesario pero

se trataban de herramientas muy distintas en concepcioacuten Para

facilitar la decisioacuten realizamos un cuadro comparando las

caracteriacutesticas y priorizaacutendolas seguacuten nuestro intereacutes El

resultado fue el siguiente

Prioridad Caracteriacutestica Redmine TeamWork

9 Integracioacuten con

LDAP Si Si

8 Integracioacuten con

Subversion Si Si

8 Traducido al espantildeol

Si No

7 Importacioacuten desde

Project No Si

7 Exportacioacuten a

Project No Si

7 Centros de coste Posible mediante los campos

personalizados

Si

7 Wikis de proyectos Si

7 Personalizacioacuten

extensioacuten Si Si

6 Gestioacuten de vacaciones

No Vacaciones a nivel de

empresa

6 Vida de la herramienta

Indeterminado al ser una

herramienta open source

Algo maacutes seguro

porque hay una empresa detraacutes

5 Facilidad de configuracioacuten

Si

5 Usuarios multi-

perfil Si Si

4 Acceso restringido a usuarios

Si Si

3 Sencillez de manejo

Si

2 Seguimiento de

incidencias Si Si

1 Asignacioacuten de tareas

Si Si

1 Imputacioacuten a tareas asignadas

Si Si

Tras una difiacutecil reflexioacuten puesto que ambas se encontraban muy

parejas decidimos decantarnos por Redmine primando la

sencillez y rapidez Existiacutea la posibilidad de que terceros la

empleasen y veiacuteamos que Redmine permitiacutea una mayor facilidad

en su manejo y resultaba maacutes intuitiva de cara a aprender a

utilizarla Posteriormente tras su uso hemos detectado algunos

inconvenientes importantes como la imposibilidad de asignar una

peticioacuten a maacutes de un usuario pero es que no hay herramienta

perfecta

Bibliografiacutea

httpwwwnavegapolisnetcontentview5649

httpwwwsimpleprojectmanagementcomhomehtml

httpwwwweb-based-softwarecomproject

httpenwikipediaorgwikiComparison_of_issue_tracking_syste

ms

httpenwikipediaorgwikiList_of_project_management_softwa

re

httpwwwpmdigestcomsoftware

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Rauacutel Sanz de Acedo

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo Lexers parsers JavaCC (y II)

Texto En este artiacuteculo vamos a utilizar JavaCC como herramienta para

implementar un moacutedulo que resuelva la casuiacutestica de la

impresioacuten de las diversas paacuteginas de un fichero Esto es lo que se

refleja en esta imagen

Para ello en el artiacuteculo anterior definimos esta gramaacutetica a la que

asociamos unas acciones semaacutenticas

inicio --gt inicializacionVariables

listaElementos

procesarDatos

listaElementos --gt elemento

restoListaElementos

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

restoListaElementos --gt SEPARADOR

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

listaElementos

|

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

restoListaElementos2 --gt GUION ENTERO

num2 = valor(ENTERO)

Si (num2 gt maxPaginas)

or (num2==0) ent error

|

JavaCC es una herramienta que dado un fichero de extensioacuten

jj que describe la gramaacutetica y sus acciones semaacutenticas

asociadas genera los ficheros java que la implementan

Estos ficheros java pueden luego obviamente incluirse en

aqueacutellos que conforman el resto de nuestra aplicacioacuten

JavaCC es una herramienta gratuita que puede descargarse

desde aquiacute Existe tambieacuten un plugin para Eclipse Y asimismo

existe una task de Ant para JavaCC

Vamos pues a construir nuestro parser

Lo denominaremos parserImprimePaginasCC y por lo tanto

vamos a editar el fichero parserImprimePaginasCCjj

Indicaremos coacutemo se traducen los tokens y las producciones a

formato JavaCC

TOKEN

ltENTERO([0-9])+gt

| ltGUION -gt

| ltSEPARADOR([ ])+ | ([ ])gt

Los tokens se describen praacutecticamente como lo indicamos en la

gramaacutetica

void inicio()throws elementoFueraLimitesException

resultado = new Vector()

num1 = -1

num2 = -1

inicializaFlags()

listaElementos()

void listaElementos()throws elementoFueraLimitesExcept

ion

elemento() restoListaElementos()

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

restoListaElementos2()

void restoListaElementos()throws elementoFueraLimitesE

xception

ltSEPARADORgt

insertaElemento(num1 num2)

num1 = -1

num2 = -1

listaElementos()

|

insertaElemento(num1 num2)

num1 = -1

num2 = -1

void restoListaElementos2()throws elementoFueraLimites

Exception

ltGUIONgtltENTEROgt

num2 = IntegervalueOf(tokenimage)intValue()

if ((num2gtmaximo)|| (num2 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num2))

|

Las producciones son algo diferentes lo que era

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

ahora es

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(IntegertoS

tring(num1))

restoListaElementos2()

El no terminal elemento se describe como void elemento() y

ademaacutes le hemos asociado una excepcioacuten para controlar el hecho

de que un usuario coloque 0 o un nuacutemero mayor que el

permitido Lo que en la parte derecha es ENTERO se indica

como ltENTEROgt y la invocacioacuten de restoListaElementos2

es restoListaElementos2()

Las acciones semaacutenticas

num1 = valor(ENTERO)

Si (num1 gt maxPaginas) or (num1==0) ent error

se indican en JavaCC asiacute

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

El valor del token actual es accesible a traveacutes de tokenimage

Si deseamos tener coacutedigo Java adicional fuera de las

producciones lo podemos antildeadir de esta forma con la palabra

reservada JAVACODE

JAVACODE void insertaElemento(int num1 int num2)

int aux i iFlag

if ((num1 = -1) ampamp (num2 = -1))

if (num1gtnum2)

aux = num1

num1 = num2

num2 = aux

for (i = num1

i lt= num2

i++)

iFlag = i-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(i))

flags[iFlag] = true

else if (num1 = -1)

iFlag = num1-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num1))

flags[iFlag] = true

else if (num2 = -1)

iFlag = num2-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num2))

flags[iFlag] = true

JAVACODE void inicializaFlags()

int i

flags = new boolean [maximo]

for (i = 0

iltmaximo

i++)

flags[i] = false

Ademaacutes podemos inicializar el parser e instanciarlo de esta

forma

PARSER_BEGIN(parserImprimePaginasCC)

import javaio

import javautilVector

public class parserImprimePaginasCC

public static int maximo

public static Vector resultado

private static int num1 num2

private static boolean flags[]

public static void main(String[]args)throws Exceptio

n

Reader r = new StringReader(args[0])

parserImprimePaginasCC p

= new parserImprimePaginasCC(r)

try

pmaximo = 50

Systemoutprintln(Maacuteximo +pmaximo)

pinicio()

Systemoutprintln(OKn)

for (int j = 0

jltpresultadosize()

j++)

Systemoutprint(presultadoelementAt(j)+

)

Systemoutprintln()

catch (ParseException e)

Systemoutprintln(Error de sintaxis)

catch (TokenMgrError e)

Systemoutprintln(Error leacutexico)

catch (elementoFueraLimitesException e)

Systemoutprintln(egetMessage())

PARSER_END(parserImprimePaginasCC)

En este caso tomaremos la entrada de lo que el usuario

introduzca por teclado pero se pueden tomar los datos a traveacutes

de ficheros o pasarlos como variables

Se hace referencia a una excepcioacuten que hemos definido asiacute en un

fichero llamado elementoFueraLimitesExceptionjava

public class elementoFueraLimitesException extends Exc

eption

Constructor

public elementoFueraLimitesException()

super()

public elementoFueraLimitesException(String msg)

super(msg)

Una vez salvado el fichero parserImprimePaginasCCjj podemos

generar la documentacioacuten de la gramaacutetica en formato HTML de

esta forma

Nota en la ejecucioacuten de estos ejemplos se ha utilizado la liacutenea de comandos de

Windows pero se podriacutea haber hecho a traveacutes de cualquier sistema que soporte

el lenguaje Java

gtjjdoc parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Documentation

Generator Version 014)

(type jjdoc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Grammar documentation generated successfully in

parserImprimePaginasCChtml

Se genera el fichero parserImprimePaginasCChtmlcuyo

contenido es

BNF for parserImprimePaginasCCjj NON-TERMINALS

inicio = listaElementos

listaElementos = elemento restoListaElementos

elemento = ltENTEROgt restoListaElementos2

restoListaElementos = ltSEPARADORgt listaElementos

|

restoListaElementos2 = ltGUIONgt ltENTEROgt

|

insertaElemento = java code

inicializaFlags = java code

Nota BNF es el tipo de notacioacuten que estamos utilizando a lo largo de estos

artiacuteculos

Compilamos el parser

gtjavacc parser ImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

File TokenMgrErrorjava does not exist Will create

one

File ParseExceptionjava does not exist Will

create one

File Tokenjava does not exist Will create one

File SimpleCharStreamjava does not exist Will

create one

Parser generated successfully

y entonces se generan estos ficheros

ParseExceptionjava --gt

Excepcioacuten generada por el parser cuando un error es encontrado

parserImprimePaginasCCjava --gt La

traduccioacuten de nuestro fichero jj a java

parserImprimePaginasCCConstantsjava --gt Los

valores de los tokens

parserImprimePaginasCCTokenManagerjava --gt El

analizador leacutexico

SimpleCharStreamjava --gt

Contiene coacutedigo para leer caracteres de cualquier

implementacioacuten de javaioInputStream o javaioReader

Tokenjava --gt

Definicioacuten de la clase Token

TokenMgrErrorjava --gt

Diversos errores que puede producir el lexer

Ahora los compilamos y antildeadimos el fichero

elementoFueraLimitesExceptionjava en dicha compilacioacuten

javac java

Y vamos a ejecutar el parser suponiendo que el maacuteximo nuacutemero

de paacuteginas a impmir es 50 (como hemos indicado con pmaximo =

50)

Lo que obtenemos como salida es la lista de paacuteginas a imprimir o

un mensaje de error

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

OK

2 5 6 7 8

java -classpath laboratorioParsers

parserImprimePaginasCC 28-3046

Num paginas 50

OK

28 29 30 4 6

java -classpath laboratorioParsers

parserImprimePaginasCC 43-51

Num paginas 50

Introdujo un numero superior al maximo51

java -classpath laboratorioParsers

parserImprimePaginasCC 43--51

Num paginas 50

Error de sintaxisEncountered - at line 1

column 4

Was expecting

ltENTEROgt

iquestQueacute pasa si algo ha ido mal iquestPodemos depurar el parser de

alguna forma

Por supuesto podemos compilar el parser asiacute para obtener una

traza de la ejecucioacuten

javacc -DEBUG_PARSER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Consumed token lt- at line 1 column 4gt

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

En la traza vemos coacutemo el parser va invocando la diferentes

producciones

Podemos tambieacuten depurar el lexer

javacc -DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Returning the ltEOFgt token

OK

2 5 6 7 8

O combinar ambas trazas

javacc -DEBUG_PARSER -

DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Consumed token lt- at line 1 column 4gt

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Returning the ltEOFgt token

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

Conclusioacuten los generadores de parsers son herramientas

potentes que sirven para resolver problemas de una manera

bdquolimpia‟ y elegante Puede que su nombre retraiga a los

desarrolladores (ldquoiquestPara queacute quiero un generador de

compiladoresrdquo) pero es una opcioacuten a tener en cuenta

Ficheros para descargar

Referencias

- Generating Parsers with JavaCC

- The JavaCC FAQ

Si quieres enviar alguacuten comentario o sugerir temas a tratar en otros artiacuteculos escribe a

curtasun[simboloArroba]ceines

Categor

iacuteas

CES OpenSouceJava

Tema Desarrollo

Autor Carlos Urtasun

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo XSL-FO (Parte 1)

Texto XSL-FO Introduccioacuten El estaacutendar XSL tal y como estaacute definido actualmente se

divide en dos grandes partes -XSLT transformacioacuten de un documento de entrada XML en

alguacuten tipo de documento de salida ya sea XML HTML PDF etc -Formatting Objects (FO) definen la visualizacioacuten final del

resultado de la transformacioacuten Son una implementacioacuten especiacutefica de un determinado XSLT y aplicados a un

fichero XML nos proporcionan otro fichero con la informacioacuten de eacuteste renderizada a alguacuten formato de visualizacioacuten impresa Eacutesta es quizaacute la principal diferencia entre un FO y

otros XSLT ambos transforman un documento XML en otro documento XML pero FO estaacute pensado para generar

directamente una renderizacioacuten

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 13: Cesnavarra 2008-boletín 7

Referencias 1 - Performance improvement techniques in String and StringBuffer

2 - Ropes an Alternative to Strings

3 - Ropes Theory and practice

4 - Ropes For Java

Categoriacute

as

CES OpenSouceJava

Tema Desarrollo

Autor Miguel Bacaicoa

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo Herramientas de gestioacuten de proyectos Open Source

Texto Haraacute unos meses nos vimos en la tesitura de buscar una

herramienta de gestioacuten de proyectos para el Centro Java y Open

Source

Hasta el momento habiacuteamos estado trabajando con dotproject

un sistema con bastante capacidad y funcionalidades No

obstante resultoacute ser una herramienta algo pesada en la creacioacuten

de planificaciones y tediosa en el mantenimiento diacutea a diacutea

Buscaacutebamos principalmente una herramienta que no solo

gestionase la parte de planificacioacuten sino tambieacuten la parte de

seguimiento posterior para mantener el control sobre el proyecto

Ademaacutes deseaacutebamos un entorno colaborativo multi-usuario y

participativo entre nosotros y cualquier colaborador externo Lo

cual maacutes que un requerimiento funcional supone un cambio

cultural la parte maacutes compleja

Todo esto en principio decantaba la decisioacuten por una opcioacuten on-

line en detrimento de una de escritorio No obstante decidimos

valorar tambieacuten las de escritorio no fuera que por empecinarnos

en unas funcionalidades descartaacutesemos otras importantes

A continuacioacuten describireacute brevemente algunas de las

herramientas valoradas

De escritorio

GanttProject

Aplicacioacuten de escritorio muy extendida y uacutetil que permite

planificar tareas y recursos sobre un diagrama Gantt Se trata de

una herramienta similar a MS Project pero maacutes sencilla lo cual

puede ser en algunos casos una ventaja Otra caracteriacutestica

interesante es que funciona tanto en Linux como en Windows y

tiene diversos formatos de exportacioacuten e importacioacuten

Planner

Aplicacioacuten de escritorio bastante extendida y algo maacutes completa

a la anterior (a pesat de tener menos opciones de importacioacuten y

exportacioacuten) pero muy similar En este caso estaacute desarrollada

para Linux aunque existe versioacuten beta para Windows

Open Workbench

Aplicacioacuten de escritorio muy completa Al igual que las anteriores

permite gestionar tareas y recursos sobre un diagrama Gantt

aunque tambieacuten permite otros diagramas como Pert camino

criacutetico y funcionalidades maacutes avanzadas Se vanagloria de ser

incluso mejor que MS Project

TaskJuggler

Se trata de una herramienta de escritorio disponible tanto para

Windows como para Linux un tanto peculiar Genera una serie de

informes bastante completos a partir de un fichero de texto El

interfaz es bastante amigable pero el hecho de andar editando

un fichero de texto que contiene la planificacioacuten no resulta muy

coacutemodo

OpenProj

Otro programa de escritorio sustitutivo de MS Project y de

apariencia muy similar Tiene versiones para Linux Unix Mac y

Windows y es compatible con ficheros MS Project y con todas sus

funcionalidades No obstante parece no estar indicado para

proyectos de grupo En estos casos te ofrecen una versioacuten on-

line (Project-ON-Demand) bajo demanda y de pago bastante

interesante

Entorno web

TeamSCOPE

Team Software for Collaborative Project Environments es una

herramienta web de colaboracioacuten Desarrollado para funcionar

sobre Debian fue creado por una universidad pero parece

haberse quedado bastante anticuado

NetOffice

Herramienta web basada en PHP sobre MySQL para gestionar proyectos tareas registros de tiempos incidenciaserrores

diagramas de Gantt (aunque un poco escondidos) etc similar pero algo maacutes agradable que dotProject Tiene ciertos tintes de herramienta de colaboracioacuten en grupo (groupware)

phpCollab

Herramienta web basada en PHP que ha sufrido un desarrollo

intermitente por lo que parece Sirve tanto para la gestioacuten de

tareas como para el seguimiento de incidenciaserrores Tiene un

aspecto similar a netOffice lo cual hace pensar que uno de los

dos proyectos deriva del otro Quizaacutes por esa razoacuten de elegir una

de las dos sea maacutes recomendable netOffice

Achievo

Herramienta web PHP sobre MySQL para la gestioacuten de proyectos

tareas recursos registro de tiempos agenda generacioacuten de

informes etc Bastante completo ademaacutes parece incluir seccioacuten

presupuestaria

XPlanner

Herramienta web Java sobre MySQL para la gestioacuten de proyectos

mediante XP y Scrum No obstante parece estancada en una

versioacuten beta desde el 2006

PPTS

Project Planning and Tracking System (PPTS) es una herramienta

Web para la gestioacuten de proyectos con metodologiacuteas XP y Scrum

al igual que la anterior Esta desarrollada en PHP contra MySQL

aunque parece tambieacuten largo tiempo abandonada

XPWeb

Al igual que las anteriores es una herramienta web para la

gestioacuten de proyectos aacutegiles incluyendo gestioacuten de tareas

calendarios informes etc Tambieacuten parece estancada

Trac

Herramienta web ampliamente extendida en la comunidad open

source para fundamentalmente el seguimiento proyectos Se

centra en la gestioacuten de incidencias y errores aunque tiene

funcionalidades antildeadidas interesantes como Wiki e integracioacuten

con Subversioacuten Hay que resentildear que se trata de una

herramienta mono-proyecto y que no cuenta con Gantt

OpenProject

Herramienta web de gestioacuten de proyectos muy completa Posee

todo lo necesario tanto que uno llega a perderse No obstante

pueden configurarse los moacutedulos que desean usarse y descartar

aquellos que no son necesarios calendario gestioacuten de tareas

seguimiento de incidencias control presupuestario Wiki foros

integracioacuten con ERPs diagramas Gantt y una larga lista de

funcionalidades

Tutos

The Ultimate Team Organization Software o eso pretende Se

trata de una herramienta web LAMP con muchas funcionalidades

calendario y agenda seguimiento de incidencias y errores

gestioacuten de tareas diagramas Gantt gestioacuten documental gestioacuten

de correos facturas e informes Interesante pero austera de

aspecto y un poco anticuada

Project Dune

Herramienta web desarrollada en Java contra MySQL que pareciacutea

prometer bastante Tiene lo necesario gestioacuten de tareas

recursos incidencias gestioacuten documental registro de tiempos

informes calendario y agenda RSS inspeccioacuten de coacutedigo

importacioacuten de MS Project etc No obstante en su evaluacioacuten

dejoacute bastante que desear resultando poco praacutectica y manejable

Collabtive

Se trata de una herramienta web LAMP para la gestioacuten de

proyectos Seguacuten se indica en la web cubre la gestioacuten de tareas e

incidencias gestioacuten documental y mensajeriacutea Es muy limpia

sencilla y aacutegil No obstante no parece contar con diagramas

Gantt ni con registro de tiempos o informes de estado En la

praacutectica parece quedarse un poco justa pero prometedora

Mindquarry

Herramienta web desarrollada en Java que pretende ser la

alternativa open source de soluciones propietarias como

Basecamp o Sharepoint para la gestioacuten de proyectos y grupos de

trabajo de forma colaborativa Tiene una versioacuten open source

para descarga y otra como servicio bajo demanda La pega es

que la empresa parece haber dejado de desarrollar su actividad

ClockingIT

Se trata de una herramienta Web desarrollada en Ruby como

servicio bajo demanda Permite una gestioacuten de tareas agenda

siguiendo el estaacutendar iCal seguimiento de tiempos generacioacuten

de informes notificaciones RSS foros Chat y Wiki repositorio

de ficheros etc

LibreSource

Se trata de una plataforma web colaborativa para el desarrollo de

software lo que se suele denominar forja y funcionalidades de

groupware archivado y publicacioacuten web Es open source y

altamente ajustable Permite alojar muacuteltiples proyectos varios

grupos de usuarios etc Estaacute desarrollada en J2EE e incorpora

entre otras cosas Wiki integracioacuten con Subversion zonas de

descarga gestioacuten documental mensajeriacutea instantaacutenea con

Jabber gestioacuten de incidencias etc No fue evaluada al ser

descubierta posteriormente a la implantacioacuten de la herramienta

elegida pero parece una buena alternativa

Aunque existen infinidad maacutes de entre todas nos decantamos

por dos que valoramos maacutes en profundidad

TeamWork

Se trata de una herramienta web desarrollada en Java por unos

Italianos Entre sus funcionalidades cabe destacar la gestioacuten de

proyectos y tareas con diversos diagramas de Gantt muy

logrados gestioacuten de incidencias gestioacuten documental entorno

colaborativo tipo groupware control de costes registros de

tiempos etc

Es muy completo raacutepido de respuesta y posee caracteriacutesticas

muy interesantes como una interesante y uacutetil navegacioacuten

contextual entre tareas del proyecto perfiles de usuario seguacuten

proyecto importacioacuten de planificaciones desde MS Project o

asociacioacuten entre incidencias y tareas

Cuenta con wizards para la configuracioacuten de la herramienta de

forma raacutepida y sencilla incluyendo la posibilidad de generar

plantillas para aplicar metodologiacuteas aacutegiles (Scrum)

El registro de horas por tarea para un desarrollador se realiza de

forma muy coacutemoda y raacutepida desde una simple vista facilitando

la participacioacuten del mismo

Se trataba de una aplicacioacuten muy completa quizaacutes demasiado

un poco compleja de entender en un comienzo pero con muchas

posibilidades

No obstante teniacutea alguna que otra pega aunque es open source

posee una licencia de pago para su uso que en cualquier caso era

muy pequentildea Tiene una versioacuten de evaluacioacuten de 30 diacuteas para

quien desee probarla antes de decidir Por otro lado no distingue

proyectos existe una tarea padre que agrupa toda la

planificacioacuten asociada tampoco cuenta con Wiki y no gestiona las

vacaciones del personal

La otra herramienta valorada maacutes en profundidad fue

Redmine

Se trata de otra herramienta web en este caso desarrollada en

Ruby on Rails con una gran cantidad de funcionalidades que la

acerca bastante a una forja pero sin tener la complejidad de la

misma Entre sus caracteriacutesticas cabe destacar la gestioacuten de

tareas incidencias diagramas de Gantt calendario de

actividades noticias foros wikis gestioacuten de ficheros y

documentos integracioacuten con Subversioacuten control de tiempos

generacioacuten de informes etc todo esto por proyecto Por

similitudes del interfaz y funcionalidades parece estar basado en

Trac pero con un lavado de cara y de coacutedigo importante ademaacutes

de ser multi-proyecto

Al igual que la anterior tambieacuten poseiacutea una serie de

caracteriacutesticas que la haciacutea diferente como la posible navegacioacuten

anoacutenima de lectura si asiacute se desea sobre los proyectos alojados

Interesante desde el punto de vista de filosofiacutea open source

Posibilidad de definir un perfil distinto por usuario seguacuten el

proyecto en el que participa

Tambieacuten cuenta con sindicacioacuten de RSS para las secciones de

noticias tareas incidencias etc y exportacioacuten a ficheros de texto

y HTML desde la Wiki los informes generados e incluso el

diagrama de Gantt

A parte se trata de un interfaz muy limpio intuitivo sencillo de

usar y rapidiacutesimo

La configuracioacuten de la herramienta resulta asiacute mismo muy

sencilla con un par de clics puedes empezar a funcionar

Cada proyecto puede configurarse con los moacutedulos que desees

que tenga ademaacutes de poder definir campos personalizados por

proyecto y tarea para permitir una mayor adaptacioacuten

Cabe destacar que para esta herramienta existe un uacutenico

concepto denominado peticioacuten que puede ser de tres tipos

tareas soporte o incidencia De esta forma todo se gestiona de

igual forma lo cual lo simplifica pero a su vez puede convertirse

en un volumen ingestionable de tareas Para evitar esto se

pueden definir categoriacuteas a las que pertenece una peticioacuten y

realizar posteriormente filtrados de peticiones en las vistas seguacuten

este y otros paraacutemetros

No obstante no todo iba a ser color de rosa tiene una serie de

limitaciones como el sistema un tanto engorroso de enlazar

peticiones o el hecho de que una vez creada una peticioacuten su

nombre y descripcioacuten no se pueden modificar tan solo ir

antildeadiendo nuevas descripciones

En este punto nos encontraacutebamos en una difiacutecil decisioacuten puesto

que ambas herramientas nos gustaban cubriacutean lo necesario pero

se trataban de herramientas muy distintas en concepcioacuten Para

facilitar la decisioacuten realizamos un cuadro comparando las

caracteriacutesticas y priorizaacutendolas seguacuten nuestro intereacutes El

resultado fue el siguiente

Prioridad Caracteriacutestica Redmine TeamWork

9 Integracioacuten con

LDAP Si Si

8 Integracioacuten con

Subversion Si Si

8 Traducido al espantildeol

Si No

7 Importacioacuten desde

Project No Si

7 Exportacioacuten a

Project No Si

7 Centros de coste Posible mediante los campos

personalizados

Si

7 Wikis de proyectos Si

7 Personalizacioacuten

extensioacuten Si Si

6 Gestioacuten de vacaciones

No Vacaciones a nivel de

empresa

6 Vida de la herramienta

Indeterminado al ser una

herramienta open source

Algo maacutes seguro

porque hay una empresa detraacutes

5 Facilidad de configuracioacuten

Si

5 Usuarios multi-

perfil Si Si

4 Acceso restringido a usuarios

Si Si

3 Sencillez de manejo

Si

2 Seguimiento de

incidencias Si Si

1 Asignacioacuten de tareas

Si Si

1 Imputacioacuten a tareas asignadas

Si Si

Tras una difiacutecil reflexioacuten puesto que ambas se encontraban muy

parejas decidimos decantarnos por Redmine primando la

sencillez y rapidez Existiacutea la posibilidad de que terceros la

empleasen y veiacuteamos que Redmine permitiacutea una mayor facilidad

en su manejo y resultaba maacutes intuitiva de cara a aprender a

utilizarla Posteriormente tras su uso hemos detectado algunos

inconvenientes importantes como la imposibilidad de asignar una

peticioacuten a maacutes de un usuario pero es que no hay herramienta

perfecta

Bibliografiacutea

httpwwwnavegapolisnetcontentview5649

httpwwwsimpleprojectmanagementcomhomehtml

httpwwwweb-based-softwarecomproject

httpenwikipediaorgwikiComparison_of_issue_tracking_syste

ms

httpenwikipediaorgwikiList_of_project_management_softwa

re

httpwwwpmdigestcomsoftware

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Rauacutel Sanz de Acedo

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo Lexers parsers JavaCC (y II)

Texto En este artiacuteculo vamos a utilizar JavaCC como herramienta para

implementar un moacutedulo que resuelva la casuiacutestica de la

impresioacuten de las diversas paacuteginas de un fichero Esto es lo que se

refleja en esta imagen

Para ello en el artiacuteculo anterior definimos esta gramaacutetica a la que

asociamos unas acciones semaacutenticas

inicio --gt inicializacionVariables

listaElementos

procesarDatos

listaElementos --gt elemento

restoListaElementos

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

restoListaElementos --gt SEPARADOR

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

listaElementos

|

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

restoListaElementos2 --gt GUION ENTERO

num2 = valor(ENTERO)

Si (num2 gt maxPaginas)

or (num2==0) ent error

|

JavaCC es una herramienta que dado un fichero de extensioacuten

jj que describe la gramaacutetica y sus acciones semaacutenticas

asociadas genera los ficheros java que la implementan

Estos ficheros java pueden luego obviamente incluirse en

aqueacutellos que conforman el resto de nuestra aplicacioacuten

JavaCC es una herramienta gratuita que puede descargarse

desde aquiacute Existe tambieacuten un plugin para Eclipse Y asimismo

existe una task de Ant para JavaCC

Vamos pues a construir nuestro parser

Lo denominaremos parserImprimePaginasCC y por lo tanto

vamos a editar el fichero parserImprimePaginasCCjj

Indicaremos coacutemo se traducen los tokens y las producciones a

formato JavaCC

TOKEN

ltENTERO([0-9])+gt

| ltGUION -gt

| ltSEPARADOR([ ])+ | ([ ])gt

Los tokens se describen praacutecticamente como lo indicamos en la

gramaacutetica

void inicio()throws elementoFueraLimitesException

resultado = new Vector()

num1 = -1

num2 = -1

inicializaFlags()

listaElementos()

void listaElementos()throws elementoFueraLimitesExcept

ion

elemento() restoListaElementos()

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

restoListaElementos2()

void restoListaElementos()throws elementoFueraLimitesE

xception

ltSEPARADORgt

insertaElemento(num1 num2)

num1 = -1

num2 = -1

listaElementos()

|

insertaElemento(num1 num2)

num1 = -1

num2 = -1

void restoListaElementos2()throws elementoFueraLimites

Exception

ltGUIONgtltENTEROgt

num2 = IntegervalueOf(tokenimage)intValue()

if ((num2gtmaximo)|| (num2 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num2))

|

Las producciones son algo diferentes lo que era

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

ahora es

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(IntegertoS

tring(num1))

restoListaElementos2()

El no terminal elemento se describe como void elemento() y

ademaacutes le hemos asociado una excepcioacuten para controlar el hecho

de que un usuario coloque 0 o un nuacutemero mayor que el

permitido Lo que en la parte derecha es ENTERO se indica

como ltENTEROgt y la invocacioacuten de restoListaElementos2

es restoListaElementos2()

Las acciones semaacutenticas

num1 = valor(ENTERO)

Si (num1 gt maxPaginas) or (num1==0) ent error

se indican en JavaCC asiacute

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

El valor del token actual es accesible a traveacutes de tokenimage

Si deseamos tener coacutedigo Java adicional fuera de las

producciones lo podemos antildeadir de esta forma con la palabra

reservada JAVACODE

JAVACODE void insertaElemento(int num1 int num2)

int aux i iFlag

if ((num1 = -1) ampamp (num2 = -1))

if (num1gtnum2)

aux = num1

num1 = num2

num2 = aux

for (i = num1

i lt= num2

i++)

iFlag = i-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(i))

flags[iFlag] = true

else if (num1 = -1)

iFlag = num1-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num1))

flags[iFlag] = true

else if (num2 = -1)

iFlag = num2-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num2))

flags[iFlag] = true

JAVACODE void inicializaFlags()

int i

flags = new boolean [maximo]

for (i = 0

iltmaximo

i++)

flags[i] = false

Ademaacutes podemos inicializar el parser e instanciarlo de esta

forma

PARSER_BEGIN(parserImprimePaginasCC)

import javaio

import javautilVector

public class parserImprimePaginasCC

public static int maximo

public static Vector resultado

private static int num1 num2

private static boolean flags[]

public static void main(String[]args)throws Exceptio

n

Reader r = new StringReader(args[0])

parserImprimePaginasCC p

= new parserImprimePaginasCC(r)

try

pmaximo = 50

Systemoutprintln(Maacuteximo +pmaximo)

pinicio()

Systemoutprintln(OKn)

for (int j = 0

jltpresultadosize()

j++)

Systemoutprint(presultadoelementAt(j)+

)

Systemoutprintln()

catch (ParseException e)

Systemoutprintln(Error de sintaxis)

catch (TokenMgrError e)

Systemoutprintln(Error leacutexico)

catch (elementoFueraLimitesException e)

Systemoutprintln(egetMessage())

PARSER_END(parserImprimePaginasCC)

En este caso tomaremos la entrada de lo que el usuario

introduzca por teclado pero se pueden tomar los datos a traveacutes

de ficheros o pasarlos como variables

Se hace referencia a una excepcioacuten que hemos definido asiacute en un

fichero llamado elementoFueraLimitesExceptionjava

public class elementoFueraLimitesException extends Exc

eption

Constructor

public elementoFueraLimitesException()

super()

public elementoFueraLimitesException(String msg)

super(msg)

Una vez salvado el fichero parserImprimePaginasCCjj podemos

generar la documentacioacuten de la gramaacutetica en formato HTML de

esta forma

Nota en la ejecucioacuten de estos ejemplos se ha utilizado la liacutenea de comandos de

Windows pero se podriacutea haber hecho a traveacutes de cualquier sistema que soporte

el lenguaje Java

gtjjdoc parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Documentation

Generator Version 014)

(type jjdoc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Grammar documentation generated successfully in

parserImprimePaginasCChtml

Se genera el fichero parserImprimePaginasCChtmlcuyo

contenido es

BNF for parserImprimePaginasCCjj NON-TERMINALS

inicio = listaElementos

listaElementos = elemento restoListaElementos

elemento = ltENTEROgt restoListaElementos2

restoListaElementos = ltSEPARADORgt listaElementos

|

restoListaElementos2 = ltGUIONgt ltENTEROgt

|

insertaElemento = java code

inicializaFlags = java code

Nota BNF es el tipo de notacioacuten que estamos utilizando a lo largo de estos

artiacuteculos

Compilamos el parser

gtjavacc parser ImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

File TokenMgrErrorjava does not exist Will create

one

File ParseExceptionjava does not exist Will

create one

File Tokenjava does not exist Will create one

File SimpleCharStreamjava does not exist Will

create one

Parser generated successfully

y entonces se generan estos ficheros

ParseExceptionjava --gt

Excepcioacuten generada por el parser cuando un error es encontrado

parserImprimePaginasCCjava --gt La

traduccioacuten de nuestro fichero jj a java

parserImprimePaginasCCConstantsjava --gt Los

valores de los tokens

parserImprimePaginasCCTokenManagerjava --gt El

analizador leacutexico

SimpleCharStreamjava --gt

Contiene coacutedigo para leer caracteres de cualquier

implementacioacuten de javaioInputStream o javaioReader

Tokenjava --gt

Definicioacuten de la clase Token

TokenMgrErrorjava --gt

Diversos errores que puede producir el lexer

Ahora los compilamos y antildeadimos el fichero

elementoFueraLimitesExceptionjava en dicha compilacioacuten

javac java

Y vamos a ejecutar el parser suponiendo que el maacuteximo nuacutemero

de paacuteginas a impmir es 50 (como hemos indicado con pmaximo =

50)

Lo que obtenemos como salida es la lista de paacuteginas a imprimir o

un mensaje de error

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

OK

2 5 6 7 8

java -classpath laboratorioParsers

parserImprimePaginasCC 28-3046

Num paginas 50

OK

28 29 30 4 6

java -classpath laboratorioParsers

parserImprimePaginasCC 43-51

Num paginas 50

Introdujo un numero superior al maximo51

java -classpath laboratorioParsers

parserImprimePaginasCC 43--51

Num paginas 50

Error de sintaxisEncountered - at line 1

column 4

Was expecting

ltENTEROgt

iquestQueacute pasa si algo ha ido mal iquestPodemos depurar el parser de

alguna forma

Por supuesto podemos compilar el parser asiacute para obtener una

traza de la ejecucioacuten

javacc -DEBUG_PARSER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Consumed token lt- at line 1 column 4gt

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

En la traza vemos coacutemo el parser va invocando la diferentes

producciones

Podemos tambieacuten depurar el lexer

javacc -DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Returning the ltEOFgt token

OK

2 5 6 7 8

O combinar ambas trazas

javacc -DEBUG_PARSER -

DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Consumed token lt- at line 1 column 4gt

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Returning the ltEOFgt token

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

Conclusioacuten los generadores de parsers son herramientas

potentes que sirven para resolver problemas de una manera

bdquolimpia‟ y elegante Puede que su nombre retraiga a los

desarrolladores (ldquoiquestPara queacute quiero un generador de

compiladoresrdquo) pero es una opcioacuten a tener en cuenta

Ficheros para descargar

Referencias

- Generating Parsers with JavaCC

- The JavaCC FAQ

Si quieres enviar alguacuten comentario o sugerir temas a tratar en otros artiacuteculos escribe a

curtasun[simboloArroba]ceines

Categor

iacuteas

CES OpenSouceJava

Tema Desarrollo

Autor Carlos Urtasun

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo XSL-FO (Parte 1)

Texto XSL-FO Introduccioacuten El estaacutendar XSL tal y como estaacute definido actualmente se

divide en dos grandes partes -XSLT transformacioacuten de un documento de entrada XML en

alguacuten tipo de documento de salida ya sea XML HTML PDF etc -Formatting Objects (FO) definen la visualizacioacuten final del

resultado de la transformacioacuten Son una implementacioacuten especiacutefica de un determinado XSLT y aplicados a un

fichero XML nos proporcionan otro fichero con la informacioacuten de eacuteste renderizada a alguacuten formato de visualizacioacuten impresa Eacutesta es quizaacute la principal diferencia entre un FO y

otros XSLT ambos transforman un documento XML en otro documento XML pero FO estaacute pensado para generar

directamente una renderizacioacuten

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 14: Cesnavarra 2008-boletín 7

herramienta de gestioacuten de proyectos para el Centro Java y Open

Source

Hasta el momento habiacuteamos estado trabajando con dotproject

un sistema con bastante capacidad y funcionalidades No

obstante resultoacute ser una herramienta algo pesada en la creacioacuten

de planificaciones y tediosa en el mantenimiento diacutea a diacutea

Buscaacutebamos principalmente una herramienta que no solo

gestionase la parte de planificacioacuten sino tambieacuten la parte de

seguimiento posterior para mantener el control sobre el proyecto

Ademaacutes deseaacutebamos un entorno colaborativo multi-usuario y

participativo entre nosotros y cualquier colaborador externo Lo

cual maacutes que un requerimiento funcional supone un cambio

cultural la parte maacutes compleja

Todo esto en principio decantaba la decisioacuten por una opcioacuten on-

line en detrimento de una de escritorio No obstante decidimos

valorar tambieacuten las de escritorio no fuera que por empecinarnos

en unas funcionalidades descartaacutesemos otras importantes

A continuacioacuten describireacute brevemente algunas de las

herramientas valoradas

De escritorio

GanttProject

Aplicacioacuten de escritorio muy extendida y uacutetil que permite

planificar tareas y recursos sobre un diagrama Gantt Se trata de

una herramienta similar a MS Project pero maacutes sencilla lo cual

puede ser en algunos casos una ventaja Otra caracteriacutestica

interesante es que funciona tanto en Linux como en Windows y

tiene diversos formatos de exportacioacuten e importacioacuten

Planner

Aplicacioacuten de escritorio bastante extendida y algo maacutes completa

a la anterior (a pesat de tener menos opciones de importacioacuten y

exportacioacuten) pero muy similar En este caso estaacute desarrollada

para Linux aunque existe versioacuten beta para Windows

Open Workbench

Aplicacioacuten de escritorio muy completa Al igual que las anteriores

permite gestionar tareas y recursos sobre un diagrama Gantt

aunque tambieacuten permite otros diagramas como Pert camino

criacutetico y funcionalidades maacutes avanzadas Se vanagloria de ser

incluso mejor que MS Project

TaskJuggler

Se trata de una herramienta de escritorio disponible tanto para

Windows como para Linux un tanto peculiar Genera una serie de

informes bastante completos a partir de un fichero de texto El

interfaz es bastante amigable pero el hecho de andar editando

un fichero de texto que contiene la planificacioacuten no resulta muy

coacutemodo

OpenProj

Otro programa de escritorio sustitutivo de MS Project y de

apariencia muy similar Tiene versiones para Linux Unix Mac y

Windows y es compatible con ficheros MS Project y con todas sus

funcionalidades No obstante parece no estar indicado para

proyectos de grupo En estos casos te ofrecen una versioacuten on-

line (Project-ON-Demand) bajo demanda y de pago bastante

interesante

Entorno web

TeamSCOPE

Team Software for Collaborative Project Environments es una

herramienta web de colaboracioacuten Desarrollado para funcionar

sobre Debian fue creado por una universidad pero parece

haberse quedado bastante anticuado

NetOffice

Herramienta web basada en PHP sobre MySQL para gestionar proyectos tareas registros de tiempos incidenciaserrores

diagramas de Gantt (aunque un poco escondidos) etc similar pero algo maacutes agradable que dotProject Tiene ciertos tintes de herramienta de colaboracioacuten en grupo (groupware)

phpCollab

Herramienta web basada en PHP que ha sufrido un desarrollo

intermitente por lo que parece Sirve tanto para la gestioacuten de

tareas como para el seguimiento de incidenciaserrores Tiene un

aspecto similar a netOffice lo cual hace pensar que uno de los

dos proyectos deriva del otro Quizaacutes por esa razoacuten de elegir una

de las dos sea maacutes recomendable netOffice

Achievo

Herramienta web PHP sobre MySQL para la gestioacuten de proyectos

tareas recursos registro de tiempos agenda generacioacuten de

informes etc Bastante completo ademaacutes parece incluir seccioacuten

presupuestaria

XPlanner

Herramienta web Java sobre MySQL para la gestioacuten de proyectos

mediante XP y Scrum No obstante parece estancada en una

versioacuten beta desde el 2006

PPTS

Project Planning and Tracking System (PPTS) es una herramienta

Web para la gestioacuten de proyectos con metodologiacuteas XP y Scrum

al igual que la anterior Esta desarrollada en PHP contra MySQL

aunque parece tambieacuten largo tiempo abandonada

XPWeb

Al igual que las anteriores es una herramienta web para la

gestioacuten de proyectos aacutegiles incluyendo gestioacuten de tareas

calendarios informes etc Tambieacuten parece estancada

Trac

Herramienta web ampliamente extendida en la comunidad open

source para fundamentalmente el seguimiento proyectos Se

centra en la gestioacuten de incidencias y errores aunque tiene

funcionalidades antildeadidas interesantes como Wiki e integracioacuten

con Subversioacuten Hay que resentildear que se trata de una

herramienta mono-proyecto y que no cuenta con Gantt

OpenProject

Herramienta web de gestioacuten de proyectos muy completa Posee

todo lo necesario tanto que uno llega a perderse No obstante

pueden configurarse los moacutedulos que desean usarse y descartar

aquellos que no son necesarios calendario gestioacuten de tareas

seguimiento de incidencias control presupuestario Wiki foros

integracioacuten con ERPs diagramas Gantt y una larga lista de

funcionalidades

Tutos

The Ultimate Team Organization Software o eso pretende Se

trata de una herramienta web LAMP con muchas funcionalidades

calendario y agenda seguimiento de incidencias y errores

gestioacuten de tareas diagramas Gantt gestioacuten documental gestioacuten

de correos facturas e informes Interesante pero austera de

aspecto y un poco anticuada

Project Dune

Herramienta web desarrollada en Java contra MySQL que pareciacutea

prometer bastante Tiene lo necesario gestioacuten de tareas

recursos incidencias gestioacuten documental registro de tiempos

informes calendario y agenda RSS inspeccioacuten de coacutedigo

importacioacuten de MS Project etc No obstante en su evaluacioacuten

dejoacute bastante que desear resultando poco praacutectica y manejable

Collabtive

Se trata de una herramienta web LAMP para la gestioacuten de

proyectos Seguacuten se indica en la web cubre la gestioacuten de tareas e

incidencias gestioacuten documental y mensajeriacutea Es muy limpia

sencilla y aacutegil No obstante no parece contar con diagramas

Gantt ni con registro de tiempos o informes de estado En la

praacutectica parece quedarse un poco justa pero prometedora

Mindquarry

Herramienta web desarrollada en Java que pretende ser la

alternativa open source de soluciones propietarias como

Basecamp o Sharepoint para la gestioacuten de proyectos y grupos de

trabajo de forma colaborativa Tiene una versioacuten open source

para descarga y otra como servicio bajo demanda La pega es

que la empresa parece haber dejado de desarrollar su actividad

ClockingIT

Se trata de una herramienta Web desarrollada en Ruby como

servicio bajo demanda Permite una gestioacuten de tareas agenda

siguiendo el estaacutendar iCal seguimiento de tiempos generacioacuten

de informes notificaciones RSS foros Chat y Wiki repositorio

de ficheros etc

LibreSource

Se trata de una plataforma web colaborativa para el desarrollo de

software lo que se suele denominar forja y funcionalidades de

groupware archivado y publicacioacuten web Es open source y

altamente ajustable Permite alojar muacuteltiples proyectos varios

grupos de usuarios etc Estaacute desarrollada en J2EE e incorpora

entre otras cosas Wiki integracioacuten con Subversion zonas de

descarga gestioacuten documental mensajeriacutea instantaacutenea con

Jabber gestioacuten de incidencias etc No fue evaluada al ser

descubierta posteriormente a la implantacioacuten de la herramienta

elegida pero parece una buena alternativa

Aunque existen infinidad maacutes de entre todas nos decantamos

por dos que valoramos maacutes en profundidad

TeamWork

Se trata de una herramienta web desarrollada en Java por unos

Italianos Entre sus funcionalidades cabe destacar la gestioacuten de

proyectos y tareas con diversos diagramas de Gantt muy

logrados gestioacuten de incidencias gestioacuten documental entorno

colaborativo tipo groupware control de costes registros de

tiempos etc

Es muy completo raacutepido de respuesta y posee caracteriacutesticas

muy interesantes como una interesante y uacutetil navegacioacuten

contextual entre tareas del proyecto perfiles de usuario seguacuten

proyecto importacioacuten de planificaciones desde MS Project o

asociacioacuten entre incidencias y tareas

Cuenta con wizards para la configuracioacuten de la herramienta de

forma raacutepida y sencilla incluyendo la posibilidad de generar

plantillas para aplicar metodologiacuteas aacutegiles (Scrum)

El registro de horas por tarea para un desarrollador se realiza de

forma muy coacutemoda y raacutepida desde una simple vista facilitando

la participacioacuten del mismo

Se trataba de una aplicacioacuten muy completa quizaacutes demasiado

un poco compleja de entender en un comienzo pero con muchas

posibilidades

No obstante teniacutea alguna que otra pega aunque es open source

posee una licencia de pago para su uso que en cualquier caso era

muy pequentildea Tiene una versioacuten de evaluacioacuten de 30 diacuteas para

quien desee probarla antes de decidir Por otro lado no distingue

proyectos existe una tarea padre que agrupa toda la

planificacioacuten asociada tampoco cuenta con Wiki y no gestiona las

vacaciones del personal

La otra herramienta valorada maacutes en profundidad fue

Redmine

Se trata de otra herramienta web en este caso desarrollada en

Ruby on Rails con una gran cantidad de funcionalidades que la

acerca bastante a una forja pero sin tener la complejidad de la

misma Entre sus caracteriacutesticas cabe destacar la gestioacuten de

tareas incidencias diagramas de Gantt calendario de

actividades noticias foros wikis gestioacuten de ficheros y

documentos integracioacuten con Subversioacuten control de tiempos

generacioacuten de informes etc todo esto por proyecto Por

similitudes del interfaz y funcionalidades parece estar basado en

Trac pero con un lavado de cara y de coacutedigo importante ademaacutes

de ser multi-proyecto

Al igual que la anterior tambieacuten poseiacutea una serie de

caracteriacutesticas que la haciacutea diferente como la posible navegacioacuten

anoacutenima de lectura si asiacute se desea sobre los proyectos alojados

Interesante desde el punto de vista de filosofiacutea open source

Posibilidad de definir un perfil distinto por usuario seguacuten el

proyecto en el que participa

Tambieacuten cuenta con sindicacioacuten de RSS para las secciones de

noticias tareas incidencias etc y exportacioacuten a ficheros de texto

y HTML desde la Wiki los informes generados e incluso el

diagrama de Gantt

A parte se trata de un interfaz muy limpio intuitivo sencillo de

usar y rapidiacutesimo

La configuracioacuten de la herramienta resulta asiacute mismo muy

sencilla con un par de clics puedes empezar a funcionar

Cada proyecto puede configurarse con los moacutedulos que desees

que tenga ademaacutes de poder definir campos personalizados por

proyecto y tarea para permitir una mayor adaptacioacuten

Cabe destacar que para esta herramienta existe un uacutenico

concepto denominado peticioacuten que puede ser de tres tipos

tareas soporte o incidencia De esta forma todo se gestiona de

igual forma lo cual lo simplifica pero a su vez puede convertirse

en un volumen ingestionable de tareas Para evitar esto se

pueden definir categoriacuteas a las que pertenece una peticioacuten y

realizar posteriormente filtrados de peticiones en las vistas seguacuten

este y otros paraacutemetros

No obstante no todo iba a ser color de rosa tiene una serie de

limitaciones como el sistema un tanto engorroso de enlazar

peticiones o el hecho de que una vez creada una peticioacuten su

nombre y descripcioacuten no se pueden modificar tan solo ir

antildeadiendo nuevas descripciones

En este punto nos encontraacutebamos en una difiacutecil decisioacuten puesto

que ambas herramientas nos gustaban cubriacutean lo necesario pero

se trataban de herramientas muy distintas en concepcioacuten Para

facilitar la decisioacuten realizamos un cuadro comparando las

caracteriacutesticas y priorizaacutendolas seguacuten nuestro intereacutes El

resultado fue el siguiente

Prioridad Caracteriacutestica Redmine TeamWork

9 Integracioacuten con

LDAP Si Si

8 Integracioacuten con

Subversion Si Si

8 Traducido al espantildeol

Si No

7 Importacioacuten desde

Project No Si

7 Exportacioacuten a

Project No Si

7 Centros de coste Posible mediante los campos

personalizados

Si

7 Wikis de proyectos Si

7 Personalizacioacuten

extensioacuten Si Si

6 Gestioacuten de vacaciones

No Vacaciones a nivel de

empresa

6 Vida de la herramienta

Indeterminado al ser una

herramienta open source

Algo maacutes seguro

porque hay una empresa detraacutes

5 Facilidad de configuracioacuten

Si

5 Usuarios multi-

perfil Si Si

4 Acceso restringido a usuarios

Si Si

3 Sencillez de manejo

Si

2 Seguimiento de

incidencias Si Si

1 Asignacioacuten de tareas

Si Si

1 Imputacioacuten a tareas asignadas

Si Si

Tras una difiacutecil reflexioacuten puesto que ambas se encontraban muy

parejas decidimos decantarnos por Redmine primando la

sencillez y rapidez Existiacutea la posibilidad de que terceros la

empleasen y veiacuteamos que Redmine permitiacutea una mayor facilidad

en su manejo y resultaba maacutes intuitiva de cara a aprender a

utilizarla Posteriormente tras su uso hemos detectado algunos

inconvenientes importantes como la imposibilidad de asignar una

peticioacuten a maacutes de un usuario pero es que no hay herramienta

perfecta

Bibliografiacutea

httpwwwnavegapolisnetcontentview5649

httpwwwsimpleprojectmanagementcomhomehtml

httpwwwweb-based-softwarecomproject

httpenwikipediaorgwikiComparison_of_issue_tracking_syste

ms

httpenwikipediaorgwikiList_of_project_management_softwa

re

httpwwwpmdigestcomsoftware

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Rauacutel Sanz de Acedo

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo Lexers parsers JavaCC (y II)

Texto En este artiacuteculo vamos a utilizar JavaCC como herramienta para

implementar un moacutedulo que resuelva la casuiacutestica de la

impresioacuten de las diversas paacuteginas de un fichero Esto es lo que se

refleja en esta imagen

Para ello en el artiacuteculo anterior definimos esta gramaacutetica a la que

asociamos unas acciones semaacutenticas

inicio --gt inicializacionVariables

listaElementos

procesarDatos

listaElementos --gt elemento

restoListaElementos

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

restoListaElementos --gt SEPARADOR

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

listaElementos

|

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

restoListaElementos2 --gt GUION ENTERO

num2 = valor(ENTERO)

Si (num2 gt maxPaginas)

or (num2==0) ent error

|

JavaCC es una herramienta que dado un fichero de extensioacuten

jj que describe la gramaacutetica y sus acciones semaacutenticas

asociadas genera los ficheros java que la implementan

Estos ficheros java pueden luego obviamente incluirse en

aqueacutellos que conforman el resto de nuestra aplicacioacuten

JavaCC es una herramienta gratuita que puede descargarse

desde aquiacute Existe tambieacuten un plugin para Eclipse Y asimismo

existe una task de Ant para JavaCC

Vamos pues a construir nuestro parser

Lo denominaremos parserImprimePaginasCC y por lo tanto

vamos a editar el fichero parserImprimePaginasCCjj

Indicaremos coacutemo se traducen los tokens y las producciones a

formato JavaCC

TOKEN

ltENTERO([0-9])+gt

| ltGUION -gt

| ltSEPARADOR([ ])+ | ([ ])gt

Los tokens se describen praacutecticamente como lo indicamos en la

gramaacutetica

void inicio()throws elementoFueraLimitesException

resultado = new Vector()

num1 = -1

num2 = -1

inicializaFlags()

listaElementos()

void listaElementos()throws elementoFueraLimitesExcept

ion

elemento() restoListaElementos()

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

restoListaElementos2()

void restoListaElementos()throws elementoFueraLimitesE

xception

ltSEPARADORgt

insertaElemento(num1 num2)

num1 = -1

num2 = -1

listaElementos()

|

insertaElemento(num1 num2)

num1 = -1

num2 = -1

void restoListaElementos2()throws elementoFueraLimites

Exception

ltGUIONgtltENTEROgt

num2 = IntegervalueOf(tokenimage)intValue()

if ((num2gtmaximo)|| (num2 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num2))

|

Las producciones son algo diferentes lo que era

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

ahora es

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(IntegertoS

tring(num1))

restoListaElementos2()

El no terminal elemento se describe como void elemento() y

ademaacutes le hemos asociado una excepcioacuten para controlar el hecho

de que un usuario coloque 0 o un nuacutemero mayor que el

permitido Lo que en la parte derecha es ENTERO se indica

como ltENTEROgt y la invocacioacuten de restoListaElementos2

es restoListaElementos2()

Las acciones semaacutenticas

num1 = valor(ENTERO)

Si (num1 gt maxPaginas) or (num1==0) ent error

se indican en JavaCC asiacute

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

El valor del token actual es accesible a traveacutes de tokenimage

Si deseamos tener coacutedigo Java adicional fuera de las

producciones lo podemos antildeadir de esta forma con la palabra

reservada JAVACODE

JAVACODE void insertaElemento(int num1 int num2)

int aux i iFlag

if ((num1 = -1) ampamp (num2 = -1))

if (num1gtnum2)

aux = num1

num1 = num2

num2 = aux

for (i = num1

i lt= num2

i++)

iFlag = i-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(i))

flags[iFlag] = true

else if (num1 = -1)

iFlag = num1-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num1))

flags[iFlag] = true

else if (num2 = -1)

iFlag = num2-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num2))

flags[iFlag] = true

JAVACODE void inicializaFlags()

int i

flags = new boolean [maximo]

for (i = 0

iltmaximo

i++)

flags[i] = false

Ademaacutes podemos inicializar el parser e instanciarlo de esta

forma

PARSER_BEGIN(parserImprimePaginasCC)

import javaio

import javautilVector

public class parserImprimePaginasCC

public static int maximo

public static Vector resultado

private static int num1 num2

private static boolean flags[]

public static void main(String[]args)throws Exceptio

n

Reader r = new StringReader(args[0])

parserImprimePaginasCC p

= new parserImprimePaginasCC(r)

try

pmaximo = 50

Systemoutprintln(Maacuteximo +pmaximo)

pinicio()

Systemoutprintln(OKn)

for (int j = 0

jltpresultadosize()

j++)

Systemoutprint(presultadoelementAt(j)+

)

Systemoutprintln()

catch (ParseException e)

Systemoutprintln(Error de sintaxis)

catch (TokenMgrError e)

Systemoutprintln(Error leacutexico)

catch (elementoFueraLimitesException e)

Systemoutprintln(egetMessage())

PARSER_END(parserImprimePaginasCC)

En este caso tomaremos la entrada de lo que el usuario

introduzca por teclado pero se pueden tomar los datos a traveacutes

de ficheros o pasarlos como variables

Se hace referencia a una excepcioacuten que hemos definido asiacute en un

fichero llamado elementoFueraLimitesExceptionjava

public class elementoFueraLimitesException extends Exc

eption

Constructor

public elementoFueraLimitesException()

super()

public elementoFueraLimitesException(String msg)

super(msg)

Una vez salvado el fichero parserImprimePaginasCCjj podemos

generar la documentacioacuten de la gramaacutetica en formato HTML de

esta forma

Nota en la ejecucioacuten de estos ejemplos se ha utilizado la liacutenea de comandos de

Windows pero se podriacutea haber hecho a traveacutes de cualquier sistema que soporte

el lenguaje Java

gtjjdoc parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Documentation

Generator Version 014)

(type jjdoc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Grammar documentation generated successfully in

parserImprimePaginasCChtml

Se genera el fichero parserImprimePaginasCChtmlcuyo

contenido es

BNF for parserImprimePaginasCCjj NON-TERMINALS

inicio = listaElementos

listaElementos = elemento restoListaElementos

elemento = ltENTEROgt restoListaElementos2

restoListaElementos = ltSEPARADORgt listaElementos

|

restoListaElementos2 = ltGUIONgt ltENTEROgt

|

insertaElemento = java code

inicializaFlags = java code

Nota BNF es el tipo de notacioacuten que estamos utilizando a lo largo de estos

artiacuteculos

Compilamos el parser

gtjavacc parser ImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

File TokenMgrErrorjava does not exist Will create

one

File ParseExceptionjava does not exist Will

create one

File Tokenjava does not exist Will create one

File SimpleCharStreamjava does not exist Will

create one

Parser generated successfully

y entonces se generan estos ficheros

ParseExceptionjava --gt

Excepcioacuten generada por el parser cuando un error es encontrado

parserImprimePaginasCCjava --gt La

traduccioacuten de nuestro fichero jj a java

parserImprimePaginasCCConstantsjava --gt Los

valores de los tokens

parserImprimePaginasCCTokenManagerjava --gt El

analizador leacutexico

SimpleCharStreamjava --gt

Contiene coacutedigo para leer caracteres de cualquier

implementacioacuten de javaioInputStream o javaioReader

Tokenjava --gt

Definicioacuten de la clase Token

TokenMgrErrorjava --gt

Diversos errores que puede producir el lexer

Ahora los compilamos y antildeadimos el fichero

elementoFueraLimitesExceptionjava en dicha compilacioacuten

javac java

Y vamos a ejecutar el parser suponiendo que el maacuteximo nuacutemero

de paacuteginas a impmir es 50 (como hemos indicado con pmaximo =

50)

Lo que obtenemos como salida es la lista de paacuteginas a imprimir o

un mensaje de error

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

OK

2 5 6 7 8

java -classpath laboratorioParsers

parserImprimePaginasCC 28-3046

Num paginas 50

OK

28 29 30 4 6

java -classpath laboratorioParsers

parserImprimePaginasCC 43-51

Num paginas 50

Introdujo un numero superior al maximo51

java -classpath laboratorioParsers

parserImprimePaginasCC 43--51

Num paginas 50

Error de sintaxisEncountered - at line 1

column 4

Was expecting

ltENTEROgt

iquestQueacute pasa si algo ha ido mal iquestPodemos depurar el parser de

alguna forma

Por supuesto podemos compilar el parser asiacute para obtener una

traza de la ejecucioacuten

javacc -DEBUG_PARSER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Consumed token lt- at line 1 column 4gt

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

En la traza vemos coacutemo el parser va invocando la diferentes

producciones

Podemos tambieacuten depurar el lexer

javacc -DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Returning the ltEOFgt token

OK

2 5 6 7 8

O combinar ambas trazas

javacc -DEBUG_PARSER -

DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Consumed token lt- at line 1 column 4gt

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Returning the ltEOFgt token

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

Conclusioacuten los generadores de parsers son herramientas

potentes que sirven para resolver problemas de una manera

bdquolimpia‟ y elegante Puede que su nombre retraiga a los

desarrolladores (ldquoiquestPara queacute quiero un generador de

compiladoresrdquo) pero es una opcioacuten a tener en cuenta

Ficheros para descargar

Referencias

- Generating Parsers with JavaCC

- The JavaCC FAQ

Si quieres enviar alguacuten comentario o sugerir temas a tratar en otros artiacuteculos escribe a

curtasun[simboloArroba]ceines

Categor

iacuteas

CES OpenSouceJava

Tema Desarrollo

Autor Carlos Urtasun

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo XSL-FO (Parte 1)

Texto XSL-FO Introduccioacuten El estaacutendar XSL tal y como estaacute definido actualmente se

divide en dos grandes partes -XSLT transformacioacuten de un documento de entrada XML en

alguacuten tipo de documento de salida ya sea XML HTML PDF etc -Formatting Objects (FO) definen la visualizacioacuten final del

resultado de la transformacioacuten Son una implementacioacuten especiacutefica de un determinado XSLT y aplicados a un

fichero XML nos proporcionan otro fichero con la informacioacuten de eacuteste renderizada a alguacuten formato de visualizacioacuten impresa Eacutesta es quizaacute la principal diferencia entre un FO y

otros XSLT ambos transforman un documento XML en otro documento XML pero FO estaacute pensado para generar

directamente una renderizacioacuten

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 15: Cesnavarra 2008-boletín 7

Planner

Aplicacioacuten de escritorio bastante extendida y algo maacutes completa

a la anterior (a pesat de tener menos opciones de importacioacuten y

exportacioacuten) pero muy similar En este caso estaacute desarrollada

para Linux aunque existe versioacuten beta para Windows

Open Workbench

Aplicacioacuten de escritorio muy completa Al igual que las anteriores

permite gestionar tareas y recursos sobre un diagrama Gantt

aunque tambieacuten permite otros diagramas como Pert camino

criacutetico y funcionalidades maacutes avanzadas Se vanagloria de ser

incluso mejor que MS Project

TaskJuggler

Se trata de una herramienta de escritorio disponible tanto para

Windows como para Linux un tanto peculiar Genera una serie de

informes bastante completos a partir de un fichero de texto El

interfaz es bastante amigable pero el hecho de andar editando

un fichero de texto que contiene la planificacioacuten no resulta muy

coacutemodo

OpenProj

Otro programa de escritorio sustitutivo de MS Project y de

apariencia muy similar Tiene versiones para Linux Unix Mac y

Windows y es compatible con ficheros MS Project y con todas sus

funcionalidades No obstante parece no estar indicado para

proyectos de grupo En estos casos te ofrecen una versioacuten on-

line (Project-ON-Demand) bajo demanda y de pago bastante

interesante

Entorno web

TeamSCOPE

Team Software for Collaborative Project Environments es una

herramienta web de colaboracioacuten Desarrollado para funcionar

sobre Debian fue creado por una universidad pero parece

haberse quedado bastante anticuado

NetOffice

Herramienta web basada en PHP sobre MySQL para gestionar proyectos tareas registros de tiempos incidenciaserrores

diagramas de Gantt (aunque un poco escondidos) etc similar pero algo maacutes agradable que dotProject Tiene ciertos tintes de herramienta de colaboracioacuten en grupo (groupware)

phpCollab

Herramienta web basada en PHP que ha sufrido un desarrollo

intermitente por lo que parece Sirve tanto para la gestioacuten de

tareas como para el seguimiento de incidenciaserrores Tiene un

aspecto similar a netOffice lo cual hace pensar que uno de los

dos proyectos deriva del otro Quizaacutes por esa razoacuten de elegir una

de las dos sea maacutes recomendable netOffice

Achievo

Herramienta web PHP sobre MySQL para la gestioacuten de proyectos

tareas recursos registro de tiempos agenda generacioacuten de

informes etc Bastante completo ademaacutes parece incluir seccioacuten

presupuestaria

XPlanner

Herramienta web Java sobre MySQL para la gestioacuten de proyectos

mediante XP y Scrum No obstante parece estancada en una

versioacuten beta desde el 2006

PPTS

Project Planning and Tracking System (PPTS) es una herramienta

Web para la gestioacuten de proyectos con metodologiacuteas XP y Scrum

al igual que la anterior Esta desarrollada en PHP contra MySQL

aunque parece tambieacuten largo tiempo abandonada

XPWeb

Al igual que las anteriores es una herramienta web para la

gestioacuten de proyectos aacutegiles incluyendo gestioacuten de tareas

calendarios informes etc Tambieacuten parece estancada

Trac

Herramienta web ampliamente extendida en la comunidad open

source para fundamentalmente el seguimiento proyectos Se

centra en la gestioacuten de incidencias y errores aunque tiene

funcionalidades antildeadidas interesantes como Wiki e integracioacuten

con Subversioacuten Hay que resentildear que se trata de una

herramienta mono-proyecto y que no cuenta con Gantt

OpenProject

Herramienta web de gestioacuten de proyectos muy completa Posee

todo lo necesario tanto que uno llega a perderse No obstante

pueden configurarse los moacutedulos que desean usarse y descartar

aquellos que no son necesarios calendario gestioacuten de tareas

seguimiento de incidencias control presupuestario Wiki foros

integracioacuten con ERPs diagramas Gantt y una larga lista de

funcionalidades

Tutos

The Ultimate Team Organization Software o eso pretende Se

trata de una herramienta web LAMP con muchas funcionalidades

calendario y agenda seguimiento de incidencias y errores

gestioacuten de tareas diagramas Gantt gestioacuten documental gestioacuten

de correos facturas e informes Interesante pero austera de

aspecto y un poco anticuada

Project Dune

Herramienta web desarrollada en Java contra MySQL que pareciacutea

prometer bastante Tiene lo necesario gestioacuten de tareas

recursos incidencias gestioacuten documental registro de tiempos

informes calendario y agenda RSS inspeccioacuten de coacutedigo

importacioacuten de MS Project etc No obstante en su evaluacioacuten

dejoacute bastante que desear resultando poco praacutectica y manejable

Collabtive

Se trata de una herramienta web LAMP para la gestioacuten de

proyectos Seguacuten se indica en la web cubre la gestioacuten de tareas e

incidencias gestioacuten documental y mensajeriacutea Es muy limpia

sencilla y aacutegil No obstante no parece contar con diagramas

Gantt ni con registro de tiempos o informes de estado En la

praacutectica parece quedarse un poco justa pero prometedora

Mindquarry

Herramienta web desarrollada en Java que pretende ser la

alternativa open source de soluciones propietarias como

Basecamp o Sharepoint para la gestioacuten de proyectos y grupos de

trabajo de forma colaborativa Tiene una versioacuten open source

para descarga y otra como servicio bajo demanda La pega es

que la empresa parece haber dejado de desarrollar su actividad

ClockingIT

Se trata de una herramienta Web desarrollada en Ruby como

servicio bajo demanda Permite una gestioacuten de tareas agenda

siguiendo el estaacutendar iCal seguimiento de tiempos generacioacuten

de informes notificaciones RSS foros Chat y Wiki repositorio

de ficheros etc

LibreSource

Se trata de una plataforma web colaborativa para el desarrollo de

software lo que se suele denominar forja y funcionalidades de

groupware archivado y publicacioacuten web Es open source y

altamente ajustable Permite alojar muacuteltiples proyectos varios

grupos de usuarios etc Estaacute desarrollada en J2EE e incorpora

entre otras cosas Wiki integracioacuten con Subversion zonas de

descarga gestioacuten documental mensajeriacutea instantaacutenea con

Jabber gestioacuten de incidencias etc No fue evaluada al ser

descubierta posteriormente a la implantacioacuten de la herramienta

elegida pero parece una buena alternativa

Aunque existen infinidad maacutes de entre todas nos decantamos

por dos que valoramos maacutes en profundidad

TeamWork

Se trata de una herramienta web desarrollada en Java por unos

Italianos Entre sus funcionalidades cabe destacar la gestioacuten de

proyectos y tareas con diversos diagramas de Gantt muy

logrados gestioacuten de incidencias gestioacuten documental entorno

colaborativo tipo groupware control de costes registros de

tiempos etc

Es muy completo raacutepido de respuesta y posee caracteriacutesticas

muy interesantes como una interesante y uacutetil navegacioacuten

contextual entre tareas del proyecto perfiles de usuario seguacuten

proyecto importacioacuten de planificaciones desde MS Project o

asociacioacuten entre incidencias y tareas

Cuenta con wizards para la configuracioacuten de la herramienta de

forma raacutepida y sencilla incluyendo la posibilidad de generar

plantillas para aplicar metodologiacuteas aacutegiles (Scrum)

El registro de horas por tarea para un desarrollador se realiza de

forma muy coacutemoda y raacutepida desde una simple vista facilitando

la participacioacuten del mismo

Se trataba de una aplicacioacuten muy completa quizaacutes demasiado

un poco compleja de entender en un comienzo pero con muchas

posibilidades

No obstante teniacutea alguna que otra pega aunque es open source

posee una licencia de pago para su uso que en cualquier caso era

muy pequentildea Tiene una versioacuten de evaluacioacuten de 30 diacuteas para

quien desee probarla antes de decidir Por otro lado no distingue

proyectos existe una tarea padre que agrupa toda la

planificacioacuten asociada tampoco cuenta con Wiki y no gestiona las

vacaciones del personal

La otra herramienta valorada maacutes en profundidad fue

Redmine

Se trata de otra herramienta web en este caso desarrollada en

Ruby on Rails con una gran cantidad de funcionalidades que la

acerca bastante a una forja pero sin tener la complejidad de la

misma Entre sus caracteriacutesticas cabe destacar la gestioacuten de

tareas incidencias diagramas de Gantt calendario de

actividades noticias foros wikis gestioacuten de ficheros y

documentos integracioacuten con Subversioacuten control de tiempos

generacioacuten de informes etc todo esto por proyecto Por

similitudes del interfaz y funcionalidades parece estar basado en

Trac pero con un lavado de cara y de coacutedigo importante ademaacutes

de ser multi-proyecto

Al igual que la anterior tambieacuten poseiacutea una serie de

caracteriacutesticas que la haciacutea diferente como la posible navegacioacuten

anoacutenima de lectura si asiacute se desea sobre los proyectos alojados

Interesante desde el punto de vista de filosofiacutea open source

Posibilidad de definir un perfil distinto por usuario seguacuten el

proyecto en el que participa

Tambieacuten cuenta con sindicacioacuten de RSS para las secciones de

noticias tareas incidencias etc y exportacioacuten a ficheros de texto

y HTML desde la Wiki los informes generados e incluso el

diagrama de Gantt

A parte se trata de un interfaz muy limpio intuitivo sencillo de

usar y rapidiacutesimo

La configuracioacuten de la herramienta resulta asiacute mismo muy

sencilla con un par de clics puedes empezar a funcionar

Cada proyecto puede configurarse con los moacutedulos que desees

que tenga ademaacutes de poder definir campos personalizados por

proyecto y tarea para permitir una mayor adaptacioacuten

Cabe destacar que para esta herramienta existe un uacutenico

concepto denominado peticioacuten que puede ser de tres tipos

tareas soporte o incidencia De esta forma todo se gestiona de

igual forma lo cual lo simplifica pero a su vez puede convertirse

en un volumen ingestionable de tareas Para evitar esto se

pueden definir categoriacuteas a las que pertenece una peticioacuten y

realizar posteriormente filtrados de peticiones en las vistas seguacuten

este y otros paraacutemetros

No obstante no todo iba a ser color de rosa tiene una serie de

limitaciones como el sistema un tanto engorroso de enlazar

peticiones o el hecho de que una vez creada una peticioacuten su

nombre y descripcioacuten no se pueden modificar tan solo ir

antildeadiendo nuevas descripciones

En este punto nos encontraacutebamos en una difiacutecil decisioacuten puesto

que ambas herramientas nos gustaban cubriacutean lo necesario pero

se trataban de herramientas muy distintas en concepcioacuten Para

facilitar la decisioacuten realizamos un cuadro comparando las

caracteriacutesticas y priorizaacutendolas seguacuten nuestro intereacutes El

resultado fue el siguiente

Prioridad Caracteriacutestica Redmine TeamWork

9 Integracioacuten con

LDAP Si Si

8 Integracioacuten con

Subversion Si Si

8 Traducido al espantildeol

Si No

7 Importacioacuten desde

Project No Si

7 Exportacioacuten a

Project No Si

7 Centros de coste Posible mediante los campos

personalizados

Si

7 Wikis de proyectos Si

7 Personalizacioacuten

extensioacuten Si Si

6 Gestioacuten de vacaciones

No Vacaciones a nivel de

empresa

6 Vida de la herramienta

Indeterminado al ser una

herramienta open source

Algo maacutes seguro

porque hay una empresa detraacutes

5 Facilidad de configuracioacuten

Si

5 Usuarios multi-

perfil Si Si

4 Acceso restringido a usuarios

Si Si

3 Sencillez de manejo

Si

2 Seguimiento de

incidencias Si Si

1 Asignacioacuten de tareas

Si Si

1 Imputacioacuten a tareas asignadas

Si Si

Tras una difiacutecil reflexioacuten puesto que ambas se encontraban muy

parejas decidimos decantarnos por Redmine primando la

sencillez y rapidez Existiacutea la posibilidad de que terceros la

empleasen y veiacuteamos que Redmine permitiacutea una mayor facilidad

en su manejo y resultaba maacutes intuitiva de cara a aprender a

utilizarla Posteriormente tras su uso hemos detectado algunos

inconvenientes importantes como la imposibilidad de asignar una

peticioacuten a maacutes de un usuario pero es que no hay herramienta

perfecta

Bibliografiacutea

httpwwwnavegapolisnetcontentview5649

httpwwwsimpleprojectmanagementcomhomehtml

httpwwwweb-based-softwarecomproject

httpenwikipediaorgwikiComparison_of_issue_tracking_syste

ms

httpenwikipediaorgwikiList_of_project_management_softwa

re

httpwwwpmdigestcomsoftware

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Rauacutel Sanz de Acedo

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo Lexers parsers JavaCC (y II)

Texto En este artiacuteculo vamos a utilizar JavaCC como herramienta para

implementar un moacutedulo que resuelva la casuiacutestica de la

impresioacuten de las diversas paacuteginas de un fichero Esto es lo que se

refleja en esta imagen

Para ello en el artiacuteculo anterior definimos esta gramaacutetica a la que

asociamos unas acciones semaacutenticas

inicio --gt inicializacionVariables

listaElementos

procesarDatos

listaElementos --gt elemento

restoListaElementos

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

restoListaElementos --gt SEPARADOR

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

listaElementos

|

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

restoListaElementos2 --gt GUION ENTERO

num2 = valor(ENTERO)

Si (num2 gt maxPaginas)

or (num2==0) ent error

|

JavaCC es una herramienta que dado un fichero de extensioacuten

jj que describe la gramaacutetica y sus acciones semaacutenticas

asociadas genera los ficheros java que la implementan

Estos ficheros java pueden luego obviamente incluirse en

aqueacutellos que conforman el resto de nuestra aplicacioacuten

JavaCC es una herramienta gratuita que puede descargarse

desde aquiacute Existe tambieacuten un plugin para Eclipse Y asimismo

existe una task de Ant para JavaCC

Vamos pues a construir nuestro parser

Lo denominaremos parserImprimePaginasCC y por lo tanto

vamos a editar el fichero parserImprimePaginasCCjj

Indicaremos coacutemo se traducen los tokens y las producciones a

formato JavaCC

TOKEN

ltENTERO([0-9])+gt

| ltGUION -gt

| ltSEPARADOR([ ])+ | ([ ])gt

Los tokens se describen praacutecticamente como lo indicamos en la

gramaacutetica

void inicio()throws elementoFueraLimitesException

resultado = new Vector()

num1 = -1

num2 = -1

inicializaFlags()

listaElementos()

void listaElementos()throws elementoFueraLimitesExcept

ion

elemento() restoListaElementos()

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

restoListaElementos2()

void restoListaElementos()throws elementoFueraLimitesE

xception

ltSEPARADORgt

insertaElemento(num1 num2)

num1 = -1

num2 = -1

listaElementos()

|

insertaElemento(num1 num2)

num1 = -1

num2 = -1

void restoListaElementos2()throws elementoFueraLimites

Exception

ltGUIONgtltENTEROgt

num2 = IntegervalueOf(tokenimage)intValue()

if ((num2gtmaximo)|| (num2 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num2))

|

Las producciones son algo diferentes lo que era

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

ahora es

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(IntegertoS

tring(num1))

restoListaElementos2()

El no terminal elemento se describe como void elemento() y

ademaacutes le hemos asociado una excepcioacuten para controlar el hecho

de que un usuario coloque 0 o un nuacutemero mayor que el

permitido Lo que en la parte derecha es ENTERO se indica

como ltENTEROgt y la invocacioacuten de restoListaElementos2

es restoListaElementos2()

Las acciones semaacutenticas

num1 = valor(ENTERO)

Si (num1 gt maxPaginas) or (num1==0) ent error

se indican en JavaCC asiacute

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

El valor del token actual es accesible a traveacutes de tokenimage

Si deseamos tener coacutedigo Java adicional fuera de las

producciones lo podemos antildeadir de esta forma con la palabra

reservada JAVACODE

JAVACODE void insertaElemento(int num1 int num2)

int aux i iFlag

if ((num1 = -1) ampamp (num2 = -1))

if (num1gtnum2)

aux = num1

num1 = num2

num2 = aux

for (i = num1

i lt= num2

i++)

iFlag = i-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(i))

flags[iFlag] = true

else if (num1 = -1)

iFlag = num1-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num1))

flags[iFlag] = true

else if (num2 = -1)

iFlag = num2-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num2))

flags[iFlag] = true

JAVACODE void inicializaFlags()

int i

flags = new boolean [maximo]

for (i = 0

iltmaximo

i++)

flags[i] = false

Ademaacutes podemos inicializar el parser e instanciarlo de esta

forma

PARSER_BEGIN(parserImprimePaginasCC)

import javaio

import javautilVector

public class parserImprimePaginasCC

public static int maximo

public static Vector resultado

private static int num1 num2

private static boolean flags[]

public static void main(String[]args)throws Exceptio

n

Reader r = new StringReader(args[0])

parserImprimePaginasCC p

= new parserImprimePaginasCC(r)

try

pmaximo = 50

Systemoutprintln(Maacuteximo +pmaximo)

pinicio()

Systemoutprintln(OKn)

for (int j = 0

jltpresultadosize()

j++)

Systemoutprint(presultadoelementAt(j)+

)

Systemoutprintln()

catch (ParseException e)

Systemoutprintln(Error de sintaxis)

catch (TokenMgrError e)

Systemoutprintln(Error leacutexico)

catch (elementoFueraLimitesException e)

Systemoutprintln(egetMessage())

PARSER_END(parserImprimePaginasCC)

En este caso tomaremos la entrada de lo que el usuario

introduzca por teclado pero se pueden tomar los datos a traveacutes

de ficheros o pasarlos como variables

Se hace referencia a una excepcioacuten que hemos definido asiacute en un

fichero llamado elementoFueraLimitesExceptionjava

public class elementoFueraLimitesException extends Exc

eption

Constructor

public elementoFueraLimitesException()

super()

public elementoFueraLimitesException(String msg)

super(msg)

Una vez salvado el fichero parserImprimePaginasCCjj podemos

generar la documentacioacuten de la gramaacutetica en formato HTML de

esta forma

Nota en la ejecucioacuten de estos ejemplos se ha utilizado la liacutenea de comandos de

Windows pero se podriacutea haber hecho a traveacutes de cualquier sistema que soporte

el lenguaje Java

gtjjdoc parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Documentation

Generator Version 014)

(type jjdoc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Grammar documentation generated successfully in

parserImprimePaginasCChtml

Se genera el fichero parserImprimePaginasCChtmlcuyo

contenido es

BNF for parserImprimePaginasCCjj NON-TERMINALS

inicio = listaElementos

listaElementos = elemento restoListaElementos

elemento = ltENTEROgt restoListaElementos2

restoListaElementos = ltSEPARADORgt listaElementos

|

restoListaElementos2 = ltGUIONgt ltENTEROgt

|

insertaElemento = java code

inicializaFlags = java code

Nota BNF es el tipo de notacioacuten que estamos utilizando a lo largo de estos

artiacuteculos

Compilamos el parser

gtjavacc parser ImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

File TokenMgrErrorjava does not exist Will create

one

File ParseExceptionjava does not exist Will

create one

File Tokenjava does not exist Will create one

File SimpleCharStreamjava does not exist Will

create one

Parser generated successfully

y entonces se generan estos ficheros

ParseExceptionjava --gt

Excepcioacuten generada por el parser cuando un error es encontrado

parserImprimePaginasCCjava --gt La

traduccioacuten de nuestro fichero jj a java

parserImprimePaginasCCConstantsjava --gt Los

valores de los tokens

parserImprimePaginasCCTokenManagerjava --gt El

analizador leacutexico

SimpleCharStreamjava --gt

Contiene coacutedigo para leer caracteres de cualquier

implementacioacuten de javaioInputStream o javaioReader

Tokenjava --gt

Definicioacuten de la clase Token

TokenMgrErrorjava --gt

Diversos errores que puede producir el lexer

Ahora los compilamos y antildeadimos el fichero

elementoFueraLimitesExceptionjava en dicha compilacioacuten

javac java

Y vamos a ejecutar el parser suponiendo que el maacuteximo nuacutemero

de paacuteginas a impmir es 50 (como hemos indicado con pmaximo =

50)

Lo que obtenemos como salida es la lista de paacuteginas a imprimir o

un mensaje de error

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

OK

2 5 6 7 8

java -classpath laboratorioParsers

parserImprimePaginasCC 28-3046

Num paginas 50

OK

28 29 30 4 6

java -classpath laboratorioParsers

parserImprimePaginasCC 43-51

Num paginas 50

Introdujo un numero superior al maximo51

java -classpath laboratorioParsers

parserImprimePaginasCC 43--51

Num paginas 50

Error de sintaxisEncountered - at line 1

column 4

Was expecting

ltENTEROgt

iquestQueacute pasa si algo ha ido mal iquestPodemos depurar el parser de

alguna forma

Por supuesto podemos compilar el parser asiacute para obtener una

traza de la ejecucioacuten

javacc -DEBUG_PARSER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Consumed token lt- at line 1 column 4gt

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

En la traza vemos coacutemo el parser va invocando la diferentes

producciones

Podemos tambieacuten depurar el lexer

javacc -DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Returning the ltEOFgt token

OK

2 5 6 7 8

O combinar ambas trazas

javacc -DEBUG_PARSER -

DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Consumed token lt- at line 1 column 4gt

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Returning the ltEOFgt token

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

Conclusioacuten los generadores de parsers son herramientas

potentes que sirven para resolver problemas de una manera

bdquolimpia‟ y elegante Puede que su nombre retraiga a los

desarrolladores (ldquoiquestPara queacute quiero un generador de

compiladoresrdquo) pero es una opcioacuten a tener en cuenta

Ficheros para descargar

Referencias

- Generating Parsers with JavaCC

- The JavaCC FAQ

Si quieres enviar alguacuten comentario o sugerir temas a tratar en otros artiacuteculos escribe a

curtasun[simboloArroba]ceines

Categor

iacuteas

CES OpenSouceJava

Tema Desarrollo

Autor Carlos Urtasun

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo XSL-FO (Parte 1)

Texto XSL-FO Introduccioacuten El estaacutendar XSL tal y como estaacute definido actualmente se

divide en dos grandes partes -XSLT transformacioacuten de un documento de entrada XML en

alguacuten tipo de documento de salida ya sea XML HTML PDF etc -Formatting Objects (FO) definen la visualizacioacuten final del

resultado de la transformacioacuten Son una implementacioacuten especiacutefica de un determinado XSLT y aplicados a un

fichero XML nos proporcionan otro fichero con la informacioacuten de eacuteste renderizada a alguacuten formato de visualizacioacuten impresa Eacutesta es quizaacute la principal diferencia entre un FO y

otros XSLT ambos transforman un documento XML en otro documento XML pero FO estaacute pensado para generar

directamente una renderizacioacuten

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 16: Cesnavarra 2008-boletín 7

sobre Debian fue creado por una universidad pero parece

haberse quedado bastante anticuado

NetOffice

Herramienta web basada en PHP sobre MySQL para gestionar proyectos tareas registros de tiempos incidenciaserrores

diagramas de Gantt (aunque un poco escondidos) etc similar pero algo maacutes agradable que dotProject Tiene ciertos tintes de herramienta de colaboracioacuten en grupo (groupware)

phpCollab

Herramienta web basada en PHP que ha sufrido un desarrollo

intermitente por lo que parece Sirve tanto para la gestioacuten de

tareas como para el seguimiento de incidenciaserrores Tiene un

aspecto similar a netOffice lo cual hace pensar que uno de los

dos proyectos deriva del otro Quizaacutes por esa razoacuten de elegir una

de las dos sea maacutes recomendable netOffice

Achievo

Herramienta web PHP sobre MySQL para la gestioacuten de proyectos

tareas recursos registro de tiempos agenda generacioacuten de

informes etc Bastante completo ademaacutes parece incluir seccioacuten

presupuestaria

XPlanner

Herramienta web Java sobre MySQL para la gestioacuten de proyectos

mediante XP y Scrum No obstante parece estancada en una

versioacuten beta desde el 2006

PPTS

Project Planning and Tracking System (PPTS) es una herramienta

Web para la gestioacuten de proyectos con metodologiacuteas XP y Scrum

al igual que la anterior Esta desarrollada en PHP contra MySQL

aunque parece tambieacuten largo tiempo abandonada

XPWeb

Al igual que las anteriores es una herramienta web para la

gestioacuten de proyectos aacutegiles incluyendo gestioacuten de tareas

calendarios informes etc Tambieacuten parece estancada

Trac

Herramienta web ampliamente extendida en la comunidad open

source para fundamentalmente el seguimiento proyectos Se

centra en la gestioacuten de incidencias y errores aunque tiene

funcionalidades antildeadidas interesantes como Wiki e integracioacuten

con Subversioacuten Hay que resentildear que se trata de una

herramienta mono-proyecto y que no cuenta con Gantt

OpenProject

Herramienta web de gestioacuten de proyectos muy completa Posee

todo lo necesario tanto que uno llega a perderse No obstante

pueden configurarse los moacutedulos que desean usarse y descartar

aquellos que no son necesarios calendario gestioacuten de tareas

seguimiento de incidencias control presupuestario Wiki foros

integracioacuten con ERPs diagramas Gantt y una larga lista de

funcionalidades

Tutos

The Ultimate Team Organization Software o eso pretende Se

trata de una herramienta web LAMP con muchas funcionalidades

calendario y agenda seguimiento de incidencias y errores

gestioacuten de tareas diagramas Gantt gestioacuten documental gestioacuten

de correos facturas e informes Interesante pero austera de

aspecto y un poco anticuada

Project Dune

Herramienta web desarrollada en Java contra MySQL que pareciacutea

prometer bastante Tiene lo necesario gestioacuten de tareas

recursos incidencias gestioacuten documental registro de tiempos

informes calendario y agenda RSS inspeccioacuten de coacutedigo

importacioacuten de MS Project etc No obstante en su evaluacioacuten

dejoacute bastante que desear resultando poco praacutectica y manejable

Collabtive

Se trata de una herramienta web LAMP para la gestioacuten de

proyectos Seguacuten se indica en la web cubre la gestioacuten de tareas e

incidencias gestioacuten documental y mensajeriacutea Es muy limpia

sencilla y aacutegil No obstante no parece contar con diagramas

Gantt ni con registro de tiempos o informes de estado En la

praacutectica parece quedarse un poco justa pero prometedora

Mindquarry

Herramienta web desarrollada en Java que pretende ser la

alternativa open source de soluciones propietarias como

Basecamp o Sharepoint para la gestioacuten de proyectos y grupos de

trabajo de forma colaborativa Tiene una versioacuten open source

para descarga y otra como servicio bajo demanda La pega es

que la empresa parece haber dejado de desarrollar su actividad

ClockingIT

Se trata de una herramienta Web desarrollada en Ruby como

servicio bajo demanda Permite una gestioacuten de tareas agenda

siguiendo el estaacutendar iCal seguimiento de tiempos generacioacuten

de informes notificaciones RSS foros Chat y Wiki repositorio

de ficheros etc

LibreSource

Se trata de una plataforma web colaborativa para el desarrollo de

software lo que se suele denominar forja y funcionalidades de

groupware archivado y publicacioacuten web Es open source y

altamente ajustable Permite alojar muacuteltiples proyectos varios

grupos de usuarios etc Estaacute desarrollada en J2EE e incorpora

entre otras cosas Wiki integracioacuten con Subversion zonas de

descarga gestioacuten documental mensajeriacutea instantaacutenea con

Jabber gestioacuten de incidencias etc No fue evaluada al ser

descubierta posteriormente a la implantacioacuten de la herramienta

elegida pero parece una buena alternativa

Aunque existen infinidad maacutes de entre todas nos decantamos

por dos que valoramos maacutes en profundidad

TeamWork

Se trata de una herramienta web desarrollada en Java por unos

Italianos Entre sus funcionalidades cabe destacar la gestioacuten de

proyectos y tareas con diversos diagramas de Gantt muy

logrados gestioacuten de incidencias gestioacuten documental entorno

colaborativo tipo groupware control de costes registros de

tiempos etc

Es muy completo raacutepido de respuesta y posee caracteriacutesticas

muy interesantes como una interesante y uacutetil navegacioacuten

contextual entre tareas del proyecto perfiles de usuario seguacuten

proyecto importacioacuten de planificaciones desde MS Project o

asociacioacuten entre incidencias y tareas

Cuenta con wizards para la configuracioacuten de la herramienta de

forma raacutepida y sencilla incluyendo la posibilidad de generar

plantillas para aplicar metodologiacuteas aacutegiles (Scrum)

El registro de horas por tarea para un desarrollador se realiza de

forma muy coacutemoda y raacutepida desde una simple vista facilitando

la participacioacuten del mismo

Se trataba de una aplicacioacuten muy completa quizaacutes demasiado

un poco compleja de entender en un comienzo pero con muchas

posibilidades

No obstante teniacutea alguna que otra pega aunque es open source

posee una licencia de pago para su uso que en cualquier caso era

muy pequentildea Tiene una versioacuten de evaluacioacuten de 30 diacuteas para

quien desee probarla antes de decidir Por otro lado no distingue

proyectos existe una tarea padre que agrupa toda la

planificacioacuten asociada tampoco cuenta con Wiki y no gestiona las

vacaciones del personal

La otra herramienta valorada maacutes en profundidad fue

Redmine

Se trata de otra herramienta web en este caso desarrollada en

Ruby on Rails con una gran cantidad de funcionalidades que la

acerca bastante a una forja pero sin tener la complejidad de la

misma Entre sus caracteriacutesticas cabe destacar la gestioacuten de

tareas incidencias diagramas de Gantt calendario de

actividades noticias foros wikis gestioacuten de ficheros y

documentos integracioacuten con Subversioacuten control de tiempos

generacioacuten de informes etc todo esto por proyecto Por

similitudes del interfaz y funcionalidades parece estar basado en

Trac pero con un lavado de cara y de coacutedigo importante ademaacutes

de ser multi-proyecto

Al igual que la anterior tambieacuten poseiacutea una serie de

caracteriacutesticas que la haciacutea diferente como la posible navegacioacuten

anoacutenima de lectura si asiacute se desea sobre los proyectos alojados

Interesante desde el punto de vista de filosofiacutea open source

Posibilidad de definir un perfil distinto por usuario seguacuten el

proyecto en el que participa

Tambieacuten cuenta con sindicacioacuten de RSS para las secciones de

noticias tareas incidencias etc y exportacioacuten a ficheros de texto

y HTML desde la Wiki los informes generados e incluso el

diagrama de Gantt

A parte se trata de un interfaz muy limpio intuitivo sencillo de

usar y rapidiacutesimo

La configuracioacuten de la herramienta resulta asiacute mismo muy

sencilla con un par de clics puedes empezar a funcionar

Cada proyecto puede configurarse con los moacutedulos que desees

que tenga ademaacutes de poder definir campos personalizados por

proyecto y tarea para permitir una mayor adaptacioacuten

Cabe destacar que para esta herramienta existe un uacutenico

concepto denominado peticioacuten que puede ser de tres tipos

tareas soporte o incidencia De esta forma todo se gestiona de

igual forma lo cual lo simplifica pero a su vez puede convertirse

en un volumen ingestionable de tareas Para evitar esto se

pueden definir categoriacuteas a las que pertenece una peticioacuten y

realizar posteriormente filtrados de peticiones en las vistas seguacuten

este y otros paraacutemetros

No obstante no todo iba a ser color de rosa tiene una serie de

limitaciones como el sistema un tanto engorroso de enlazar

peticiones o el hecho de que una vez creada una peticioacuten su

nombre y descripcioacuten no se pueden modificar tan solo ir

antildeadiendo nuevas descripciones

En este punto nos encontraacutebamos en una difiacutecil decisioacuten puesto

que ambas herramientas nos gustaban cubriacutean lo necesario pero

se trataban de herramientas muy distintas en concepcioacuten Para

facilitar la decisioacuten realizamos un cuadro comparando las

caracteriacutesticas y priorizaacutendolas seguacuten nuestro intereacutes El

resultado fue el siguiente

Prioridad Caracteriacutestica Redmine TeamWork

9 Integracioacuten con

LDAP Si Si

8 Integracioacuten con

Subversion Si Si

8 Traducido al espantildeol

Si No

7 Importacioacuten desde

Project No Si

7 Exportacioacuten a

Project No Si

7 Centros de coste Posible mediante los campos

personalizados

Si

7 Wikis de proyectos Si

7 Personalizacioacuten

extensioacuten Si Si

6 Gestioacuten de vacaciones

No Vacaciones a nivel de

empresa

6 Vida de la herramienta

Indeterminado al ser una

herramienta open source

Algo maacutes seguro

porque hay una empresa detraacutes

5 Facilidad de configuracioacuten

Si

5 Usuarios multi-

perfil Si Si

4 Acceso restringido a usuarios

Si Si

3 Sencillez de manejo

Si

2 Seguimiento de

incidencias Si Si

1 Asignacioacuten de tareas

Si Si

1 Imputacioacuten a tareas asignadas

Si Si

Tras una difiacutecil reflexioacuten puesto que ambas se encontraban muy

parejas decidimos decantarnos por Redmine primando la

sencillez y rapidez Existiacutea la posibilidad de que terceros la

empleasen y veiacuteamos que Redmine permitiacutea una mayor facilidad

en su manejo y resultaba maacutes intuitiva de cara a aprender a

utilizarla Posteriormente tras su uso hemos detectado algunos

inconvenientes importantes como la imposibilidad de asignar una

peticioacuten a maacutes de un usuario pero es que no hay herramienta

perfecta

Bibliografiacutea

httpwwwnavegapolisnetcontentview5649

httpwwwsimpleprojectmanagementcomhomehtml

httpwwwweb-based-softwarecomproject

httpenwikipediaorgwikiComparison_of_issue_tracking_syste

ms

httpenwikipediaorgwikiList_of_project_management_softwa

re

httpwwwpmdigestcomsoftware

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Rauacutel Sanz de Acedo

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo Lexers parsers JavaCC (y II)

Texto En este artiacuteculo vamos a utilizar JavaCC como herramienta para

implementar un moacutedulo que resuelva la casuiacutestica de la

impresioacuten de las diversas paacuteginas de un fichero Esto es lo que se

refleja en esta imagen

Para ello en el artiacuteculo anterior definimos esta gramaacutetica a la que

asociamos unas acciones semaacutenticas

inicio --gt inicializacionVariables

listaElementos

procesarDatos

listaElementos --gt elemento

restoListaElementos

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

restoListaElementos --gt SEPARADOR

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

listaElementos

|

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

restoListaElementos2 --gt GUION ENTERO

num2 = valor(ENTERO)

Si (num2 gt maxPaginas)

or (num2==0) ent error

|

JavaCC es una herramienta que dado un fichero de extensioacuten

jj que describe la gramaacutetica y sus acciones semaacutenticas

asociadas genera los ficheros java que la implementan

Estos ficheros java pueden luego obviamente incluirse en

aqueacutellos que conforman el resto de nuestra aplicacioacuten

JavaCC es una herramienta gratuita que puede descargarse

desde aquiacute Existe tambieacuten un plugin para Eclipse Y asimismo

existe una task de Ant para JavaCC

Vamos pues a construir nuestro parser

Lo denominaremos parserImprimePaginasCC y por lo tanto

vamos a editar el fichero parserImprimePaginasCCjj

Indicaremos coacutemo se traducen los tokens y las producciones a

formato JavaCC

TOKEN

ltENTERO([0-9])+gt

| ltGUION -gt

| ltSEPARADOR([ ])+ | ([ ])gt

Los tokens se describen praacutecticamente como lo indicamos en la

gramaacutetica

void inicio()throws elementoFueraLimitesException

resultado = new Vector()

num1 = -1

num2 = -1

inicializaFlags()

listaElementos()

void listaElementos()throws elementoFueraLimitesExcept

ion

elemento() restoListaElementos()

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

restoListaElementos2()

void restoListaElementos()throws elementoFueraLimitesE

xception

ltSEPARADORgt

insertaElemento(num1 num2)

num1 = -1

num2 = -1

listaElementos()

|

insertaElemento(num1 num2)

num1 = -1

num2 = -1

void restoListaElementos2()throws elementoFueraLimites

Exception

ltGUIONgtltENTEROgt

num2 = IntegervalueOf(tokenimage)intValue()

if ((num2gtmaximo)|| (num2 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num2))

|

Las producciones son algo diferentes lo que era

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

ahora es

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(IntegertoS

tring(num1))

restoListaElementos2()

El no terminal elemento se describe como void elemento() y

ademaacutes le hemos asociado una excepcioacuten para controlar el hecho

de que un usuario coloque 0 o un nuacutemero mayor que el

permitido Lo que en la parte derecha es ENTERO se indica

como ltENTEROgt y la invocacioacuten de restoListaElementos2

es restoListaElementos2()

Las acciones semaacutenticas

num1 = valor(ENTERO)

Si (num1 gt maxPaginas) or (num1==0) ent error

se indican en JavaCC asiacute

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

El valor del token actual es accesible a traveacutes de tokenimage

Si deseamos tener coacutedigo Java adicional fuera de las

producciones lo podemos antildeadir de esta forma con la palabra

reservada JAVACODE

JAVACODE void insertaElemento(int num1 int num2)

int aux i iFlag

if ((num1 = -1) ampamp (num2 = -1))

if (num1gtnum2)

aux = num1

num1 = num2

num2 = aux

for (i = num1

i lt= num2

i++)

iFlag = i-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(i))

flags[iFlag] = true

else if (num1 = -1)

iFlag = num1-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num1))

flags[iFlag] = true

else if (num2 = -1)

iFlag = num2-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num2))

flags[iFlag] = true

JAVACODE void inicializaFlags()

int i

flags = new boolean [maximo]

for (i = 0

iltmaximo

i++)

flags[i] = false

Ademaacutes podemos inicializar el parser e instanciarlo de esta

forma

PARSER_BEGIN(parserImprimePaginasCC)

import javaio

import javautilVector

public class parserImprimePaginasCC

public static int maximo

public static Vector resultado

private static int num1 num2

private static boolean flags[]

public static void main(String[]args)throws Exceptio

n

Reader r = new StringReader(args[0])

parserImprimePaginasCC p

= new parserImprimePaginasCC(r)

try

pmaximo = 50

Systemoutprintln(Maacuteximo +pmaximo)

pinicio()

Systemoutprintln(OKn)

for (int j = 0

jltpresultadosize()

j++)

Systemoutprint(presultadoelementAt(j)+

)

Systemoutprintln()

catch (ParseException e)

Systemoutprintln(Error de sintaxis)

catch (TokenMgrError e)

Systemoutprintln(Error leacutexico)

catch (elementoFueraLimitesException e)

Systemoutprintln(egetMessage())

PARSER_END(parserImprimePaginasCC)

En este caso tomaremos la entrada de lo que el usuario

introduzca por teclado pero se pueden tomar los datos a traveacutes

de ficheros o pasarlos como variables

Se hace referencia a una excepcioacuten que hemos definido asiacute en un

fichero llamado elementoFueraLimitesExceptionjava

public class elementoFueraLimitesException extends Exc

eption

Constructor

public elementoFueraLimitesException()

super()

public elementoFueraLimitesException(String msg)

super(msg)

Una vez salvado el fichero parserImprimePaginasCCjj podemos

generar la documentacioacuten de la gramaacutetica en formato HTML de

esta forma

Nota en la ejecucioacuten de estos ejemplos se ha utilizado la liacutenea de comandos de

Windows pero se podriacutea haber hecho a traveacutes de cualquier sistema que soporte

el lenguaje Java

gtjjdoc parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Documentation

Generator Version 014)

(type jjdoc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Grammar documentation generated successfully in

parserImprimePaginasCChtml

Se genera el fichero parserImprimePaginasCChtmlcuyo

contenido es

BNF for parserImprimePaginasCCjj NON-TERMINALS

inicio = listaElementos

listaElementos = elemento restoListaElementos

elemento = ltENTEROgt restoListaElementos2

restoListaElementos = ltSEPARADORgt listaElementos

|

restoListaElementos2 = ltGUIONgt ltENTEROgt

|

insertaElemento = java code

inicializaFlags = java code

Nota BNF es el tipo de notacioacuten que estamos utilizando a lo largo de estos

artiacuteculos

Compilamos el parser

gtjavacc parser ImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

File TokenMgrErrorjava does not exist Will create

one

File ParseExceptionjava does not exist Will

create one

File Tokenjava does not exist Will create one

File SimpleCharStreamjava does not exist Will

create one

Parser generated successfully

y entonces se generan estos ficheros

ParseExceptionjava --gt

Excepcioacuten generada por el parser cuando un error es encontrado

parserImprimePaginasCCjava --gt La

traduccioacuten de nuestro fichero jj a java

parserImprimePaginasCCConstantsjava --gt Los

valores de los tokens

parserImprimePaginasCCTokenManagerjava --gt El

analizador leacutexico

SimpleCharStreamjava --gt

Contiene coacutedigo para leer caracteres de cualquier

implementacioacuten de javaioInputStream o javaioReader

Tokenjava --gt

Definicioacuten de la clase Token

TokenMgrErrorjava --gt

Diversos errores que puede producir el lexer

Ahora los compilamos y antildeadimos el fichero

elementoFueraLimitesExceptionjava en dicha compilacioacuten

javac java

Y vamos a ejecutar el parser suponiendo que el maacuteximo nuacutemero

de paacuteginas a impmir es 50 (como hemos indicado con pmaximo =

50)

Lo que obtenemos como salida es la lista de paacuteginas a imprimir o

un mensaje de error

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

OK

2 5 6 7 8

java -classpath laboratorioParsers

parserImprimePaginasCC 28-3046

Num paginas 50

OK

28 29 30 4 6

java -classpath laboratorioParsers

parserImprimePaginasCC 43-51

Num paginas 50

Introdujo un numero superior al maximo51

java -classpath laboratorioParsers

parserImprimePaginasCC 43--51

Num paginas 50

Error de sintaxisEncountered - at line 1

column 4

Was expecting

ltENTEROgt

iquestQueacute pasa si algo ha ido mal iquestPodemos depurar el parser de

alguna forma

Por supuesto podemos compilar el parser asiacute para obtener una

traza de la ejecucioacuten

javacc -DEBUG_PARSER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Consumed token lt- at line 1 column 4gt

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

En la traza vemos coacutemo el parser va invocando la diferentes

producciones

Podemos tambieacuten depurar el lexer

javacc -DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Returning the ltEOFgt token

OK

2 5 6 7 8

O combinar ambas trazas

javacc -DEBUG_PARSER -

DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Consumed token lt- at line 1 column 4gt

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Returning the ltEOFgt token

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

Conclusioacuten los generadores de parsers son herramientas

potentes que sirven para resolver problemas de una manera

bdquolimpia‟ y elegante Puede que su nombre retraiga a los

desarrolladores (ldquoiquestPara queacute quiero un generador de

compiladoresrdquo) pero es una opcioacuten a tener en cuenta

Ficheros para descargar

Referencias

- Generating Parsers with JavaCC

- The JavaCC FAQ

Si quieres enviar alguacuten comentario o sugerir temas a tratar en otros artiacuteculos escribe a

curtasun[simboloArroba]ceines

Categor

iacuteas

CES OpenSouceJava

Tema Desarrollo

Autor Carlos Urtasun

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo XSL-FO (Parte 1)

Texto XSL-FO Introduccioacuten El estaacutendar XSL tal y como estaacute definido actualmente se

divide en dos grandes partes -XSLT transformacioacuten de un documento de entrada XML en

alguacuten tipo de documento de salida ya sea XML HTML PDF etc -Formatting Objects (FO) definen la visualizacioacuten final del

resultado de la transformacioacuten Son una implementacioacuten especiacutefica de un determinado XSLT y aplicados a un

fichero XML nos proporcionan otro fichero con la informacioacuten de eacuteste renderizada a alguacuten formato de visualizacioacuten impresa Eacutesta es quizaacute la principal diferencia entre un FO y

otros XSLT ambos transforman un documento XML en otro documento XML pero FO estaacute pensado para generar

directamente una renderizacioacuten

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 17: Cesnavarra 2008-boletín 7

XPWeb

Al igual que las anteriores es una herramienta web para la

gestioacuten de proyectos aacutegiles incluyendo gestioacuten de tareas

calendarios informes etc Tambieacuten parece estancada

Trac

Herramienta web ampliamente extendida en la comunidad open

source para fundamentalmente el seguimiento proyectos Se

centra en la gestioacuten de incidencias y errores aunque tiene

funcionalidades antildeadidas interesantes como Wiki e integracioacuten

con Subversioacuten Hay que resentildear que se trata de una

herramienta mono-proyecto y que no cuenta con Gantt

OpenProject

Herramienta web de gestioacuten de proyectos muy completa Posee

todo lo necesario tanto que uno llega a perderse No obstante

pueden configurarse los moacutedulos que desean usarse y descartar

aquellos que no son necesarios calendario gestioacuten de tareas

seguimiento de incidencias control presupuestario Wiki foros

integracioacuten con ERPs diagramas Gantt y una larga lista de

funcionalidades

Tutos

The Ultimate Team Organization Software o eso pretende Se

trata de una herramienta web LAMP con muchas funcionalidades

calendario y agenda seguimiento de incidencias y errores

gestioacuten de tareas diagramas Gantt gestioacuten documental gestioacuten

de correos facturas e informes Interesante pero austera de

aspecto y un poco anticuada

Project Dune

Herramienta web desarrollada en Java contra MySQL que pareciacutea

prometer bastante Tiene lo necesario gestioacuten de tareas

recursos incidencias gestioacuten documental registro de tiempos

informes calendario y agenda RSS inspeccioacuten de coacutedigo

importacioacuten de MS Project etc No obstante en su evaluacioacuten

dejoacute bastante que desear resultando poco praacutectica y manejable

Collabtive

Se trata de una herramienta web LAMP para la gestioacuten de

proyectos Seguacuten se indica en la web cubre la gestioacuten de tareas e

incidencias gestioacuten documental y mensajeriacutea Es muy limpia

sencilla y aacutegil No obstante no parece contar con diagramas

Gantt ni con registro de tiempos o informes de estado En la

praacutectica parece quedarse un poco justa pero prometedora

Mindquarry

Herramienta web desarrollada en Java que pretende ser la

alternativa open source de soluciones propietarias como

Basecamp o Sharepoint para la gestioacuten de proyectos y grupos de

trabajo de forma colaborativa Tiene una versioacuten open source

para descarga y otra como servicio bajo demanda La pega es

que la empresa parece haber dejado de desarrollar su actividad

ClockingIT

Se trata de una herramienta Web desarrollada en Ruby como

servicio bajo demanda Permite una gestioacuten de tareas agenda

siguiendo el estaacutendar iCal seguimiento de tiempos generacioacuten

de informes notificaciones RSS foros Chat y Wiki repositorio

de ficheros etc

LibreSource

Se trata de una plataforma web colaborativa para el desarrollo de

software lo que se suele denominar forja y funcionalidades de

groupware archivado y publicacioacuten web Es open source y

altamente ajustable Permite alojar muacuteltiples proyectos varios

grupos de usuarios etc Estaacute desarrollada en J2EE e incorpora

entre otras cosas Wiki integracioacuten con Subversion zonas de

descarga gestioacuten documental mensajeriacutea instantaacutenea con

Jabber gestioacuten de incidencias etc No fue evaluada al ser

descubierta posteriormente a la implantacioacuten de la herramienta

elegida pero parece una buena alternativa

Aunque existen infinidad maacutes de entre todas nos decantamos

por dos que valoramos maacutes en profundidad

TeamWork

Se trata de una herramienta web desarrollada en Java por unos

Italianos Entre sus funcionalidades cabe destacar la gestioacuten de

proyectos y tareas con diversos diagramas de Gantt muy

logrados gestioacuten de incidencias gestioacuten documental entorno

colaborativo tipo groupware control de costes registros de

tiempos etc

Es muy completo raacutepido de respuesta y posee caracteriacutesticas

muy interesantes como una interesante y uacutetil navegacioacuten

contextual entre tareas del proyecto perfiles de usuario seguacuten

proyecto importacioacuten de planificaciones desde MS Project o

asociacioacuten entre incidencias y tareas

Cuenta con wizards para la configuracioacuten de la herramienta de

forma raacutepida y sencilla incluyendo la posibilidad de generar

plantillas para aplicar metodologiacuteas aacutegiles (Scrum)

El registro de horas por tarea para un desarrollador se realiza de

forma muy coacutemoda y raacutepida desde una simple vista facilitando

la participacioacuten del mismo

Se trataba de una aplicacioacuten muy completa quizaacutes demasiado

un poco compleja de entender en un comienzo pero con muchas

posibilidades

No obstante teniacutea alguna que otra pega aunque es open source

posee una licencia de pago para su uso que en cualquier caso era

muy pequentildea Tiene una versioacuten de evaluacioacuten de 30 diacuteas para

quien desee probarla antes de decidir Por otro lado no distingue

proyectos existe una tarea padre que agrupa toda la

planificacioacuten asociada tampoco cuenta con Wiki y no gestiona las

vacaciones del personal

La otra herramienta valorada maacutes en profundidad fue

Redmine

Se trata de otra herramienta web en este caso desarrollada en

Ruby on Rails con una gran cantidad de funcionalidades que la

acerca bastante a una forja pero sin tener la complejidad de la

misma Entre sus caracteriacutesticas cabe destacar la gestioacuten de

tareas incidencias diagramas de Gantt calendario de

actividades noticias foros wikis gestioacuten de ficheros y

documentos integracioacuten con Subversioacuten control de tiempos

generacioacuten de informes etc todo esto por proyecto Por

similitudes del interfaz y funcionalidades parece estar basado en

Trac pero con un lavado de cara y de coacutedigo importante ademaacutes

de ser multi-proyecto

Al igual que la anterior tambieacuten poseiacutea una serie de

caracteriacutesticas que la haciacutea diferente como la posible navegacioacuten

anoacutenima de lectura si asiacute se desea sobre los proyectos alojados

Interesante desde el punto de vista de filosofiacutea open source

Posibilidad de definir un perfil distinto por usuario seguacuten el

proyecto en el que participa

Tambieacuten cuenta con sindicacioacuten de RSS para las secciones de

noticias tareas incidencias etc y exportacioacuten a ficheros de texto

y HTML desde la Wiki los informes generados e incluso el

diagrama de Gantt

A parte se trata de un interfaz muy limpio intuitivo sencillo de

usar y rapidiacutesimo

La configuracioacuten de la herramienta resulta asiacute mismo muy

sencilla con un par de clics puedes empezar a funcionar

Cada proyecto puede configurarse con los moacutedulos que desees

que tenga ademaacutes de poder definir campos personalizados por

proyecto y tarea para permitir una mayor adaptacioacuten

Cabe destacar que para esta herramienta existe un uacutenico

concepto denominado peticioacuten que puede ser de tres tipos

tareas soporte o incidencia De esta forma todo se gestiona de

igual forma lo cual lo simplifica pero a su vez puede convertirse

en un volumen ingestionable de tareas Para evitar esto se

pueden definir categoriacuteas a las que pertenece una peticioacuten y

realizar posteriormente filtrados de peticiones en las vistas seguacuten

este y otros paraacutemetros

No obstante no todo iba a ser color de rosa tiene una serie de

limitaciones como el sistema un tanto engorroso de enlazar

peticiones o el hecho de que una vez creada una peticioacuten su

nombre y descripcioacuten no se pueden modificar tan solo ir

antildeadiendo nuevas descripciones

En este punto nos encontraacutebamos en una difiacutecil decisioacuten puesto

que ambas herramientas nos gustaban cubriacutean lo necesario pero

se trataban de herramientas muy distintas en concepcioacuten Para

facilitar la decisioacuten realizamos un cuadro comparando las

caracteriacutesticas y priorizaacutendolas seguacuten nuestro intereacutes El

resultado fue el siguiente

Prioridad Caracteriacutestica Redmine TeamWork

9 Integracioacuten con

LDAP Si Si

8 Integracioacuten con

Subversion Si Si

8 Traducido al espantildeol

Si No

7 Importacioacuten desde

Project No Si

7 Exportacioacuten a

Project No Si

7 Centros de coste Posible mediante los campos

personalizados

Si

7 Wikis de proyectos Si

7 Personalizacioacuten

extensioacuten Si Si

6 Gestioacuten de vacaciones

No Vacaciones a nivel de

empresa

6 Vida de la herramienta

Indeterminado al ser una

herramienta open source

Algo maacutes seguro

porque hay una empresa detraacutes

5 Facilidad de configuracioacuten

Si

5 Usuarios multi-

perfil Si Si

4 Acceso restringido a usuarios

Si Si

3 Sencillez de manejo

Si

2 Seguimiento de

incidencias Si Si

1 Asignacioacuten de tareas

Si Si

1 Imputacioacuten a tareas asignadas

Si Si

Tras una difiacutecil reflexioacuten puesto que ambas se encontraban muy

parejas decidimos decantarnos por Redmine primando la

sencillez y rapidez Existiacutea la posibilidad de que terceros la

empleasen y veiacuteamos que Redmine permitiacutea una mayor facilidad

en su manejo y resultaba maacutes intuitiva de cara a aprender a

utilizarla Posteriormente tras su uso hemos detectado algunos

inconvenientes importantes como la imposibilidad de asignar una

peticioacuten a maacutes de un usuario pero es que no hay herramienta

perfecta

Bibliografiacutea

httpwwwnavegapolisnetcontentview5649

httpwwwsimpleprojectmanagementcomhomehtml

httpwwwweb-based-softwarecomproject

httpenwikipediaorgwikiComparison_of_issue_tracking_syste

ms

httpenwikipediaorgwikiList_of_project_management_softwa

re

httpwwwpmdigestcomsoftware

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Rauacutel Sanz de Acedo

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo Lexers parsers JavaCC (y II)

Texto En este artiacuteculo vamos a utilizar JavaCC como herramienta para

implementar un moacutedulo que resuelva la casuiacutestica de la

impresioacuten de las diversas paacuteginas de un fichero Esto es lo que se

refleja en esta imagen

Para ello en el artiacuteculo anterior definimos esta gramaacutetica a la que

asociamos unas acciones semaacutenticas

inicio --gt inicializacionVariables

listaElementos

procesarDatos

listaElementos --gt elemento

restoListaElementos

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

restoListaElementos --gt SEPARADOR

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

listaElementos

|

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

restoListaElementos2 --gt GUION ENTERO

num2 = valor(ENTERO)

Si (num2 gt maxPaginas)

or (num2==0) ent error

|

JavaCC es una herramienta que dado un fichero de extensioacuten

jj que describe la gramaacutetica y sus acciones semaacutenticas

asociadas genera los ficheros java que la implementan

Estos ficheros java pueden luego obviamente incluirse en

aqueacutellos que conforman el resto de nuestra aplicacioacuten

JavaCC es una herramienta gratuita que puede descargarse

desde aquiacute Existe tambieacuten un plugin para Eclipse Y asimismo

existe una task de Ant para JavaCC

Vamos pues a construir nuestro parser

Lo denominaremos parserImprimePaginasCC y por lo tanto

vamos a editar el fichero parserImprimePaginasCCjj

Indicaremos coacutemo se traducen los tokens y las producciones a

formato JavaCC

TOKEN

ltENTERO([0-9])+gt

| ltGUION -gt

| ltSEPARADOR([ ])+ | ([ ])gt

Los tokens se describen praacutecticamente como lo indicamos en la

gramaacutetica

void inicio()throws elementoFueraLimitesException

resultado = new Vector()

num1 = -1

num2 = -1

inicializaFlags()

listaElementos()

void listaElementos()throws elementoFueraLimitesExcept

ion

elemento() restoListaElementos()

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

restoListaElementos2()

void restoListaElementos()throws elementoFueraLimitesE

xception

ltSEPARADORgt

insertaElemento(num1 num2)

num1 = -1

num2 = -1

listaElementos()

|

insertaElemento(num1 num2)

num1 = -1

num2 = -1

void restoListaElementos2()throws elementoFueraLimites

Exception

ltGUIONgtltENTEROgt

num2 = IntegervalueOf(tokenimage)intValue()

if ((num2gtmaximo)|| (num2 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num2))

|

Las producciones son algo diferentes lo que era

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

ahora es

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(IntegertoS

tring(num1))

restoListaElementos2()

El no terminal elemento se describe como void elemento() y

ademaacutes le hemos asociado una excepcioacuten para controlar el hecho

de que un usuario coloque 0 o un nuacutemero mayor que el

permitido Lo que en la parte derecha es ENTERO se indica

como ltENTEROgt y la invocacioacuten de restoListaElementos2

es restoListaElementos2()

Las acciones semaacutenticas

num1 = valor(ENTERO)

Si (num1 gt maxPaginas) or (num1==0) ent error

se indican en JavaCC asiacute

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

El valor del token actual es accesible a traveacutes de tokenimage

Si deseamos tener coacutedigo Java adicional fuera de las

producciones lo podemos antildeadir de esta forma con la palabra

reservada JAVACODE

JAVACODE void insertaElemento(int num1 int num2)

int aux i iFlag

if ((num1 = -1) ampamp (num2 = -1))

if (num1gtnum2)

aux = num1

num1 = num2

num2 = aux

for (i = num1

i lt= num2

i++)

iFlag = i-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(i))

flags[iFlag] = true

else if (num1 = -1)

iFlag = num1-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num1))

flags[iFlag] = true

else if (num2 = -1)

iFlag = num2-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num2))

flags[iFlag] = true

JAVACODE void inicializaFlags()

int i

flags = new boolean [maximo]

for (i = 0

iltmaximo

i++)

flags[i] = false

Ademaacutes podemos inicializar el parser e instanciarlo de esta

forma

PARSER_BEGIN(parserImprimePaginasCC)

import javaio

import javautilVector

public class parserImprimePaginasCC

public static int maximo

public static Vector resultado

private static int num1 num2

private static boolean flags[]

public static void main(String[]args)throws Exceptio

n

Reader r = new StringReader(args[0])

parserImprimePaginasCC p

= new parserImprimePaginasCC(r)

try

pmaximo = 50

Systemoutprintln(Maacuteximo +pmaximo)

pinicio()

Systemoutprintln(OKn)

for (int j = 0

jltpresultadosize()

j++)

Systemoutprint(presultadoelementAt(j)+

)

Systemoutprintln()

catch (ParseException e)

Systemoutprintln(Error de sintaxis)

catch (TokenMgrError e)

Systemoutprintln(Error leacutexico)

catch (elementoFueraLimitesException e)

Systemoutprintln(egetMessage())

PARSER_END(parserImprimePaginasCC)

En este caso tomaremos la entrada de lo que el usuario

introduzca por teclado pero se pueden tomar los datos a traveacutes

de ficheros o pasarlos como variables

Se hace referencia a una excepcioacuten que hemos definido asiacute en un

fichero llamado elementoFueraLimitesExceptionjava

public class elementoFueraLimitesException extends Exc

eption

Constructor

public elementoFueraLimitesException()

super()

public elementoFueraLimitesException(String msg)

super(msg)

Una vez salvado el fichero parserImprimePaginasCCjj podemos

generar la documentacioacuten de la gramaacutetica en formato HTML de

esta forma

Nota en la ejecucioacuten de estos ejemplos se ha utilizado la liacutenea de comandos de

Windows pero se podriacutea haber hecho a traveacutes de cualquier sistema que soporte

el lenguaje Java

gtjjdoc parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Documentation

Generator Version 014)

(type jjdoc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Grammar documentation generated successfully in

parserImprimePaginasCChtml

Se genera el fichero parserImprimePaginasCChtmlcuyo

contenido es

BNF for parserImprimePaginasCCjj NON-TERMINALS

inicio = listaElementos

listaElementos = elemento restoListaElementos

elemento = ltENTEROgt restoListaElementos2

restoListaElementos = ltSEPARADORgt listaElementos

|

restoListaElementos2 = ltGUIONgt ltENTEROgt

|

insertaElemento = java code

inicializaFlags = java code

Nota BNF es el tipo de notacioacuten que estamos utilizando a lo largo de estos

artiacuteculos

Compilamos el parser

gtjavacc parser ImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

File TokenMgrErrorjava does not exist Will create

one

File ParseExceptionjava does not exist Will

create one

File Tokenjava does not exist Will create one

File SimpleCharStreamjava does not exist Will

create one

Parser generated successfully

y entonces se generan estos ficheros

ParseExceptionjava --gt

Excepcioacuten generada por el parser cuando un error es encontrado

parserImprimePaginasCCjava --gt La

traduccioacuten de nuestro fichero jj a java

parserImprimePaginasCCConstantsjava --gt Los

valores de los tokens

parserImprimePaginasCCTokenManagerjava --gt El

analizador leacutexico

SimpleCharStreamjava --gt

Contiene coacutedigo para leer caracteres de cualquier

implementacioacuten de javaioInputStream o javaioReader

Tokenjava --gt

Definicioacuten de la clase Token

TokenMgrErrorjava --gt

Diversos errores que puede producir el lexer

Ahora los compilamos y antildeadimos el fichero

elementoFueraLimitesExceptionjava en dicha compilacioacuten

javac java

Y vamos a ejecutar el parser suponiendo que el maacuteximo nuacutemero

de paacuteginas a impmir es 50 (como hemos indicado con pmaximo =

50)

Lo que obtenemos como salida es la lista de paacuteginas a imprimir o

un mensaje de error

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

OK

2 5 6 7 8

java -classpath laboratorioParsers

parserImprimePaginasCC 28-3046

Num paginas 50

OK

28 29 30 4 6

java -classpath laboratorioParsers

parserImprimePaginasCC 43-51

Num paginas 50

Introdujo un numero superior al maximo51

java -classpath laboratorioParsers

parserImprimePaginasCC 43--51

Num paginas 50

Error de sintaxisEncountered - at line 1

column 4

Was expecting

ltENTEROgt

iquestQueacute pasa si algo ha ido mal iquestPodemos depurar el parser de

alguna forma

Por supuesto podemos compilar el parser asiacute para obtener una

traza de la ejecucioacuten

javacc -DEBUG_PARSER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Consumed token lt- at line 1 column 4gt

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

En la traza vemos coacutemo el parser va invocando la diferentes

producciones

Podemos tambieacuten depurar el lexer

javacc -DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Returning the ltEOFgt token

OK

2 5 6 7 8

O combinar ambas trazas

javacc -DEBUG_PARSER -

DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Consumed token lt- at line 1 column 4gt

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Returning the ltEOFgt token

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

Conclusioacuten los generadores de parsers son herramientas

potentes que sirven para resolver problemas de una manera

bdquolimpia‟ y elegante Puede que su nombre retraiga a los

desarrolladores (ldquoiquestPara queacute quiero un generador de

compiladoresrdquo) pero es una opcioacuten a tener en cuenta

Ficheros para descargar

Referencias

- Generating Parsers with JavaCC

- The JavaCC FAQ

Si quieres enviar alguacuten comentario o sugerir temas a tratar en otros artiacuteculos escribe a

curtasun[simboloArroba]ceines

Categor

iacuteas

CES OpenSouceJava

Tema Desarrollo

Autor Carlos Urtasun

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo XSL-FO (Parte 1)

Texto XSL-FO Introduccioacuten El estaacutendar XSL tal y como estaacute definido actualmente se

divide en dos grandes partes -XSLT transformacioacuten de un documento de entrada XML en

alguacuten tipo de documento de salida ya sea XML HTML PDF etc -Formatting Objects (FO) definen la visualizacioacuten final del

resultado de la transformacioacuten Son una implementacioacuten especiacutefica de un determinado XSLT y aplicados a un

fichero XML nos proporcionan otro fichero con la informacioacuten de eacuteste renderizada a alguacuten formato de visualizacioacuten impresa Eacutesta es quizaacute la principal diferencia entre un FO y

otros XSLT ambos transforman un documento XML en otro documento XML pero FO estaacute pensado para generar

directamente una renderizacioacuten

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 18: Cesnavarra 2008-boletín 7

dejoacute bastante que desear resultando poco praacutectica y manejable

Collabtive

Se trata de una herramienta web LAMP para la gestioacuten de

proyectos Seguacuten se indica en la web cubre la gestioacuten de tareas e

incidencias gestioacuten documental y mensajeriacutea Es muy limpia

sencilla y aacutegil No obstante no parece contar con diagramas

Gantt ni con registro de tiempos o informes de estado En la

praacutectica parece quedarse un poco justa pero prometedora

Mindquarry

Herramienta web desarrollada en Java que pretende ser la

alternativa open source de soluciones propietarias como

Basecamp o Sharepoint para la gestioacuten de proyectos y grupos de

trabajo de forma colaborativa Tiene una versioacuten open source

para descarga y otra como servicio bajo demanda La pega es

que la empresa parece haber dejado de desarrollar su actividad

ClockingIT

Se trata de una herramienta Web desarrollada en Ruby como

servicio bajo demanda Permite una gestioacuten de tareas agenda

siguiendo el estaacutendar iCal seguimiento de tiempos generacioacuten

de informes notificaciones RSS foros Chat y Wiki repositorio

de ficheros etc

LibreSource

Se trata de una plataforma web colaborativa para el desarrollo de

software lo que se suele denominar forja y funcionalidades de

groupware archivado y publicacioacuten web Es open source y

altamente ajustable Permite alojar muacuteltiples proyectos varios

grupos de usuarios etc Estaacute desarrollada en J2EE e incorpora

entre otras cosas Wiki integracioacuten con Subversion zonas de

descarga gestioacuten documental mensajeriacutea instantaacutenea con

Jabber gestioacuten de incidencias etc No fue evaluada al ser

descubierta posteriormente a la implantacioacuten de la herramienta

elegida pero parece una buena alternativa

Aunque existen infinidad maacutes de entre todas nos decantamos

por dos que valoramos maacutes en profundidad

TeamWork

Se trata de una herramienta web desarrollada en Java por unos

Italianos Entre sus funcionalidades cabe destacar la gestioacuten de

proyectos y tareas con diversos diagramas de Gantt muy

logrados gestioacuten de incidencias gestioacuten documental entorno

colaborativo tipo groupware control de costes registros de

tiempos etc

Es muy completo raacutepido de respuesta y posee caracteriacutesticas

muy interesantes como una interesante y uacutetil navegacioacuten

contextual entre tareas del proyecto perfiles de usuario seguacuten

proyecto importacioacuten de planificaciones desde MS Project o

asociacioacuten entre incidencias y tareas

Cuenta con wizards para la configuracioacuten de la herramienta de

forma raacutepida y sencilla incluyendo la posibilidad de generar

plantillas para aplicar metodologiacuteas aacutegiles (Scrum)

El registro de horas por tarea para un desarrollador se realiza de

forma muy coacutemoda y raacutepida desde una simple vista facilitando

la participacioacuten del mismo

Se trataba de una aplicacioacuten muy completa quizaacutes demasiado

un poco compleja de entender en un comienzo pero con muchas

posibilidades

No obstante teniacutea alguna que otra pega aunque es open source

posee una licencia de pago para su uso que en cualquier caso era

muy pequentildea Tiene una versioacuten de evaluacioacuten de 30 diacuteas para

quien desee probarla antes de decidir Por otro lado no distingue

proyectos existe una tarea padre que agrupa toda la

planificacioacuten asociada tampoco cuenta con Wiki y no gestiona las

vacaciones del personal

La otra herramienta valorada maacutes en profundidad fue

Redmine

Se trata de otra herramienta web en este caso desarrollada en

Ruby on Rails con una gran cantidad de funcionalidades que la

acerca bastante a una forja pero sin tener la complejidad de la

misma Entre sus caracteriacutesticas cabe destacar la gestioacuten de

tareas incidencias diagramas de Gantt calendario de

actividades noticias foros wikis gestioacuten de ficheros y

documentos integracioacuten con Subversioacuten control de tiempos

generacioacuten de informes etc todo esto por proyecto Por

similitudes del interfaz y funcionalidades parece estar basado en

Trac pero con un lavado de cara y de coacutedigo importante ademaacutes

de ser multi-proyecto

Al igual que la anterior tambieacuten poseiacutea una serie de

caracteriacutesticas que la haciacutea diferente como la posible navegacioacuten

anoacutenima de lectura si asiacute se desea sobre los proyectos alojados

Interesante desde el punto de vista de filosofiacutea open source

Posibilidad de definir un perfil distinto por usuario seguacuten el

proyecto en el que participa

Tambieacuten cuenta con sindicacioacuten de RSS para las secciones de

noticias tareas incidencias etc y exportacioacuten a ficheros de texto

y HTML desde la Wiki los informes generados e incluso el

diagrama de Gantt

A parte se trata de un interfaz muy limpio intuitivo sencillo de

usar y rapidiacutesimo

La configuracioacuten de la herramienta resulta asiacute mismo muy

sencilla con un par de clics puedes empezar a funcionar

Cada proyecto puede configurarse con los moacutedulos que desees

que tenga ademaacutes de poder definir campos personalizados por

proyecto y tarea para permitir una mayor adaptacioacuten

Cabe destacar que para esta herramienta existe un uacutenico

concepto denominado peticioacuten que puede ser de tres tipos

tareas soporte o incidencia De esta forma todo se gestiona de

igual forma lo cual lo simplifica pero a su vez puede convertirse

en un volumen ingestionable de tareas Para evitar esto se

pueden definir categoriacuteas a las que pertenece una peticioacuten y

realizar posteriormente filtrados de peticiones en las vistas seguacuten

este y otros paraacutemetros

No obstante no todo iba a ser color de rosa tiene una serie de

limitaciones como el sistema un tanto engorroso de enlazar

peticiones o el hecho de que una vez creada una peticioacuten su

nombre y descripcioacuten no se pueden modificar tan solo ir

antildeadiendo nuevas descripciones

En este punto nos encontraacutebamos en una difiacutecil decisioacuten puesto

que ambas herramientas nos gustaban cubriacutean lo necesario pero

se trataban de herramientas muy distintas en concepcioacuten Para

facilitar la decisioacuten realizamos un cuadro comparando las

caracteriacutesticas y priorizaacutendolas seguacuten nuestro intereacutes El

resultado fue el siguiente

Prioridad Caracteriacutestica Redmine TeamWork

9 Integracioacuten con

LDAP Si Si

8 Integracioacuten con

Subversion Si Si

8 Traducido al espantildeol

Si No

7 Importacioacuten desde

Project No Si

7 Exportacioacuten a

Project No Si

7 Centros de coste Posible mediante los campos

personalizados

Si

7 Wikis de proyectos Si

7 Personalizacioacuten

extensioacuten Si Si

6 Gestioacuten de vacaciones

No Vacaciones a nivel de

empresa

6 Vida de la herramienta

Indeterminado al ser una

herramienta open source

Algo maacutes seguro

porque hay una empresa detraacutes

5 Facilidad de configuracioacuten

Si

5 Usuarios multi-

perfil Si Si

4 Acceso restringido a usuarios

Si Si

3 Sencillez de manejo

Si

2 Seguimiento de

incidencias Si Si

1 Asignacioacuten de tareas

Si Si

1 Imputacioacuten a tareas asignadas

Si Si

Tras una difiacutecil reflexioacuten puesto que ambas se encontraban muy

parejas decidimos decantarnos por Redmine primando la

sencillez y rapidez Existiacutea la posibilidad de que terceros la

empleasen y veiacuteamos que Redmine permitiacutea una mayor facilidad

en su manejo y resultaba maacutes intuitiva de cara a aprender a

utilizarla Posteriormente tras su uso hemos detectado algunos

inconvenientes importantes como la imposibilidad de asignar una

peticioacuten a maacutes de un usuario pero es que no hay herramienta

perfecta

Bibliografiacutea

httpwwwnavegapolisnetcontentview5649

httpwwwsimpleprojectmanagementcomhomehtml

httpwwwweb-based-softwarecomproject

httpenwikipediaorgwikiComparison_of_issue_tracking_syste

ms

httpenwikipediaorgwikiList_of_project_management_softwa

re

httpwwwpmdigestcomsoftware

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Rauacutel Sanz de Acedo

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo Lexers parsers JavaCC (y II)

Texto En este artiacuteculo vamos a utilizar JavaCC como herramienta para

implementar un moacutedulo que resuelva la casuiacutestica de la

impresioacuten de las diversas paacuteginas de un fichero Esto es lo que se

refleja en esta imagen

Para ello en el artiacuteculo anterior definimos esta gramaacutetica a la que

asociamos unas acciones semaacutenticas

inicio --gt inicializacionVariables

listaElementos

procesarDatos

listaElementos --gt elemento

restoListaElementos

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

restoListaElementos --gt SEPARADOR

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

listaElementos

|

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

restoListaElementos2 --gt GUION ENTERO

num2 = valor(ENTERO)

Si (num2 gt maxPaginas)

or (num2==0) ent error

|

JavaCC es una herramienta que dado un fichero de extensioacuten

jj que describe la gramaacutetica y sus acciones semaacutenticas

asociadas genera los ficheros java que la implementan

Estos ficheros java pueden luego obviamente incluirse en

aqueacutellos que conforman el resto de nuestra aplicacioacuten

JavaCC es una herramienta gratuita que puede descargarse

desde aquiacute Existe tambieacuten un plugin para Eclipse Y asimismo

existe una task de Ant para JavaCC

Vamos pues a construir nuestro parser

Lo denominaremos parserImprimePaginasCC y por lo tanto

vamos a editar el fichero parserImprimePaginasCCjj

Indicaremos coacutemo se traducen los tokens y las producciones a

formato JavaCC

TOKEN

ltENTERO([0-9])+gt

| ltGUION -gt

| ltSEPARADOR([ ])+ | ([ ])gt

Los tokens se describen praacutecticamente como lo indicamos en la

gramaacutetica

void inicio()throws elementoFueraLimitesException

resultado = new Vector()

num1 = -1

num2 = -1

inicializaFlags()

listaElementos()

void listaElementos()throws elementoFueraLimitesExcept

ion

elemento() restoListaElementos()

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

restoListaElementos2()

void restoListaElementos()throws elementoFueraLimitesE

xception

ltSEPARADORgt

insertaElemento(num1 num2)

num1 = -1

num2 = -1

listaElementos()

|

insertaElemento(num1 num2)

num1 = -1

num2 = -1

void restoListaElementos2()throws elementoFueraLimites

Exception

ltGUIONgtltENTEROgt

num2 = IntegervalueOf(tokenimage)intValue()

if ((num2gtmaximo)|| (num2 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num2))

|

Las producciones son algo diferentes lo que era

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

ahora es

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(IntegertoS

tring(num1))

restoListaElementos2()

El no terminal elemento se describe como void elemento() y

ademaacutes le hemos asociado una excepcioacuten para controlar el hecho

de que un usuario coloque 0 o un nuacutemero mayor que el

permitido Lo que en la parte derecha es ENTERO se indica

como ltENTEROgt y la invocacioacuten de restoListaElementos2

es restoListaElementos2()

Las acciones semaacutenticas

num1 = valor(ENTERO)

Si (num1 gt maxPaginas) or (num1==0) ent error

se indican en JavaCC asiacute

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

El valor del token actual es accesible a traveacutes de tokenimage

Si deseamos tener coacutedigo Java adicional fuera de las

producciones lo podemos antildeadir de esta forma con la palabra

reservada JAVACODE

JAVACODE void insertaElemento(int num1 int num2)

int aux i iFlag

if ((num1 = -1) ampamp (num2 = -1))

if (num1gtnum2)

aux = num1

num1 = num2

num2 = aux

for (i = num1

i lt= num2

i++)

iFlag = i-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(i))

flags[iFlag] = true

else if (num1 = -1)

iFlag = num1-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num1))

flags[iFlag] = true

else if (num2 = -1)

iFlag = num2-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num2))

flags[iFlag] = true

JAVACODE void inicializaFlags()

int i

flags = new boolean [maximo]

for (i = 0

iltmaximo

i++)

flags[i] = false

Ademaacutes podemos inicializar el parser e instanciarlo de esta

forma

PARSER_BEGIN(parserImprimePaginasCC)

import javaio

import javautilVector

public class parserImprimePaginasCC

public static int maximo

public static Vector resultado

private static int num1 num2

private static boolean flags[]

public static void main(String[]args)throws Exceptio

n

Reader r = new StringReader(args[0])

parserImprimePaginasCC p

= new parserImprimePaginasCC(r)

try

pmaximo = 50

Systemoutprintln(Maacuteximo +pmaximo)

pinicio()

Systemoutprintln(OKn)

for (int j = 0

jltpresultadosize()

j++)

Systemoutprint(presultadoelementAt(j)+

)

Systemoutprintln()

catch (ParseException e)

Systemoutprintln(Error de sintaxis)

catch (TokenMgrError e)

Systemoutprintln(Error leacutexico)

catch (elementoFueraLimitesException e)

Systemoutprintln(egetMessage())

PARSER_END(parserImprimePaginasCC)

En este caso tomaremos la entrada de lo que el usuario

introduzca por teclado pero se pueden tomar los datos a traveacutes

de ficheros o pasarlos como variables

Se hace referencia a una excepcioacuten que hemos definido asiacute en un

fichero llamado elementoFueraLimitesExceptionjava

public class elementoFueraLimitesException extends Exc

eption

Constructor

public elementoFueraLimitesException()

super()

public elementoFueraLimitesException(String msg)

super(msg)

Una vez salvado el fichero parserImprimePaginasCCjj podemos

generar la documentacioacuten de la gramaacutetica en formato HTML de

esta forma

Nota en la ejecucioacuten de estos ejemplos se ha utilizado la liacutenea de comandos de

Windows pero se podriacutea haber hecho a traveacutes de cualquier sistema que soporte

el lenguaje Java

gtjjdoc parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Documentation

Generator Version 014)

(type jjdoc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Grammar documentation generated successfully in

parserImprimePaginasCChtml

Se genera el fichero parserImprimePaginasCChtmlcuyo

contenido es

BNF for parserImprimePaginasCCjj NON-TERMINALS

inicio = listaElementos

listaElementos = elemento restoListaElementos

elemento = ltENTEROgt restoListaElementos2

restoListaElementos = ltSEPARADORgt listaElementos

|

restoListaElementos2 = ltGUIONgt ltENTEROgt

|

insertaElemento = java code

inicializaFlags = java code

Nota BNF es el tipo de notacioacuten que estamos utilizando a lo largo de estos

artiacuteculos

Compilamos el parser

gtjavacc parser ImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

File TokenMgrErrorjava does not exist Will create

one

File ParseExceptionjava does not exist Will

create one

File Tokenjava does not exist Will create one

File SimpleCharStreamjava does not exist Will

create one

Parser generated successfully

y entonces se generan estos ficheros

ParseExceptionjava --gt

Excepcioacuten generada por el parser cuando un error es encontrado

parserImprimePaginasCCjava --gt La

traduccioacuten de nuestro fichero jj a java

parserImprimePaginasCCConstantsjava --gt Los

valores de los tokens

parserImprimePaginasCCTokenManagerjava --gt El

analizador leacutexico

SimpleCharStreamjava --gt

Contiene coacutedigo para leer caracteres de cualquier

implementacioacuten de javaioInputStream o javaioReader

Tokenjava --gt

Definicioacuten de la clase Token

TokenMgrErrorjava --gt

Diversos errores que puede producir el lexer

Ahora los compilamos y antildeadimos el fichero

elementoFueraLimitesExceptionjava en dicha compilacioacuten

javac java

Y vamos a ejecutar el parser suponiendo que el maacuteximo nuacutemero

de paacuteginas a impmir es 50 (como hemos indicado con pmaximo =

50)

Lo que obtenemos como salida es la lista de paacuteginas a imprimir o

un mensaje de error

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

OK

2 5 6 7 8

java -classpath laboratorioParsers

parserImprimePaginasCC 28-3046

Num paginas 50

OK

28 29 30 4 6

java -classpath laboratorioParsers

parserImprimePaginasCC 43-51

Num paginas 50

Introdujo un numero superior al maximo51

java -classpath laboratorioParsers

parserImprimePaginasCC 43--51

Num paginas 50

Error de sintaxisEncountered - at line 1

column 4

Was expecting

ltENTEROgt

iquestQueacute pasa si algo ha ido mal iquestPodemos depurar el parser de

alguna forma

Por supuesto podemos compilar el parser asiacute para obtener una

traza de la ejecucioacuten

javacc -DEBUG_PARSER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Consumed token lt- at line 1 column 4gt

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

En la traza vemos coacutemo el parser va invocando la diferentes

producciones

Podemos tambieacuten depurar el lexer

javacc -DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Returning the ltEOFgt token

OK

2 5 6 7 8

O combinar ambas trazas

javacc -DEBUG_PARSER -

DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Consumed token lt- at line 1 column 4gt

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Returning the ltEOFgt token

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

Conclusioacuten los generadores de parsers son herramientas

potentes que sirven para resolver problemas de una manera

bdquolimpia‟ y elegante Puede que su nombre retraiga a los

desarrolladores (ldquoiquestPara queacute quiero un generador de

compiladoresrdquo) pero es una opcioacuten a tener en cuenta

Ficheros para descargar

Referencias

- Generating Parsers with JavaCC

- The JavaCC FAQ

Si quieres enviar alguacuten comentario o sugerir temas a tratar en otros artiacuteculos escribe a

curtasun[simboloArroba]ceines

Categor

iacuteas

CES OpenSouceJava

Tema Desarrollo

Autor Carlos Urtasun

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo XSL-FO (Parte 1)

Texto XSL-FO Introduccioacuten El estaacutendar XSL tal y como estaacute definido actualmente se

divide en dos grandes partes -XSLT transformacioacuten de un documento de entrada XML en

alguacuten tipo de documento de salida ya sea XML HTML PDF etc -Formatting Objects (FO) definen la visualizacioacuten final del

resultado de la transformacioacuten Son una implementacioacuten especiacutefica de un determinado XSLT y aplicados a un

fichero XML nos proporcionan otro fichero con la informacioacuten de eacuteste renderizada a alguacuten formato de visualizacioacuten impresa Eacutesta es quizaacute la principal diferencia entre un FO y

otros XSLT ambos transforman un documento XML en otro documento XML pero FO estaacute pensado para generar

directamente una renderizacioacuten

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 19: Cesnavarra 2008-boletín 7

Aunque existen infinidad maacutes de entre todas nos decantamos

por dos que valoramos maacutes en profundidad

TeamWork

Se trata de una herramienta web desarrollada en Java por unos

Italianos Entre sus funcionalidades cabe destacar la gestioacuten de

proyectos y tareas con diversos diagramas de Gantt muy

logrados gestioacuten de incidencias gestioacuten documental entorno

colaborativo tipo groupware control de costes registros de

tiempos etc

Es muy completo raacutepido de respuesta y posee caracteriacutesticas

muy interesantes como una interesante y uacutetil navegacioacuten

contextual entre tareas del proyecto perfiles de usuario seguacuten

proyecto importacioacuten de planificaciones desde MS Project o

asociacioacuten entre incidencias y tareas

Cuenta con wizards para la configuracioacuten de la herramienta de

forma raacutepida y sencilla incluyendo la posibilidad de generar

plantillas para aplicar metodologiacuteas aacutegiles (Scrum)

El registro de horas por tarea para un desarrollador se realiza de

forma muy coacutemoda y raacutepida desde una simple vista facilitando

la participacioacuten del mismo

Se trataba de una aplicacioacuten muy completa quizaacutes demasiado

un poco compleja de entender en un comienzo pero con muchas

posibilidades

No obstante teniacutea alguna que otra pega aunque es open source

posee una licencia de pago para su uso que en cualquier caso era

muy pequentildea Tiene una versioacuten de evaluacioacuten de 30 diacuteas para

quien desee probarla antes de decidir Por otro lado no distingue

proyectos existe una tarea padre que agrupa toda la

planificacioacuten asociada tampoco cuenta con Wiki y no gestiona las

vacaciones del personal

La otra herramienta valorada maacutes en profundidad fue

Redmine

Se trata de otra herramienta web en este caso desarrollada en

Ruby on Rails con una gran cantidad de funcionalidades que la

acerca bastante a una forja pero sin tener la complejidad de la

misma Entre sus caracteriacutesticas cabe destacar la gestioacuten de

tareas incidencias diagramas de Gantt calendario de

actividades noticias foros wikis gestioacuten de ficheros y

documentos integracioacuten con Subversioacuten control de tiempos

generacioacuten de informes etc todo esto por proyecto Por

similitudes del interfaz y funcionalidades parece estar basado en

Trac pero con un lavado de cara y de coacutedigo importante ademaacutes

de ser multi-proyecto

Al igual que la anterior tambieacuten poseiacutea una serie de

caracteriacutesticas que la haciacutea diferente como la posible navegacioacuten

anoacutenima de lectura si asiacute se desea sobre los proyectos alojados

Interesante desde el punto de vista de filosofiacutea open source

Posibilidad de definir un perfil distinto por usuario seguacuten el

proyecto en el que participa

Tambieacuten cuenta con sindicacioacuten de RSS para las secciones de

noticias tareas incidencias etc y exportacioacuten a ficheros de texto

y HTML desde la Wiki los informes generados e incluso el

diagrama de Gantt

A parte se trata de un interfaz muy limpio intuitivo sencillo de

usar y rapidiacutesimo

La configuracioacuten de la herramienta resulta asiacute mismo muy

sencilla con un par de clics puedes empezar a funcionar

Cada proyecto puede configurarse con los moacutedulos que desees

que tenga ademaacutes de poder definir campos personalizados por

proyecto y tarea para permitir una mayor adaptacioacuten

Cabe destacar que para esta herramienta existe un uacutenico

concepto denominado peticioacuten que puede ser de tres tipos

tareas soporte o incidencia De esta forma todo se gestiona de

igual forma lo cual lo simplifica pero a su vez puede convertirse

en un volumen ingestionable de tareas Para evitar esto se

pueden definir categoriacuteas a las que pertenece una peticioacuten y

realizar posteriormente filtrados de peticiones en las vistas seguacuten

este y otros paraacutemetros

No obstante no todo iba a ser color de rosa tiene una serie de

limitaciones como el sistema un tanto engorroso de enlazar

peticiones o el hecho de que una vez creada una peticioacuten su

nombre y descripcioacuten no se pueden modificar tan solo ir

antildeadiendo nuevas descripciones

En este punto nos encontraacutebamos en una difiacutecil decisioacuten puesto

que ambas herramientas nos gustaban cubriacutean lo necesario pero

se trataban de herramientas muy distintas en concepcioacuten Para

facilitar la decisioacuten realizamos un cuadro comparando las

caracteriacutesticas y priorizaacutendolas seguacuten nuestro intereacutes El

resultado fue el siguiente

Prioridad Caracteriacutestica Redmine TeamWork

9 Integracioacuten con

LDAP Si Si

8 Integracioacuten con

Subversion Si Si

8 Traducido al espantildeol

Si No

7 Importacioacuten desde

Project No Si

7 Exportacioacuten a

Project No Si

7 Centros de coste Posible mediante los campos

personalizados

Si

7 Wikis de proyectos Si

7 Personalizacioacuten

extensioacuten Si Si

6 Gestioacuten de vacaciones

No Vacaciones a nivel de

empresa

6 Vida de la herramienta

Indeterminado al ser una

herramienta open source

Algo maacutes seguro

porque hay una empresa detraacutes

5 Facilidad de configuracioacuten

Si

5 Usuarios multi-

perfil Si Si

4 Acceso restringido a usuarios

Si Si

3 Sencillez de manejo

Si

2 Seguimiento de

incidencias Si Si

1 Asignacioacuten de tareas

Si Si

1 Imputacioacuten a tareas asignadas

Si Si

Tras una difiacutecil reflexioacuten puesto que ambas se encontraban muy

parejas decidimos decantarnos por Redmine primando la

sencillez y rapidez Existiacutea la posibilidad de que terceros la

empleasen y veiacuteamos que Redmine permitiacutea una mayor facilidad

en su manejo y resultaba maacutes intuitiva de cara a aprender a

utilizarla Posteriormente tras su uso hemos detectado algunos

inconvenientes importantes como la imposibilidad de asignar una

peticioacuten a maacutes de un usuario pero es que no hay herramienta

perfecta

Bibliografiacutea

httpwwwnavegapolisnetcontentview5649

httpwwwsimpleprojectmanagementcomhomehtml

httpwwwweb-based-softwarecomproject

httpenwikipediaorgwikiComparison_of_issue_tracking_syste

ms

httpenwikipediaorgwikiList_of_project_management_softwa

re

httpwwwpmdigestcomsoftware

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Rauacutel Sanz de Acedo

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo Lexers parsers JavaCC (y II)

Texto En este artiacuteculo vamos a utilizar JavaCC como herramienta para

implementar un moacutedulo que resuelva la casuiacutestica de la

impresioacuten de las diversas paacuteginas de un fichero Esto es lo que se

refleja en esta imagen

Para ello en el artiacuteculo anterior definimos esta gramaacutetica a la que

asociamos unas acciones semaacutenticas

inicio --gt inicializacionVariables

listaElementos

procesarDatos

listaElementos --gt elemento

restoListaElementos

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

restoListaElementos --gt SEPARADOR

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

listaElementos

|

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

restoListaElementos2 --gt GUION ENTERO

num2 = valor(ENTERO)

Si (num2 gt maxPaginas)

or (num2==0) ent error

|

JavaCC es una herramienta que dado un fichero de extensioacuten

jj que describe la gramaacutetica y sus acciones semaacutenticas

asociadas genera los ficheros java que la implementan

Estos ficheros java pueden luego obviamente incluirse en

aqueacutellos que conforman el resto de nuestra aplicacioacuten

JavaCC es una herramienta gratuita que puede descargarse

desde aquiacute Existe tambieacuten un plugin para Eclipse Y asimismo

existe una task de Ant para JavaCC

Vamos pues a construir nuestro parser

Lo denominaremos parserImprimePaginasCC y por lo tanto

vamos a editar el fichero parserImprimePaginasCCjj

Indicaremos coacutemo se traducen los tokens y las producciones a

formato JavaCC

TOKEN

ltENTERO([0-9])+gt

| ltGUION -gt

| ltSEPARADOR([ ])+ | ([ ])gt

Los tokens se describen praacutecticamente como lo indicamos en la

gramaacutetica

void inicio()throws elementoFueraLimitesException

resultado = new Vector()

num1 = -1

num2 = -1

inicializaFlags()

listaElementos()

void listaElementos()throws elementoFueraLimitesExcept

ion

elemento() restoListaElementos()

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

restoListaElementos2()

void restoListaElementos()throws elementoFueraLimitesE

xception

ltSEPARADORgt

insertaElemento(num1 num2)

num1 = -1

num2 = -1

listaElementos()

|

insertaElemento(num1 num2)

num1 = -1

num2 = -1

void restoListaElementos2()throws elementoFueraLimites

Exception

ltGUIONgtltENTEROgt

num2 = IntegervalueOf(tokenimage)intValue()

if ((num2gtmaximo)|| (num2 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num2))

|

Las producciones son algo diferentes lo que era

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

ahora es

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(IntegertoS

tring(num1))

restoListaElementos2()

El no terminal elemento se describe como void elemento() y

ademaacutes le hemos asociado una excepcioacuten para controlar el hecho

de que un usuario coloque 0 o un nuacutemero mayor que el

permitido Lo que en la parte derecha es ENTERO se indica

como ltENTEROgt y la invocacioacuten de restoListaElementos2

es restoListaElementos2()

Las acciones semaacutenticas

num1 = valor(ENTERO)

Si (num1 gt maxPaginas) or (num1==0) ent error

se indican en JavaCC asiacute

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

El valor del token actual es accesible a traveacutes de tokenimage

Si deseamos tener coacutedigo Java adicional fuera de las

producciones lo podemos antildeadir de esta forma con la palabra

reservada JAVACODE

JAVACODE void insertaElemento(int num1 int num2)

int aux i iFlag

if ((num1 = -1) ampamp (num2 = -1))

if (num1gtnum2)

aux = num1

num1 = num2

num2 = aux

for (i = num1

i lt= num2

i++)

iFlag = i-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(i))

flags[iFlag] = true

else if (num1 = -1)

iFlag = num1-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num1))

flags[iFlag] = true

else if (num2 = -1)

iFlag = num2-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num2))

flags[iFlag] = true

JAVACODE void inicializaFlags()

int i

flags = new boolean [maximo]

for (i = 0

iltmaximo

i++)

flags[i] = false

Ademaacutes podemos inicializar el parser e instanciarlo de esta

forma

PARSER_BEGIN(parserImprimePaginasCC)

import javaio

import javautilVector

public class parserImprimePaginasCC

public static int maximo

public static Vector resultado

private static int num1 num2

private static boolean flags[]

public static void main(String[]args)throws Exceptio

n

Reader r = new StringReader(args[0])

parserImprimePaginasCC p

= new parserImprimePaginasCC(r)

try

pmaximo = 50

Systemoutprintln(Maacuteximo +pmaximo)

pinicio()

Systemoutprintln(OKn)

for (int j = 0

jltpresultadosize()

j++)

Systemoutprint(presultadoelementAt(j)+

)

Systemoutprintln()

catch (ParseException e)

Systemoutprintln(Error de sintaxis)

catch (TokenMgrError e)

Systemoutprintln(Error leacutexico)

catch (elementoFueraLimitesException e)

Systemoutprintln(egetMessage())

PARSER_END(parserImprimePaginasCC)

En este caso tomaremos la entrada de lo que el usuario

introduzca por teclado pero se pueden tomar los datos a traveacutes

de ficheros o pasarlos como variables

Se hace referencia a una excepcioacuten que hemos definido asiacute en un

fichero llamado elementoFueraLimitesExceptionjava

public class elementoFueraLimitesException extends Exc

eption

Constructor

public elementoFueraLimitesException()

super()

public elementoFueraLimitesException(String msg)

super(msg)

Una vez salvado el fichero parserImprimePaginasCCjj podemos

generar la documentacioacuten de la gramaacutetica en formato HTML de

esta forma

Nota en la ejecucioacuten de estos ejemplos se ha utilizado la liacutenea de comandos de

Windows pero se podriacutea haber hecho a traveacutes de cualquier sistema que soporte

el lenguaje Java

gtjjdoc parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Documentation

Generator Version 014)

(type jjdoc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Grammar documentation generated successfully in

parserImprimePaginasCChtml

Se genera el fichero parserImprimePaginasCChtmlcuyo

contenido es

BNF for parserImprimePaginasCCjj NON-TERMINALS

inicio = listaElementos

listaElementos = elemento restoListaElementos

elemento = ltENTEROgt restoListaElementos2

restoListaElementos = ltSEPARADORgt listaElementos

|

restoListaElementos2 = ltGUIONgt ltENTEROgt

|

insertaElemento = java code

inicializaFlags = java code

Nota BNF es el tipo de notacioacuten que estamos utilizando a lo largo de estos

artiacuteculos

Compilamos el parser

gtjavacc parser ImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

File TokenMgrErrorjava does not exist Will create

one

File ParseExceptionjava does not exist Will

create one

File Tokenjava does not exist Will create one

File SimpleCharStreamjava does not exist Will

create one

Parser generated successfully

y entonces se generan estos ficheros

ParseExceptionjava --gt

Excepcioacuten generada por el parser cuando un error es encontrado

parserImprimePaginasCCjava --gt La

traduccioacuten de nuestro fichero jj a java

parserImprimePaginasCCConstantsjava --gt Los

valores de los tokens

parserImprimePaginasCCTokenManagerjava --gt El

analizador leacutexico

SimpleCharStreamjava --gt

Contiene coacutedigo para leer caracteres de cualquier

implementacioacuten de javaioInputStream o javaioReader

Tokenjava --gt

Definicioacuten de la clase Token

TokenMgrErrorjava --gt

Diversos errores que puede producir el lexer

Ahora los compilamos y antildeadimos el fichero

elementoFueraLimitesExceptionjava en dicha compilacioacuten

javac java

Y vamos a ejecutar el parser suponiendo que el maacuteximo nuacutemero

de paacuteginas a impmir es 50 (como hemos indicado con pmaximo =

50)

Lo que obtenemos como salida es la lista de paacuteginas a imprimir o

un mensaje de error

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

OK

2 5 6 7 8

java -classpath laboratorioParsers

parserImprimePaginasCC 28-3046

Num paginas 50

OK

28 29 30 4 6

java -classpath laboratorioParsers

parserImprimePaginasCC 43-51

Num paginas 50

Introdujo un numero superior al maximo51

java -classpath laboratorioParsers

parserImprimePaginasCC 43--51

Num paginas 50

Error de sintaxisEncountered - at line 1

column 4

Was expecting

ltENTEROgt

iquestQueacute pasa si algo ha ido mal iquestPodemos depurar el parser de

alguna forma

Por supuesto podemos compilar el parser asiacute para obtener una

traza de la ejecucioacuten

javacc -DEBUG_PARSER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Consumed token lt- at line 1 column 4gt

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

En la traza vemos coacutemo el parser va invocando la diferentes

producciones

Podemos tambieacuten depurar el lexer

javacc -DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Returning the ltEOFgt token

OK

2 5 6 7 8

O combinar ambas trazas

javacc -DEBUG_PARSER -

DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Consumed token lt- at line 1 column 4gt

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Returning the ltEOFgt token

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

Conclusioacuten los generadores de parsers son herramientas

potentes que sirven para resolver problemas de una manera

bdquolimpia‟ y elegante Puede que su nombre retraiga a los

desarrolladores (ldquoiquestPara queacute quiero un generador de

compiladoresrdquo) pero es una opcioacuten a tener en cuenta

Ficheros para descargar

Referencias

- Generating Parsers with JavaCC

- The JavaCC FAQ

Si quieres enviar alguacuten comentario o sugerir temas a tratar en otros artiacuteculos escribe a

curtasun[simboloArroba]ceines

Categor

iacuteas

CES OpenSouceJava

Tema Desarrollo

Autor Carlos Urtasun

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo XSL-FO (Parte 1)

Texto XSL-FO Introduccioacuten El estaacutendar XSL tal y como estaacute definido actualmente se

divide en dos grandes partes -XSLT transformacioacuten de un documento de entrada XML en

alguacuten tipo de documento de salida ya sea XML HTML PDF etc -Formatting Objects (FO) definen la visualizacioacuten final del

resultado de la transformacioacuten Son una implementacioacuten especiacutefica de un determinado XSLT y aplicados a un

fichero XML nos proporcionan otro fichero con la informacioacuten de eacuteste renderizada a alguacuten formato de visualizacioacuten impresa Eacutesta es quizaacute la principal diferencia entre un FO y

otros XSLT ambos transforman un documento XML en otro documento XML pero FO estaacute pensado para generar

directamente una renderizacioacuten

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 20: Cesnavarra 2008-boletín 7

vacaciones del personal

La otra herramienta valorada maacutes en profundidad fue

Redmine

Se trata de otra herramienta web en este caso desarrollada en

Ruby on Rails con una gran cantidad de funcionalidades que la

acerca bastante a una forja pero sin tener la complejidad de la

misma Entre sus caracteriacutesticas cabe destacar la gestioacuten de

tareas incidencias diagramas de Gantt calendario de

actividades noticias foros wikis gestioacuten de ficheros y

documentos integracioacuten con Subversioacuten control de tiempos

generacioacuten de informes etc todo esto por proyecto Por

similitudes del interfaz y funcionalidades parece estar basado en

Trac pero con un lavado de cara y de coacutedigo importante ademaacutes

de ser multi-proyecto

Al igual que la anterior tambieacuten poseiacutea una serie de

caracteriacutesticas que la haciacutea diferente como la posible navegacioacuten

anoacutenima de lectura si asiacute se desea sobre los proyectos alojados

Interesante desde el punto de vista de filosofiacutea open source

Posibilidad de definir un perfil distinto por usuario seguacuten el

proyecto en el que participa

Tambieacuten cuenta con sindicacioacuten de RSS para las secciones de

noticias tareas incidencias etc y exportacioacuten a ficheros de texto

y HTML desde la Wiki los informes generados e incluso el

diagrama de Gantt

A parte se trata de un interfaz muy limpio intuitivo sencillo de

usar y rapidiacutesimo

La configuracioacuten de la herramienta resulta asiacute mismo muy

sencilla con un par de clics puedes empezar a funcionar

Cada proyecto puede configurarse con los moacutedulos que desees

que tenga ademaacutes de poder definir campos personalizados por

proyecto y tarea para permitir una mayor adaptacioacuten

Cabe destacar que para esta herramienta existe un uacutenico

concepto denominado peticioacuten que puede ser de tres tipos

tareas soporte o incidencia De esta forma todo se gestiona de

igual forma lo cual lo simplifica pero a su vez puede convertirse

en un volumen ingestionable de tareas Para evitar esto se

pueden definir categoriacuteas a las que pertenece una peticioacuten y

realizar posteriormente filtrados de peticiones en las vistas seguacuten

este y otros paraacutemetros

No obstante no todo iba a ser color de rosa tiene una serie de

limitaciones como el sistema un tanto engorroso de enlazar

peticiones o el hecho de que una vez creada una peticioacuten su

nombre y descripcioacuten no se pueden modificar tan solo ir

antildeadiendo nuevas descripciones

En este punto nos encontraacutebamos en una difiacutecil decisioacuten puesto

que ambas herramientas nos gustaban cubriacutean lo necesario pero

se trataban de herramientas muy distintas en concepcioacuten Para

facilitar la decisioacuten realizamos un cuadro comparando las

caracteriacutesticas y priorizaacutendolas seguacuten nuestro intereacutes El

resultado fue el siguiente

Prioridad Caracteriacutestica Redmine TeamWork

9 Integracioacuten con

LDAP Si Si

8 Integracioacuten con

Subversion Si Si

8 Traducido al espantildeol

Si No

7 Importacioacuten desde

Project No Si

7 Exportacioacuten a

Project No Si

7 Centros de coste Posible mediante los campos

personalizados

Si

7 Wikis de proyectos Si

7 Personalizacioacuten

extensioacuten Si Si

6 Gestioacuten de vacaciones

No Vacaciones a nivel de

empresa

6 Vida de la herramienta

Indeterminado al ser una

herramienta open source

Algo maacutes seguro

porque hay una empresa detraacutes

5 Facilidad de configuracioacuten

Si

5 Usuarios multi-

perfil Si Si

4 Acceso restringido a usuarios

Si Si

3 Sencillez de manejo

Si

2 Seguimiento de

incidencias Si Si

1 Asignacioacuten de tareas

Si Si

1 Imputacioacuten a tareas asignadas

Si Si

Tras una difiacutecil reflexioacuten puesto que ambas se encontraban muy

parejas decidimos decantarnos por Redmine primando la

sencillez y rapidez Existiacutea la posibilidad de que terceros la

empleasen y veiacuteamos que Redmine permitiacutea una mayor facilidad

en su manejo y resultaba maacutes intuitiva de cara a aprender a

utilizarla Posteriormente tras su uso hemos detectado algunos

inconvenientes importantes como la imposibilidad de asignar una

peticioacuten a maacutes de un usuario pero es que no hay herramienta

perfecta

Bibliografiacutea

httpwwwnavegapolisnetcontentview5649

httpwwwsimpleprojectmanagementcomhomehtml

httpwwwweb-based-softwarecomproject

httpenwikipediaorgwikiComparison_of_issue_tracking_syste

ms

httpenwikipediaorgwikiList_of_project_management_softwa

re

httpwwwpmdigestcomsoftware

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Rauacutel Sanz de Acedo

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo Lexers parsers JavaCC (y II)

Texto En este artiacuteculo vamos a utilizar JavaCC como herramienta para

implementar un moacutedulo que resuelva la casuiacutestica de la

impresioacuten de las diversas paacuteginas de un fichero Esto es lo que se

refleja en esta imagen

Para ello en el artiacuteculo anterior definimos esta gramaacutetica a la que

asociamos unas acciones semaacutenticas

inicio --gt inicializacionVariables

listaElementos

procesarDatos

listaElementos --gt elemento

restoListaElementos

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

restoListaElementos --gt SEPARADOR

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

listaElementos

|

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

restoListaElementos2 --gt GUION ENTERO

num2 = valor(ENTERO)

Si (num2 gt maxPaginas)

or (num2==0) ent error

|

JavaCC es una herramienta que dado un fichero de extensioacuten

jj que describe la gramaacutetica y sus acciones semaacutenticas

asociadas genera los ficheros java que la implementan

Estos ficheros java pueden luego obviamente incluirse en

aqueacutellos que conforman el resto de nuestra aplicacioacuten

JavaCC es una herramienta gratuita que puede descargarse

desde aquiacute Existe tambieacuten un plugin para Eclipse Y asimismo

existe una task de Ant para JavaCC

Vamos pues a construir nuestro parser

Lo denominaremos parserImprimePaginasCC y por lo tanto

vamos a editar el fichero parserImprimePaginasCCjj

Indicaremos coacutemo se traducen los tokens y las producciones a

formato JavaCC

TOKEN

ltENTERO([0-9])+gt

| ltGUION -gt

| ltSEPARADOR([ ])+ | ([ ])gt

Los tokens se describen praacutecticamente como lo indicamos en la

gramaacutetica

void inicio()throws elementoFueraLimitesException

resultado = new Vector()

num1 = -1

num2 = -1

inicializaFlags()

listaElementos()

void listaElementos()throws elementoFueraLimitesExcept

ion

elemento() restoListaElementos()

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

restoListaElementos2()

void restoListaElementos()throws elementoFueraLimitesE

xception

ltSEPARADORgt

insertaElemento(num1 num2)

num1 = -1

num2 = -1

listaElementos()

|

insertaElemento(num1 num2)

num1 = -1

num2 = -1

void restoListaElementos2()throws elementoFueraLimites

Exception

ltGUIONgtltENTEROgt

num2 = IntegervalueOf(tokenimage)intValue()

if ((num2gtmaximo)|| (num2 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num2))

|

Las producciones son algo diferentes lo que era

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

ahora es

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(IntegertoS

tring(num1))

restoListaElementos2()

El no terminal elemento se describe como void elemento() y

ademaacutes le hemos asociado una excepcioacuten para controlar el hecho

de que un usuario coloque 0 o un nuacutemero mayor que el

permitido Lo que en la parte derecha es ENTERO se indica

como ltENTEROgt y la invocacioacuten de restoListaElementos2

es restoListaElementos2()

Las acciones semaacutenticas

num1 = valor(ENTERO)

Si (num1 gt maxPaginas) or (num1==0) ent error

se indican en JavaCC asiacute

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

El valor del token actual es accesible a traveacutes de tokenimage

Si deseamos tener coacutedigo Java adicional fuera de las

producciones lo podemos antildeadir de esta forma con la palabra

reservada JAVACODE

JAVACODE void insertaElemento(int num1 int num2)

int aux i iFlag

if ((num1 = -1) ampamp (num2 = -1))

if (num1gtnum2)

aux = num1

num1 = num2

num2 = aux

for (i = num1

i lt= num2

i++)

iFlag = i-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(i))

flags[iFlag] = true

else if (num1 = -1)

iFlag = num1-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num1))

flags[iFlag] = true

else if (num2 = -1)

iFlag = num2-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num2))

flags[iFlag] = true

JAVACODE void inicializaFlags()

int i

flags = new boolean [maximo]

for (i = 0

iltmaximo

i++)

flags[i] = false

Ademaacutes podemos inicializar el parser e instanciarlo de esta

forma

PARSER_BEGIN(parserImprimePaginasCC)

import javaio

import javautilVector

public class parserImprimePaginasCC

public static int maximo

public static Vector resultado

private static int num1 num2

private static boolean flags[]

public static void main(String[]args)throws Exceptio

n

Reader r = new StringReader(args[0])

parserImprimePaginasCC p

= new parserImprimePaginasCC(r)

try

pmaximo = 50

Systemoutprintln(Maacuteximo +pmaximo)

pinicio()

Systemoutprintln(OKn)

for (int j = 0

jltpresultadosize()

j++)

Systemoutprint(presultadoelementAt(j)+

)

Systemoutprintln()

catch (ParseException e)

Systemoutprintln(Error de sintaxis)

catch (TokenMgrError e)

Systemoutprintln(Error leacutexico)

catch (elementoFueraLimitesException e)

Systemoutprintln(egetMessage())

PARSER_END(parserImprimePaginasCC)

En este caso tomaremos la entrada de lo que el usuario

introduzca por teclado pero se pueden tomar los datos a traveacutes

de ficheros o pasarlos como variables

Se hace referencia a una excepcioacuten que hemos definido asiacute en un

fichero llamado elementoFueraLimitesExceptionjava

public class elementoFueraLimitesException extends Exc

eption

Constructor

public elementoFueraLimitesException()

super()

public elementoFueraLimitesException(String msg)

super(msg)

Una vez salvado el fichero parserImprimePaginasCCjj podemos

generar la documentacioacuten de la gramaacutetica en formato HTML de

esta forma

Nota en la ejecucioacuten de estos ejemplos se ha utilizado la liacutenea de comandos de

Windows pero se podriacutea haber hecho a traveacutes de cualquier sistema que soporte

el lenguaje Java

gtjjdoc parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Documentation

Generator Version 014)

(type jjdoc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Grammar documentation generated successfully in

parserImprimePaginasCChtml

Se genera el fichero parserImprimePaginasCChtmlcuyo

contenido es

BNF for parserImprimePaginasCCjj NON-TERMINALS

inicio = listaElementos

listaElementos = elemento restoListaElementos

elemento = ltENTEROgt restoListaElementos2

restoListaElementos = ltSEPARADORgt listaElementos

|

restoListaElementos2 = ltGUIONgt ltENTEROgt

|

insertaElemento = java code

inicializaFlags = java code

Nota BNF es el tipo de notacioacuten que estamos utilizando a lo largo de estos

artiacuteculos

Compilamos el parser

gtjavacc parser ImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

File TokenMgrErrorjava does not exist Will create

one

File ParseExceptionjava does not exist Will

create one

File Tokenjava does not exist Will create one

File SimpleCharStreamjava does not exist Will

create one

Parser generated successfully

y entonces se generan estos ficheros

ParseExceptionjava --gt

Excepcioacuten generada por el parser cuando un error es encontrado

parserImprimePaginasCCjava --gt La

traduccioacuten de nuestro fichero jj a java

parserImprimePaginasCCConstantsjava --gt Los

valores de los tokens

parserImprimePaginasCCTokenManagerjava --gt El

analizador leacutexico

SimpleCharStreamjava --gt

Contiene coacutedigo para leer caracteres de cualquier

implementacioacuten de javaioInputStream o javaioReader

Tokenjava --gt

Definicioacuten de la clase Token

TokenMgrErrorjava --gt

Diversos errores que puede producir el lexer

Ahora los compilamos y antildeadimos el fichero

elementoFueraLimitesExceptionjava en dicha compilacioacuten

javac java

Y vamos a ejecutar el parser suponiendo que el maacuteximo nuacutemero

de paacuteginas a impmir es 50 (como hemos indicado con pmaximo =

50)

Lo que obtenemos como salida es la lista de paacuteginas a imprimir o

un mensaje de error

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

OK

2 5 6 7 8

java -classpath laboratorioParsers

parserImprimePaginasCC 28-3046

Num paginas 50

OK

28 29 30 4 6

java -classpath laboratorioParsers

parserImprimePaginasCC 43-51

Num paginas 50

Introdujo un numero superior al maximo51

java -classpath laboratorioParsers

parserImprimePaginasCC 43--51

Num paginas 50

Error de sintaxisEncountered - at line 1

column 4

Was expecting

ltENTEROgt

iquestQueacute pasa si algo ha ido mal iquestPodemos depurar el parser de

alguna forma

Por supuesto podemos compilar el parser asiacute para obtener una

traza de la ejecucioacuten

javacc -DEBUG_PARSER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Consumed token lt- at line 1 column 4gt

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

En la traza vemos coacutemo el parser va invocando la diferentes

producciones

Podemos tambieacuten depurar el lexer

javacc -DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Returning the ltEOFgt token

OK

2 5 6 7 8

O combinar ambas trazas

javacc -DEBUG_PARSER -

DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Consumed token lt- at line 1 column 4gt

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Returning the ltEOFgt token

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

Conclusioacuten los generadores de parsers son herramientas

potentes que sirven para resolver problemas de una manera

bdquolimpia‟ y elegante Puede que su nombre retraiga a los

desarrolladores (ldquoiquestPara queacute quiero un generador de

compiladoresrdquo) pero es una opcioacuten a tener en cuenta

Ficheros para descargar

Referencias

- Generating Parsers with JavaCC

- The JavaCC FAQ

Si quieres enviar alguacuten comentario o sugerir temas a tratar en otros artiacuteculos escribe a

curtasun[simboloArroba]ceines

Categor

iacuteas

CES OpenSouceJava

Tema Desarrollo

Autor Carlos Urtasun

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo XSL-FO (Parte 1)

Texto XSL-FO Introduccioacuten El estaacutendar XSL tal y como estaacute definido actualmente se

divide en dos grandes partes -XSLT transformacioacuten de un documento de entrada XML en

alguacuten tipo de documento de salida ya sea XML HTML PDF etc -Formatting Objects (FO) definen la visualizacioacuten final del

resultado de la transformacioacuten Son una implementacioacuten especiacutefica de un determinado XSLT y aplicados a un

fichero XML nos proporcionan otro fichero con la informacioacuten de eacuteste renderizada a alguacuten formato de visualizacioacuten impresa Eacutesta es quizaacute la principal diferencia entre un FO y

otros XSLT ambos transforman un documento XML en otro documento XML pero FO estaacute pensado para generar

directamente una renderizacioacuten

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 21: Cesnavarra 2008-boletín 7

sencilla con un par de clics puedes empezar a funcionar

Cada proyecto puede configurarse con los moacutedulos que desees

que tenga ademaacutes de poder definir campos personalizados por

proyecto y tarea para permitir una mayor adaptacioacuten

Cabe destacar que para esta herramienta existe un uacutenico

concepto denominado peticioacuten que puede ser de tres tipos

tareas soporte o incidencia De esta forma todo se gestiona de

igual forma lo cual lo simplifica pero a su vez puede convertirse

en un volumen ingestionable de tareas Para evitar esto se

pueden definir categoriacuteas a las que pertenece una peticioacuten y

realizar posteriormente filtrados de peticiones en las vistas seguacuten

este y otros paraacutemetros

No obstante no todo iba a ser color de rosa tiene una serie de

limitaciones como el sistema un tanto engorroso de enlazar

peticiones o el hecho de que una vez creada una peticioacuten su

nombre y descripcioacuten no se pueden modificar tan solo ir

antildeadiendo nuevas descripciones

En este punto nos encontraacutebamos en una difiacutecil decisioacuten puesto

que ambas herramientas nos gustaban cubriacutean lo necesario pero

se trataban de herramientas muy distintas en concepcioacuten Para

facilitar la decisioacuten realizamos un cuadro comparando las

caracteriacutesticas y priorizaacutendolas seguacuten nuestro intereacutes El

resultado fue el siguiente

Prioridad Caracteriacutestica Redmine TeamWork

9 Integracioacuten con

LDAP Si Si

8 Integracioacuten con

Subversion Si Si

8 Traducido al espantildeol

Si No

7 Importacioacuten desde

Project No Si

7 Exportacioacuten a

Project No Si

7 Centros de coste Posible mediante los campos

personalizados

Si

7 Wikis de proyectos Si

7 Personalizacioacuten

extensioacuten Si Si

6 Gestioacuten de vacaciones

No Vacaciones a nivel de

empresa

6 Vida de la herramienta

Indeterminado al ser una

herramienta open source

Algo maacutes seguro

porque hay una empresa detraacutes

5 Facilidad de configuracioacuten

Si

5 Usuarios multi-

perfil Si Si

4 Acceso restringido a usuarios

Si Si

3 Sencillez de manejo

Si

2 Seguimiento de

incidencias Si Si

1 Asignacioacuten de tareas

Si Si

1 Imputacioacuten a tareas asignadas

Si Si

Tras una difiacutecil reflexioacuten puesto que ambas se encontraban muy

parejas decidimos decantarnos por Redmine primando la

sencillez y rapidez Existiacutea la posibilidad de que terceros la

empleasen y veiacuteamos que Redmine permitiacutea una mayor facilidad

en su manejo y resultaba maacutes intuitiva de cara a aprender a

utilizarla Posteriormente tras su uso hemos detectado algunos

inconvenientes importantes como la imposibilidad de asignar una

peticioacuten a maacutes de un usuario pero es que no hay herramienta

perfecta

Bibliografiacutea

httpwwwnavegapolisnetcontentview5649

httpwwwsimpleprojectmanagementcomhomehtml

httpwwwweb-based-softwarecomproject

httpenwikipediaorgwikiComparison_of_issue_tracking_syste

ms

httpenwikipediaorgwikiList_of_project_management_softwa

re

httpwwwpmdigestcomsoftware

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Rauacutel Sanz de Acedo

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo Lexers parsers JavaCC (y II)

Texto En este artiacuteculo vamos a utilizar JavaCC como herramienta para

implementar un moacutedulo que resuelva la casuiacutestica de la

impresioacuten de las diversas paacuteginas de un fichero Esto es lo que se

refleja en esta imagen

Para ello en el artiacuteculo anterior definimos esta gramaacutetica a la que

asociamos unas acciones semaacutenticas

inicio --gt inicializacionVariables

listaElementos

procesarDatos

listaElementos --gt elemento

restoListaElementos

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

restoListaElementos --gt SEPARADOR

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

listaElementos

|

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

restoListaElementos2 --gt GUION ENTERO

num2 = valor(ENTERO)

Si (num2 gt maxPaginas)

or (num2==0) ent error

|

JavaCC es una herramienta que dado un fichero de extensioacuten

jj que describe la gramaacutetica y sus acciones semaacutenticas

asociadas genera los ficheros java que la implementan

Estos ficheros java pueden luego obviamente incluirse en

aqueacutellos que conforman el resto de nuestra aplicacioacuten

JavaCC es una herramienta gratuita que puede descargarse

desde aquiacute Existe tambieacuten un plugin para Eclipse Y asimismo

existe una task de Ant para JavaCC

Vamos pues a construir nuestro parser

Lo denominaremos parserImprimePaginasCC y por lo tanto

vamos a editar el fichero parserImprimePaginasCCjj

Indicaremos coacutemo se traducen los tokens y las producciones a

formato JavaCC

TOKEN

ltENTERO([0-9])+gt

| ltGUION -gt

| ltSEPARADOR([ ])+ | ([ ])gt

Los tokens se describen praacutecticamente como lo indicamos en la

gramaacutetica

void inicio()throws elementoFueraLimitesException

resultado = new Vector()

num1 = -1

num2 = -1

inicializaFlags()

listaElementos()

void listaElementos()throws elementoFueraLimitesExcept

ion

elemento() restoListaElementos()

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

restoListaElementos2()

void restoListaElementos()throws elementoFueraLimitesE

xception

ltSEPARADORgt

insertaElemento(num1 num2)

num1 = -1

num2 = -1

listaElementos()

|

insertaElemento(num1 num2)

num1 = -1

num2 = -1

void restoListaElementos2()throws elementoFueraLimites

Exception

ltGUIONgtltENTEROgt

num2 = IntegervalueOf(tokenimage)intValue()

if ((num2gtmaximo)|| (num2 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num2))

|

Las producciones son algo diferentes lo que era

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

ahora es

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(IntegertoS

tring(num1))

restoListaElementos2()

El no terminal elemento se describe como void elemento() y

ademaacutes le hemos asociado una excepcioacuten para controlar el hecho

de que un usuario coloque 0 o un nuacutemero mayor que el

permitido Lo que en la parte derecha es ENTERO se indica

como ltENTEROgt y la invocacioacuten de restoListaElementos2

es restoListaElementos2()

Las acciones semaacutenticas

num1 = valor(ENTERO)

Si (num1 gt maxPaginas) or (num1==0) ent error

se indican en JavaCC asiacute

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

El valor del token actual es accesible a traveacutes de tokenimage

Si deseamos tener coacutedigo Java adicional fuera de las

producciones lo podemos antildeadir de esta forma con la palabra

reservada JAVACODE

JAVACODE void insertaElemento(int num1 int num2)

int aux i iFlag

if ((num1 = -1) ampamp (num2 = -1))

if (num1gtnum2)

aux = num1

num1 = num2

num2 = aux

for (i = num1

i lt= num2

i++)

iFlag = i-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(i))

flags[iFlag] = true

else if (num1 = -1)

iFlag = num1-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num1))

flags[iFlag] = true

else if (num2 = -1)

iFlag = num2-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num2))

flags[iFlag] = true

JAVACODE void inicializaFlags()

int i

flags = new boolean [maximo]

for (i = 0

iltmaximo

i++)

flags[i] = false

Ademaacutes podemos inicializar el parser e instanciarlo de esta

forma

PARSER_BEGIN(parserImprimePaginasCC)

import javaio

import javautilVector

public class parserImprimePaginasCC

public static int maximo

public static Vector resultado

private static int num1 num2

private static boolean flags[]

public static void main(String[]args)throws Exceptio

n

Reader r = new StringReader(args[0])

parserImprimePaginasCC p

= new parserImprimePaginasCC(r)

try

pmaximo = 50

Systemoutprintln(Maacuteximo +pmaximo)

pinicio()

Systemoutprintln(OKn)

for (int j = 0

jltpresultadosize()

j++)

Systemoutprint(presultadoelementAt(j)+

)

Systemoutprintln()

catch (ParseException e)

Systemoutprintln(Error de sintaxis)

catch (TokenMgrError e)

Systemoutprintln(Error leacutexico)

catch (elementoFueraLimitesException e)

Systemoutprintln(egetMessage())

PARSER_END(parserImprimePaginasCC)

En este caso tomaremos la entrada de lo que el usuario

introduzca por teclado pero se pueden tomar los datos a traveacutes

de ficheros o pasarlos como variables

Se hace referencia a una excepcioacuten que hemos definido asiacute en un

fichero llamado elementoFueraLimitesExceptionjava

public class elementoFueraLimitesException extends Exc

eption

Constructor

public elementoFueraLimitesException()

super()

public elementoFueraLimitesException(String msg)

super(msg)

Una vez salvado el fichero parserImprimePaginasCCjj podemos

generar la documentacioacuten de la gramaacutetica en formato HTML de

esta forma

Nota en la ejecucioacuten de estos ejemplos se ha utilizado la liacutenea de comandos de

Windows pero se podriacutea haber hecho a traveacutes de cualquier sistema que soporte

el lenguaje Java

gtjjdoc parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Documentation

Generator Version 014)

(type jjdoc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Grammar documentation generated successfully in

parserImprimePaginasCChtml

Se genera el fichero parserImprimePaginasCChtmlcuyo

contenido es

BNF for parserImprimePaginasCCjj NON-TERMINALS

inicio = listaElementos

listaElementos = elemento restoListaElementos

elemento = ltENTEROgt restoListaElementos2

restoListaElementos = ltSEPARADORgt listaElementos

|

restoListaElementos2 = ltGUIONgt ltENTEROgt

|

insertaElemento = java code

inicializaFlags = java code

Nota BNF es el tipo de notacioacuten que estamos utilizando a lo largo de estos

artiacuteculos

Compilamos el parser

gtjavacc parser ImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

File TokenMgrErrorjava does not exist Will create

one

File ParseExceptionjava does not exist Will

create one

File Tokenjava does not exist Will create one

File SimpleCharStreamjava does not exist Will

create one

Parser generated successfully

y entonces se generan estos ficheros

ParseExceptionjava --gt

Excepcioacuten generada por el parser cuando un error es encontrado

parserImprimePaginasCCjava --gt La

traduccioacuten de nuestro fichero jj a java

parserImprimePaginasCCConstantsjava --gt Los

valores de los tokens

parserImprimePaginasCCTokenManagerjava --gt El

analizador leacutexico

SimpleCharStreamjava --gt

Contiene coacutedigo para leer caracteres de cualquier

implementacioacuten de javaioInputStream o javaioReader

Tokenjava --gt

Definicioacuten de la clase Token

TokenMgrErrorjava --gt

Diversos errores que puede producir el lexer

Ahora los compilamos y antildeadimos el fichero

elementoFueraLimitesExceptionjava en dicha compilacioacuten

javac java

Y vamos a ejecutar el parser suponiendo que el maacuteximo nuacutemero

de paacuteginas a impmir es 50 (como hemos indicado con pmaximo =

50)

Lo que obtenemos como salida es la lista de paacuteginas a imprimir o

un mensaje de error

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

OK

2 5 6 7 8

java -classpath laboratorioParsers

parserImprimePaginasCC 28-3046

Num paginas 50

OK

28 29 30 4 6

java -classpath laboratorioParsers

parserImprimePaginasCC 43-51

Num paginas 50

Introdujo un numero superior al maximo51

java -classpath laboratorioParsers

parserImprimePaginasCC 43--51

Num paginas 50

Error de sintaxisEncountered - at line 1

column 4

Was expecting

ltENTEROgt

iquestQueacute pasa si algo ha ido mal iquestPodemos depurar el parser de

alguna forma

Por supuesto podemos compilar el parser asiacute para obtener una

traza de la ejecucioacuten

javacc -DEBUG_PARSER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Consumed token lt- at line 1 column 4gt

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

En la traza vemos coacutemo el parser va invocando la diferentes

producciones

Podemos tambieacuten depurar el lexer

javacc -DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Returning the ltEOFgt token

OK

2 5 6 7 8

O combinar ambas trazas

javacc -DEBUG_PARSER -

DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Consumed token lt- at line 1 column 4gt

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Returning the ltEOFgt token

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

Conclusioacuten los generadores de parsers son herramientas

potentes que sirven para resolver problemas de una manera

bdquolimpia‟ y elegante Puede que su nombre retraiga a los

desarrolladores (ldquoiquestPara queacute quiero un generador de

compiladoresrdquo) pero es una opcioacuten a tener en cuenta

Ficheros para descargar

Referencias

- Generating Parsers with JavaCC

- The JavaCC FAQ

Si quieres enviar alguacuten comentario o sugerir temas a tratar en otros artiacuteculos escribe a

curtasun[simboloArroba]ceines

Categor

iacuteas

CES OpenSouceJava

Tema Desarrollo

Autor Carlos Urtasun

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo XSL-FO (Parte 1)

Texto XSL-FO Introduccioacuten El estaacutendar XSL tal y como estaacute definido actualmente se

divide en dos grandes partes -XSLT transformacioacuten de un documento de entrada XML en

alguacuten tipo de documento de salida ya sea XML HTML PDF etc -Formatting Objects (FO) definen la visualizacioacuten final del

resultado de la transformacioacuten Son una implementacioacuten especiacutefica de un determinado XSLT y aplicados a un

fichero XML nos proporcionan otro fichero con la informacioacuten de eacuteste renderizada a alguacuten formato de visualizacioacuten impresa Eacutesta es quizaacute la principal diferencia entre un FO y

otros XSLT ambos transforman un documento XML en otro documento XML pero FO estaacute pensado para generar

directamente una renderizacioacuten

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 22: Cesnavarra 2008-boletín 7

7 Exportacioacuten a

Project No Si

7 Centros de coste Posible mediante los campos

personalizados

Si

7 Wikis de proyectos Si

7 Personalizacioacuten

extensioacuten Si Si

6 Gestioacuten de vacaciones

No Vacaciones a nivel de

empresa

6 Vida de la herramienta

Indeterminado al ser una

herramienta open source

Algo maacutes seguro

porque hay una empresa detraacutes

5 Facilidad de configuracioacuten

Si

5 Usuarios multi-

perfil Si Si

4 Acceso restringido a usuarios

Si Si

3 Sencillez de manejo

Si

2 Seguimiento de

incidencias Si Si

1 Asignacioacuten de tareas

Si Si

1 Imputacioacuten a tareas asignadas

Si Si

Tras una difiacutecil reflexioacuten puesto que ambas se encontraban muy

parejas decidimos decantarnos por Redmine primando la

sencillez y rapidez Existiacutea la posibilidad de que terceros la

empleasen y veiacuteamos que Redmine permitiacutea una mayor facilidad

en su manejo y resultaba maacutes intuitiva de cara a aprender a

utilizarla Posteriormente tras su uso hemos detectado algunos

inconvenientes importantes como la imposibilidad de asignar una

peticioacuten a maacutes de un usuario pero es que no hay herramienta

perfecta

Bibliografiacutea

httpwwwnavegapolisnetcontentview5649

httpwwwsimpleprojectmanagementcomhomehtml

httpwwwweb-based-softwarecomproject

httpenwikipediaorgwikiComparison_of_issue_tracking_syste

ms

httpenwikipediaorgwikiList_of_project_management_softwa

re

httpwwwpmdigestcomsoftware

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Rauacutel Sanz de Acedo

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo Lexers parsers JavaCC (y II)

Texto En este artiacuteculo vamos a utilizar JavaCC como herramienta para

implementar un moacutedulo que resuelva la casuiacutestica de la

impresioacuten de las diversas paacuteginas de un fichero Esto es lo que se

refleja en esta imagen

Para ello en el artiacuteculo anterior definimos esta gramaacutetica a la que

asociamos unas acciones semaacutenticas

inicio --gt inicializacionVariables

listaElementos

procesarDatos

listaElementos --gt elemento

restoListaElementos

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

restoListaElementos --gt SEPARADOR

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

listaElementos

|

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

restoListaElementos2 --gt GUION ENTERO

num2 = valor(ENTERO)

Si (num2 gt maxPaginas)

or (num2==0) ent error

|

JavaCC es una herramienta que dado un fichero de extensioacuten

jj que describe la gramaacutetica y sus acciones semaacutenticas

asociadas genera los ficheros java que la implementan

Estos ficheros java pueden luego obviamente incluirse en

aqueacutellos que conforman el resto de nuestra aplicacioacuten

JavaCC es una herramienta gratuita que puede descargarse

desde aquiacute Existe tambieacuten un plugin para Eclipse Y asimismo

existe una task de Ant para JavaCC

Vamos pues a construir nuestro parser

Lo denominaremos parserImprimePaginasCC y por lo tanto

vamos a editar el fichero parserImprimePaginasCCjj

Indicaremos coacutemo se traducen los tokens y las producciones a

formato JavaCC

TOKEN

ltENTERO([0-9])+gt

| ltGUION -gt

| ltSEPARADOR([ ])+ | ([ ])gt

Los tokens se describen praacutecticamente como lo indicamos en la

gramaacutetica

void inicio()throws elementoFueraLimitesException

resultado = new Vector()

num1 = -1

num2 = -1

inicializaFlags()

listaElementos()

void listaElementos()throws elementoFueraLimitesExcept

ion

elemento() restoListaElementos()

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

restoListaElementos2()

void restoListaElementos()throws elementoFueraLimitesE

xception

ltSEPARADORgt

insertaElemento(num1 num2)

num1 = -1

num2 = -1

listaElementos()

|

insertaElemento(num1 num2)

num1 = -1

num2 = -1

void restoListaElementos2()throws elementoFueraLimites

Exception

ltGUIONgtltENTEROgt

num2 = IntegervalueOf(tokenimage)intValue()

if ((num2gtmaximo)|| (num2 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num2))

|

Las producciones son algo diferentes lo que era

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

ahora es

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(IntegertoS

tring(num1))

restoListaElementos2()

El no terminal elemento se describe como void elemento() y

ademaacutes le hemos asociado una excepcioacuten para controlar el hecho

de que un usuario coloque 0 o un nuacutemero mayor que el

permitido Lo que en la parte derecha es ENTERO se indica

como ltENTEROgt y la invocacioacuten de restoListaElementos2

es restoListaElementos2()

Las acciones semaacutenticas

num1 = valor(ENTERO)

Si (num1 gt maxPaginas) or (num1==0) ent error

se indican en JavaCC asiacute

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

El valor del token actual es accesible a traveacutes de tokenimage

Si deseamos tener coacutedigo Java adicional fuera de las

producciones lo podemos antildeadir de esta forma con la palabra

reservada JAVACODE

JAVACODE void insertaElemento(int num1 int num2)

int aux i iFlag

if ((num1 = -1) ampamp (num2 = -1))

if (num1gtnum2)

aux = num1

num1 = num2

num2 = aux

for (i = num1

i lt= num2

i++)

iFlag = i-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(i))

flags[iFlag] = true

else if (num1 = -1)

iFlag = num1-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num1))

flags[iFlag] = true

else if (num2 = -1)

iFlag = num2-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num2))

flags[iFlag] = true

JAVACODE void inicializaFlags()

int i

flags = new boolean [maximo]

for (i = 0

iltmaximo

i++)

flags[i] = false

Ademaacutes podemos inicializar el parser e instanciarlo de esta

forma

PARSER_BEGIN(parserImprimePaginasCC)

import javaio

import javautilVector

public class parserImprimePaginasCC

public static int maximo

public static Vector resultado

private static int num1 num2

private static boolean flags[]

public static void main(String[]args)throws Exceptio

n

Reader r = new StringReader(args[0])

parserImprimePaginasCC p

= new parserImprimePaginasCC(r)

try

pmaximo = 50

Systemoutprintln(Maacuteximo +pmaximo)

pinicio()

Systemoutprintln(OKn)

for (int j = 0

jltpresultadosize()

j++)

Systemoutprint(presultadoelementAt(j)+

)

Systemoutprintln()

catch (ParseException e)

Systemoutprintln(Error de sintaxis)

catch (TokenMgrError e)

Systemoutprintln(Error leacutexico)

catch (elementoFueraLimitesException e)

Systemoutprintln(egetMessage())

PARSER_END(parserImprimePaginasCC)

En este caso tomaremos la entrada de lo que el usuario

introduzca por teclado pero se pueden tomar los datos a traveacutes

de ficheros o pasarlos como variables

Se hace referencia a una excepcioacuten que hemos definido asiacute en un

fichero llamado elementoFueraLimitesExceptionjava

public class elementoFueraLimitesException extends Exc

eption

Constructor

public elementoFueraLimitesException()

super()

public elementoFueraLimitesException(String msg)

super(msg)

Una vez salvado el fichero parserImprimePaginasCCjj podemos

generar la documentacioacuten de la gramaacutetica en formato HTML de

esta forma

Nota en la ejecucioacuten de estos ejemplos se ha utilizado la liacutenea de comandos de

Windows pero se podriacutea haber hecho a traveacutes de cualquier sistema que soporte

el lenguaje Java

gtjjdoc parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Documentation

Generator Version 014)

(type jjdoc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Grammar documentation generated successfully in

parserImprimePaginasCChtml

Se genera el fichero parserImprimePaginasCChtmlcuyo

contenido es

BNF for parserImprimePaginasCCjj NON-TERMINALS

inicio = listaElementos

listaElementos = elemento restoListaElementos

elemento = ltENTEROgt restoListaElementos2

restoListaElementos = ltSEPARADORgt listaElementos

|

restoListaElementos2 = ltGUIONgt ltENTEROgt

|

insertaElemento = java code

inicializaFlags = java code

Nota BNF es el tipo de notacioacuten que estamos utilizando a lo largo de estos

artiacuteculos

Compilamos el parser

gtjavacc parser ImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

File TokenMgrErrorjava does not exist Will create

one

File ParseExceptionjava does not exist Will

create one

File Tokenjava does not exist Will create one

File SimpleCharStreamjava does not exist Will

create one

Parser generated successfully

y entonces se generan estos ficheros

ParseExceptionjava --gt

Excepcioacuten generada por el parser cuando un error es encontrado

parserImprimePaginasCCjava --gt La

traduccioacuten de nuestro fichero jj a java

parserImprimePaginasCCConstantsjava --gt Los

valores de los tokens

parserImprimePaginasCCTokenManagerjava --gt El

analizador leacutexico

SimpleCharStreamjava --gt

Contiene coacutedigo para leer caracteres de cualquier

implementacioacuten de javaioInputStream o javaioReader

Tokenjava --gt

Definicioacuten de la clase Token

TokenMgrErrorjava --gt

Diversos errores que puede producir el lexer

Ahora los compilamos y antildeadimos el fichero

elementoFueraLimitesExceptionjava en dicha compilacioacuten

javac java

Y vamos a ejecutar el parser suponiendo que el maacuteximo nuacutemero

de paacuteginas a impmir es 50 (como hemos indicado con pmaximo =

50)

Lo que obtenemos como salida es la lista de paacuteginas a imprimir o

un mensaje de error

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

OK

2 5 6 7 8

java -classpath laboratorioParsers

parserImprimePaginasCC 28-3046

Num paginas 50

OK

28 29 30 4 6

java -classpath laboratorioParsers

parserImprimePaginasCC 43-51

Num paginas 50

Introdujo un numero superior al maximo51

java -classpath laboratorioParsers

parserImprimePaginasCC 43--51

Num paginas 50

Error de sintaxisEncountered - at line 1

column 4

Was expecting

ltENTEROgt

iquestQueacute pasa si algo ha ido mal iquestPodemos depurar el parser de

alguna forma

Por supuesto podemos compilar el parser asiacute para obtener una

traza de la ejecucioacuten

javacc -DEBUG_PARSER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Consumed token lt- at line 1 column 4gt

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

En la traza vemos coacutemo el parser va invocando la diferentes

producciones

Podemos tambieacuten depurar el lexer

javacc -DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Returning the ltEOFgt token

OK

2 5 6 7 8

O combinar ambas trazas

javacc -DEBUG_PARSER -

DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Consumed token lt- at line 1 column 4gt

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Returning the ltEOFgt token

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

Conclusioacuten los generadores de parsers son herramientas

potentes que sirven para resolver problemas de una manera

bdquolimpia‟ y elegante Puede que su nombre retraiga a los

desarrolladores (ldquoiquestPara queacute quiero un generador de

compiladoresrdquo) pero es una opcioacuten a tener en cuenta

Ficheros para descargar

Referencias

- Generating Parsers with JavaCC

- The JavaCC FAQ

Si quieres enviar alguacuten comentario o sugerir temas a tratar en otros artiacuteculos escribe a

curtasun[simboloArroba]ceines

Categor

iacuteas

CES OpenSouceJava

Tema Desarrollo

Autor Carlos Urtasun

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo XSL-FO (Parte 1)

Texto XSL-FO Introduccioacuten El estaacutendar XSL tal y como estaacute definido actualmente se

divide en dos grandes partes -XSLT transformacioacuten de un documento de entrada XML en

alguacuten tipo de documento de salida ya sea XML HTML PDF etc -Formatting Objects (FO) definen la visualizacioacuten final del

resultado de la transformacioacuten Son una implementacioacuten especiacutefica de un determinado XSLT y aplicados a un

fichero XML nos proporcionan otro fichero con la informacioacuten de eacuteste renderizada a alguacuten formato de visualizacioacuten impresa Eacutesta es quizaacute la principal diferencia entre un FO y

otros XSLT ambos transforman un documento XML en otro documento XML pero FO estaacute pensado para generar

directamente una renderizacioacuten

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 23: Cesnavarra 2008-boletín 7

httpwwwnavegapolisnetcontentview5649

httpwwwsimpleprojectmanagementcomhomehtml

httpwwwweb-based-softwarecomproject

httpenwikipediaorgwikiComparison_of_issue_tracking_syste

ms

httpenwikipediaorgwikiList_of_project_management_softwa

re

httpwwwpmdigestcomsoftware

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Rauacutel Sanz de Acedo

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo Lexers parsers JavaCC (y II)

Texto En este artiacuteculo vamos a utilizar JavaCC como herramienta para

implementar un moacutedulo que resuelva la casuiacutestica de la

impresioacuten de las diversas paacuteginas de un fichero Esto es lo que se

refleja en esta imagen

Para ello en el artiacuteculo anterior definimos esta gramaacutetica a la que

asociamos unas acciones semaacutenticas

inicio --gt inicializacionVariables

listaElementos

procesarDatos

listaElementos --gt elemento

restoListaElementos

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

restoListaElementos --gt SEPARADOR

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

listaElementos

|

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

restoListaElementos2 --gt GUION ENTERO

num2 = valor(ENTERO)

Si (num2 gt maxPaginas)

or (num2==0) ent error

|

JavaCC es una herramienta que dado un fichero de extensioacuten

jj que describe la gramaacutetica y sus acciones semaacutenticas

asociadas genera los ficheros java que la implementan

Estos ficheros java pueden luego obviamente incluirse en

aqueacutellos que conforman el resto de nuestra aplicacioacuten

JavaCC es una herramienta gratuita que puede descargarse

desde aquiacute Existe tambieacuten un plugin para Eclipse Y asimismo

existe una task de Ant para JavaCC

Vamos pues a construir nuestro parser

Lo denominaremos parserImprimePaginasCC y por lo tanto

vamos a editar el fichero parserImprimePaginasCCjj

Indicaremos coacutemo se traducen los tokens y las producciones a

formato JavaCC

TOKEN

ltENTERO([0-9])+gt

| ltGUION -gt

| ltSEPARADOR([ ])+ | ([ ])gt

Los tokens se describen praacutecticamente como lo indicamos en la

gramaacutetica

void inicio()throws elementoFueraLimitesException

resultado = new Vector()

num1 = -1

num2 = -1

inicializaFlags()

listaElementos()

void listaElementos()throws elementoFueraLimitesExcept

ion

elemento() restoListaElementos()

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

restoListaElementos2()

void restoListaElementos()throws elementoFueraLimitesE

xception

ltSEPARADORgt

insertaElemento(num1 num2)

num1 = -1

num2 = -1

listaElementos()

|

insertaElemento(num1 num2)

num1 = -1

num2 = -1

void restoListaElementos2()throws elementoFueraLimites

Exception

ltGUIONgtltENTEROgt

num2 = IntegervalueOf(tokenimage)intValue()

if ((num2gtmaximo)|| (num2 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num2))

|

Las producciones son algo diferentes lo que era

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

ahora es

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(IntegertoS

tring(num1))

restoListaElementos2()

El no terminal elemento se describe como void elemento() y

ademaacutes le hemos asociado una excepcioacuten para controlar el hecho

de que un usuario coloque 0 o un nuacutemero mayor que el

permitido Lo que en la parte derecha es ENTERO se indica

como ltENTEROgt y la invocacioacuten de restoListaElementos2

es restoListaElementos2()

Las acciones semaacutenticas

num1 = valor(ENTERO)

Si (num1 gt maxPaginas) or (num1==0) ent error

se indican en JavaCC asiacute

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

El valor del token actual es accesible a traveacutes de tokenimage

Si deseamos tener coacutedigo Java adicional fuera de las

producciones lo podemos antildeadir de esta forma con la palabra

reservada JAVACODE

JAVACODE void insertaElemento(int num1 int num2)

int aux i iFlag

if ((num1 = -1) ampamp (num2 = -1))

if (num1gtnum2)

aux = num1

num1 = num2

num2 = aux

for (i = num1

i lt= num2

i++)

iFlag = i-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(i))

flags[iFlag] = true

else if (num1 = -1)

iFlag = num1-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num1))

flags[iFlag] = true

else if (num2 = -1)

iFlag = num2-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num2))

flags[iFlag] = true

JAVACODE void inicializaFlags()

int i

flags = new boolean [maximo]

for (i = 0

iltmaximo

i++)

flags[i] = false

Ademaacutes podemos inicializar el parser e instanciarlo de esta

forma

PARSER_BEGIN(parserImprimePaginasCC)

import javaio

import javautilVector

public class parserImprimePaginasCC

public static int maximo

public static Vector resultado

private static int num1 num2

private static boolean flags[]

public static void main(String[]args)throws Exceptio

n

Reader r = new StringReader(args[0])

parserImprimePaginasCC p

= new parserImprimePaginasCC(r)

try

pmaximo = 50

Systemoutprintln(Maacuteximo +pmaximo)

pinicio()

Systemoutprintln(OKn)

for (int j = 0

jltpresultadosize()

j++)

Systemoutprint(presultadoelementAt(j)+

)

Systemoutprintln()

catch (ParseException e)

Systemoutprintln(Error de sintaxis)

catch (TokenMgrError e)

Systemoutprintln(Error leacutexico)

catch (elementoFueraLimitesException e)

Systemoutprintln(egetMessage())

PARSER_END(parserImprimePaginasCC)

En este caso tomaremos la entrada de lo que el usuario

introduzca por teclado pero se pueden tomar los datos a traveacutes

de ficheros o pasarlos como variables

Se hace referencia a una excepcioacuten que hemos definido asiacute en un

fichero llamado elementoFueraLimitesExceptionjava

public class elementoFueraLimitesException extends Exc

eption

Constructor

public elementoFueraLimitesException()

super()

public elementoFueraLimitesException(String msg)

super(msg)

Una vez salvado el fichero parserImprimePaginasCCjj podemos

generar la documentacioacuten de la gramaacutetica en formato HTML de

esta forma

Nota en la ejecucioacuten de estos ejemplos se ha utilizado la liacutenea de comandos de

Windows pero se podriacutea haber hecho a traveacutes de cualquier sistema que soporte

el lenguaje Java

gtjjdoc parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Documentation

Generator Version 014)

(type jjdoc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Grammar documentation generated successfully in

parserImprimePaginasCChtml

Se genera el fichero parserImprimePaginasCChtmlcuyo

contenido es

BNF for parserImprimePaginasCCjj NON-TERMINALS

inicio = listaElementos

listaElementos = elemento restoListaElementos

elemento = ltENTEROgt restoListaElementos2

restoListaElementos = ltSEPARADORgt listaElementos

|

restoListaElementos2 = ltGUIONgt ltENTEROgt

|

insertaElemento = java code

inicializaFlags = java code

Nota BNF es el tipo de notacioacuten que estamos utilizando a lo largo de estos

artiacuteculos

Compilamos el parser

gtjavacc parser ImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

File TokenMgrErrorjava does not exist Will create

one

File ParseExceptionjava does not exist Will

create one

File Tokenjava does not exist Will create one

File SimpleCharStreamjava does not exist Will

create one

Parser generated successfully

y entonces se generan estos ficheros

ParseExceptionjava --gt

Excepcioacuten generada por el parser cuando un error es encontrado

parserImprimePaginasCCjava --gt La

traduccioacuten de nuestro fichero jj a java

parserImprimePaginasCCConstantsjava --gt Los

valores de los tokens

parserImprimePaginasCCTokenManagerjava --gt El

analizador leacutexico

SimpleCharStreamjava --gt

Contiene coacutedigo para leer caracteres de cualquier

implementacioacuten de javaioInputStream o javaioReader

Tokenjava --gt

Definicioacuten de la clase Token

TokenMgrErrorjava --gt

Diversos errores que puede producir el lexer

Ahora los compilamos y antildeadimos el fichero

elementoFueraLimitesExceptionjava en dicha compilacioacuten

javac java

Y vamos a ejecutar el parser suponiendo que el maacuteximo nuacutemero

de paacuteginas a impmir es 50 (como hemos indicado con pmaximo =

50)

Lo que obtenemos como salida es la lista de paacuteginas a imprimir o

un mensaje de error

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

OK

2 5 6 7 8

java -classpath laboratorioParsers

parserImprimePaginasCC 28-3046

Num paginas 50

OK

28 29 30 4 6

java -classpath laboratorioParsers

parserImprimePaginasCC 43-51

Num paginas 50

Introdujo un numero superior al maximo51

java -classpath laboratorioParsers

parserImprimePaginasCC 43--51

Num paginas 50

Error de sintaxisEncountered - at line 1

column 4

Was expecting

ltENTEROgt

iquestQueacute pasa si algo ha ido mal iquestPodemos depurar el parser de

alguna forma

Por supuesto podemos compilar el parser asiacute para obtener una

traza de la ejecucioacuten

javacc -DEBUG_PARSER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Consumed token lt- at line 1 column 4gt

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

En la traza vemos coacutemo el parser va invocando la diferentes

producciones

Podemos tambieacuten depurar el lexer

javacc -DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Returning the ltEOFgt token

OK

2 5 6 7 8

O combinar ambas trazas

javacc -DEBUG_PARSER -

DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Consumed token lt- at line 1 column 4gt

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Returning the ltEOFgt token

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

Conclusioacuten los generadores de parsers son herramientas

potentes que sirven para resolver problemas de una manera

bdquolimpia‟ y elegante Puede que su nombre retraiga a los

desarrolladores (ldquoiquestPara queacute quiero un generador de

compiladoresrdquo) pero es una opcioacuten a tener en cuenta

Ficheros para descargar

Referencias

- Generating Parsers with JavaCC

- The JavaCC FAQ

Si quieres enviar alguacuten comentario o sugerir temas a tratar en otros artiacuteculos escribe a

curtasun[simboloArroba]ceines

Categor

iacuteas

CES OpenSouceJava

Tema Desarrollo

Autor Carlos Urtasun

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo XSL-FO (Parte 1)

Texto XSL-FO Introduccioacuten El estaacutendar XSL tal y como estaacute definido actualmente se

divide en dos grandes partes -XSLT transformacioacuten de un documento de entrada XML en

alguacuten tipo de documento de salida ya sea XML HTML PDF etc -Formatting Objects (FO) definen la visualizacioacuten final del

resultado de la transformacioacuten Son una implementacioacuten especiacutefica de un determinado XSLT y aplicados a un

fichero XML nos proporcionan otro fichero con la informacioacuten de eacuteste renderizada a alguacuten formato de visualizacioacuten impresa Eacutesta es quizaacute la principal diferencia entre un FO y

otros XSLT ambos transforman un documento XML en otro documento XML pero FO estaacute pensado para generar

directamente una renderizacioacuten

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 24: Cesnavarra 2008-boletín 7

Para ello en el artiacuteculo anterior definimos esta gramaacutetica a la que

asociamos unas acciones semaacutenticas

inicio --gt inicializacionVariables

listaElementos

procesarDatos

listaElementos --gt elemento

restoListaElementos

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

restoListaElementos --gt SEPARADOR

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

listaElementos

|

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

restoListaElementos2 --gt GUION ENTERO

num2 = valor(ENTERO)

Si (num2 gt maxPaginas)

or (num2==0) ent error

|

JavaCC es una herramienta que dado un fichero de extensioacuten

jj que describe la gramaacutetica y sus acciones semaacutenticas

asociadas genera los ficheros java que la implementan

Estos ficheros java pueden luego obviamente incluirse en

aqueacutellos que conforman el resto de nuestra aplicacioacuten

JavaCC es una herramienta gratuita que puede descargarse

desde aquiacute Existe tambieacuten un plugin para Eclipse Y asimismo

existe una task de Ant para JavaCC

Vamos pues a construir nuestro parser

Lo denominaremos parserImprimePaginasCC y por lo tanto

vamos a editar el fichero parserImprimePaginasCCjj

Indicaremos coacutemo se traducen los tokens y las producciones a

formato JavaCC

TOKEN

ltENTERO([0-9])+gt

| ltGUION -gt

| ltSEPARADOR([ ])+ | ([ ])gt

Los tokens se describen praacutecticamente como lo indicamos en la

gramaacutetica

void inicio()throws elementoFueraLimitesException

resultado = new Vector()

num1 = -1

num2 = -1

inicializaFlags()

listaElementos()

void listaElementos()throws elementoFueraLimitesExcept

ion

elemento() restoListaElementos()

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

restoListaElementos2()

void restoListaElementos()throws elementoFueraLimitesE

xception

ltSEPARADORgt

insertaElemento(num1 num2)

num1 = -1

num2 = -1

listaElementos()

|

insertaElemento(num1 num2)

num1 = -1

num2 = -1

void restoListaElementos2()throws elementoFueraLimites

Exception

ltGUIONgtltENTEROgt

num2 = IntegervalueOf(tokenimage)intValue()

if ((num2gtmaximo)|| (num2 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num2))

|

Las producciones son algo diferentes lo que era

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

ahora es

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(IntegertoS

tring(num1))

restoListaElementos2()

El no terminal elemento se describe como void elemento() y

ademaacutes le hemos asociado una excepcioacuten para controlar el hecho

de que un usuario coloque 0 o un nuacutemero mayor que el

permitido Lo que en la parte derecha es ENTERO se indica

como ltENTEROgt y la invocacioacuten de restoListaElementos2

es restoListaElementos2()

Las acciones semaacutenticas

num1 = valor(ENTERO)

Si (num1 gt maxPaginas) or (num1==0) ent error

se indican en JavaCC asiacute

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

El valor del token actual es accesible a traveacutes de tokenimage

Si deseamos tener coacutedigo Java adicional fuera de las

producciones lo podemos antildeadir de esta forma con la palabra

reservada JAVACODE

JAVACODE void insertaElemento(int num1 int num2)

int aux i iFlag

if ((num1 = -1) ampamp (num2 = -1))

if (num1gtnum2)

aux = num1

num1 = num2

num2 = aux

for (i = num1

i lt= num2

i++)

iFlag = i-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(i))

flags[iFlag] = true

else if (num1 = -1)

iFlag = num1-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num1))

flags[iFlag] = true

else if (num2 = -1)

iFlag = num2-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num2))

flags[iFlag] = true

JAVACODE void inicializaFlags()

int i

flags = new boolean [maximo]

for (i = 0

iltmaximo

i++)

flags[i] = false

Ademaacutes podemos inicializar el parser e instanciarlo de esta

forma

PARSER_BEGIN(parserImprimePaginasCC)

import javaio

import javautilVector

public class parserImprimePaginasCC

public static int maximo

public static Vector resultado

private static int num1 num2

private static boolean flags[]

public static void main(String[]args)throws Exceptio

n

Reader r = new StringReader(args[0])

parserImprimePaginasCC p

= new parserImprimePaginasCC(r)

try

pmaximo = 50

Systemoutprintln(Maacuteximo +pmaximo)

pinicio()

Systemoutprintln(OKn)

for (int j = 0

jltpresultadosize()

j++)

Systemoutprint(presultadoelementAt(j)+

)

Systemoutprintln()

catch (ParseException e)

Systemoutprintln(Error de sintaxis)

catch (TokenMgrError e)

Systemoutprintln(Error leacutexico)

catch (elementoFueraLimitesException e)

Systemoutprintln(egetMessage())

PARSER_END(parserImprimePaginasCC)

En este caso tomaremos la entrada de lo que el usuario

introduzca por teclado pero se pueden tomar los datos a traveacutes

de ficheros o pasarlos como variables

Se hace referencia a una excepcioacuten que hemos definido asiacute en un

fichero llamado elementoFueraLimitesExceptionjava

public class elementoFueraLimitesException extends Exc

eption

Constructor

public elementoFueraLimitesException()

super()

public elementoFueraLimitesException(String msg)

super(msg)

Una vez salvado el fichero parserImprimePaginasCCjj podemos

generar la documentacioacuten de la gramaacutetica en formato HTML de

esta forma

Nota en la ejecucioacuten de estos ejemplos se ha utilizado la liacutenea de comandos de

Windows pero se podriacutea haber hecho a traveacutes de cualquier sistema que soporte

el lenguaje Java

gtjjdoc parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Documentation

Generator Version 014)

(type jjdoc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Grammar documentation generated successfully in

parserImprimePaginasCChtml

Se genera el fichero parserImprimePaginasCChtmlcuyo

contenido es

BNF for parserImprimePaginasCCjj NON-TERMINALS

inicio = listaElementos

listaElementos = elemento restoListaElementos

elemento = ltENTEROgt restoListaElementos2

restoListaElementos = ltSEPARADORgt listaElementos

|

restoListaElementos2 = ltGUIONgt ltENTEROgt

|

insertaElemento = java code

inicializaFlags = java code

Nota BNF es el tipo de notacioacuten que estamos utilizando a lo largo de estos

artiacuteculos

Compilamos el parser

gtjavacc parser ImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

File TokenMgrErrorjava does not exist Will create

one

File ParseExceptionjava does not exist Will

create one

File Tokenjava does not exist Will create one

File SimpleCharStreamjava does not exist Will

create one

Parser generated successfully

y entonces se generan estos ficheros

ParseExceptionjava --gt

Excepcioacuten generada por el parser cuando un error es encontrado

parserImprimePaginasCCjava --gt La

traduccioacuten de nuestro fichero jj a java

parserImprimePaginasCCConstantsjava --gt Los

valores de los tokens

parserImprimePaginasCCTokenManagerjava --gt El

analizador leacutexico

SimpleCharStreamjava --gt

Contiene coacutedigo para leer caracteres de cualquier

implementacioacuten de javaioInputStream o javaioReader

Tokenjava --gt

Definicioacuten de la clase Token

TokenMgrErrorjava --gt

Diversos errores que puede producir el lexer

Ahora los compilamos y antildeadimos el fichero

elementoFueraLimitesExceptionjava en dicha compilacioacuten

javac java

Y vamos a ejecutar el parser suponiendo que el maacuteximo nuacutemero

de paacuteginas a impmir es 50 (como hemos indicado con pmaximo =

50)

Lo que obtenemos como salida es la lista de paacuteginas a imprimir o

un mensaje de error

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

OK

2 5 6 7 8

java -classpath laboratorioParsers

parserImprimePaginasCC 28-3046

Num paginas 50

OK

28 29 30 4 6

java -classpath laboratorioParsers

parserImprimePaginasCC 43-51

Num paginas 50

Introdujo un numero superior al maximo51

java -classpath laboratorioParsers

parserImprimePaginasCC 43--51

Num paginas 50

Error de sintaxisEncountered - at line 1

column 4

Was expecting

ltENTEROgt

iquestQueacute pasa si algo ha ido mal iquestPodemos depurar el parser de

alguna forma

Por supuesto podemos compilar el parser asiacute para obtener una

traza de la ejecucioacuten

javacc -DEBUG_PARSER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Consumed token lt- at line 1 column 4gt

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

En la traza vemos coacutemo el parser va invocando la diferentes

producciones

Podemos tambieacuten depurar el lexer

javacc -DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Returning the ltEOFgt token

OK

2 5 6 7 8

O combinar ambas trazas

javacc -DEBUG_PARSER -

DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Consumed token lt- at line 1 column 4gt

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Returning the ltEOFgt token

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

Conclusioacuten los generadores de parsers son herramientas

potentes que sirven para resolver problemas de una manera

bdquolimpia‟ y elegante Puede que su nombre retraiga a los

desarrolladores (ldquoiquestPara queacute quiero un generador de

compiladoresrdquo) pero es una opcioacuten a tener en cuenta

Ficheros para descargar

Referencias

- Generating Parsers with JavaCC

- The JavaCC FAQ

Si quieres enviar alguacuten comentario o sugerir temas a tratar en otros artiacuteculos escribe a

curtasun[simboloArroba]ceines

Categor

iacuteas

CES OpenSouceJava

Tema Desarrollo

Autor Carlos Urtasun

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo XSL-FO (Parte 1)

Texto XSL-FO Introduccioacuten El estaacutendar XSL tal y como estaacute definido actualmente se

divide en dos grandes partes -XSLT transformacioacuten de un documento de entrada XML en

alguacuten tipo de documento de salida ya sea XML HTML PDF etc -Formatting Objects (FO) definen la visualizacioacuten final del

resultado de la transformacioacuten Son una implementacioacuten especiacutefica de un determinado XSLT y aplicados a un

fichero XML nos proporcionan otro fichero con la informacioacuten de eacuteste renderizada a alguacuten formato de visualizacioacuten impresa Eacutesta es quizaacute la principal diferencia entre un FO y

otros XSLT ambos transforman un documento XML en otro documento XML pero FO estaacute pensado para generar

directamente una renderizacioacuten

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 25: Cesnavarra 2008-boletín 7

inicializacion(num2)

listaElementos

|

insertarElemento(num1

num2)

inicializacion(num1)

inicializacion(num2)

restoListaElementos2 --gt GUION ENTERO

num2 = valor(ENTERO)

Si (num2 gt maxPaginas)

or (num2==0) ent error

|

JavaCC es una herramienta que dado un fichero de extensioacuten

jj que describe la gramaacutetica y sus acciones semaacutenticas

asociadas genera los ficheros java que la implementan

Estos ficheros java pueden luego obviamente incluirse en

aqueacutellos que conforman el resto de nuestra aplicacioacuten

JavaCC es una herramienta gratuita que puede descargarse

desde aquiacute Existe tambieacuten un plugin para Eclipse Y asimismo

existe una task de Ant para JavaCC

Vamos pues a construir nuestro parser

Lo denominaremos parserImprimePaginasCC y por lo tanto

vamos a editar el fichero parserImprimePaginasCCjj

Indicaremos coacutemo se traducen los tokens y las producciones a

formato JavaCC

TOKEN

ltENTERO([0-9])+gt

| ltGUION -gt

| ltSEPARADOR([ ])+ | ([ ])gt

Los tokens se describen praacutecticamente como lo indicamos en la

gramaacutetica

void inicio()throws elementoFueraLimitesException

resultado = new Vector()

num1 = -1

num2 = -1

inicializaFlags()

listaElementos()

void listaElementos()throws elementoFueraLimitesExcept

ion

elemento() restoListaElementos()

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

restoListaElementos2()

void restoListaElementos()throws elementoFueraLimitesE

xception

ltSEPARADORgt

insertaElemento(num1 num2)

num1 = -1

num2 = -1

listaElementos()

|

insertaElemento(num1 num2)

num1 = -1

num2 = -1

void restoListaElementos2()throws elementoFueraLimites

Exception

ltGUIONgtltENTEROgt

num2 = IntegervalueOf(tokenimage)intValue()

if ((num2gtmaximo)|| (num2 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num2))

|

Las producciones son algo diferentes lo que era

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

ahora es

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(IntegertoS

tring(num1))

restoListaElementos2()

El no terminal elemento se describe como void elemento() y

ademaacutes le hemos asociado una excepcioacuten para controlar el hecho

de que un usuario coloque 0 o un nuacutemero mayor que el

permitido Lo que en la parte derecha es ENTERO se indica

como ltENTEROgt y la invocacioacuten de restoListaElementos2

es restoListaElementos2()

Las acciones semaacutenticas

num1 = valor(ENTERO)

Si (num1 gt maxPaginas) or (num1==0) ent error

se indican en JavaCC asiacute

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

El valor del token actual es accesible a traveacutes de tokenimage

Si deseamos tener coacutedigo Java adicional fuera de las

producciones lo podemos antildeadir de esta forma con la palabra

reservada JAVACODE

JAVACODE void insertaElemento(int num1 int num2)

int aux i iFlag

if ((num1 = -1) ampamp (num2 = -1))

if (num1gtnum2)

aux = num1

num1 = num2

num2 = aux

for (i = num1

i lt= num2

i++)

iFlag = i-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(i))

flags[iFlag] = true

else if (num1 = -1)

iFlag = num1-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num1))

flags[iFlag] = true

else if (num2 = -1)

iFlag = num2-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num2))

flags[iFlag] = true

JAVACODE void inicializaFlags()

int i

flags = new boolean [maximo]

for (i = 0

iltmaximo

i++)

flags[i] = false

Ademaacutes podemos inicializar el parser e instanciarlo de esta

forma

PARSER_BEGIN(parserImprimePaginasCC)

import javaio

import javautilVector

public class parserImprimePaginasCC

public static int maximo

public static Vector resultado

private static int num1 num2

private static boolean flags[]

public static void main(String[]args)throws Exceptio

n

Reader r = new StringReader(args[0])

parserImprimePaginasCC p

= new parserImprimePaginasCC(r)

try

pmaximo = 50

Systemoutprintln(Maacuteximo +pmaximo)

pinicio()

Systemoutprintln(OKn)

for (int j = 0

jltpresultadosize()

j++)

Systemoutprint(presultadoelementAt(j)+

)

Systemoutprintln()

catch (ParseException e)

Systemoutprintln(Error de sintaxis)

catch (TokenMgrError e)

Systemoutprintln(Error leacutexico)

catch (elementoFueraLimitesException e)

Systemoutprintln(egetMessage())

PARSER_END(parserImprimePaginasCC)

En este caso tomaremos la entrada de lo que el usuario

introduzca por teclado pero se pueden tomar los datos a traveacutes

de ficheros o pasarlos como variables

Se hace referencia a una excepcioacuten que hemos definido asiacute en un

fichero llamado elementoFueraLimitesExceptionjava

public class elementoFueraLimitesException extends Exc

eption

Constructor

public elementoFueraLimitesException()

super()

public elementoFueraLimitesException(String msg)

super(msg)

Una vez salvado el fichero parserImprimePaginasCCjj podemos

generar la documentacioacuten de la gramaacutetica en formato HTML de

esta forma

Nota en la ejecucioacuten de estos ejemplos se ha utilizado la liacutenea de comandos de

Windows pero se podriacutea haber hecho a traveacutes de cualquier sistema que soporte

el lenguaje Java

gtjjdoc parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Documentation

Generator Version 014)

(type jjdoc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Grammar documentation generated successfully in

parserImprimePaginasCChtml

Se genera el fichero parserImprimePaginasCChtmlcuyo

contenido es

BNF for parserImprimePaginasCCjj NON-TERMINALS

inicio = listaElementos

listaElementos = elemento restoListaElementos

elemento = ltENTEROgt restoListaElementos2

restoListaElementos = ltSEPARADORgt listaElementos

|

restoListaElementos2 = ltGUIONgt ltENTEROgt

|

insertaElemento = java code

inicializaFlags = java code

Nota BNF es el tipo de notacioacuten que estamos utilizando a lo largo de estos

artiacuteculos

Compilamos el parser

gtjavacc parser ImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

File TokenMgrErrorjava does not exist Will create

one

File ParseExceptionjava does not exist Will

create one

File Tokenjava does not exist Will create one

File SimpleCharStreamjava does not exist Will

create one

Parser generated successfully

y entonces se generan estos ficheros

ParseExceptionjava --gt

Excepcioacuten generada por el parser cuando un error es encontrado

parserImprimePaginasCCjava --gt La

traduccioacuten de nuestro fichero jj a java

parserImprimePaginasCCConstantsjava --gt Los

valores de los tokens

parserImprimePaginasCCTokenManagerjava --gt El

analizador leacutexico

SimpleCharStreamjava --gt

Contiene coacutedigo para leer caracteres de cualquier

implementacioacuten de javaioInputStream o javaioReader

Tokenjava --gt

Definicioacuten de la clase Token

TokenMgrErrorjava --gt

Diversos errores que puede producir el lexer

Ahora los compilamos y antildeadimos el fichero

elementoFueraLimitesExceptionjava en dicha compilacioacuten

javac java

Y vamos a ejecutar el parser suponiendo que el maacuteximo nuacutemero

de paacuteginas a impmir es 50 (como hemos indicado con pmaximo =

50)

Lo que obtenemos como salida es la lista de paacuteginas a imprimir o

un mensaje de error

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

OK

2 5 6 7 8

java -classpath laboratorioParsers

parserImprimePaginasCC 28-3046

Num paginas 50

OK

28 29 30 4 6

java -classpath laboratorioParsers

parserImprimePaginasCC 43-51

Num paginas 50

Introdujo un numero superior al maximo51

java -classpath laboratorioParsers

parserImprimePaginasCC 43--51

Num paginas 50

Error de sintaxisEncountered - at line 1

column 4

Was expecting

ltENTEROgt

iquestQueacute pasa si algo ha ido mal iquestPodemos depurar el parser de

alguna forma

Por supuesto podemos compilar el parser asiacute para obtener una

traza de la ejecucioacuten

javacc -DEBUG_PARSER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Consumed token lt- at line 1 column 4gt

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

En la traza vemos coacutemo el parser va invocando la diferentes

producciones

Podemos tambieacuten depurar el lexer

javacc -DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Returning the ltEOFgt token

OK

2 5 6 7 8

O combinar ambas trazas

javacc -DEBUG_PARSER -

DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Consumed token lt- at line 1 column 4gt

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Returning the ltEOFgt token

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

Conclusioacuten los generadores de parsers son herramientas

potentes que sirven para resolver problemas de una manera

bdquolimpia‟ y elegante Puede que su nombre retraiga a los

desarrolladores (ldquoiquestPara queacute quiero un generador de

compiladoresrdquo) pero es una opcioacuten a tener en cuenta

Ficheros para descargar

Referencias

- Generating Parsers with JavaCC

- The JavaCC FAQ

Si quieres enviar alguacuten comentario o sugerir temas a tratar en otros artiacuteculos escribe a

curtasun[simboloArroba]ceines

Categor

iacuteas

CES OpenSouceJava

Tema Desarrollo

Autor Carlos Urtasun

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo XSL-FO (Parte 1)

Texto XSL-FO Introduccioacuten El estaacutendar XSL tal y como estaacute definido actualmente se

divide en dos grandes partes -XSLT transformacioacuten de un documento de entrada XML en

alguacuten tipo de documento de salida ya sea XML HTML PDF etc -Formatting Objects (FO) definen la visualizacioacuten final del

resultado de la transformacioacuten Son una implementacioacuten especiacutefica de un determinado XSLT y aplicados a un

fichero XML nos proporcionan otro fichero con la informacioacuten de eacuteste renderizada a alguacuten formato de visualizacioacuten impresa Eacutesta es quizaacute la principal diferencia entre un FO y

otros XSLT ambos transforman un documento XML en otro documento XML pero FO estaacute pensado para generar

directamente una renderizacioacuten

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 26: Cesnavarra 2008-boletín 7

JavaCC es una herramienta gratuita que puede descargarse

desde aquiacute Existe tambieacuten un plugin para Eclipse Y asimismo

existe una task de Ant para JavaCC

Vamos pues a construir nuestro parser

Lo denominaremos parserImprimePaginasCC y por lo tanto

vamos a editar el fichero parserImprimePaginasCCjj

Indicaremos coacutemo se traducen los tokens y las producciones a

formato JavaCC

TOKEN

ltENTERO([0-9])+gt

| ltGUION -gt

| ltSEPARADOR([ ])+ | ([ ])gt

Los tokens se describen praacutecticamente como lo indicamos en la

gramaacutetica

void inicio()throws elementoFueraLimitesException

resultado = new Vector()

num1 = -1

num2 = -1

inicializaFlags()

listaElementos()

void listaElementos()throws elementoFueraLimitesExcept

ion

elemento() restoListaElementos()

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

restoListaElementos2()

void restoListaElementos()throws elementoFueraLimitesE

xception

ltSEPARADORgt

insertaElemento(num1 num2)

num1 = -1

num2 = -1

listaElementos()

|

insertaElemento(num1 num2)

num1 = -1

num2 = -1

void restoListaElementos2()throws elementoFueraLimites

Exception

ltGUIONgtltENTEROgt

num2 = IntegervalueOf(tokenimage)intValue()

if ((num2gtmaximo)|| (num2 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num2))

|

Las producciones son algo diferentes lo que era

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

ahora es

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(IntegertoS

tring(num1))

restoListaElementos2()

El no terminal elemento se describe como void elemento() y

ademaacutes le hemos asociado una excepcioacuten para controlar el hecho

de que un usuario coloque 0 o un nuacutemero mayor que el

permitido Lo que en la parte derecha es ENTERO se indica

como ltENTEROgt y la invocacioacuten de restoListaElementos2

es restoListaElementos2()

Las acciones semaacutenticas

num1 = valor(ENTERO)

Si (num1 gt maxPaginas) or (num1==0) ent error

se indican en JavaCC asiacute

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

El valor del token actual es accesible a traveacutes de tokenimage

Si deseamos tener coacutedigo Java adicional fuera de las

producciones lo podemos antildeadir de esta forma con la palabra

reservada JAVACODE

JAVACODE void insertaElemento(int num1 int num2)

int aux i iFlag

if ((num1 = -1) ampamp (num2 = -1))

if (num1gtnum2)

aux = num1

num1 = num2

num2 = aux

for (i = num1

i lt= num2

i++)

iFlag = i-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(i))

flags[iFlag] = true

else if (num1 = -1)

iFlag = num1-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num1))

flags[iFlag] = true

else if (num2 = -1)

iFlag = num2-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num2))

flags[iFlag] = true

JAVACODE void inicializaFlags()

int i

flags = new boolean [maximo]

for (i = 0

iltmaximo

i++)

flags[i] = false

Ademaacutes podemos inicializar el parser e instanciarlo de esta

forma

PARSER_BEGIN(parserImprimePaginasCC)

import javaio

import javautilVector

public class parserImprimePaginasCC

public static int maximo

public static Vector resultado

private static int num1 num2

private static boolean flags[]

public static void main(String[]args)throws Exceptio

n

Reader r = new StringReader(args[0])

parserImprimePaginasCC p

= new parserImprimePaginasCC(r)

try

pmaximo = 50

Systemoutprintln(Maacuteximo +pmaximo)

pinicio()

Systemoutprintln(OKn)

for (int j = 0

jltpresultadosize()

j++)

Systemoutprint(presultadoelementAt(j)+

)

Systemoutprintln()

catch (ParseException e)

Systemoutprintln(Error de sintaxis)

catch (TokenMgrError e)

Systemoutprintln(Error leacutexico)

catch (elementoFueraLimitesException e)

Systemoutprintln(egetMessage())

PARSER_END(parserImprimePaginasCC)

En este caso tomaremos la entrada de lo que el usuario

introduzca por teclado pero se pueden tomar los datos a traveacutes

de ficheros o pasarlos como variables

Se hace referencia a una excepcioacuten que hemos definido asiacute en un

fichero llamado elementoFueraLimitesExceptionjava

public class elementoFueraLimitesException extends Exc

eption

Constructor

public elementoFueraLimitesException()

super()

public elementoFueraLimitesException(String msg)

super(msg)

Una vez salvado el fichero parserImprimePaginasCCjj podemos

generar la documentacioacuten de la gramaacutetica en formato HTML de

esta forma

Nota en la ejecucioacuten de estos ejemplos se ha utilizado la liacutenea de comandos de

Windows pero se podriacutea haber hecho a traveacutes de cualquier sistema que soporte

el lenguaje Java

gtjjdoc parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Documentation

Generator Version 014)

(type jjdoc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Grammar documentation generated successfully in

parserImprimePaginasCChtml

Se genera el fichero parserImprimePaginasCChtmlcuyo

contenido es

BNF for parserImprimePaginasCCjj NON-TERMINALS

inicio = listaElementos

listaElementos = elemento restoListaElementos

elemento = ltENTEROgt restoListaElementos2

restoListaElementos = ltSEPARADORgt listaElementos

|

restoListaElementos2 = ltGUIONgt ltENTEROgt

|

insertaElemento = java code

inicializaFlags = java code

Nota BNF es el tipo de notacioacuten que estamos utilizando a lo largo de estos

artiacuteculos

Compilamos el parser

gtjavacc parser ImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

File TokenMgrErrorjava does not exist Will create

one

File ParseExceptionjava does not exist Will

create one

File Tokenjava does not exist Will create one

File SimpleCharStreamjava does not exist Will

create one

Parser generated successfully

y entonces se generan estos ficheros

ParseExceptionjava --gt

Excepcioacuten generada por el parser cuando un error es encontrado

parserImprimePaginasCCjava --gt La

traduccioacuten de nuestro fichero jj a java

parserImprimePaginasCCConstantsjava --gt Los

valores de los tokens

parserImprimePaginasCCTokenManagerjava --gt El

analizador leacutexico

SimpleCharStreamjava --gt

Contiene coacutedigo para leer caracteres de cualquier

implementacioacuten de javaioInputStream o javaioReader

Tokenjava --gt

Definicioacuten de la clase Token

TokenMgrErrorjava --gt

Diversos errores que puede producir el lexer

Ahora los compilamos y antildeadimos el fichero

elementoFueraLimitesExceptionjava en dicha compilacioacuten

javac java

Y vamos a ejecutar el parser suponiendo que el maacuteximo nuacutemero

de paacuteginas a impmir es 50 (como hemos indicado con pmaximo =

50)

Lo que obtenemos como salida es la lista de paacuteginas a imprimir o

un mensaje de error

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

OK

2 5 6 7 8

java -classpath laboratorioParsers

parserImprimePaginasCC 28-3046

Num paginas 50

OK

28 29 30 4 6

java -classpath laboratorioParsers

parserImprimePaginasCC 43-51

Num paginas 50

Introdujo un numero superior al maximo51

java -classpath laboratorioParsers

parserImprimePaginasCC 43--51

Num paginas 50

Error de sintaxisEncountered - at line 1

column 4

Was expecting

ltENTEROgt

iquestQueacute pasa si algo ha ido mal iquestPodemos depurar el parser de

alguna forma

Por supuesto podemos compilar el parser asiacute para obtener una

traza de la ejecucioacuten

javacc -DEBUG_PARSER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Consumed token lt- at line 1 column 4gt

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

En la traza vemos coacutemo el parser va invocando la diferentes

producciones

Podemos tambieacuten depurar el lexer

javacc -DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Returning the ltEOFgt token

OK

2 5 6 7 8

O combinar ambas trazas

javacc -DEBUG_PARSER -

DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Consumed token lt- at line 1 column 4gt

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Returning the ltEOFgt token

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

Conclusioacuten los generadores de parsers son herramientas

potentes que sirven para resolver problemas de una manera

bdquolimpia‟ y elegante Puede que su nombre retraiga a los

desarrolladores (ldquoiquestPara queacute quiero un generador de

compiladoresrdquo) pero es una opcioacuten a tener en cuenta

Ficheros para descargar

Referencias

- Generating Parsers with JavaCC

- The JavaCC FAQ

Si quieres enviar alguacuten comentario o sugerir temas a tratar en otros artiacuteculos escribe a

curtasun[simboloArroba]ceines

Categor

iacuteas

CES OpenSouceJava

Tema Desarrollo

Autor Carlos Urtasun

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo XSL-FO (Parte 1)

Texto XSL-FO Introduccioacuten El estaacutendar XSL tal y como estaacute definido actualmente se

divide en dos grandes partes -XSLT transformacioacuten de un documento de entrada XML en

alguacuten tipo de documento de salida ya sea XML HTML PDF etc -Formatting Objects (FO) definen la visualizacioacuten final del

resultado de la transformacioacuten Son una implementacioacuten especiacutefica de un determinado XSLT y aplicados a un

fichero XML nos proporcionan otro fichero con la informacioacuten de eacuteste renderizada a alguacuten formato de visualizacioacuten impresa Eacutesta es quizaacute la principal diferencia entre un FO y

otros XSLT ambos transforman un documento XML en otro documento XML pero FO estaacute pensado para generar

directamente una renderizacioacuten

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 27: Cesnavarra 2008-boletín 7

inicializaFlags()

listaElementos()

void listaElementos()throws elementoFueraLimitesExcept

ion

elemento() restoListaElementos()

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

restoListaElementos2()

void restoListaElementos()throws elementoFueraLimitesE

xception

ltSEPARADORgt

insertaElemento(num1 num2)

num1 = -1

num2 = -1

listaElementos()

|

insertaElemento(num1 num2)

num1 = -1

num2 = -1

void restoListaElementos2()throws elementoFueraLimites

Exception

ltGUIONgtltENTEROgt

num2 = IntegervalueOf(tokenimage)intValue()

if ((num2gtmaximo)|| (num2 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num2))

|

Las producciones son algo diferentes lo que era

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

ahora es

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(IntegertoS

tring(num1))

restoListaElementos2()

El no terminal elemento se describe como void elemento() y

ademaacutes le hemos asociado una excepcioacuten para controlar el hecho

de que un usuario coloque 0 o un nuacutemero mayor que el

permitido Lo que en la parte derecha es ENTERO se indica

como ltENTEROgt y la invocacioacuten de restoListaElementos2

es restoListaElementos2()

Las acciones semaacutenticas

num1 = valor(ENTERO)

Si (num1 gt maxPaginas) or (num1==0) ent error

se indican en JavaCC asiacute

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

El valor del token actual es accesible a traveacutes de tokenimage

Si deseamos tener coacutedigo Java adicional fuera de las

producciones lo podemos antildeadir de esta forma con la palabra

reservada JAVACODE

JAVACODE void insertaElemento(int num1 int num2)

int aux i iFlag

if ((num1 = -1) ampamp (num2 = -1))

if (num1gtnum2)

aux = num1

num1 = num2

num2 = aux

for (i = num1

i lt= num2

i++)

iFlag = i-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(i))

flags[iFlag] = true

else if (num1 = -1)

iFlag = num1-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num1))

flags[iFlag] = true

else if (num2 = -1)

iFlag = num2-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num2))

flags[iFlag] = true

JAVACODE void inicializaFlags()

int i

flags = new boolean [maximo]

for (i = 0

iltmaximo

i++)

flags[i] = false

Ademaacutes podemos inicializar el parser e instanciarlo de esta

forma

PARSER_BEGIN(parserImprimePaginasCC)

import javaio

import javautilVector

public class parserImprimePaginasCC

public static int maximo

public static Vector resultado

private static int num1 num2

private static boolean flags[]

public static void main(String[]args)throws Exceptio

n

Reader r = new StringReader(args[0])

parserImprimePaginasCC p

= new parserImprimePaginasCC(r)

try

pmaximo = 50

Systemoutprintln(Maacuteximo +pmaximo)

pinicio()

Systemoutprintln(OKn)

for (int j = 0

jltpresultadosize()

j++)

Systemoutprint(presultadoelementAt(j)+

)

Systemoutprintln()

catch (ParseException e)

Systemoutprintln(Error de sintaxis)

catch (TokenMgrError e)

Systemoutprintln(Error leacutexico)

catch (elementoFueraLimitesException e)

Systemoutprintln(egetMessage())

PARSER_END(parserImprimePaginasCC)

En este caso tomaremos la entrada de lo que el usuario

introduzca por teclado pero se pueden tomar los datos a traveacutes

de ficheros o pasarlos como variables

Se hace referencia a una excepcioacuten que hemos definido asiacute en un

fichero llamado elementoFueraLimitesExceptionjava

public class elementoFueraLimitesException extends Exc

eption

Constructor

public elementoFueraLimitesException()

super()

public elementoFueraLimitesException(String msg)

super(msg)

Una vez salvado el fichero parserImprimePaginasCCjj podemos

generar la documentacioacuten de la gramaacutetica en formato HTML de

esta forma

Nota en la ejecucioacuten de estos ejemplos se ha utilizado la liacutenea de comandos de

Windows pero se podriacutea haber hecho a traveacutes de cualquier sistema que soporte

el lenguaje Java

gtjjdoc parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Documentation

Generator Version 014)

(type jjdoc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Grammar documentation generated successfully in

parserImprimePaginasCChtml

Se genera el fichero parserImprimePaginasCChtmlcuyo

contenido es

BNF for parserImprimePaginasCCjj NON-TERMINALS

inicio = listaElementos

listaElementos = elemento restoListaElementos

elemento = ltENTEROgt restoListaElementos2

restoListaElementos = ltSEPARADORgt listaElementos

|

restoListaElementos2 = ltGUIONgt ltENTEROgt

|

insertaElemento = java code

inicializaFlags = java code

Nota BNF es el tipo de notacioacuten que estamos utilizando a lo largo de estos

artiacuteculos

Compilamos el parser

gtjavacc parser ImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

File TokenMgrErrorjava does not exist Will create

one

File ParseExceptionjava does not exist Will

create one

File Tokenjava does not exist Will create one

File SimpleCharStreamjava does not exist Will

create one

Parser generated successfully

y entonces se generan estos ficheros

ParseExceptionjava --gt

Excepcioacuten generada por el parser cuando un error es encontrado

parserImprimePaginasCCjava --gt La

traduccioacuten de nuestro fichero jj a java

parserImprimePaginasCCConstantsjava --gt Los

valores de los tokens

parserImprimePaginasCCTokenManagerjava --gt El

analizador leacutexico

SimpleCharStreamjava --gt

Contiene coacutedigo para leer caracteres de cualquier

implementacioacuten de javaioInputStream o javaioReader

Tokenjava --gt

Definicioacuten de la clase Token

TokenMgrErrorjava --gt

Diversos errores que puede producir el lexer

Ahora los compilamos y antildeadimos el fichero

elementoFueraLimitesExceptionjava en dicha compilacioacuten

javac java

Y vamos a ejecutar el parser suponiendo que el maacuteximo nuacutemero

de paacuteginas a impmir es 50 (como hemos indicado con pmaximo =

50)

Lo que obtenemos como salida es la lista de paacuteginas a imprimir o

un mensaje de error

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

OK

2 5 6 7 8

java -classpath laboratorioParsers

parserImprimePaginasCC 28-3046

Num paginas 50

OK

28 29 30 4 6

java -classpath laboratorioParsers

parserImprimePaginasCC 43-51

Num paginas 50

Introdujo un numero superior al maximo51

java -classpath laboratorioParsers

parserImprimePaginasCC 43--51

Num paginas 50

Error de sintaxisEncountered - at line 1

column 4

Was expecting

ltENTEROgt

iquestQueacute pasa si algo ha ido mal iquestPodemos depurar el parser de

alguna forma

Por supuesto podemos compilar el parser asiacute para obtener una

traza de la ejecucioacuten

javacc -DEBUG_PARSER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Consumed token lt- at line 1 column 4gt

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

En la traza vemos coacutemo el parser va invocando la diferentes

producciones

Podemos tambieacuten depurar el lexer

javacc -DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Returning the ltEOFgt token

OK

2 5 6 7 8

O combinar ambas trazas

javacc -DEBUG_PARSER -

DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Consumed token lt- at line 1 column 4gt

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Returning the ltEOFgt token

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

Conclusioacuten los generadores de parsers son herramientas

potentes que sirven para resolver problemas de una manera

bdquolimpia‟ y elegante Puede que su nombre retraiga a los

desarrolladores (ldquoiquestPara queacute quiero un generador de

compiladoresrdquo) pero es una opcioacuten a tener en cuenta

Ficheros para descargar

Referencias

- Generating Parsers with JavaCC

- The JavaCC FAQ

Si quieres enviar alguacuten comentario o sugerir temas a tratar en otros artiacuteculos escribe a

curtasun[simboloArroba]ceines

Categor

iacuteas

CES OpenSouceJava

Tema Desarrollo

Autor Carlos Urtasun

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo XSL-FO (Parte 1)

Texto XSL-FO Introduccioacuten El estaacutendar XSL tal y como estaacute definido actualmente se

divide en dos grandes partes -XSLT transformacioacuten de un documento de entrada XML en

alguacuten tipo de documento de salida ya sea XML HTML PDF etc -Formatting Objects (FO) definen la visualizacioacuten final del

resultado de la transformacioacuten Son una implementacioacuten especiacutefica de un determinado XSLT y aplicados a un

fichero XML nos proporcionan otro fichero con la informacioacuten de eacuteste renderizada a alguacuten formato de visualizacioacuten impresa Eacutesta es quizaacute la principal diferencia entre un FO y

otros XSLT ambos transforman un documento XML en otro documento XML pero FO estaacute pensado para generar

directamente una renderizacioacuten

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 28: Cesnavarra 2008-boletín 7

num1 = -1

num2 = -1

void restoListaElementos2()throws elementoFueraLimites

Exception

ltGUIONgtltENTEROgt

num2 = IntegervalueOf(tokenimage)intValue()

if ((num2gtmaximo)|| (num2 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num2))

|

Las producciones son algo diferentes lo que era

elemento --gt ENTERO

num1 = valor(ENTERO)

Si (num1 gt maxPaginas)

or (num1==0) ent error

restoListaElementos2

ahora es

void elemento()throws elementoFueraLimitesException

ltENTEROgt

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(IntegertoS

tring(num1))

restoListaElementos2()

El no terminal elemento se describe como void elemento() y

ademaacutes le hemos asociado una excepcioacuten para controlar el hecho

de que un usuario coloque 0 o un nuacutemero mayor que el

permitido Lo que en la parte derecha es ENTERO se indica

como ltENTEROgt y la invocacioacuten de restoListaElementos2

es restoListaElementos2()

Las acciones semaacutenticas

num1 = valor(ENTERO)

Si (num1 gt maxPaginas) or (num1==0) ent error

se indican en JavaCC asiacute

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

El valor del token actual es accesible a traveacutes de tokenimage

Si deseamos tener coacutedigo Java adicional fuera de las

producciones lo podemos antildeadir de esta forma con la palabra

reservada JAVACODE

JAVACODE void insertaElemento(int num1 int num2)

int aux i iFlag

if ((num1 = -1) ampamp (num2 = -1))

if (num1gtnum2)

aux = num1

num1 = num2

num2 = aux

for (i = num1

i lt= num2

i++)

iFlag = i-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(i))

flags[iFlag] = true

else if (num1 = -1)

iFlag = num1-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num1))

flags[iFlag] = true

else if (num2 = -1)

iFlag = num2-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num2))

flags[iFlag] = true

JAVACODE void inicializaFlags()

int i

flags = new boolean [maximo]

for (i = 0

iltmaximo

i++)

flags[i] = false

Ademaacutes podemos inicializar el parser e instanciarlo de esta

forma

PARSER_BEGIN(parserImprimePaginasCC)

import javaio

import javautilVector

public class parserImprimePaginasCC

public static int maximo

public static Vector resultado

private static int num1 num2

private static boolean flags[]

public static void main(String[]args)throws Exceptio

n

Reader r = new StringReader(args[0])

parserImprimePaginasCC p

= new parserImprimePaginasCC(r)

try

pmaximo = 50

Systemoutprintln(Maacuteximo +pmaximo)

pinicio()

Systemoutprintln(OKn)

for (int j = 0

jltpresultadosize()

j++)

Systemoutprint(presultadoelementAt(j)+

)

Systemoutprintln()

catch (ParseException e)

Systemoutprintln(Error de sintaxis)

catch (TokenMgrError e)

Systemoutprintln(Error leacutexico)

catch (elementoFueraLimitesException e)

Systemoutprintln(egetMessage())

PARSER_END(parserImprimePaginasCC)

En este caso tomaremos la entrada de lo que el usuario

introduzca por teclado pero se pueden tomar los datos a traveacutes

de ficheros o pasarlos como variables

Se hace referencia a una excepcioacuten que hemos definido asiacute en un

fichero llamado elementoFueraLimitesExceptionjava

public class elementoFueraLimitesException extends Exc

eption

Constructor

public elementoFueraLimitesException()

super()

public elementoFueraLimitesException(String msg)

super(msg)

Una vez salvado el fichero parserImprimePaginasCCjj podemos

generar la documentacioacuten de la gramaacutetica en formato HTML de

esta forma

Nota en la ejecucioacuten de estos ejemplos se ha utilizado la liacutenea de comandos de

Windows pero se podriacutea haber hecho a traveacutes de cualquier sistema que soporte

el lenguaje Java

gtjjdoc parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Documentation

Generator Version 014)

(type jjdoc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Grammar documentation generated successfully in

parserImprimePaginasCChtml

Se genera el fichero parserImprimePaginasCChtmlcuyo

contenido es

BNF for parserImprimePaginasCCjj NON-TERMINALS

inicio = listaElementos

listaElementos = elemento restoListaElementos

elemento = ltENTEROgt restoListaElementos2

restoListaElementos = ltSEPARADORgt listaElementos

|

restoListaElementos2 = ltGUIONgt ltENTEROgt

|

insertaElemento = java code

inicializaFlags = java code

Nota BNF es el tipo de notacioacuten que estamos utilizando a lo largo de estos

artiacuteculos

Compilamos el parser

gtjavacc parser ImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

File TokenMgrErrorjava does not exist Will create

one

File ParseExceptionjava does not exist Will

create one

File Tokenjava does not exist Will create one

File SimpleCharStreamjava does not exist Will

create one

Parser generated successfully

y entonces se generan estos ficheros

ParseExceptionjava --gt

Excepcioacuten generada por el parser cuando un error es encontrado

parserImprimePaginasCCjava --gt La

traduccioacuten de nuestro fichero jj a java

parserImprimePaginasCCConstantsjava --gt Los

valores de los tokens

parserImprimePaginasCCTokenManagerjava --gt El

analizador leacutexico

SimpleCharStreamjava --gt

Contiene coacutedigo para leer caracteres de cualquier

implementacioacuten de javaioInputStream o javaioReader

Tokenjava --gt

Definicioacuten de la clase Token

TokenMgrErrorjava --gt

Diversos errores que puede producir el lexer

Ahora los compilamos y antildeadimos el fichero

elementoFueraLimitesExceptionjava en dicha compilacioacuten

javac java

Y vamos a ejecutar el parser suponiendo que el maacuteximo nuacutemero

de paacuteginas a impmir es 50 (como hemos indicado con pmaximo =

50)

Lo que obtenemos como salida es la lista de paacuteginas a imprimir o

un mensaje de error

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

OK

2 5 6 7 8

java -classpath laboratorioParsers

parserImprimePaginasCC 28-3046

Num paginas 50

OK

28 29 30 4 6

java -classpath laboratorioParsers

parserImprimePaginasCC 43-51

Num paginas 50

Introdujo un numero superior al maximo51

java -classpath laboratorioParsers

parserImprimePaginasCC 43--51

Num paginas 50

Error de sintaxisEncountered - at line 1

column 4

Was expecting

ltENTEROgt

iquestQueacute pasa si algo ha ido mal iquestPodemos depurar el parser de

alguna forma

Por supuesto podemos compilar el parser asiacute para obtener una

traza de la ejecucioacuten

javacc -DEBUG_PARSER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Consumed token lt- at line 1 column 4gt

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

En la traza vemos coacutemo el parser va invocando la diferentes

producciones

Podemos tambieacuten depurar el lexer

javacc -DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Returning the ltEOFgt token

OK

2 5 6 7 8

O combinar ambas trazas

javacc -DEBUG_PARSER -

DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Consumed token lt- at line 1 column 4gt

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Returning the ltEOFgt token

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

Conclusioacuten los generadores de parsers son herramientas

potentes que sirven para resolver problemas de una manera

bdquolimpia‟ y elegante Puede que su nombre retraiga a los

desarrolladores (ldquoiquestPara queacute quiero un generador de

compiladoresrdquo) pero es una opcioacuten a tener en cuenta

Ficheros para descargar

Referencias

- Generating Parsers with JavaCC

- The JavaCC FAQ

Si quieres enviar alguacuten comentario o sugerir temas a tratar en otros artiacuteculos escribe a

curtasun[simboloArroba]ceines

Categor

iacuteas

CES OpenSouceJava

Tema Desarrollo

Autor Carlos Urtasun

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo XSL-FO (Parte 1)

Texto XSL-FO Introduccioacuten El estaacutendar XSL tal y como estaacute definido actualmente se

divide en dos grandes partes -XSLT transformacioacuten de un documento de entrada XML en

alguacuten tipo de documento de salida ya sea XML HTML PDF etc -Formatting Objects (FO) definen la visualizacioacuten final del

resultado de la transformacioacuten Son una implementacioacuten especiacutefica de un determinado XSLT y aplicados a un

fichero XML nos proporcionan otro fichero con la informacioacuten de eacuteste renderizada a alguacuten formato de visualizacioacuten impresa Eacutesta es quizaacute la principal diferencia entre un FO y

otros XSLT ambos transforman un documento XML en otro documento XML pero FO estaacute pensado para generar

directamente una renderizacioacuten

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 29: Cesnavarra 2008-boletín 7

restoListaElementos2()

El no terminal elemento se describe como void elemento() y

ademaacutes le hemos asociado una excepcioacuten para controlar el hecho

de que un usuario coloque 0 o un nuacutemero mayor que el

permitido Lo que en la parte derecha es ENTERO se indica

como ltENTEROgt y la invocacioacuten de restoListaElementos2

es restoListaElementos2()

Las acciones semaacutenticas

num1 = valor(ENTERO)

Si (num1 gt maxPaginas) or (num1==0) ent error

se indican en JavaCC asiacute

num1 = IntegervalueOf(tokenimage)intValue()

if ((num1gtmaximo)|| (num1 ==

0))throw new elementoFueraLimitesException(Introdujo

un numero superior al maximo +

IntegertoString(num1))

El valor del token actual es accesible a traveacutes de tokenimage

Si deseamos tener coacutedigo Java adicional fuera de las

producciones lo podemos antildeadir de esta forma con la palabra

reservada JAVACODE

JAVACODE void insertaElemento(int num1 int num2)

int aux i iFlag

if ((num1 = -1) ampamp (num2 = -1))

if (num1gtnum2)

aux = num1

num1 = num2

num2 = aux

for (i = num1

i lt= num2

i++)

iFlag = i-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(i))

flags[iFlag] = true

else if (num1 = -1)

iFlag = num1-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num1))

flags[iFlag] = true

else if (num2 = -1)

iFlag = num2-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num2))

flags[iFlag] = true

JAVACODE void inicializaFlags()

int i

flags = new boolean [maximo]

for (i = 0

iltmaximo

i++)

flags[i] = false

Ademaacutes podemos inicializar el parser e instanciarlo de esta

forma

PARSER_BEGIN(parserImprimePaginasCC)

import javaio

import javautilVector

public class parserImprimePaginasCC

public static int maximo

public static Vector resultado

private static int num1 num2

private static boolean flags[]

public static void main(String[]args)throws Exceptio

n

Reader r = new StringReader(args[0])

parserImprimePaginasCC p

= new parserImprimePaginasCC(r)

try

pmaximo = 50

Systemoutprintln(Maacuteximo +pmaximo)

pinicio()

Systemoutprintln(OKn)

for (int j = 0

jltpresultadosize()

j++)

Systemoutprint(presultadoelementAt(j)+

)

Systemoutprintln()

catch (ParseException e)

Systemoutprintln(Error de sintaxis)

catch (TokenMgrError e)

Systemoutprintln(Error leacutexico)

catch (elementoFueraLimitesException e)

Systemoutprintln(egetMessage())

PARSER_END(parserImprimePaginasCC)

En este caso tomaremos la entrada de lo que el usuario

introduzca por teclado pero se pueden tomar los datos a traveacutes

de ficheros o pasarlos como variables

Se hace referencia a una excepcioacuten que hemos definido asiacute en un

fichero llamado elementoFueraLimitesExceptionjava

public class elementoFueraLimitesException extends Exc

eption

Constructor

public elementoFueraLimitesException()

super()

public elementoFueraLimitesException(String msg)

super(msg)

Una vez salvado el fichero parserImprimePaginasCCjj podemos

generar la documentacioacuten de la gramaacutetica en formato HTML de

esta forma

Nota en la ejecucioacuten de estos ejemplos se ha utilizado la liacutenea de comandos de

Windows pero se podriacutea haber hecho a traveacutes de cualquier sistema que soporte

el lenguaje Java

gtjjdoc parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Documentation

Generator Version 014)

(type jjdoc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Grammar documentation generated successfully in

parserImprimePaginasCChtml

Se genera el fichero parserImprimePaginasCChtmlcuyo

contenido es

BNF for parserImprimePaginasCCjj NON-TERMINALS

inicio = listaElementos

listaElementos = elemento restoListaElementos

elemento = ltENTEROgt restoListaElementos2

restoListaElementos = ltSEPARADORgt listaElementos

|

restoListaElementos2 = ltGUIONgt ltENTEROgt

|

insertaElemento = java code

inicializaFlags = java code

Nota BNF es el tipo de notacioacuten que estamos utilizando a lo largo de estos

artiacuteculos

Compilamos el parser

gtjavacc parser ImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

File TokenMgrErrorjava does not exist Will create

one

File ParseExceptionjava does not exist Will

create one

File Tokenjava does not exist Will create one

File SimpleCharStreamjava does not exist Will

create one

Parser generated successfully

y entonces se generan estos ficheros

ParseExceptionjava --gt

Excepcioacuten generada por el parser cuando un error es encontrado

parserImprimePaginasCCjava --gt La

traduccioacuten de nuestro fichero jj a java

parserImprimePaginasCCConstantsjava --gt Los

valores de los tokens

parserImprimePaginasCCTokenManagerjava --gt El

analizador leacutexico

SimpleCharStreamjava --gt

Contiene coacutedigo para leer caracteres de cualquier

implementacioacuten de javaioInputStream o javaioReader

Tokenjava --gt

Definicioacuten de la clase Token

TokenMgrErrorjava --gt

Diversos errores que puede producir el lexer

Ahora los compilamos y antildeadimos el fichero

elementoFueraLimitesExceptionjava en dicha compilacioacuten

javac java

Y vamos a ejecutar el parser suponiendo que el maacuteximo nuacutemero

de paacuteginas a impmir es 50 (como hemos indicado con pmaximo =

50)

Lo que obtenemos como salida es la lista de paacuteginas a imprimir o

un mensaje de error

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

OK

2 5 6 7 8

java -classpath laboratorioParsers

parserImprimePaginasCC 28-3046

Num paginas 50

OK

28 29 30 4 6

java -classpath laboratorioParsers

parserImprimePaginasCC 43-51

Num paginas 50

Introdujo un numero superior al maximo51

java -classpath laboratorioParsers

parserImprimePaginasCC 43--51

Num paginas 50

Error de sintaxisEncountered - at line 1

column 4

Was expecting

ltENTEROgt

iquestQueacute pasa si algo ha ido mal iquestPodemos depurar el parser de

alguna forma

Por supuesto podemos compilar el parser asiacute para obtener una

traza de la ejecucioacuten

javacc -DEBUG_PARSER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Consumed token lt- at line 1 column 4gt

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

En la traza vemos coacutemo el parser va invocando la diferentes

producciones

Podemos tambieacuten depurar el lexer

javacc -DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Returning the ltEOFgt token

OK

2 5 6 7 8

O combinar ambas trazas

javacc -DEBUG_PARSER -

DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Consumed token lt- at line 1 column 4gt

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Returning the ltEOFgt token

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

Conclusioacuten los generadores de parsers son herramientas

potentes que sirven para resolver problemas de una manera

bdquolimpia‟ y elegante Puede que su nombre retraiga a los

desarrolladores (ldquoiquestPara queacute quiero un generador de

compiladoresrdquo) pero es una opcioacuten a tener en cuenta

Ficheros para descargar

Referencias

- Generating Parsers with JavaCC

- The JavaCC FAQ

Si quieres enviar alguacuten comentario o sugerir temas a tratar en otros artiacuteculos escribe a

curtasun[simboloArroba]ceines

Categor

iacuteas

CES OpenSouceJava

Tema Desarrollo

Autor Carlos Urtasun

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo XSL-FO (Parte 1)

Texto XSL-FO Introduccioacuten El estaacutendar XSL tal y como estaacute definido actualmente se

divide en dos grandes partes -XSLT transformacioacuten de un documento de entrada XML en

alguacuten tipo de documento de salida ya sea XML HTML PDF etc -Formatting Objects (FO) definen la visualizacioacuten final del

resultado de la transformacioacuten Son una implementacioacuten especiacutefica de un determinado XSLT y aplicados a un

fichero XML nos proporcionan otro fichero con la informacioacuten de eacuteste renderizada a alguacuten formato de visualizacioacuten impresa Eacutesta es quizaacute la principal diferencia entre un FO y

otros XSLT ambos transforman un documento XML en otro documento XML pero FO estaacute pensado para generar

directamente una renderizacioacuten

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 30: Cesnavarra 2008-boletín 7

num1 = num2

num2 = aux

for (i = num1

i lt= num2

i++)

iFlag = i-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(i))

flags[iFlag] = true

else if (num1 = -1)

iFlag = num1-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num1))

flags[iFlag] = true

else if (num2 = -1)

iFlag = num2-1

if (flags[iFlag] == false)

resultadoaddElement(new Integer(num2))

flags[iFlag] = true

JAVACODE void inicializaFlags()

int i

flags = new boolean [maximo]

for (i = 0

iltmaximo

i++)

flags[i] = false

Ademaacutes podemos inicializar el parser e instanciarlo de esta

forma

PARSER_BEGIN(parserImprimePaginasCC)

import javaio

import javautilVector

public class parserImprimePaginasCC

public static int maximo

public static Vector resultado

private static int num1 num2

private static boolean flags[]

public static void main(String[]args)throws Exceptio

n

Reader r = new StringReader(args[0])

parserImprimePaginasCC p

= new parserImprimePaginasCC(r)

try

pmaximo = 50

Systemoutprintln(Maacuteximo +pmaximo)

pinicio()

Systemoutprintln(OKn)

for (int j = 0

jltpresultadosize()

j++)

Systemoutprint(presultadoelementAt(j)+

)

Systemoutprintln()

catch (ParseException e)

Systemoutprintln(Error de sintaxis)

catch (TokenMgrError e)

Systemoutprintln(Error leacutexico)

catch (elementoFueraLimitesException e)

Systemoutprintln(egetMessage())

PARSER_END(parserImprimePaginasCC)

En este caso tomaremos la entrada de lo que el usuario

introduzca por teclado pero se pueden tomar los datos a traveacutes

de ficheros o pasarlos como variables

Se hace referencia a una excepcioacuten que hemos definido asiacute en un

fichero llamado elementoFueraLimitesExceptionjava

public class elementoFueraLimitesException extends Exc

eption

Constructor

public elementoFueraLimitesException()

super()

public elementoFueraLimitesException(String msg)

super(msg)

Una vez salvado el fichero parserImprimePaginasCCjj podemos

generar la documentacioacuten de la gramaacutetica en formato HTML de

esta forma

Nota en la ejecucioacuten de estos ejemplos se ha utilizado la liacutenea de comandos de

Windows pero se podriacutea haber hecho a traveacutes de cualquier sistema que soporte

el lenguaje Java

gtjjdoc parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Documentation

Generator Version 014)

(type jjdoc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Grammar documentation generated successfully in

parserImprimePaginasCChtml

Se genera el fichero parserImprimePaginasCChtmlcuyo

contenido es

BNF for parserImprimePaginasCCjj NON-TERMINALS

inicio = listaElementos

listaElementos = elemento restoListaElementos

elemento = ltENTEROgt restoListaElementos2

restoListaElementos = ltSEPARADORgt listaElementos

|

restoListaElementos2 = ltGUIONgt ltENTEROgt

|

insertaElemento = java code

inicializaFlags = java code

Nota BNF es el tipo de notacioacuten que estamos utilizando a lo largo de estos

artiacuteculos

Compilamos el parser

gtjavacc parser ImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

File TokenMgrErrorjava does not exist Will create

one

File ParseExceptionjava does not exist Will

create one

File Tokenjava does not exist Will create one

File SimpleCharStreamjava does not exist Will

create one

Parser generated successfully

y entonces se generan estos ficheros

ParseExceptionjava --gt

Excepcioacuten generada por el parser cuando un error es encontrado

parserImprimePaginasCCjava --gt La

traduccioacuten de nuestro fichero jj a java

parserImprimePaginasCCConstantsjava --gt Los

valores de los tokens

parserImprimePaginasCCTokenManagerjava --gt El

analizador leacutexico

SimpleCharStreamjava --gt

Contiene coacutedigo para leer caracteres de cualquier

implementacioacuten de javaioInputStream o javaioReader

Tokenjava --gt

Definicioacuten de la clase Token

TokenMgrErrorjava --gt

Diversos errores que puede producir el lexer

Ahora los compilamos y antildeadimos el fichero

elementoFueraLimitesExceptionjava en dicha compilacioacuten

javac java

Y vamos a ejecutar el parser suponiendo que el maacuteximo nuacutemero

de paacuteginas a impmir es 50 (como hemos indicado con pmaximo =

50)

Lo que obtenemos como salida es la lista de paacuteginas a imprimir o

un mensaje de error

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

OK

2 5 6 7 8

java -classpath laboratorioParsers

parserImprimePaginasCC 28-3046

Num paginas 50

OK

28 29 30 4 6

java -classpath laboratorioParsers

parserImprimePaginasCC 43-51

Num paginas 50

Introdujo un numero superior al maximo51

java -classpath laboratorioParsers

parserImprimePaginasCC 43--51

Num paginas 50

Error de sintaxisEncountered - at line 1

column 4

Was expecting

ltENTEROgt

iquestQueacute pasa si algo ha ido mal iquestPodemos depurar el parser de

alguna forma

Por supuesto podemos compilar el parser asiacute para obtener una

traza de la ejecucioacuten

javacc -DEBUG_PARSER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Consumed token lt- at line 1 column 4gt

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

En la traza vemos coacutemo el parser va invocando la diferentes

producciones

Podemos tambieacuten depurar el lexer

javacc -DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Returning the ltEOFgt token

OK

2 5 6 7 8

O combinar ambas trazas

javacc -DEBUG_PARSER -

DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Consumed token lt- at line 1 column 4gt

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Returning the ltEOFgt token

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

Conclusioacuten los generadores de parsers son herramientas

potentes que sirven para resolver problemas de una manera

bdquolimpia‟ y elegante Puede que su nombre retraiga a los

desarrolladores (ldquoiquestPara queacute quiero un generador de

compiladoresrdquo) pero es una opcioacuten a tener en cuenta

Ficheros para descargar

Referencias

- Generating Parsers with JavaCC

- The JavaCC FAQ

Si quieres enviar alguacuten comentario o sugerir temas a tratar en otros artiacuteculos escribe a

curtasun[simboloArroba]ceines

Categor

iacuteas

CES OpenSouceJava

Tema Desarrollo

Autor Carlos Urtasun

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo XSL-FO (Parte 1)

Texto XSL-FO Introduccioacuten El estaacutendar XSL tal y como estaacute definido actualmente se

divide en dos grandes partes -XSLT transformacioacuten de un documento de entrada XML en

alguacuten tipo de documento de salida ya sea XML HTML PDF etc -Formatting Objects (FO) definen la visualizacioacuten final del

resultado de la transformacioacuten Son una implementacioacuten especiacutefica de un determinado XSLT y aplicados a un

fichero XML nos proporcionan otro fichero con la informacioacuten de eacuteste renderizada a alguacuten formato de visualizacioacuten impresa Eacutesta es quizaacute la principal diferencia entre un FO y

otros XSLT ambos transforman un documento XML en otro documento XML pero FO estaacute pensado para generar

directamente una renderizacioacuten

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 31: Cesnavarra 2008-boletín 7

flags = new boolean [maximo]

for (i = 0

iltmaximo

i++)

flags[i] = false

Ademaacutes podemos inicializar el parser e instanciarlo de esta

forma

PARSER_BEGIN(parserImprimePaginasCC)

import javaio

import javautilVector

public class parserImprimePaginasCC

public static int maximo

public static Vector resultado

private static int num1 num2

private static boolean flags[]

public static void main(String[]args)throws Exceptio

n

Reader r = new StringReader(args[0])

parserImprimePaginasCC p

= new parserImprimePaginasCC(r)

try

pmaximo = 50

Systemoutprintln(Maacuteximo +pmaximo)

pinicio()

Systemoutprintln(OKn)

for (int j = 0

jltpresultadosize()

j++)

Systemoutprint(presultadoelementAt(j)+

)

Systemoutprintln()

catch (ParseException e)

Systemoutprintln(Error de sintaxis)

catch (TokenMgrError e)

Systemoutprintln(Error leacutexico)

catch (elementoFueraLimitesException e)

Systemoutprintln(egetMessage())

PARSER_END(parserImprimePaginasCC)

En este caso tomaremos la entrada de lo que el usuario

introduzca por teclado pero se pueden tomar los datos a traveacutes

de ficheros o pasarlos como variables

Se hace referencia a una excepcioacuten que hemos definido asiacute en un

fichero llamado elementoFueraLimitesExceptionjava

public class elementoFueraLimitesException extends Exc

eption

Constructor

public elementoFueraLimitesException()

super()

public elementoFueraLimitesException(String msg)

super(msg)

Una vez salvado el fichero parserImprimePaginasCCjj podemos

generar la documentacioacuten de la gramaacutetica en formato HTML de

esta forma

Nota en la ejecucioacuten de estos ejemplos se ha utilizado la liacutenea de comandos de

Windows pero se podriacutea haber hecho a traveacutes de cualquier sistema que soporte

el lenguaje Java

gtjjdoc parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Documentation

Generator Version 014)

(type jjdoc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Grammar documentation generated successfully in

parserImprimePaginasCChtml

Se genera el fichero parserImprimePaginasCChtmlcuyo

contenido es

BNF for parserImprimePaginasCCjj NON-TERMINALS

inicio = listaElementos

listaElementos = elemento restoListaElementos

elemento = ltENTEROgt restoListaElementos2

restoListaElementos = ltSEPARADORgt listaElementos

|

restoListaElementos2 = ltGUIONgt ltENTEROgt

|

insertaElemento = java code

inicializaFlags = java code

Nota BNF es el tipo de notacioacuten que estamos utilizando a lo largo de estos

artiacuteculos

Compilamos el parser

gtjavacc parser ImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

File TokenMgrErrorjava does not exist Will create

one

File ParseExceptionjava does not exist Will

create one

File Tokenjava does not exist Will create one

File SimpleCharStreamjava does not exist Will

create one

Parser generated successfully

y entonces se generan estos ficheros

ParseExceptionjava --gt

Excepcioacuten generada por el parser cuando un error es encontrado

parserImprimePaginasCCjava --gt La

traduccioacuten de nuestro fichero jj a java

parserImprimePaginasCCConstantsjava --gt Los

valores de los tokens

parserImprimePaginasCCTokenManagerjava --gt El

analizador leacutexico

SimpleCharStreamjava --gt

Contiene coacutedigo para leer caracteres de cualquier

implementacioacuten de javaioInputStream o javaioReader

Tokenjava --gt

Definicioacuten de la clase Token

TokenMgrErrorjava --gt

Diversos errores que puede producir el lexer

Ahora los compilamos y antildeadimos el fichero

elementoFueraLimitesExceptionjava en dicha compilacioacuten

javac java

Y vamos a ejecutar el parser suponiendo que el maacuteximo nuacutemero

de paacuteginas a impmir es 50 (como hemos indicado con pmaximo =

50)

Lo que obtenemos como salida es la lista de paacuteginas a imprimir o

un mensaje de error

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

OK

2 5 6 7 8

java -classpath laboratorioParsers

parserImprimePaginasCC 28-3046

Num paginas 50

OK

28 29 30 4 6

java -classpath laboratorioParsers

parserImprimePaginasCC 43-51

Num paginas 50

Introdujo un numero superior al maximo51

java -classpath laboratorioParsers

parserImprimePaginasCC 43--51

Num paginas 50

Error de sintaxisEncountered - at line 1

column 4

Was expecting

ltENTEROgt

iquestQueacute pasa si algo ha ido mal iquestPodemos depurar el parser de

alguna forma

Por supuesto podemos compilar el parser asiacute para obtener una

traza de la ejecucioacuten

javacc -DEBUG_PARSER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Consumed token lt- at line 1 column 4gt

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

En la traza vemos coacutemo el parser va invocando la diferentes

producciones

Podemos tambieacuten depurar el lexer

javacc -DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Returning the ltEOFgt token

OK

2 5 6 7 8

O combinar ambas trazas

javacc -DEBUG_PARSER -

DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Consumed token lt- at line 1 column 4gt

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Returning the ltEOFgt token

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

Conclusioacuten los generadores de parsers son herramientas

potentes que sirven para resolver problemas de una manera

bdquolimpia‟ y elegante Puede que su nombre retraiga a los

desarrolladores (ldquoiquestPara queacute quiero un generador de

compiladoresrdquo) pero es una opcioacuten a tener en cuenta

Ficheros para descargar

Referencias

- Generating Parsers with JavaCC

- The JavaCC FAQ

Si quieres enviar alguacuten comentario o sugerir temas a tratar en otros artiacuteculos escribe a

curtasun[simboloArroba]ceines

Categor

iacuteas

CES OpenSouceJava

Tema Desarrollo

Autor Carlos Urtasun

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo XSL-FO (Parte 1)

Texto XSL-FO Introduccioacuten El estaacutendar XSL tal y como estaacute definido actualmente se

divide en dos grandes partes -XSLT transformacioacuten de un documento de entrada XML en

alguacuten tipo de documento de salida ya sea XML HTML PDF etc -Formatting Objects (FO) definen la visualizacioacuten final del

resultado de la transformacioacuten Son una implementacioacuten especiacutefica de un determinado XSLT y aplicados a un

fichero XML nos proporcionan otro fichero con la informacioacuten de eacuteste renderizada a alguacuten formato de visualizacioacuten impresa Eacutesta es quizaacute la principal diferencia entre un FO y

otros XSLT ambos transforman un documento XML en otro documento XML pero FO estaacute pensado para generar

directamente una renderizacioacuten

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 32: Cesnavarra 2008-boletín 7

Systemoutprint(presultadoelementAt(j)+

)

Systemoutprintln()

catch (ParseException e)

Systemoutprintln(Error de sintaxis)

catch (TokenMgrError e)

Systemoutprintln(Error leacutexico)

catch (elementoFueraLimitesException e)

Systemoutprintln(egetMessage())

PARSER_END(parserImprimePaginasCC)

En este caso tomaremos la entrada de lo que el usuario

introduzca por teclado pero se pueden tomar los datos a traveacutes

de ficheros o pasarlos como variables

Se hace referencia a una excepcioacuten que hemos definido asiacute en un

fichero llamado elementoFueraLimitesExceptionjava

public class elementoFueraLimitesException extends Exc

eption

Constructor

public elementoFueraLimitesException()

super()

public elementoFueraLimitesException(String msg)

super(msg)

Una vez salvado el fichero parserImprimePaginasCCjj podemos

generar la documentacioacuten de la gramaacutetica en formato HTML de

esta forma

Nota en la ejecucioacuten de estos ejemplos se ha utilizado la liacutenea de comandos de

Windows pero se podriacutea haber hecho a traveacutes de cualquier sistema que soporte

el lenguaje Java

gtjjdoc parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Documentation

Generator Version 014)

(type jjdoc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Grammar documentation generated successfully in

parserImprimePaginasCChtml

Se genera el fichero parserImprimePaginasCChtmlcuyo

contenido es

BNF for parserImprimePaginasCCjj NON-TERMINALS

inicio = listaElementos

listaElementos = elemento restoListaElementos

elemento = ltENTEROgt restoListaElementos2

restoListaElementos = ltSEPARADORgt listaElementos

|

restoListaElementos2 = ltGUIONgt ltENTEROgt

|

insertaElemento = java code

inicializaFlags = java code

Nota BNF es el tipo de notacioacuten que estamos utilizando a lo largo de estos

artiacuteculos

Compilamos el parser

gtjavacc parser ImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

File TokenMgrErrorjava does not exist Will create

one

File ParseExceptionjava does not exist Will

create one

File Tokenjava does not exist Will create one

File SimpleCharStreamjava does not exist Will

create one

Parser generated successfully

y entonces se generan estos ficheros

ParseExceptionjava --gt

Excepcioacuten generada por el parser cuando un error es encontrado

parserImprimePaginasCCjava --gt La

traduccioacuten de nuestro fichero jj a java

parserImprimePaginasCCConstantsjava --gt Los

valores de los tokens

parserImprimePaginasCCTokenManagerjava --gt El

analizador leacutexico

SimpleCharStreamjava --gt

Contiene coacutedigo para leer caracteres de cualquier

implementacioacuten de javaioInputStream o javaioReader

Tokenjava --gt

Definicioacuten de la clase Token

TokenMgrErrorjava --gt

Diversos errores que puede producir el lexer

Ahora los compilamos y antildeadimos el fichero

elementoFueraLimitesExceptionjava en dicha compilacioacuten

javac java

Y vamos a ejecutar el parser suponiendo que el maacuteximo nuacutemero

de paacuteginas a impmir es 50 (como hemos indicado con pmaximo =

50)

Lo que obtenemos como salida es la lista de paacuteginas a imprimir o

un mensaje de error

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

OK

2 5 6 7 8

java -classpath laboratorioParsers

parserImprimePaginasCC 28-3046

Num paginas 50

OK

28 29 30 4 6

java -classpath laboratorioParsers

parserImprimePaginasCC 43-51

Num paginas 50

Introdujo un numero superior al maximo51

java -classpath laboratorioParsers

parserImprimePaginasCC 43--51

Num paginas 50

Error de sintaxisEncountered - at line 1

column 4

Was expecting

ltENTEROgt

iquestQueacute pasa si algo ha ido mal iquestPodemos depurar el parser de

alguna forma

Por supuesto podemos compilar el parser asiacute para obtener una

traza de la ejecucioacuten

javacc -DEBUG_PARSER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Consumed token lt- at line 1 column 4gt

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

En la traza vemos coacutemo el parser va invocando la diferentes

producciones

Podemos tambieacuten depurar el lexer

javacc -DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Returning the ltEOFgt token

OK

2 5 6 7 8

O combinar ambas trazas

javacc -DEBUG_PARSER -

DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Consumed token lt- at line 1 column 4gt

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Returning the ltEOFgt token

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

Conclusioacuten los generadores de parsers son herramientas

potentes que sirven para resolver problemas de una manera

bdquolimpia‟ y elegante Puede que su nombre retraiga a los

desarrolladores (ldquoiquestPara queacute quiero un generador de

compiladoresrdquo) pero es una opcioacuten a tener en cuenta

Ficheros para descargar

Referencias

- Generating Parsers with JavaCC

- The JavaCC FAQ

Si quieres enviar alguacuten comentario o sugerir temas a tratar en otros artiacuteculos escribe a

curtasun[simboloArroba]ceines

Categor

iacuteas

CES OpenSouceJava

Tema Desarrollo

Autor Carlos Urtasun

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo XSL-FO (Parte 1)

Texto XSL-FO Introduccioacuten El estaacutendar XSL tal y como estaacute definido actualmente se

divide en dos grandes partes -XSLT transformacioacuten de un documento de entrada XML en

alguacuten tipo de documento de salida ya sea XML HTML PDF etc -Formatting Objects (FO) definen la visualizacioacuten final del

resultado de la transformacioacuten Son una implementacioacuten especiacutefica de un determinado XSLT y aplicados a un

fichero XML nos proporcionan otro fichero con la informacioacuten de eacuteste renderizada a alguacuten formato de visualizacioacuten impresa Eacutesta es quizaacute la principal diferencia entre un FO y

otros XSLT ambos transforman un documento XML en otro documento XML pero FO estaacute pensado para generar

directamente una renderizacioacuten

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 33: Cesnavarra 2008-boletín 7

super()

public elementoFueraLimitesException(String msg)

super(msg)

Una vez salvado el fichero parserImprimePaginasCCjj podemos

generar la documentacioacuten de la gramaacutetica en formato HTML de

esta forma

Nota en la ejecucioacuten de estos ejemplos se ha utilizado la liacutenea de comandos de

Windows pero se podriacutea haber hecho a traveacutes de cualquier sistema que soporte

el lenguaje Java

gtjjdoc parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Documentation

Generator Version 014)

(type jjdoc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Grammar documentation generated successfully in

parserImprimePaginasCChtml

Se genera el fichero parserImprimePaginasCChtmlcuyo

contenido es

BNF for parserImprimePaginasCCjj NON-TERMINALS

inicio = listaElementos

listaElementos = elemento restoListaElementos

elemento = ltENTEROgt restoListaElementos2

restoListaElementos = ltSEPARADORgt listaElementos

|

restoListaElementos2 = ltGUIONgt ltENTEROgt

|

insertaElemento = java code

inicializaFlags = java code

Nota BNF es el tipo de notacioacuten que estamos utilizando a lo largo de estos

artiacuteculos

Compilamos el parser

gtjavacc parser ImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

File TokenMgrErrorjava does not exist Will create

one

File ParseExceptionjava does not exist Will

create one

File Tokenjava does not exist Will create one

File SimpleCharStreamjava does not exist Will

create one

Parser generated successfully

y entonces se generan estos ficheros

ParseExceptionjava --gt

Excepcioacuten generada por el parser cuando un error es encontrado

parserImprimePaginasCCjava --gt La

traduccioacuten de nuestro fichero jj a java

parserImprimePaginasCCConstantsjava --gt Los

valores de los tokens

parserImprimePaginasCCTokenManagerjava --gt El

analizador leacutexico

SimpleCharStreamjava --gt

Contiene coacutedigo para leer caracteres de cualquier

implementacioacuten de javaioInputStream o javaioReader

Tokenjava --gt

Definicioacuten de la clase Token

TokenMgrErrorjava --gt

Diversos errores que puede producir el lexer

Ahora los compilamos y antildeadimos el fichero

elementoFueraLimitesExceptionjava en dicha compilacioacuten

javac java

Y vamos a ejecutar el parser suponiendo que el maacuteximo nuacutemero

de paacuteginas a impmir es 50 (como hemos indicado con pmaximo =

50)

Lo que obtenemos como salida es la lista de paacuteginas a imprimir o

un mensaje de error

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

OK

2 5 6 7 8

java -classpath laboratorioParsers

parserImprimePaginasCC 28-3046

Num paginas 50

OK

28 29 30 4 6

java -classpath laboratorioParsers

parserImprimePaginasCC 43-51

Num paginas 50

Introdujo un numero superior al maximo51

java -classpath laboratorioParsers

parserImprimePaginasCC 43--51

Num paginas 50

Error de sintaxisEncountered - at line 1

column 4

Was expecting

ltENTEROgt

iquestQueacute pasa si algo ha ido mal iquestPodemos depurar el parser de

alguna forma

Por supuesto podemos compilar el parser asiacute para obtener una

traza de la ejecucioacuten

javacc -DEBUG_PARSER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Consumed token lt- at line 1 column 4gt

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

En la traza vemos coacutemo el parser va invocando la diferentes

producciones

Podemos tambieacuten depurar el lexer

javacc -DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Returning the ltEOFgt token

OK

2 5 6 7 8

O combinar ambas trazas

javacc -DEBUG_PARSER -

DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Consumed token lt- at line 1 column 4gt

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Returning the ltEOFgt token

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

Conclusioacuten los generadores de parsers son herramientas

potentes que sirven para resolver problemas de una manera

bdquolimpia‟ y elegante Puede que su nombre retraiga a los

desarrolladores (ldquoiquestPara queacute quiero un generador de

compiladoresrdquo) pero es una opcioacuten a tener en cuenta

Ficheros para descargar

Referencias

- Generating Parsers with JavaCC

- The JavaCC FAQ

Si quieres enviar alguacuten comentario o sugerir temas a tratar en otros artiacuteculos escribe a

curtasun[simboloArroba]ceines

Categor

iacuteas

CES OpenSouceJava

Tema Desarrollo

Autor Carlos Urtasun

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo XSL-FO (Parte 1)

Texto XSL-FO Introduccioacuten El estaacutendar XSL tal y como estaacute definido actualmente se

divide en dos grandes partes -XSLT transformacioacuten de un documento de entrada XML en

alguacuten tipo de documento de salida ya sea XML HTML PDF etc -Formatting Objects (FO) definen la visualizacioacuten final del

resultado de la transformacioacuten Son una implementacioacuten especiacutefica de un determinado XSLT y aplicados a un

fichero XML nos proporcionan otro fichero con la informacioacuten de eacuteste renderizada a alguacuten formato de visualizacioacuten impresa Eacutesta es quizaacute la principal diferencia entre un FO y

otros XSLT ambos transforman un documento XML en otro documento XML pero FO estaacute pensado para generar

directamente una renderizacioacuten

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 34: Cesnavarra 2008-boletín 7

|

restoListaElementos2 = ltGUIONgt ltENTEROgt

|

insertaElemento = java code

inicializaFlags = java code

Nota BNF es el tipo de notacioacuten que estamos utilizando a lo largo de estos

artiacuteculos

Compilamos el parser

gtjavacc parser ImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

File TokenMgrErrorjava does not exist Will create

one

File ParseExceptionjava does not exist Will

create one

File Tokenjava does not exist Will create one

File SimpleCharStreamjava does not exist Will

create one

Parser generated successfully

y entonces se generan estos ficheros

ParseExceptionjava --gt

Excepcioacuten generada por el parser cuando un error es encontrado

parserImprimePaginasCCjava --gt La

traduccioacuten de nuestro fichero jj a java

parserImprimePaginasCCConstantsjava --gt Los

valores de los tokens

parserImprimePaginasCCTokenManagerjava --gt El

analizador leacutexico

SimpleCharStreamjava --gt

Contiene coacutedigo para leer caracteres de cualquier

implementacioacuten de javaioInputStream o javaioReader

Tokenjava --gt

Definicioacuten de la clase Token

TokenMgrErrorjava --gt

Diversos errores que puede producir el lexer

Ahora los compilamos y antildeadimos el fichero

elementoFueraLimitesExceptionjava en dicha compilacioacuten

javac java

Y vamos a ejecutar el parser suponiendo que el maacuteximo nuacutemero

de paacuteginas a impmir es 50 (como hemos indicado con pmaximo =

50)

Lo que obtenemos como salida es la lista de paacuteginas a imprimir o

un mensaje de error

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

OK

2 5 6 7 8

java -classpath laboratorioParsers

parserImprimePaginasCC 28-3046

Num paginas 50

OK

28 29 30 4 6

java -classpath laboratorioParsers

parserImprimePaginasCC 43-51

Num paginas 50

Introdujo un numero superior al maximo51

java -classpath laboratorioParsers

parserImprimePaginasCC 43--51

Num paginas 50

Error de sintaxisEncountered - at line 1

column 4

Was expecting

ltENTEROgt

iquestQueacute pasa si algo ha ido mal iquestPodemos depurar el parser de

alguna forma

Por supuesto podemos compilar el parser asiacute para obtener una

traza de la ejecucioacuten

javacc -DEBUG_PARSER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Consumed token lt- at line 1 column 4gt

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

En la traza vemos coacutemo el parser va invocando la diferentes

producciones

Podemos tambieacuten depurar el lexer

javacc -DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Returning the ltEOFgt token

OK

2 5 6 7 8

O combinar ambas trazas

javacc -DEBUG_PARSER -

DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Consumed token lt- at line 1 column 4gt

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Returning the ltEOFgt token

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

Conclusioacuten los generadores de parsers son herramientas

potentes que sirven para resolver problemas de una manera

bdquolimpia‟ y elegante Puede que su nombre retraiga a los

desarrolladores (ldquoiquestPara queacute quiero un generador de

compiladoresrdquo) pero es una opcioacuten a tener en cuenta

Ficheros para descargar

Referencias

- Generating Parsers with JavaCC

- The JavaCC FAQ

Si quieres enviar alguacuten comentario o sugerir temas a tratar en otros artiacuteculos escribe a

curtasun[simboloArroba]ceines

Categor

iacuteas

CES OpenSouceJava

Tema Desarrollo

Autor Carlos Urtasun

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo XSL-FO (Parte 1)

Texto XSL-FO Introduccioacuten El estaacutendar XSL tal y como estaacute definido actualmente se

divide en dos grandes partes -XSLT transformacioacuten de un documento de entrada XML en

alguacuten tipo de documento de salida ya sea XML HTML PDF etc -Formatting Objects (FO) definen la visualizacioacuten final del

resultado de la transformacioacuten Son una implementacioacuten especiacutefica de un determinado XSLT y aplicados a un

fichero XML nos proporcionan otro fichero con la informacioacuten de eacuteste renderizada a alguacuten formato de visualizacioacuten impresa Eacutesta es quizaacute la principal diferencia entre un FO y

otros XSLT ambos transforman un documento XML en otro documento XML pero FO estaacute pensado para generar

directamente una renderizacioacuten

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 35: Cesnavarra 2008-boletín 7

SimpleCharStreamjava --gt

Contiene coacutedigo para leer caracteres de cualquier

implementacioacuten de javaioInputStream o javaioReader

Tokenjava --gt

Definicioacuten de la clase Token

TokenMgrErrorjava --gt

Diversos errores que puede producir el lexer

Ahora los compilamos y antildeadimos el fichero

elementoFueraLimitesExceptionjava en dicha compilacioacuten

javac java

Y vamos a ejecutar el parser suponiendo que el maacuteximo nuacutemero

de paacuteginas a impmir es 50 (como hemos indicado con pmaximo =

50)

Lo que obtenemos como salida es la lista de paacuteginas a imprimir o

un mensaje de error

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

OK

2 5 6 7 8

java -classpath laboratorioParsers

parserImprimePaginasCC 28-3046

Num paginas 50

OK

28 29 30 4 6

java -classpath laboratorioParsers

parserImprimePaginasCC 43-51

Num paginas 50

Introdujo un numero superior al maximo51

java -classpath laboratorioParsers

parserImprimePaginasCC 43--51

Num paginas 50

Error de sintaxisEncountered - at line 1

column 4

Was expecting

ltENTEROgt

iquestQueacute pasa si algo ha ido mal iquestPodemos depurar el parser de

alguna forma

Por supuesto podemos compilar el parser asiacute para obtener una

traza de la ejecucioacuten

javacc -DEBUG_PARSER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Consumed token lt- at line 1 column 4gt

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

En la traza vemos coacutemo el parser va invocando la diferentes

producciones

Podemos tambieacuten depurar el lexer

javacc -DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Returning the ltEOFgt token

OK

2 5 6 7 8

O combinar ambas trazas

javacc -DEBUG_PARSER -

DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Consumed token lt- at line 1 column 4gt

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Returning the ltEOFgt token

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

Conclusioacuten los generadores de parsers son herramientas

potentes que sirven para resolver problemas de una manera

bdquolimpia‟ y elegante Puede que su nombre retraiga a los

desarrolladores (ldquoiquestPara queacute quiero un generador de

compiladoresrdquo) pero es una opcioacuten a tener en cuenta

Ficheros para descargar

Referencias

- Generating Parsers with JavaCC

- The JavaCC FAQ

Si quieres enviar alguacuten comentario o sugerir temas a tratar en otros artiacuteculos escribe a

curtasun[simboloArroba]ceines

Categor

iacuteas

CES OpenSouceJava

Tema Desarrollo

Autor Carlos Urtasun

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo XSL-FO (Parte 1)

Texto XSL-FO Introduccioacuten El estaacutendar XSL tal y como estaacute definido actualmente se

divide en dos grandes partes -XSLT transformacioacuten de un documento de entrada XML en

alguacuten tipo de documento de salida ya sea XML HTML PDF etc -Formatting Objects (FO) definen la visualizacioacuten final del

resultado de la transformacioacuten Son una implementacioacuten especiacutefica de un determinado XSLT y aplicados a un

fichero XML nos proporcionan otro fichero con la informacioacuten de eacuteste renderizada a alguacuten formato de visualizacioacuten impresa Eacutesta es quizaacute la principal diferencia entre un FO y

otros XSLT ambos transforman un documento XML en otro documento XML pero FO estaacute pensado para generar

directamente una renderizacioacuten

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 36: Cesnavarra 2008-boletín 7

java -classpath laboratorioParsers

parserImprimePaginasCC 43--51

Num paginas 50

Error de sintaxisEncountered - at line 1

column 4

Was expecting

ltENTEROgt

iquestQueacute pasa si algo ha ido mal iquestPodemos depurar el parser de

alguna forma

Por supuesto podemos compilar el parser asiacute para obtener una

traza de la ejecucioacuten

javacc -DEBUG_PARSER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Consumed token lt- at line 1 column 4gt

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

En la traza vemos coacutemo el parser va invocando la diferentes

producciones

Podemos tambieacuten depurar el lexer

javacc -DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Returning the ltEOFgt token

OK

2 5 6 7 8

O combinar ambas trazas

javacc -DEBUG_PARSER -

DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Consumed token lt- at line 1 column 4gt

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Returning the ltEOFgt token

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

Conclusioacuten los generadores de parsers son herramientas

potentes que sirven para resolver problemas de una manera

bdquolimpia‟ y elegante Puede que su nombre retraiga a los

desarrolladores (ldquoiquestPara queacute quiero un generador de

compiladoresrdquo) pero es una opcioacuten a tener en cuenta

Ficheros para descargar

Referencias

- Generating Parsers with JavaCC

- The JavaCC FAQ

Si quieres enviar alguacuten comentario o sugerir temas a tratar en otros artiacuteculos escribe a

curtasun[simboloArroba]ceines

Categor

iacuteas

CES OpenSouceJava

Tema Desarrollo

Autor Carlos Urtasun

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo XSL-FO (Parte 1)

Texto XSL-FO Introduccioacuten El estaacutendar XSL tal y como estaacute definido actualmente se

divide en dos grandes partes -XSLT transformacioacuten de un documento de entrada XML en

alguacuten tipo de documento de salida ya sea XML HTML PDF etc -Formatting Objects (FO) definen la visualizacioacuten final del

resultado de la transformacioacuten Son una implementacioacuten especiacutefica de un determinado XSLT y aplicados a un

fichero XML nos proporcionan otro fichero con la informacioacuten de eacuteste renderizada a alguacuten formato de visualizacioacuten impresa Eacutesta es quizaacute la principal diferencia entre un FO y

otros XSLT ambos transforman un documento XML en otro documento XML pero FO estaacute pensado para generar

directamente una renderizacioacuten

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 37: Cesnavarra 2008-boletín 7

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Consumed token lt- at line 1 column 4gt

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

En la traza vemos coacutemo el parser va invocando la diferentes

producciones

Podemos tambieacuten depurar el lexer

javacc -DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Returning the ltEOFgt token

OK

2 5 6 7 8

O combinar ambas trazas

javacc -DEBUG_PARSER -

DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Consumed token lt- at line 1 column 4gt

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Returning the ltEOFgt token

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

Conclusioacuten los generadores de parsers son herramientas

potentes que sirven para resolver problemas de una manera

bdquolimpia‟ y elegante Puede que su nombre retraiga a los

desarrolladores (ldquoiquestPara queacute quiero un generador de

compiladoresrdquo) pero es una opcioacuten a tener en cuenta

Ficheros para descargar

Referencias

- Generating Parsers with JavaCC

- The JavaCC FAQ

Si quieres enviar alguacuten comentario o sugerir temas a tratar en otros artiacuteculos escribe a

curtasun[simboloArroba]ceines

Categor

iacuteas

CES OpenSouceJava

Tema Desarrollo

Autor Carlos Urtasun

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo XSL-FO (Parte 1)

Texto XSL-FO Introduccioacuten El estaacutendar XSL tal y como estaacute definido actualmente se

divide en dos grandes partes -XSLT transformacioacuten de un documento de entrada XML en

alguacuten tipo de documento de salida ya sea XML HTML PDF etc -Formatting Objects (FO) definen la visualizacioacuten final del

resultado de la transformacioacuten Son una implementacioacuten especiacutefica de un determinado XSLT y aplicados a un

fichero XML nos proporcionan otro fichero con la informacioacuten de eacuteste renderizada a alguacuten formato de visualizacioacuten impresa Eacutesta es quizaacute la principal diferencia entre un FO y

otros XSLT ambos transforman un documento XML en otro documento XML pero FO estaacute pensado para generar

directamente una renderizacioacuten

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 38: Cesnavarra 2008-boletín 7

Podemos tambieacuten depurar el lexer

javacc -DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Returning the ltEOFgt token

OK

2 5 6 7 8

O combinar ambas trazas

javacc -DEBUG_PARSER -

DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Consumed token lt- at line 1 column 4gt

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Returning the ltEOFgt token

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

Conclusioacuten los generadores de parsers son herramientas

potentes que sirven para resolver problemas de una manera

bdquolimpia‟ y elegante Puede que su nombre retraiga a los

desarrolladores (ldquoiquestPara queacute quiero un generador de

compiladoresrdquo) pero es una opcioacuten a tener en cuenta

Ficheros para descargar

Referencias

- Generating Parsers with JavaCC

- The JavaCC FAQ

Si quieres enviar alguacuten comentario o sugerir temas a tratar en otros artiacuteculos escribe a

curtasun[simboloArroba]ceines

Categor

iacuteas

CES OpenSouceJava

Tema Desarrollo

Autor Carlos Urtasun

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo XSL-FO (Parte 1)

Texto XSL-FO Introduccioacuten El estaacutendar XSL tal y como estaacute definido actualmente se

divide en dos grandes partes -XSLT transformacioacuten de un documento de entrada XML en

alguacuten tipo de documento de salida ya sea XML HTML PDF etc -Formatting Objects (FO) definen la visualizacioacuten final del

resultado de la transformacioacuten Son una implementacioacuten especiacutefica de un determinado XSLT y aplicados a un

fichero XML nos proporcionan otro fichero con la informacioacuten de eacuteste renderizada a alguacuten formato de visualizacioacuten impresa Eacutesta es quizaacute la principal diferencia entre un FO y

otros XSLT ambos transforman un documento XML en otro documento XML pero FO estaacute pensado para generar

directamente una renderizacioacuten

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 39: Cesnavarra 2008-boletín 7

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Returning the ltEOFgt token

OK

2 5 6 7 8

O combinar ambas trazas

javacc -DEBUG_PARSER -

DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Consumed token lt- at line 1 column 4gt

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Returning the ltEOFgt token

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

Conclusioacuten los generadores de parsers son herramientas

potentes que sirven para resolver problemas de una manera

bdquolimpia‟ y elegante Puede que su nombre retraiga a los

desarrolladores (ldquoiquestPara queacute quiero un generador de

compiladoresrdquo) pero es una opcioacuten a tener en cuenta

Ficheros para descargar

Referencias

- Generating Parsers with JavaCC

- The JavaCC FAQ

Si quieres enviar alguacuten comentario o sugerir temas a tratar en otros artiacuteculos escribe a

curtasun[simboloArroba]ceines

Categor

iacuteas

CES OpenSouceJava

Tema Desarrollo

Autor Carlos Urtasun

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo XSL-FO (Parte 1)

Texto XSL-FO Introduccioacuten El estaacutendar XSL tal y como estaacute definido actualmente se

divide en dos grandes partes -XSLT transformacioacuten de un documento de entrada XML en

alguacuten tipo de documento de salida ya sea XML HTML PDF etc -Formatting Objects (FO) definen la visualizacioacuten final del

resultado de la transformacioacuten Son una implementacioacuten especiacutefica de un determinado XSLT y aplicados a un

fichero XML nos proporcionan otro fichero con la informacioacuten de eacuteste renderizada a alguacuten formato de visualizacioacuten impresa Eacutesta es quizaacute la principal diferencia entre un FO y

otros XSLT ambos transforman un documento XML en otro documento XML pero FO estaacute pensado para generar

directamente una renderizacioacuten

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 40: Cesnavarra 2008-boletín 7

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Returning the ltEOFgt token

OK

2 5 6 7 8

O combinar ambas trazas

javacc -DEBUG_PARSER -

DEBUG_TOKEN_MANAGER parserImprimePaginasCCjj

Java Compiler Compiler Version 40 (Parser Generator)

(type javacc with no arguments for help)

Reading from file parserImprimePaginasCCjj

Parser generated successfully

javac java

java -classpath laboratorioParsers

parserImprimePaginasCC 25-8

Num paginas 50

Call inicio

Call inicializaFlags

Return inicializaFlags

Call listaElementos

Call elemento

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Consumed token lt- at line 1 column 4gt

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Returning the ltEOFgt token

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

Conclusioacuten los generadores de parsers son herramientas

potentes que sirven para resolver problemas de una manera

bdquolimpia‟ y elegante Puede que su nombre retraiga a los

desarrolladores (ldquoiquestPara queacute quiero un generador de

compiladoresrdquo) pero es una opcioacuten a tener en cuenta

Ficheros para descargar

Referencias

- Generating Parsers with JavaCC

- The JavaCC FAQ

Si quieres enviar alguacuten comentario o sugerir temas a tratar en otros artiacuteculos escribe a

curtasun[simboloArroba]ceines

Categor

iacuteas

CES OpenSouceJava

Tema Desarrollo

Autor Carlos Urtasun

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo XSL-FO (Parte 1)

Texto XSL-FO Introduccioacuten El estaacutendar XSL tal y como estaacute definido actualmente se

divide en dos grandes partes -XSLT transformacioacuten de un documento de entrada XML en

alguacuten tipo de documento de salida ya sea XML HTML PDF etc -Formatting Objects (FO) definen la visualizacioacuten final del

resultado de la transformacioacuten Son una implementacioacuten especiacutefica de un determinado XSLT y aplicados a un

fichero XML nos proporcionan otro fichero con la informacioacuten de eacuteste renderizada a alguacuten formato de visualizacioacuten impresa Eacutesta es quizaacute la principal diferencia entre un FO y

otros XSLT ambos transforman un documento XML en otro documento XML pero FO estaacute pensado para generar

directamente una renderizacioacuten

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 41: Cesnavarra 2008-boletín 7

Current character 2 (50) at line 1 column 1

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 2 (50) at line 1 column 1

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (2)

Consumed token ltltENTEROgt 2 at line 1 column

1gt

Call restoListaElementos2

Current character (44) at line 1 column 2

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character (44) at line 1 column 2

Currently matched the first 1 characters as a

ltSEPARADORgt token

Possible kinds of longer matches ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltSEPARADORgt token

Putting back 1 characters into the input stream

FOUND A ltSEPARADORgt MATCH ()

Return restoListaElementos2

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Consumed token lt- at line 1 column 4gt

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Returning the ltEOFgt token

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

Conclusioacuten los generadores de parsers son herramientas

potentes que sirven para resolver problemas de una manera

bdquolimpia‟ y elegante Puede que su nombre retraiga a los

desarrolladores (ldquoiquestPara queacute quiero un generador de

compiladoresrdquo) pero es una opcioacuten a tener en cuenta

Ficheros para descargar

Referencias

- Generating Parsers with JavaCC

- The JavaCC FAQ

Si quieres enviar alguacuten comentario o sugerir temas a tratar en otros artiacuteculos escribe a

curtasun[simboloArroba]ceines

Categor

iacuteas

CES OpenSouceJava

Tema Desarrollo

Autor Carlos Urtasun

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo XSL-FO (Parte 1)

Texto XSL-FO Introduccioacuten El estaacutendar XSL tal y como estaacute definido actualmente se

divide en dos grandes partes -XSLT transformacioacuten de un documento de entrada XML en

alguacuten tipo de documento de salida ya sea XML HTML PDF etc -Formatting Objects (FO) definen la visualizacioacuten final del

resultado de la transformacioacuten Son una implementacioacuten especiacutefica de un determinado XSLT y aplicados a un

fichero XML nos proporcionan otro fichero con la informacioacuten de eacuteste renderizada a alguacuten formato de visualizacioacuten impresa Eacutesta es quizaacute la principal diferencia entre un FO y

otros XSLT ambos transforman un documento XML en otro documento XML pero FO estaacute pensado para generar

directamente una renderizacioacuten

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 42: Cesnavarra 2008-boletín 7

Return elemento

Call restoListaElementos

Consumed token ltltSEPARADORgt at line 1

column 2gt

Call insertaElemento

Return insertaElemento

Call listaElementos

Call elemento

Current character 5 (53) at line 1 column 3

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 5 (53) at line 1 column 3

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

Current character - (45) at line 1 column 4

Currently matched the first 1 characters as a

ltENTEROgt token

Putting back 1 characters into the input stream

FOUND A ltENTEROgt MATCH (5)

Consumed token ltltENTEROgt 5 at line 1

column 3gt

Call restoListaElementos2

Current character - (45) at line 1 column 4

No more string literal token matches are possible

Currently matched the first 1 characters as a -

token

FOUND A - MATCH (-)

Consumed token lt- at line 1 column 4gt

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Returning the ltEOFgt token

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

Conclusioacuten los generadores de parsers son herramientas

potentes que sirven para resolver problemas de una manera

bdquolimpia‟ y elegante Puede que su nombre retraiga a los

desarrolladores (ldquoiquestPara queacute quiero un generador de

compiladoresrdquo) pero es una opcioacuten a tener en cuenta

Ficheros para descargar

Referencias

- Generating Parsers with JavaCC

- The JavaCC FAQ

Si quieres enviar alguacuten comentario o sugerir temas a tratar en otros artiacuteculos escribe a

curtasun[simboloArroba]ceines

Categor

iacuteas

CES OpenSouceJava

Tema Desarrollo

Autor Carlos Urtasun

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo XSL-FO (Parte 1)

Texto XSL-FO Introduccioacuten El estaacutendar XSL tal y como estaacute definido actualmente se

divide en dos grandes partes -XSLT transformacioacuten de un documento de entrada XML en

alguacuten tipo de documento de salida ya sea XML HTML PDF etc -Formatting Objects (FO) definen la visualizacioacuten final del

resultado de la transformacioacuten Son una implementacioacuten especiacutefica de un determinado XSLT y aplicados a un

fichero XML nos proporcionan otro fichero con la informacioacuten de eacuteste renderizada a alguacuten formato de visualizacioacuten impresa Eacutesta es quizaacute la principal diferencia entre un FO y

otros XSLT ambos transforman un documento XML en otro documento XML pero FO estaacute pensado para generar

directamente una renderizacioacuten

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 43: Cesnavarra 2008-boletín 7

Current character 8 (56) at line 1 column 5

No string literal matches possible

Starting NFA to match one of ltENTEROgt

ltSEPARADORgt

Current character 8 (56) at line 1 column 5

Currently matched the first 1 characters as a

ltENTEROgt token

Possible kinds of longer matches ltENTEROgt

ltSEPARADORgt

FOUND A ltENTEROgt MATCH (8)

Consumed token ltltENTEROgt 8 at line 1

column 5gt

Return restoListaElementos2

Return elemento

Call restoListaElementos

Returning the ltEOFgt token

Call insertaElemento

Return insertaElemento

Return restoListaElementos

Return listaElementos

Return restoListaElementos

Return listaElementos

Return inicio

OK

2 5 6 7 8

Conclusioacuten los generadores de parsers son herramientas

potentes que sirven para resolver problemas de una manera

bdquolimpia‟ y elegante Puede que su nombre retraiga a los

desarrolladores (ldquoiquestPara queacute quiero un generador de

compiladoresrdquo) pero es una opcioacuten a tener en cuenta

Ficheros para descargar

Referencias

- Generating Parsers with JavaCC

- The JavaCC FAQ

Si quieres enviar alguacuten comentario o sugerir temas a tratar en otros artiacuteculos escribe a

curtasun[simboloArroba]ceines

Categor

iacuteas

CES OpenSouceJava

Tema Desarrollo

Autor Carlos Urtasun

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo XSL-FO (Parte 1)

Texto XSL-FO Introduccioacuten El estaacutendar XSL tal y como estaacute definido actualmente se

divide en dos grandes partes -XSLT transformacioacuten de un documento de entrada XML en

alguacuten tipo de documento de salida ya sea XML HTML PDF etc -Formatting Objects (FO) definen la visualizacioacuten final del

resultado de la transformacioacuten Son una implementacioacuten especiacutefica de un determinado XSLT y aplicados a un

fichero XML nos proporcionan otro fichero con la informacioacuten de eacuteste renderizada a alguacuten formato de visualizacioacuten impresa Eacutesta es quizaacute la principal diferencia entre un FO y

otros XSLT ambos transforman un documento XML en otro documento XML pero FO estaacute pensado para generar

directamente una renderizacioacuten

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 44: Cesnavarra 2008-boletín 7

Ficheros para descargar

Referencias

- Generating Parsers with JavaCC

- The JavaCC FAQ

Si quieres enviar alguacuten comentario o sugerir temas a tratar en otros artiacuteculos escribe a

curtasun[simboloArroba]ceines

Categor

iacuteas

CES OpenSouceJava

Tema Desarrollo

Autor Carlos Urtasun

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo XSL-FO (Parte 1)

Texto XSL-FO Introduccioacuten El estaacutendar XSL tal y como estaacute definido actualmente se

divide en dos grandes partes -XSLT transformacioacuten de un documento de entrada XML en

alguacuten tipo de documento de salida ya sea XML HTML PDF etc -Formatting Objects (FO) definen la visualizacioacuten final del

resultado de la transformacioacuten Son una implementacioacuten especiacutefica de un determinado XSLT y aplicados a un

fichero XML nos proporcionan otro fichero con la informacioacuten de eacuteste renderizada a alguacuten formato de visualizacioacuten impresa Eacutesta es quizaacute la principal diferencia entre un FO y

otros XSLT ambos transforman un documento XML en otro documento XML pero FO estaacute pensado para generar

directamente una renderizacioacuten

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 45: Cesnavarra 2008-boletín 7

XSL-FO construye un documento que se crea de fuera para adentro Con XSL-FO se puede definir el tamantildeo fiacutesico de la hoja para imprimir y controlar propiedades de la paacutegina maacutergenes cabecera piehellip La paginacioacuten se produce de forma

automaacutetica Se pueden definir distintos modelos de paacuteginas se pueden insertar diferentes elementos como por ejemplo

imaacutegenes posee propiedades compatibles con CSS y maacutes posibilidades no contempladas en CSS se pueden hacer referencias cruzadas etc Los FO estaacuten divididos formalmente en cuatro tipos de aacutereas rectangulares

- block-container es la estructura de mayor nivel Se

puede colocar de manera precisa por coordenadas dentro de su propio contenedor Puede contener block-container blocks tablas y listas

- block es un paacuterrafo Lleva al final un salto de liacutenea

Puede contener maacutes blocks imaacutegenes liacuteneas tablas listashellip Se corresponde con el ltdivgt de HTML

- inline-container cada liacutenea de texto - inline caracteres dentro de una liacutenea Se suele usar

para cambiar su color de fondo su tamantildeo de fuente y otros atributos afines

Estas cuatro categoriacuteas forman una jerarquiacutea muy estricta

Estas aacutereas pueden contener atributos para dar estilo a su contenido

Existen cuatro atributos muy utilizados en el elemento block

space-before space-after

margin border

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 46: Cesnavarra 2008-boletín 7

padding content

Space-before y space-after es el espacio vaciacuteo que separa el block de otros block Margin es el aacuterea vaciacutea en la parte externa del block Border es el borde del block Padding es el aacuterea comprendida entre el border y el contenido

del block Content lleva el contenido real texto imaacutegenes tablas

Dentro de un elemento foblock se puede hacer un corte de

paacutegina ltfoblock font-size=9pt break-before=pagegt

Texto perteneciente al block ltfoblockgt

En este caso el corte se produciraacute antes de pintarse el block

En el siguiente caso el corte se produciraacute despueacutes de pintarse el contenido del block

ltfoblock font-size=9pt break-after=pagegt Texto perteneciente al block

ltfoblockgt

Ademaacutes de poder definir la estructura del documento generado a partir de los FO podemos usar propiedades para

especificar maacutes concretamente la renderizacioacuten que produciraacute un determinado fichero Asiacute por ejemplo el tamantildeo de la

paacutegina color de texto etc pueden ser explicitadas mediante el uso de atributos de los FO

Por lo tanto XSL-FO es la tecnologiacutea que nos permite

transformar ficheros XML en formato pdf lo que hace que adquiera una gran potencia ya que seguacuten las exigencias del

usuario podremos adaptar la informacioacuten contenida en nuestro XML al gusto del usuario que al final va a ser el que haga uso de la informacioacuten disponible

Categoriacuteas General

Tema Desarrollo

Autor Raquel Urdangarin

Mes Julio

Antildeo 2008

Boletiacuten 07

Tiacutetulo iquestQueacute es Subversion

Texto Subversion es un sistema gratuito y open

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 47: Cesnavarra 2008-boletín 7

source de control de versiones iniciado en 2000

por CollabNet Inc Emplea licencia ApacheBSD Se usa para mantener versiones actuales e histoacutericas y los

cambios de archivos tales como los de coacutedigo fuente paacuteginas web yo documentacioacuten Esto permite recuperar

versiones antiguas de los datos o examinar coacutemo han ido

evolucionando estos Por eso se podriacutea pensar que un sistema de control de versiones es una especie de

ldquomaacutequina del tiempordquo Su objetivo es ser un sucesor praacutecticamente compatible del ampliamente

usado Concurrent Versions System(CVS)

Subversion puede trabajar a traveacutes de redes lo que permite que personas que esteacuten en diferentes

ordenadores puedan usarlo De cierta manera la posibilidad de que varias personas modifiquen y

gestionen el mismo conjunto de datos desde sus respectivos sitios promueve la colaboracioacuten Y como el

trabajo estaacute versionado no hace falta temer que la calidad del mismo empeore como consecuencia de perder

un conducto que los revisara ya que si se produce alguacuten cambio incorrecto de los datos soacutelo hace falta

deshacerlo

Ventajas

Se sigue la historia de los archivos y directorios a traveacutes de copias y renombrados

Las modificaciones (incluyendo cambios a varios

archivos) son atoacutemicas

La creacioacuten de ramas y etiquetas es una operacioacuten maacutes eficiente Tiene costo de complejidad

constante (O(1)) y no lineal (O(n)) como en CVS

Se enviacutean soacutelo las diferencias en ambas direcciones (en CVS siempre se enviacutean al servidor archivos

completos)

Puede ser servido mediante Apache sobre WebDAVDeltaV Esto permite que clientes

WebDAV utilicen Subversion de forma transparente

Maneja eficientemente archivos binarios (a diferencia de CVS que los trata internamente como

si fueran de texto)

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 48: Cesnavarra 2008-boletín 7

Permite selectivamente el bloqueo de archivos Se

usa en archivos binarios que al no poder fusionarse faacutecilmente conviene que no sean editados por maacutes

de una persona a la vez

Cuando se usa integrado a Apache permite utilizar todas las opciones que este servidor provee a la

hora de autentificar archivos (SQL LDAP PAM etc)

Los programas asociados a Subversion que se

ejecutan por liacutenea de comandos tales como svn pueden ejecutarse tanto en plataformas Unix

Linux Solaris o Microsoft Windows La forma de ejecutarlos es igual en cualquier sistema salvo por

el hecho de tener en cuenta unas pequentildeas excepciones como el uso de contra-barras () en

vez de barras () si fuera necesario

Carencias

El manejo de cambio de nombres de archivos no es

completo Lo maneja como la suma de una operacioacuten de copia y una de borrado

No resuelve el problema de aplicar repetidamente

parches entre ramas no facilita el llevar la cuenta de queacute cambios se han trasladado Esto se resuelve

siendo cuidadoso con los mensajes de commit Esta carencia ha sido corregida en la versioacuten 15

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 49: Cesnavarra 2008-boletín 7

Figura 1 Arquitectura de subversion

Comparativa entre Subversion y CVS

En CVS los nuacutemeros de revisioacuten se dan a cada archivo en Subversion los nuacutemeros de revisioacuten se

dan a todos los archivos Por cada revisioacuten que se hace se genera un nuevo aacuterbol de directorios que

contiene todos los cambios de la revisioacuten

En CVS un tag o branch es una anotacioacuten en un archivo o en la informacioacuten de la versioacuten de ese

archivo mientras que en Subversion es una copia del aacuterbol completo en un directorio Por convenio

se usan branches o tags que se encuentran en la

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 50: Cesnavarra 2008-boletín 7

raiacutez del repositorio

Subversion tiene en cuenta las estructuras de

directorios no soacutelo el contenido de los archivos Sin embargo hasta que no se haga un

update el nuacutemero de revisioacuten asignado al directorio no seraacute correcto

Subversion permite ejecutar maacutes operaciones sin

conexioacuten que CVS porque guarda una copia de soacutelo lectura de los archivos sin modificaciones Permite

ejecutar operaciones de status de diff (ver las diferencias entre revisiones) o revertir los

cambios Ademaacutes cuando se conecta al repositorio manda las diferencias

Subversion modifica los comandos update y status

para clarificar su uso En CVS el comando status sirve para mostrar las modificaciones de la copia

local y para ver queacute ficheros no estaacuten sincronizados Esta informacioacuten es bastante

complicada de leer Para obtenerla de forma maacutes sencilla se puede usar la opcioacuten update ndashn La

opcioacuten de update sirve tambieacuten para actualizar el

repositorio En Subversion status te muestra los archivos locales que tienen cambios (por defecto

sin contactar con el repositorio) y update actualiza tu copia local del repositorio mostrando soacutelo los

cambios que se han actualizado no las modificaciones de los archivos locales

Para Subversion los branches y tags son solamente

directorios mientras que en CVS son un espacio aparte

En Subversion se pueden antildeadir propiedades a

archivos y directorios mientra que en CVS no

Para resolver conflictos Subversion en vez de

antildeadir una C para indicar que hay un conflicto y permitir luego hacer cambios no permite las

operaciones de commit hasta que no se resuelva

expliacutecitamente el conflicto Ademaacutes a partir de la versioacuten 15 los permite resolver interactivamente

asiacute conforme van descubrieacutendose se pueden resolver y se continuaraacute con la operacioacuten de

commit

CVS soacutelo puede guardar archivos de texto asiacute que

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 51: Cesnavarra 2008-boletín 7

si se guardan archivos binarios los debe

transformar a texto mientras que Subversion distingue entre archivos binarios y texto

CVS utiliza RCS para guardar las revisiones

mientras que Subversion utiliza una base de datos

Subversion considera que un moacutedulo en un conjunto de archivos y directorios asiacute que si esto

se cambia todos los usuarios se enteraraacuten mientras que en CVS eso no seraacute posible

CVS exige autentificacioacuten para todas las

operaciones aunque el acceso sea anoacutenimo mientras que en Subversion si se utiliza Apache

para contactar con el repositorio y el repositorio tiene acceso universal de lectura entonces no te

pediraacute ninguacuten tipo de autentificacioacuten para hacer operaciones de lectura Soacutelo la exigiraacute para hacer

las operaciones para lo que se haya configurado la necesidad de autentificacioacuten El uacutenico caso en el

que siempre solicitaraacute contrasentildea Subversion seraacute cuando el acceso se hace mediante svnserve y estaacute

configurado con ssh En ese momento para

comenzar la comunicacioacuten pediraacute una contrasentildea

Para obtener maacutes informacioacuten sobre el tema se pueden consultar la documentacioacuten siguiente

ENLACES DE INTEREacuteS

Subversion

httpenwikipediaorgwikiSubversion_(software)

httpeswikipediaorgwikiSubversion

httpsubversiontigrisorg

httpwww1x4x9infofilessubversionhtmlonline-chunkedindexhtml

httpsvncollabnetrepossvntrunkINSTALL

Version Control with Subversion Ben Collins-

Sussman Brian W Fitzpatrick C Michael Pilato -gt httpsvnbookred-beancom

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07

Page 52: Cesnavarra 2008-boletín 7

httpwwwpushokcomsoft_svn_vscvsphp

Categoriacutea

s

CES OpenSouceJava

Tema Varios

Autor Blanca Cubas Cruz

Mes Julio

Antildeo 2008

Boletiacuten 07