Upload
cein
View
953
Download
0
Embed Size (px)
Citation preview
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
|
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
httpwwwpushokcomsoft_svn_vscvsphp
Categoriacutea
s
CES OpenSouceJava
Tema Varios
Autor Blanca Cubas Cruz
Mes Julio
Antildeo 2008
Boletiacuten 07