rafael díaz rojas amin harou daniel lópez sánchez

Post on 03-Jan-2016

51 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

DESCRIPTION

Rafael Díaz Rojas Amin Harou Daniel López Sánchez. Índice. Introducción Reseña técnica Ejemplo de aplicación. Introducción a. Es una librería para crear interfaz gráfica de usuario en Haskell Orientada a la industria Está construida sobre wxWidgets que es una librería de C++ - PowerPoint PPT Presentation

TRANSCRIPT

1

Rafael Díaz RojasAmin Harou

Daniel López Sánchez

2

ÍndiceÍndiceIntroducciónReseña técnicaEjemplo de aplicación

3

Introducción aIntroducción a

4

IntroducciónIntroducciónEs una librería para crear interfaz gráfica de

usuario en HaskellOrientada a la industriaEstá construida sobre wxWidgets que es una

librería de C++ Permite crear aplicaciones para Win32, Mac

OS X, GTK+, X11, Motif, WinCE…

5

IntroducciónIntroducción

Soporta Windows, GTK (Linux) y MacOSEl núcleo de su interfaz se desarrolló a partir

de WxEiffel, luego la mayoría de sus Widgets están soportados

En Enero del 2009 apareció la versión 11.0WxHaskell no soporta la programación

multihebraWxHaskell consta de una página oficial llena

de documentación que fue creada en agosto del 2008

6

Permite crear botones, cajas de texto, menús, etc

Permite especificar la disposición física de los componentes utilizando espacios de trabajo al estilo del lenguaje Java (Los espacios de trabajo sirven para organizar los Widgets)

También se usan eventos como el caso de Java (Por ejemplo se lanza un evento cuando presionamos un botón)

IntroducciónIntroducción

7

WidgetsWidgetsLos Widgets son los componentes básicos de

la interfaz gráfica de usuarioUn Widget es un componente gráfico, o

control, con el cual el usuario interactúa.Existen dos tipos de Widgets:

◦Ventanas : Son los Widgets que contienen otros Widgets

◦Controles: Widgets normales (como una ventana normal con los botones cerrar, minimizar y maximizar)

8

wxWidgetswxWidgetsFue diseñado por Thellinni en Italia 2008 en el

instituto de Aplicaciones de la Inteligencia Artificial de la universidad St. Andrews (Escocia)

Es un software libre (última versión 2.8.9 salió el 22 de septiembre de 2008)

Soporta varias plataformasTambién tiene una ligadura para lenguajes como

Python o PerlCuenta con soporte, documentación, ayuda en

línea, foros …

9

wxWidgetswxWidgetsSe encuentra entre los 25 proyectos más activos de

código abiertoLa biblioteca es madura, lleva en desarrollo

desde 1992Permite gráficos 2D, 3D con openGL, Bases de

datos, Redes, Impresión, Hebras …Cuenta con una versión extendida para

dispositivos como PDAs y teléfonos celularesTiene un API orientada a objetos que es fácil de

aprender y de utilizar

10

Desventajas WxWidgetsDesventajas WxWidgetsWxWidgets es software libre, por lo tanto

depende del tiempo y el esfuerzo de los que lo han creado.

Es una biblioteca muy grande.Consta solo de una capa para el API nativa de

cada SO (Es decir: la apariencia dependerá de en que SO se esta ejecutando)

Abusa de la utilización de macros para realizar ciertas operaciones

No cuenta con soporte para características modernas de C++ como manejo de excepciones

11

Ventajas WxHaskellVentajas WxHaskell

Poder utilizar características importantes de Haskell, como el polimorfismo paramétrico, funciones de orden superior, evaluación perezosa

Los programas resultantes tienden a ser más cortos y más elegantes que sus homólogos en C++ por ejemplo

Posibilidad de interactuar con código Haskell

12

Ejemplo de aplicación: DazzleEjemplo de aplicación: Dazzle

Es un programa que simula las creencias de las redes bayesianas

Fue desarrollado por el grupo Decision Support Systems de la universidad de Utrecht (Holanda)

Herramienta para la construcción, edición y análisis de redes bayesianas

Consta de más de 4000 líneas de código específico WxHaskell

13

Ejemplo gráficoEjemplo gráfico

14

Ejemplo de aplicación: DazzleEjemplo de aplicación: Dazzle

Es una aplicación para múltiples plataformas (Se usa tanto para Windows como para Linux)

Se desarrolló mucho antes del plazo previsto que ocurre rara vez en proyectos software.

En Windows XP, utiliza 12M de memoria para las grandes redes bayesianas de más de 50 nodos

15

Más sobre WxHaskellMás sobre WxHaskellSe publicó un artículo en una revista muy popular

en Francia llamada L’informaticien sobre WxHaskell en Octubre del 2003 escrito por Frédéric Mazué

WxHaskell se imparte en la Universidad Politécnica De Valencia en la asignatura Programación Declarativa

También se imparte en la Universidad de Girona en la asignatura Paradigmas de programación

16

En la Universidad Mayor de San Simón, Cochabamba, Bolivia se dio una conferencia sobre las interfaces gráficas de usuario en Haskell con especial atención a WxHaskell el 1 de Noviembre de 2007

El departamento de ciencias de la computación de la universidad de Utrecht, Holanda tiene varias aplicaciones de investigación que usan WxHaskell (El Dazzle es uno de ellos)

Más sobre WxHaskellMás sobre WxHaskell

17

El departamento de Sistemas Informáticos y computación de la universidad politécnica de Valencia desarrolló una aplicación para la verificación de sitios Web utilizando lenguajes funcionales el 19 de Julio de 2005, y la interfaz gráfica de esa aplicación fue implementada en WxHaskell

Más sobre WxHaskellMás sobre WxHaskell

18

Reseña técnica aReseña técnica a

19

Atributos y PropiedadesAtributos y Propiedades

El tipo de un atributo representa su contenedor y su valor

text :: Attr (Button a) Stringget ::w->Attr w a->IO aA la combinación de atributo y valor se le llama

propiedad( :=) :: Attr w a->a->Prop wset ::w->[Prop w]->IO ()

20

Atributos y PropiedadesAtributos y Propiedades

exclamation :: Button a->IO () exclamation b = do s <- get b text set b [text := s++"!"]

( :~) :: Attr w a->(a->a)->Prop w

exclamation b = set b [text :~ (++"!")]

21

Atributos y PropiedadesAtributos y Propiedades

Como la clase Window de wxWidgets posee un atributo de texto, todo tipo de ventanas pueden tenerlo

text :: Attr (Window a) StringDe esta manera no hay que definir atributos de

forma separadaget ::w->Attr w a->IO aget w (Attr getter setter) = getter wdata Prop w = a: (Attr w a) := a| a: (Attr w a) :» (a->a)

22

SeguridadSeguridad

wxHaskell impone una fuerte disciplina de tipos en wxWidgets

El tratamiento de memoria se realiza de forma automática

Comprueba punteros no inicializados, lanzando una excepción en Haskell

Existe una estructura jerárquica entre los Widgets creados

23

LayoutLayout

Se aloja en el frame

caption :: String->Layoutspace :: Int->Int->Layoutrule :: Int->Int->Layoutboxed :: String->Layout->Layoutgrid :: Int->Int->[[Layout]]->Layout

24

Primer ProgramaPrimer Programa

main :: IO () main = start hello

hello :: IO () hello = do f    <- frame    [text := "Hello!"] quit <- button f [text := "Quit", on command := close f] set f [layout := widget quit]

25

LibreríasLibrerías

Graphics.UI.WX y Graphics.UI.WXCore

WXCore está a bajo nivelEs el núcleo de la interfaz de los wxWidgetsSolamente usa abstracción funcional

Sin embargo WX introduce nuevas funcionalidadesEstá implementada encima de WXCoreMecanismos de abstracción como la sobrecarga

26

ConceptosConceptosEl frame es la ventana de nivel superiorTodas las demás poseen siempre un padreLos panels se incluyen en el frameLos elementos tienen atributosLos nombres de los atributos están sobrecargadosLa apariencia en la pantalla la establece layoutLos controles también tienen atributos

27

ConceptosConceptos

Son instrucciones a seguir cuando se activan (on)Hay Widgets invisibles (timer, value …)Se basa en un entorno de desarrollo orientado a

objetosLos Widgets son punteros a objetos en C++Atributo + Valor = PropiedadGracias a la herencia hay atributos compartidosColisión con el sistema de tipos de HaskellEl contenedor sirve para Widgets anidados

28

ConceptosConceptos

Alinear, Expandir y EstirarhalignLeft :: Layout->Layout -- defaulthalignRight :: Layout->LayouthalignCenter :: Layout->LayoutvalignTop :: Layout->Layout -- defaultvalignBottom :: Layout->LayoutvalignCenter :: Layout->Layout

29

ConceptosConceptos

rigid :: Layout->Layout -- defaultshaped :: Layout->Layoutexpand :: Layout->Layout

static :: Layout->Layout -- defaulthstretch :: Layout->Layoutvstretch :: Layout->Layout

30

ConceptosConceptos

Para dividir el espacio entre filas y columnas

hweight :: Int->Layout->Layoutvweight :: Int->Layout->LayoutDepende del peso de cada elemento

31

Una primera aplicación en

ASTEROIDS(en 54 líneas de código)

32

IntroducciónIntroducción

wxHaskell no es una interfaz diseñada para crear juegos, aún así, hemos elegido poner como ejemplo el conocido juego ASTEROIDS en una versión bastante minimal.

La intención de programar este juego es la de mostrar aspectos interesantes de wxHaskell, que con otras aplicaciones hubiera sido más "costoso" de ver.

Para quien no conozca el juego Asteroids, éste trata de una nave que debe de esquivar infinitas cantidades de asteroides, y en cuanto choca con un asteroide, éste explosiona llevándonos al final del juego.

33

Primeros pasosPrimeros pasos

En esta minimalística versión no trataremos de crear un clon exacto de Asteroids, simplemente intentaremos haceros conocer las virtudes de wxHaskell.

Para comenzar definiremos las siguientes constantes

height = 300 width = 300 (Definición del espacio del frame) Diameter = 24 (Diámetro del asteroide) chance = 0.1 :: Double (Probabilidad de aparecer un asteroide)

34

Creación de la base del juegoCreación de la base del juego

asteroids :: IO ()asteroids =do g <- getStdGen vrocks <- variable [value := randomRocks g] vship <- variable [value := div width 2]

f <- frame [resizeable := False] t <- timer f [interval := 50,

on command := advance vrocks f ]

set f [text := "Asteroids", bgcolor := white, layout := space width height, on paint := draw vrocks vship, on leftKey := set vship [value :» nx!x¡5], on rightKey := set vship [value :» nx!x+5]]

Definimos la variable asteroids como IO()

Creamos una variable para generar números aleatorios

Vrock es una lista de las futuras posiciones de los asteroides

Vship contiene la posición del eje X de la nave

F la ventana T es un temporizador para

actualizar eventos Establecemos los atributos de la

variable 'f', color de fondo, tamaño, función de dibujado, y asignar funciones a las pulsaciones de teclas

35

Creación de la base del juegoCreación de la base del juego

En lugar de la asignación usual de haskell := hemos usado :~ Esto no realiza una asignación a la variable, sino que le aplica una función.

En el caso de on LeftKey, podríamos usar:on leftKey := set vship [value :~ \x->max 0 (x-5)]

Lo que nos permitiría implementar los bordes de la ventana (frame).Para el caso de on Rightkey, análogamente sería:on rightKey := set vship [value :~ \x->min width (x+5)]

36

Función de generado y avanceFunción de generado y avancede los Asteroidesde los Asteroides

randomRocks :: RandomGen g => g → [[Point ]]randomRocks g = flatten [ ] (map fresh (randoms g))flatten rocks (t : ts) = let now = map head rocks later = filter (not o null) (map tail rocks) in now : flatten (t++later) tsfresh r | r>chance = [ ] | otherwise = [track (floor (fromIntegral width*r =

chance))]track x = [point x (y - diameter) | y ← [0,6... height +2

*diameter]]

Tenemos un generador de números aleatorios, que con él generamos asteroides aleatoriamente.

Cuando generamos un asteroide, lo metemos en una lista, siendo un asteroide una lista de posiciones dentro de la ventana, que va desde arriba, hasta abajo.

37

Función de generado y avanceFunción de generado y avancede los Asteroidesde los Asteroides

advance vrocks f = do set vrocks [value :~ tail] repaint f

draw vrocks vship dc view = do rocks ← get vrocks value x ← get vship value let ship = point x (height - 2*diameter) positions = head rocks collisions = map (collide ship) positions drawShip dc ship mapM (drawRock dc) (zip positions collisions) when (or collisions) (play explode)

La función advance coge el estado actual de la situación de los asteroides y la representa en pantalla.

La función draw especifica lo que hacer en la ventana. Ésta llama a drawShip y drawRock. Es llamada cada 50ms.

dc indica el contexto donde dibujar, puede ser un mapa de bits o una impresora, pero en este caso, es la ventana.

Collide es la función que comprueba que un asteroide choca con la nave

38

Función de dibujado de Función de dibujado de primitivasprimitivas

La nave puede ser representada como una primitiva, al igual que los asteroides:

drawShip dc pos =

circle dc pos (div diameter 2) [brush := brushSolid red]

drawRock dc (pos; collides) =

|collides == true = circle dc pos (div diameter 2) [brush := brushSolid black]

|collides == false = circle dc pos (div diameter 2) [brush := brushSolid yellow]

39

Función de dibujado de mapa Función de dibujado de mapa de bitsde bits

La nave puede ser representada con un mapa de bits, al igual que los asteroides:

drawShip dc pos =

drawBitmap dc ship pos True [ ]

drawRock dc (pos; collides) =

let picture = if collides then burning else rock

in drawBitmap dc picture pos True [ ]

collide pos0 pos1 =

let distance = vecLength (vecBetween pos0 pos1)

in distance ≤ fromIntegral diameter

rock = bitmap "rock.ico"

burning = bitmap "burning.ico"

ship = bitmap "ship.ico"

explode = sound "explode.wav"

40

Generación de la barra de Generación de la barra de menúmenú

Con el símbolo '&' indicamos que la letra J del teclado, tendrá asociada la función de expandir el menú Juego

El campo help, indica qué texto poner en la barra de ayuda de la ventana

game ← menuPane [text := "&Juego"]

new ← menuItem game [text := "&Nuevo\tCtrl+N"

, help := "Empezar nuevo juego"]

pause ← menuItem game [text := "&Pausa\tCtrl+P"

, help := "Pausar el juego"

,checkable := True]

menuLine game

quit ← menuQuit game [help := "Salir del juego"]

set new [on command := asteroids]set pause [on command := set t [enabled :~ not]]set quit [on command := close f ]

La opción 'checkable' añade una marca de selección.

Con el comando 'on command', añadimos una funcionalidad a cada botón.

'new' crea una nueva ventana de juego

Para pausar el juego, tan solo hay que desactivar el temporizador

Por último close f, cierra la ventana

41

Juego finalizadoJuego finalizado

42

BibliografíaBibliografíahttp://haskell.org/haskellwiki/WxHaskellhttp://www.wxwidgets.org/http://www.linformaticien.com/El proyecto Verificación de sitios Web utilizando

Lenguajes funcionales [2005]Haskell Ready to Dazzle the Real World [2005]Slicing wxHaskell modules to derive the User

Interface Abstract Model [2007] http://zenon.dsic.upv.es/muterm/muterm.php

(Del profesor Raúl Gutiérrez herramienta de terminación MU-TERM)

43

MejorasMejorasMateu Villavet profesor de la escuela Politécnica

Superior de la Universidad de Gerona y Salvador Lucas profesor de la Universidad Politécnica de Valencia nos contestó a algunas dudas.

El profesor de la Universidad Politécnica de Valencia que participa en el desarrollo de la herramienta de terminación MU-TERM cuya versión 'de sobremesa' utiliza wxHaskell acerca del procedimiento necesario para instalar WxHaskell

44

Respuesta a preguntas (Mateu Respuesta a preguntas (Mateu Villavet)Villavet)¿Como habéis conseguido instalar

WxHaskell?◦Siguiendo las instrucciones de la Web.

Lo único que tienes que vigilar son las versiones de wxhaskell y del GHC queutilices para la compatibilidad

45

¿Cuantas clases prácticas hacéis de WxHaskell?¿Es fácil de manejar, y de entender?¿se hicieron algunos proyectos en la Universidad de Gerona ? ¿y trabajosde investigación?◦ La práctica de haskell ha sido realizar un juego con wxhaskell. algunos

alumnos han hecho el Pacman. La verdad es que no hay mucha documentación pero el artículo que hay en la sesión 5 de laboratorio

◦ es de gran ayuda:http://ima.udg.edu/Docencia/3105200736/index.htmlSobre un proyecto final de carrera hecho con GHC y wxHaskell paraaprender lambda-cálculo puedes visitar:http://ima.udg.edu/~villaret/tilc/TILC-Presentation.htmlSi quieres comentárselo a tu profesor por si desea utilizarlo en casoque estudiéis lambda cálculo.

Respuesta a preguntas (Mateu Respuesta a preguntas (Mateu Villavet)Villavet)

46

Respuesta a preguntas (Salvador Respuesta a preguntas (Salvador Lucas)Lucas)¿Cuantas clases se dedican a WxHaskell?

◦No dedicamos ninguna clase a wxHaskell. En realidad, los alumnos utilizan un móduloHaskell que yo les proporciono para integrar la práctica que realizan y poder utilizarla con una interfaz gráfica realizada en wxHaskell. No necesitan conocer nada sobre la librería...

47

Respuesta a preguntas (Salvador Respuesta a preguntas (Salvador Lucas)Lucas)¿Es fácil el uso de WxHaskell?

◦Es relativamente fácil, una vez que te familiarizas con la manera de especificar la interfaz gráfica y tratar la interacción mediante eventos, etc.

48

Respuesta a preguntas (Raúl Respuesta a preguntas (Raúl Gutiérrez)Gutiérrez)¿Cómo se instala WxHaskell?

◦te recomiendo que te instales cabal, ya que es la mejor forma para trabajar y descargarte paquetes de haskell: http://www.haskell.org/cabal/ y después instalar el paquete con:cabal install wx-core wx

49

MejorasMejorasTambién nos pusimos en contacto con el

profesor Doaitse Swierstra de la Universidad de Utrecht

50

Respuesta a preguntas (Doaitse Respuesta a preguntas (Doaitse Swierstra)Swierstra)¿Podría funcionar el UHC para instalar

WxHaskell?◦ La instalación de WxHaskell en sí no es realmente un

problema hoy en día, solo hace falta lograr la correcta combinación de sistema operativo, WxWidgets y WxHaskell GHC.

◦ En la actualidad, todavía le faltan muchas cosas a WxHaskell para ejecutar programas con UHC, esperemos que este problema se subsane en el futuro

◦ Para instalar WxHaskell en Ubuntu podéis seguir estas instrucciones que fueron producidas por uno de nuestros estudiantes:http://www.students.cs.uu.nl/~jfklein/fp/Install_wxhaskell_on_ubuntu.txt

top related