Archive for the ‘miguelaneas’ Category

Xtext codea por vos

noviembre 12, 2013

Buenas. El proyecto final de la carrera de Ing. en  Sistemas que estoy desarrollando es un entorno para enseñar programación orientada a objetos en el que puedo ver los objetos de manera gráfica y darles movimiento y un aspecto.

Es un prototipo todavía, pero con suerte y viento a favor en el mediano plazo va a estar completo,  y quién dice no lo podamos poner a prueba con estudiantes.

Está hecho con Xtext, un framework para desarrollar lenguajes e integrarlos fácilmente a eclipse.

Uno define una gramática, Xtext te genera los elementos para parsear y validar el lenguaje y a partir de ella se puede generar código en el lenguaje que prefiera e incluso construir un intérprete sobre la misma plataforma. HOOPE usa Xtensivamente este framework y otros chiches de la API de eclipse.

Xtext permite generar código java muy fácilmente e integrarlo con las APIs de uso común como JAX-WS o JPA.

En el laburo estoy desarrollando servicios web y tengo que admitir que no siempre es fácil la metodología wsdl-first. Sobre todo porque al que solicita los servicios web le cuesta adaptarse a los wsdl. Pero tampoco es cómodo programar de entrada y anotar con jax-ws. Hay mucho código – andamiaje y puede volverse Vogon Poetry.

Y Xtext andaba en mi cabeza…

Con una gramática muy sencilla:

grammar org.miguelius.ws.Generator with org.eclipse.xtext.xbase.Xbase

generate generator "https://lodemiguel.wordpress.com/ws/WsGenerator"

Service:
	('package' packageName=QualifiedName)?
	('targetNamespace' targetNamespace=STRING)?
	'webservice' name=ValidID '{' operations+=Operation+ '}';

Operation:
	name=ValidID '('
	(params+=FullJvmFormalParameter
	(',' params+=FullJvmFormalParameter)*)?
	')'
	'returns'
	'('
	(returned+=FullJvmFormalParameter
	(',' returned+=FullJvmFormalParameter)*)?
	')';

Como el lenguaje está basado en xbase / jvm, puedo usar un inferrer. El inferrer permite generar código con chequeo de tipos a partir del árbol sintáctico:

   	def dispatch void infer(Service element, IJvmDeclaredTypeAcceptor acceptor, boolean isPreIndexingPhase) {
		val requests = new HashMap()
		val responses = new HashMap()
   		// Here you explain how your model is mapped to Java elements, by writing the actual translation code.

   				for (operation : element.operations) {

   						val req = operation.toClass(operation.name + 'Request')
   						acceptor.accept(req).initializeLater[
   							packageName=element.packageName
							for (param : operation.params) {
								members += toField(param.name, param.parameterType)
								val getter = toGetter(param.name, param.parameterType)

								val getterAnnotation=findAnnotation(typeof(javax.xml.bind.annotation.XmlElement),param)
								getterAnnotation.addStringValue("name", param.name)
								getter.annotations+=getterAnnotation

								members += getter
								members += toSetter(param.name, param.parameterType)
							}
   						]
   						requests.put(operation, req)

						req.annotations += findAnnotation(typeof(javax.xml.bind.annotation.XmlRootElement),operation)

   						val resp = operation.toClass(operation.name + 'Response')

						resp.annotations += findAnnotation(typeof(javax.xml.bind.annotation.XmlRootElement),operation)
   						acceptor.accept(resp).initializeLater[
   							packageName=element.packageName

							for (param : operation.returned) {
								members += toField(param.name, param.parameterType)
								val getter = toGetter(param.name, param.parameterType)

								val getterAnnotation=findAnnotation(typeof(javax.xml.bind.annotation.XmlElement),param)
								getterAnnotation.addStringValue("name", param.name)
								getter.annotations+=getterAnnotation

								members += getter
								members += toSetter(param.name, param.parameterType)
							}
   						]
   						responses.put(operation, resp)
				}
   		// An implementation for the initial hello world example could look like this:
   		val wsInterface = element.toInterface(element.name,[])
   		//wsInterface.annotations+=findAnnotation(typeof(javax.jws.WebService),element)
   		acceptor.accept(wsInterface)
   			.initializeLater([
   				packageName=element.packageName

   				val webService = findAnnotation(typeof(javax.jws.WebService),element)
   				webService.addStringValue("name", element.name + "Type")
   				annotations+=webService

   				val soapBinding = findAnnotation(typeof(javax.jws.soap.SOAPBinding),element)
   				soapBinding.addEnumValue("parameterStyle",
   					getTypeForName(javax.jws.soap.SOAPBinding.ParameterStyle, element),
   					'BARE'
   				)
   				annotations+=soapBinding
   				for (operation : element.operations) {

					val responseReference = responses.get(operation).fullName.getTypeForName(element)
					val requestReference = requests.get(operation).fullName.getTypeForName(element)

					val operMethod = operation.toMethod(operation.name, responseReference) [
						val parameter = toParameter(requests.get(operation).fullName.toFirstLower,requestReference)
						val webParam = findAnnotation(typeof(javax.jws.WebParam),operation)
							.addStringValue("name", requests.get(operation).fullName)
							.addStringValue("partName", requests.get(operation).fullName)
						parameter.annotations += webParam
						it.parameters+= parameter
					]
					operMethod.annotations+=findAnnotation(typeof(javax.jws.WebMethod),operation)

   					members += operMethod
   				}
   			])

   	}

Esto está en lenguaje xtend y no soy un especialista (dicho con más que pena que gloria). Admite sendos refactors, por ejemplo mejorar los dispatches del método infer. El pseudcódigo se muy sencillo:

  1. Generar una clase Request y Response por objeto con los parámetros de cada una con sus anotaciones JAXB
  2. Generar una interfaz para el Servicio y anotarla con JAX-WS
  3. Agregar las operaciones y anotarlas con JAX-WS

Esto me genera las clases java y la SEI. Heredo de la interfaz y tengo definido el servicio.

De esta manera, me puedo sentar con el cliente y definir un servicio de una manera comprensible para ambas partes y sin ahondar en detalles.

Supongamos que queremos hacer un servicio web para registrar posts que reciba un título y el contenido y me devuelva el ID del post y la URL.


webservice PostService {

RegistrarPost
(String Titulo, String Cuerpo)
returns
(Integer PostID, String URL)

BuscarPostPorID
(Integer PostID)
returns
(String Titulo, String Cuerpo)

}

Esto construye la interfaz PostService, con los métodos RegistrarPost y BuscarPostPorID. A su vez construye las clases RegistrarPostRequest y RegistrarPostResponse y otro par para BuscarPostPorID. Todo con sus anotaciones y listo para nuestra implementación de JAX-WS lo publique.

Con relativamente poco código tenemos un DSL para generar Web Services en java de manera declarativa y accesible a quién conoce el dominio.

Estoy trabajando en agregar tipos compuestos y listas.

Como sea ya tenemos la primer experiencia con Xtext en protoducción.

¡Hasta la próxima!

Anuncios

hope you guess my name

julio 15, 2012

Domingo, materias firmadas a último momento y rasposamente, tps anuales interminables, bajón previo al lunes.

Compasión por el diablo, y por nosotros también.

recolector de basura

abril 28, 2012

bueno, señores, este, no tan joven, finalmente cayó…

todo objeto que uno hace en java, a menos que algo anormal pase en el medio, tiene como destino final el recolector de basura…

ahora entendiendo la naturaleza de los objetos que la jvm espera…

bisiesto

febrero 29, 2012

Mientras cuento los días para irme de vacaciones, y administracion de recursos queda atras noto que es 29 de febrero. Un día que disponemos cada 4 años. Bah, generalmente, porque los años terminados en 00 y no múltiplos de 400 tienen febreros de 28 días.

Parece ser que los romanos contaban los días respecto a días claves, por ejemplo calendas era el primero, nonas el quinto e idus el 13, salvo en marzo, mayo, julio y octubre que caía 15.-

Al parecer para compensar el -casi- 1/4 de día excedente de los 365 que le toma al Sol darle una vuelta a la Tierra, cada cuatro años los romanos agregaban un día más, el 23 de febrero, o seis días antes de las calendas de marzo, duraba 48 horas. Para complicarla más contaban también el día de la referencia, es decir: 2 para las calendas sería el día anterior al primero del mes siguiente. A la segunda parte de este día se le decía bis sectus o segundo sexto. De ahí, una serie de deformaciones de pasar de un idioma a otro, produjeron el vocablo bisiesto.

Y se fue otro 29 de febrero. El del año que el calendario maya dio over-flow. Buenas noches.

1q84

febrero 22, 2012

A ver… me llamó mucho la atención porque yo sabía que la letra q en japonés se lee igual que 9… me llamó mucho la atención que fueran varios libros… sentía que tenía que leer algo de Haruki Murakami

Los dos primeros libros que se editan como un sólo libraco de 700 páginas me gustaron. Me gustó mucho la historia tras de Vanguardia, una comunidad religiosa (secta) formada a partir de una granja comunitaria de izquierdistas setentosos devenidos en vendedores de productos orgánicos en los ’80. La little people, las dos lunas, esa especie de Rei Ayanami llamada Fukaeri. Komatsu el editor maldito que quería reirse de su mundillo. Todos en algún momento encontramos cómico y algo ridículo el mundo en el que nos desenvolvemos.

La novela iba in crescendo, hasta la página 600 aproximadamente. Haruki resutló un gran narrador, con muchas referencias a la cultura de masas. Muy interesante de leer. Después me resultó un difícil trámite, lleno de historias que no conducen a mucho, personajes movidos por más por venganzas personales que por causas altruistas, parejas artificiales, historias que no se cierran y algunas crueldades innecesarias.

Da la impresión que la propia novela fuera escrita por Tengo -el protagonista, un profe de matemáticas escritor que todavía no desarrolló su oficio de novelista del todo-, o que el mismo Haruki leyó la Crisalida de aire y fue convirtiendo la anodina novela de una asesina de tipos de la peor calaña (los tipos!) en una historia fantástica con dos lunas, concepciones a distancia y una pareja con menos química que Lara Croft y el profesor McAllister.

En algún momento pensé que se iba a salvar, que la mitad del libro era una ficción escrita en la otra mitad, pero de golpe el libro se empezó a estancar, y todos  -hasta un sagaz detective de aspecto desagradable- terminaron embobados, mirando la luna sobre un tobogán en un arenero de plaza.

Lo pior es que yo también me subí a ese tobogán, buscándole algún cierre, miraba y miraba las dos lunas. Pero nada.

Igual prometo darle otra oportunidad a Muramaki.

Peter Capusotto y sus videos, ahora en el cine en 3D!

enero 6, 2012

Gente, el 26/01 del corriente se estrena en el cine Peter Capusotto y sus videos en 3D. Casi un regalo de cumpleaños para quien suscribe.

¡Feliz día de reyes magos!

agotando las últimas horas de 2011

diciembre 30, 2011

Qué calor que hace! Al fin parece diciembre.

Bueno, lector que pasás por acá, este es un post de cierre de año. Año curioso. En la facu me cambiaron de plan, lo que significó cursar física 2, cosa que por suerte ya pasó y ya quedó afirmada la aprobación en un acta de la facu. Remando y con un par de golpes conseguí el 13/12/11 el título intermedio de Analista Universitario de Sistemas, título que me viene bien laboralmente, aunque no estaba en mis planes originales al ingresar a la facu.

Aprendí algo de computación gráfica y de administración de recursos humanos. Me tengo que poner pillo con la investigación operativa de acá a los primeros días de febrero para recuperarla, que me quedo colgando.

Hice un curso de metodologías de desarrollo seguro, dictado por Cristian Borghello. Es curioso, pero cada vez más veo la necesidad de aplicar metodologías a esto de programar, pero por otro lado las urgencias o tal vez la falta de disciplina de uno, hacen que uno termine a mitad de camino. Es algo que le pasa mucho a quién escribe, sabe que es lo correcto, pero por alguna razón no llega a ponerlo en marcha.

¡Scala es un bodrio! Java 7 llegó tarde y con pocas cosas divertidas. Al parece Java 8 la va a romper. A quien ande en esta no tan noble profesión del desarrollo web en java le recomiendo Como funciona tomcat. El libro explica como funcionan las versiones 4 y 5 del servidor planteando el diseño como si lo quisieramos programar de nuevo.

Recomiendo encaresidamente el libro Kryptonita de Leonardo Oyola. La cosa es más o menos así, el nafta super no es como nosotros. Evidentemente vino de otro lado, pero por razón terminó viviendo entre nosotros. Hay quien dice que si hubiera terminado en otros lados, como en una granja en arkansas, hoy sería el super hombre -no, el de nietzche y sus seguidores folkloristas alemanes, no!-, ese que se para por sobre todos y lucha por la justicia y los mercados. Como sea nuestro nafta súper tuvo un percance, y cayó en la guardia del Paroissien. Un nochero (doctor que cubre guardias por otro a un costo humano muy elevado) tendrá que mantenerlo con vida, mientras sus super amigos lo cuidan del horror… el horror…

Como sea el libro del párrafo anterior es el libro del año.

Con esto de la investigación operativa me dio curiosidad la película esa de la mente brillante, acerca del matemático Nash. creo que también podría haberse llamado “una película intrascendente”. Más allá del drama personal del compañero Nash, el personaje de russel crowe no pasa el test de turing.

Ciudadano Kane la rompe. Matt Groenning le debe mucho.

Creo que el blog del año es (aunque no de este para el autor, pero sí para mí que llegué tarde, pa’variar) es realismo socialista del dibujante Galliano. En el blog, el dibujante publica sus obras (no, no faltó una s) y se ve que el pibe tiene oficio. Yo creo que dejaría a Nik en la lona si a la nación se copase con el cinismo de izquirdas. Pero la nación es una mierda y nik seguirá en la delincuencia de cuello blanco. Soberbia la serie Lenin y vos!

Bueno, yo estoy contento. Muy vago con esto del blog. Pero como todos los años me propongo darle un poco de vida.

Aflojen con la quiniela! Los números también pueden ser el más grande ejercicio para la cabeza.

Ahora me voy a ver a Almafuerte.

Feliz año, lector!

la ciencia es la física, lo demás es coleccionismo de estampillas

enero 10, 2011

La frase “haciendo amigos 2011” se la sacamos a Ernest Rutherford, físico y químico neozelandés del siglo XX.
Aclaro que  consideramos esta definición de ciencia parcialísima e incompleta y pensamos más en la ciencia como una actividad colectiva que busca generar saber acerca de cosas de la realidad para felicidad del pueblo y grandeza de la nación.
Pero ante todo simpatizamos con la honestidad brutal y creemos que no anda tan lejos del buen camino.
¡Buen año!

Cayó Sistemas de Representación

noviembre 22, 2010

Bueno, el que lea esto por ahí mucho no le importe, pero esta semana, luego de 4 años en la UTN, cayó sistemas de representació (AKA dibujo técnico)

También se firmó ténicas avanzadas de programación (tadp.wikidot.com) y se promocionó Legislación.

Estoy notas de Redes y de Diseño de sistemas, la material troncal de tercero.

Ahora sí, de a 4 o 6 materias por cuatrimestre (este fueron 5), pero rumbo al título.

Peter Capusoto vuelve el 22 de Septiembre (2008 reprise)

septiembre 9, 2008

Damas y caballeros, que anduvieron viniendo mientras buscaban info de Peter Capusotto y sus videos.

Según lo que se puede ver en canal 7 y lo que confirmamos con un cumpa de la facu. El programa de rock de la televisión pública vuelve el 22 de Septiembre a las 23 horas.

Vaya otra temporada, y otro septiembre con Peter Capustto y sus vídeos.

Buenas Noches.