| neosergio |
Siendo las 17 Horas UTC con 02 minutos empezamos
Bienvenidos amigos, fans y curiosos Gnomeros
|
| aruiz |
neosergio, no vas a necesitar @ para cambiar el modo del canal?
|
| diegoe |
aruiz, apelemos a la civilización ;-)
|
| neosergio |
;)
|
| aruiz |
pues si
bueno, neosergio adelante, haz los honores pues
|
| neosergio |
http://live.gnome.org/Vala
y tenemos el placer, gusto, agrado y quizas honor de tener a Alberto Ruiz para que nos hable del \
asunto
|
| aruiz |
:)
neosergio, empiezo pues?
|
| neosergio |
antes
para aquellos que no conozcan a aruiz , aqui pueden leer un poco sobre el \
http://www.grancanariadesktopsummit.org/node/343
pues dale entonces aruiz
|
| aruiz |
doile pues
pues bueno
bienvenidos a todos y gracias por atender
como bien ha comentado Sergio, hoy vamos a hablar del lenguaje de programacion Vala
les voy a rogar me disculpen si no utilizo acentuaciones o uso nh en lugar de enhe
pero es que no tengo teclado en castellano
:)
de entrada, les ruego que vayan instalandose los paquetes valac y libgtk2.0-dev en ubuntu jaunty
estoy asumiendo las versiones del compilador y las utilidades de esa distro pues es la que tengo en \
casa
voy a dar una breve introduccion sobre el proyecto
y luego voy a pasar a comentar unos ejemplos que he empaquetado en \
http://www.gnome.org/~aruiz/tutorialvala-gh-1.0.tar.gz
les ruego lo descargen y lo descompriman
tiene varios directorios con los capitulos del tutorial
Pues bien
Vala es un lenguaje de programacion inspirado en C# cuyo proposito es proporcionar un lenguaje de \
alto nivel para la paltaforma de desarrollo de GNOME en concreto, para el sistema de objetos GObject \
y \
GLib
La pregunta es, existiendo Mono, cual es el proposito de Vala?
Pues la respuesta viene dada por la pecularidad de este compilador
y es que en lugar de utilizar una maquina virtual, transforma las fuentes a C
y luego utiliza GCC (u otros compiladores de C) para pasar a codigo maquina
esto permite crear librerias y aplicaciones con exactamente el mismo rendimiento que si lo \
hubieramos escrito todo en C nosotros \
mismos
ademas de ello Vala proporciona varias caracteristicas muy interesantes aprovechando el potencial de \
GObject
como por ejemplo, hace conteo de referencias automatico, con lo cual no nos tenemos que preocupar de \
liberar memoria en ningun momento (salvo casos un poco particulares, de los que no voy a hablar \
hoy)
para la explicacion de los ejemplos, voy a asumir ciertas nociones de programacion orientada a \
objetos y C/C#, aunque tratare de explicar todos los conceptos de la forma mas generica \
posible
bueno
http://www.gnome.org/~aruiz/tutorialvala-gh-1.0.tar.gz
si nos descargamos y descomprimimos el paquete
nos vamos a encontrar con varios directorios
TutorialVala/01_HolaMundo
es el directorio que contiene la primera serie de ejemplos
|
| neosergio |
Una breve pausa: Los asistentes a la charla pueden enviarme las preguntas por privado, desde ahora.
|
| aruiz |
ah, si, no tengo problemas con recibir preguntas en tanto las envien a traves del moderador
pues bien
nos situamos ahora en TutorialVala/01_HolaMundo
el primer ejemplo, es HolaMundo1.vala
http://pastebin.valadoc.org/69.html
de forma alternativa, voy a utilizar el pastebin de valadoc.org
para comentar trozos de codigo
pues bien, esta aplicacion, es la minima expresion de una aplicacion escrita en vala
es basicamente el equivalente a una funcion main que devuelve 0 en C
para compilar esta aplicacion
debemos invocar el compilador de vala, el comando valac
y utilizar el nombre del fichero .vala como argumento
aruiz@dopamine:~/TutorialVala/01_HolaMundo$ valac HolaMundo1.vala
aruiz@dopamine:~/TutorialVala/01_HolaMundo$
cuando la compilacion de una aplicacion es satisfactoria, no hay mensajes de salida
ahora observaremos que hay un ejecutable llamado HolaMundo1
si lo ejecutamos, veremos que no ocurre nada, como es esperado
bien, con respecto a C, en la declaracion de esa funcion podemos observar un par de cosas un poco \
"raras", para aquellos que no esten familiarizados con \
C#
public static, significa, que la funcion es publica, y que ademas es estatica
el concepto de estatico es diferente al static de C
significa que la funcion puede utilizarse sin tener que instanciar ningun objeto (veremos mas \
adelante esto con detalle en los ejemplos de declaracion de \
clases)
bien, ahora que ya tenemos un ejemplo basico
veamos HolaMundo2.vala
|
| neosergio |
aruiz: una pregunta que hace hhlp, es que IDE puede usar para Vala
|
| aruiz |
dime
oh, muy buena pregunta
hay varias opciones hoy en dia
aunque ninguna es lo suficientemente madura como para compararla con los IDEs disponibles para otros \
lenguajes y \
plataformas
yo personalmente uso GEdit y la linea de comandos
pero por ejemplo, Anjuta y Monodevelop tienen ambos plugins para Vala
tambien hay un proyecto llamado Valide
http://www.valaide.org/
hasta donde se hace cosas muy basicas
http://code.google.com/p/vtg/
Vala toys for gedit
que tienen autocompletion y otras cosas interesantes
prosigamos
|
| neosergio |
:)
|
| aruiz |
HolaMundo2.vala
http://pastebin.valadoc.org/70.html
podemos ver el codigo fuente aqui
este si es el clasico hola mundo
voy a explicar un poco la linea numero 2
vala trata de ofrecer un entorno lo mas orientado a objetos posible
asi que normalmente no nos vamos a encontrar con las funciones sueltas como en C
como por ejemplo, printf
en cambio, tenemos algo mucho mas interesante
la salida estandard, esta representada por el objeto global stdout
y este objeto tiene un metodo, printf, que funciona exactamente como la llamada printf de C de toda \
la vida (o fprintf con stdout como buffer de \
salida)
para compilarlo, lo de siempre:
aruiz@dopamine:~/TutorialVala/01_HolaMundo$ valac HolaMundo2.vala
aruiz@dopamine:~/TutorialVala/01_HolaMundo$ ./HolaMundo2
Hola mundo!
Bien
ahora vamos a ver por encima, como se declaran variables
para ello, he anhadido dos ejemplos en HolaMundo3
http://pastebin.valadoc.org/71.html
en la linea 2 podemos observar lo siguiente:
string hola = "Hola";
esta es la tipica declaracion + asignacion de variable en C
definimos una variable hola de tipo string y le asignamos la cadena "Hola"
ahora bien, en la siguiente linea
tenemos algo distinto
var mundo = "Mundo";
resulta que vala, al ser un lenguaje de tipado estatico, puede inferir el tipo de una variable si le \
asignamos un valor en su \
declaracion
para ello simplemente utilizamos var
esto es bastante util si no tenemos claro el tipo que nos devuelve una funcion
o si queremos hacer casting del tipo mas adelante
en la linea 4 podemos observar como utilizo el formato de argumentos de printf para insertar las dos \
cadenas en la \
salida
no se si habran observado, que en el paquete he anhadido un Makefile para facilitar un poco las \
cosas
aruiz@dopamine:~/TutorialVala/01_HolaMundo$ make HolaMundo3
/usr/bin/valac HolaMundo3.vala
aruiz@dopamine:~/TutorialVala/01_HolaMundo$ ./HolaMundo3
Hola Mundo!
bien
ahora pasamos al ultimo ejemplo del capitulo de familiarizacion
http://pastebin.valadoc.org/72.html
este es el fichero HolaMundo4.vala
ahi doy varios ejemplos de las tipicas sentencias de control
funcionan exactamente igual que en C
excepto por la sentencia foreach
|
| neosergio |
aruiz: una pregunta por parte de ddasd
|
| aruiz |
foreach es una sentencia que recorre aquellos tipos de tipo coleccion, como por ejemplo las listas \
de GLib (tipo List en \
vala)
adelante
:)
|
| neosergio |
pregunta de ddasd: vala tiene una solución al problema de Vulnerabilidad al usar punteros en C?
|
| aruiz |
no estoy familiarizado con ese problema
ddasd, guardate esa pregunta para el final de la charla
y lo discutimos luego
;-)
pues bien
foreach
basicamente lo que hacemos es declarar una variable
string arg, en este caso
que va a adquirir el valor de cada uno de los elementos del vector de argumentos de la funcion main
ademas, esta vez, en lugar de imprimir con stdout
vamos a usar la llamada de salida de depuracion de GLib
debug(string format, ...)
funciona de forma similar a printf, pero se hace por la salida de depuracion estandard y no \
necesitamos anhadir el retorno de carro al \
final
ademas da mas informacion
para compilar
simplemente ejecutamos valac HolaMundo4.vala o make HolaMundo4
aruiz@dopamine:~/TutorialVala/01_HolaMundo$ make HolaMundo4
/usr/bin/valac HolaMundo4.vala
HolaMundo4.vala:8.18-8.21: warning: unreachable code detected
while (false && true) {
^^^^
Compilation succeeded - 1 warning(s)
como ven, el ejemplo compila satisfactoriamente
pero con una alerta avisando de que la sentencia while siempre es falsa
el compilador de vala hace algunas cosas muy interesantes para detectar posibles fallos en tiempo de \
compilacion
en muchas ocasiones ayuda a detectar fallos que hubieran tomado horas identificar en C
|
| neosergio |
aruiz, una pregunta de raster
|
| aruiz |
adelante
:)
|
| neosergio |
Pregunta de raster: Una pregunta ¿existe la construccion elif? (esto es, un else if , pero todo \
junto. Suelo usarlo en C (con un #define elif else if) para que, cuando hago varios else if's \
seguidos, el código quede más claro, aunque a nivel de ejecución no tiene ninguna \
diferencia
|
| aruiz |
en ese sentido es igual que C#
hay que usar "else if"
Vala tiende a ser lo mas compatible posible con C#
excepto en contadas excepciones y donde el beneficio supera con creces a andar anhadiendo cosas \
extranhas al \
lenguaje
bien
prosigo
|
| neosergio |
aruiz: otra pregunta, esta vez de diega
referente al codigo del ejemplo anterior
|
| aruiz |
oh, adelante
:)
|
| neosergio |
pregunta de diega: hay algun motivo por el cual el metodo debug no est? dentro de alg?n objeto como \
lo est? printf dentro de \
stdout?
|
| aruiz |
si, la idea es que debug es una funcion del lenguaje
debug no sirve para imprimir en la salida estandard (aunque al final eso sea lo que haga)
debug sirve para emitir salidas para depurar el codigo
espero que eso responda la pregunta
:)
aruiz@dopamine:~/TutorialVala/01_HolaMundo$ ./HolaMundo4
No se especifico ningun argumento
bien
como vemos, si no especificamos argumentos,
nos sale un mensaje de error, que se ha imprimido a traves de la salida de errores (el objeto \
stderr)
|
| neosergio |
ls
|
| aruiz |
de tal forma que si hicieramos $ ./HolaMundo4 2> errores.txt
neosergio, je
|
| neosergio |
*mistake
|
| aruiz |
tendriamos ese error en ese fichero
notese
que hemos detectado el numero de argumentos con la propiedad length del vector args
args.lenght es por tanto una propiedad del tipo uint
length, que diga
bien
aqui se acaba el primer capitulo
alguna pregunta hasta aqui?
|
| neosergio |
hasta el momento solo las respondidas
|
| aruiz |
bien
erm
para terminar de dar los otros dos capitulos, se me esta escapando un poco el tiempo
voy a intentar acelerar un poco el asunto
:)
si alguien tiene que irse o se aburre, que lo diga :P
en principio voy a continuar
bien
pasemos al capitulo 02
en el directorio TutorialVala/02_Clases
http://pastebin.valadoc.org/73.html
este es el fichero Clase1.vala
ahi hemos definido la minima expresion de una clase
notese que estamos declarando esta clase dentro de un espacio de nombres determinado
un espacio de nombres, no acaba siendo otra cosa que un prefijo en las funciones
por ejemplo
el prefijo gtk_ de las funciones de Gtk+
no acaba siendo otra cosa que el espacio de nombres Gtk en Vala
es simplemente para poder declarar clases con el mismo nombre en librerias distintas y que no hayan \
conflictos
a continuacion, de claramos una clase publica
las declaraciones de las clases se definen tal y como esta representada en la linea 4
notese que derivamos de la clase Object
que basicamente es la clase GObject
las clases, hay que declararlas publicas de forma explicita, dado que sino no se pueden utilizar \
desde otros programas (por ejemplo en la funcion \
principal)
esta clase esta vacia, no hace absolutamente nada
podemos ver en la clase principal, main, como podemos crear un objeto de una clase determinada
var objeto = new Tutorial.Clase1();
esto crea un objeto (llamado objeto) de la clase Clase1 incluida en el espacio de nombres Tutorial
para compilar, make Clase1
/usr/bin/valac Clase1.vala
Clase1.vala:12.6-12.35: warning: local variable `objeto' declared but never used
var objeto = new Tutorial.Clase1();
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Compilation succeeded - 1 warning(s)
como vemos, Vala ha detectado que despues de asignar la variable, no la hemos utilizado en ningun \
elemento
esto ayuda a ver si tenemos variables sin usar desperdiciando memoria
pero la compilacion es satisfactoria en cualquier caso
y si ejecutamos el programa, veremos como no hace absolutamente nada
|
| fmaq |
;)
|
| aruiz |
:P
bien
pasemos a la clase numero 2
Clase2.vala
|
| neosergio |
una pregunta aruiz
|
| aruiz |
adelante
|
| neosergio |
pregunta de gforcada: buenas, una pregunta para alberto: le puedes indicar al compilador que genere \
el codigo en C en vez de crear el \
ejecutable?
|
| aruiz |
ah si
pregunta muy buena
si le pasamos la opcion -C
puede generar el codigo en C
tambien hay otras opciones para generar las cabeceras .h de las funciones/clases publicas
y tambien hay opciones para generar librerias .so en lugar de programas, entre otras cosas
pero no he querido entrar en esos detalles para este tutorial
bien, prosigo
http://pastebin.valadoc.org/74.html
esta es la clase numero 2
en esta clase podemos ver varias cosas
primero, la sentencia using
using <Espacio de nombres>;
basicamente esto nos permite usar simbolos de un espacio de nombres sin tener que especificarlo \
expliciamente
como podemos ver en la funcion principal, para referirnos a Clase2, ya no usamos Tutorial.Clase2, \
sino directamente \
Clase2
es algo parecido a "import" en python o a "include" en C, pero no se comporta de la misma manera
pues bien
tenemos una clase con dos constructores
un constructor sin parametros
public Clase2 () { ... }
ese es el constructor por defecto
y tenemos un constructor alternativo que acepta un parametro de clase string
llamemmoslo, constructor con gracia
como podemos ver en el cuerpo del constructor con gracia
le pasa la cadena que estaba como parametro
a la salida de depuracion
compilamos
/usr/bin/valac Clase2.vala
Clase2.vala:21.6-21.27: warning: local variable `objeto' declared but never used
var objeto = new Clase2 ();
^^^^^^^^^^^^^^^^^^^^^^
Clase2.vala:22.6-22.79: warning: local variable `chiste' declared but never used
var chiste = new Clase2.con_gracia ("Dice que van dos y se cae el del centro");
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Compilation succeeded - 2 warning(s)
como esperabamos
la salida del compilador nos avisa de que no estamos usando las variables
** (process:1904): DEBUG: Clase2.vala:9: Clase 2 construida
** (process:1904): DEBUG: Clase2.vala:14: Dice que van dos y se cae el del centro
y bien, aque tenemos la salida de cada constructor
el constructor es llamado, cada vez que se le llama con new, como podemos ver en main
alguna pregunta hasta aqui?
bien
|
| neosergio |
una pregunta aruiz
|
| aruiz |
neosergio, dime
|
| neosergio |
pregunta de diega: a los constructores con par?metros hay que siempre ponerles un nombre? no se \
puede hacer public Clase2 (string chiste) { ... \
}?
|
| aruiz |
ah, vale
quizas no deje eso claro
si, se puede tener un constructor por defecto con parametro
|
| EGCdigital |
wenas
|
| aruiz |
EGCdigital, estamos en medio de una charla ;-)
EGCdigital, el moderador no tiene OP, asi que trata de pasarle a el las dudas
|
| EGCdigital |
y esta interesante?
|
| aruiz |
...
|
| neosergio |
EGCdigital privado
|
| aruiz |
EGCdigital, estoy tratando de decir, que no interrumpas
:)
|
| EGCdigital |
gogogogo
a oks aruiz
:)
|
| aruiz |
gracias
como decia
los constructores por defecto pueden tener parametros en efecto
en el ejemplo trato de decir como tener varios constructores que acepten distintos parametros
podriamos tener
public Clase2 (string chiste) {...}
y luego
public Clase2.desde_un_entero (int entero) {...}
espero que eso aclare la duda
bien
pasamos al ejemplo Clase3
http://pastebin.valadoc.org/75.html
|
| neosergio |
ante esto aruiz, una pregunta mas
|
| aruiz |
neosergio, claro
adelante
|
| neosergio |
pregunta de ddasd: ¿El método main, no es necesario que este dentro de una clase como en C#?
|
| aruiz |
jeje
ddasd, muy buena observacion
ddasd, no, no hace falta
ddasd, y he tratado de tenerlo separado para que quede claro que no pertenece a la clase
mierda
eso ha sido un split
?
neosergio, ?
|
| neosergio |
parece que es del plugin de mibbit
|
| aruiz |
sigo?
:?
|
| neosergio |
todos los desconectados han estado usando mibbit
claro
|
| aruiz |
ah bien
ddasd, como decia
ddasd, en C#, por definicion, nada puede estar fuera de una clase
ddasd, por eso tienes metodos estaticos
ddasd, en Vala, dado que estamos hablando de GObject, esto es perfectamente posible
ddasd, lo he dejado asi por claridad, para que se vea claramente que main no es un metodo de ninguna \
clase
ddasd, recuerdo como me confundia ese hecho de Java y C# cuando empeze a aprender esos lenguajes
bueno
prosigo
a ver si consigo terminar pronto
:)
http://pastebin.valadoc.org/75.html
la clase 3
empezamos a hacer cosas mas interesantes
ahora tenemos una clase que tiene metodos y propiedades
en la linea numero 7
hemos declarado una propiedad llamada propiedad (que original yo) que es de lectura y escritura
sabemos que es de lectura y escritura pq tiene los metodos {get;set;}
esos son los metodos get, set estandard
podriamos definir otros metodos get, set, alternativos
por ejemplo...
http://pastebin.valadoc.org/76.html
si recargan la pagina
veran que he hecho una pequenha modificacion
#
private int _propiedad
#
public int propiedad {
#
get { return _propiedad }}
se me escapo un ; ahi
pero da igual
ahora la propiedad es de solo lectura
dado que solo tiene el metodo get
el valor real de la propiedad se encuentra en el miembro privado _propiedad
dense cuenta que _propiedad no es una propiedad estandard de GObject
sino un miembro de la estructura privada
de tipo int
basicamente un miembro es una propiedad sin metodos de escritura y lectura
pero no quiero entrar en muchos detalles al respecto
:)
|
| neosergio |
una pregunta aruiz
|
| aruiz |
adelante
|
| neosergio |
pregunta de xapiens: vala tiene roundtrip? de no tenerlo es posible pasar codigo c directo para q lo \
genere dentro del codigo \
generado?
|
| aruiz |
xapiens, que es roundtrip?
|
| xapiens |
vala -> c, c->vala <-- roundtrip
|
| aruiz |
jojojo, no no
xapiens, si quieres hacer c->vala tienes que generar un fichero .vapi, que viene a ser algo asi \
como un .h \
le dice a Vala como generar el codigo a C
lo normal, es generar un .vapi usando las herramientas de GObject-Introspection
y si la API no es GObject, como sqlite3 por ejemplo
el .vapi se genera a mano
pero ese es un tema muy complejo
no puedes poner codigo C directo dentro de vala
pero puedes compilar C y Vala juntos
valac fichero.vala fichero.c
tampoco quiero meterme en esos berenjenales
prosigo
http://pastebin.valadoc.org/75.html
volvemos al ejemplo original
|
| neosergio |
otra pregunta aruiz
|
| aruiz |
neosergio, adelante
:)
|
| neosergio |
pregunta de raster: Ha hablado de constructores, pero no de destructores. ¿Existen en Vala?
|
| aruiz |
existen los destructores en la ultima version de Vala
public Clase ~Destructor() {...}
pero a dia de hoy
y despues de dos anhos, no he tenido que usarlos
se usan normalmente cuando se utilizan objetos que no tienen contadores de referencia dentro de una \
clase
pero eso suele venir de APIs que no son de GNOME
lo cual es inusual
prosigo
http://pastebin.valadoc.org/75.html
volvemos al ejemplo original
neosergio, vamos a intentar pasar las preguntas que no esten relacionadas con los ejemplos para el \
final?
:)
asi avanzamos
y luego discutimos abiertamente
|
| neosergio |
perfecto
|
| aruiz |
bien, la Clase3
define una propiedad, y un metodo mostrar_propiedad, que no devuelve nada
pero muestra dicha propiedad por la salida de depuracion
el constructor de Clase3 asigna un valor por defecto a dicha propiedad
mas adelante, en el procedimiento principal
construimos un objeto de dicha clase
utilizamos el metodo
y escribimos un valor nuevo en la propiedad
objeto.propiedad = 5;
como vemos, no tenemos que usar metodos de ningun tipo
simplemente asignamos
esto lo que hace es llamar al metodo set; que hemos definido arriba
que como es el metodo set; por defecto, pues simplemente asigna el valor
luego volvemos a mostrar la propiedad
compilemos y ejecutemos el ejemplo
aruiz@dopamine:~/TutorialVala/02_Clases$ make Clase3
/usr/bin/valac Clase3.vala
aruiz@dopamine:~/TutorialVala/02_Clases$ ./Clase3
** (process:2411): DEBUG: Clase3.vala:11: 3
** (process:2411): DEBUG: Clase3.vala:11: 5
como vemos
obtenemos los valores antes y despues de cambiarlos
en este ejemplo creamos una clase base (ClaseBase)
con una propiedad y un metodo (basicamente igual que la Clase3)
y luego creamos una subclase, SubClase
como vemos, para heredar
simplemente ponemos el nombre de la clase base tras los dos puntos que van despues del nombre de la \
clase que queremos \
crear
public class SubClase : ClaseBase {
no hay mas ciencia
nos acabmos de ahorrar decenas de lineas de codigo en C
:)
creamos un constructor que modifica el valor por defecto de la propiedad, le asigna 4
compilemos y ejecutemos para ver el resultado
aruiz@dopamine:~/TutorialVala/02_Clases$ make Herencia1
/usr/bin/valac Herencia1.vala
aruiz@dopamine:~/TutorialVala/02_Clases$ ./Herencia1
** (process:2461): DEBUG: Herencia1.vala:13: Constructor base
** (process:2461): DEBUG: Herencia1.vala:21: Constructor de la subclase
** (process:2461): DEBUG: Herencia1.vala:9: 4
como vemos
se ejecuta el constructor base
y seguidamente
el constructor de la subclase
y luego el metodo mostrar_propiedad(), declarado en la clase base
muestra el valor, 4, que ha sido asignado en el constructor de la subclase
bueno, con esto termino con el capitulo 3
digo, capitulo 2
:)
llevo hora y media
|
| neosergio |
:)
|
| aruiz |
creo que voy a mostrar el ejemplo mas grafico del capitulo 3
y a acabar
que les parece?
alguien en contra?
:)
|
| neosergio |
no hay respuesta ante esa pregunta, prosigamos entonces :)
|
| aruiz |
http://pastebin.valadoc.org/79.html
bien
pasemos al directorio TutorialVala/03_Gtk
aqui la cosa se pone mas interesante
voy a pasar directamente a la clase SimpleApp2.vala
aqui estoy usando funciones de la libreria Gtk+
el espacio de nombres como comente en su momento, es Gtk
para ver que paquetes estan disponibles para Vala y su documentacion online
utilicen www.valadoc.org
el sitio no es perfecto, pero es bastante util
http://references.valadoc.org/gtk+-2.0.html
aqui estan las referencias del paquete gtk+-2.0
la nomenclatura de los paquetes sigue la nomenclatura dada por pkg-config
http://pastebin.valadoc.org/79.html
buen
bien
en ese ejemplo
vemos como heredamos de la clase Window
(en el ejemplo SimpleApp1.vala pongo direcciones de la referencia de la clase Window y sus \
propiedades en \
valadoc)
en el constructor, le asignamos el valor TOPLEVEL a la propiedad type
creamos una etiqueta
(aunque el comentario diga boton.... typo)
y mas adelante
vemos una cosa un poco extranha
delete_event += on_delete_event;
hum...
delete_event, es una senhal del objeto Gtk.Window
las senhales son objetos a los que se les peude conectar Callbacks
las Callbacks son funciones, cuyo prototipo esta definido por la senhal
por ejemplo
http://references.valadoc.org/gtk+-2.0/Gtk.Widget.delete_event.html
public signal bool delete_event (Event event);
esa senhal, pertenece a la clase Gtk.Widget
y tiene un parametro Gdk.Event
y devuelve un valor booleano
en la documentacion explica que valor debe devolver
pues bien
dicha senhal requiere una retrollamada, o Callback declarada de la siguiente manera
[Callback]
public bool on_delete_event (SimpleApp widget, Gdk.Event event) {...}
[Callback] es un atributo (algo asi como un decorador) de la funcion
basicamente le dice a Vala como debe usar los parametros (pasara la instancia del objeto donde se \
especifica por el parametro, gpointer \
data...)
pero ese tipo de detalles es mejor ignorarlos
:)
basicamente
lo que estamos haciendo aqui
es decirle al objeto, que cuando la senhal delete sea emitida
ejecute on_delete_event
bien....
compilemos el ejemplo
aruiz@dopamine:~/TutorialVala/03_Gtk$ valac SimpleApp2.vala
SimpleApp2.vala:1.7-1.9: error: The namespace name `Gtk' could not be found
using Gtk;
^^^
uhhhhh
que pasa aqui?
:)
bien, vala no detecta automaticamente que paquetes quieres usar
el espacio de nombres Gtk viene definido en el paquete gtk+-2.0
asi que hay que pasarle al compilador la lista de paquetes que queremos usar
con el parametro --pkg
/usr/bin/valac --pkg gtk+-2.0 SimpleApp2.vala
SimpleApp2.vala:32.6-32.34: warning: local variable `aplicacion' declared but never used
var aplicacion = new SimpleApp ();
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Compilation succeeded - 1 warning(s)
bien
si cerramos la ventana
(tras ejecutar ./SimpleApp2)
vemos como el programa termina, dado que la retrollamada, llama a la funcion que finaliza el bucle \
principal de \
Gtk
y bueno
con esto termina el tutorial
me hubiera gustado hacerlo mas corto
pero por IRC todo se hace mas lento la verdad
:)
podemos abrir el turno de preguntas
creo que ddasd tenia una pregunta sobre algo relacionado con los punteros
|
| neosergio |
bueno, ahora si la ronda de preguntas
|
| aruiz |
:)
|
| neosergio |
pregunta de ddasd: vala tiene una solución al problema de Vulnerabilidad al usar punteros en C?
|
| aruiz |
ddasd, puedes elaborar un poco a que problema te refieres?
(no creo que haga falta la moderacion ahora)
|
| ddasd |
es que he visto por todos lados, que al usar punteros el programa es poco seguro (en c)
|
| aruiz |
?
ddasd, bueno, no por usar punteros es inseguro
ddasd, es inseguro si se usan mal y sin cuidado
|
| ddasd |
=0
|
| aruiz |
ddasd, con Vala se disminuye el riesgo de cometer errores por un mal uso de punteros (normalmente, \
no se usan punteros de forma explicita en \
Vala)
|
| neosergio |
pregunta de raster: ¿Hay alguna diferencia entre definir una propiedad publica con y sin {get:set}? \
Yo, en las pruebas que hice, no lo puse y pude acceder a ellas sin problemas desde fuera de la \
clase. ¿Hay alguna ventaja en añadirlo, o se puede \
eliminar?
|
| aruiz |
si hay una diferencia
aunque dentro de Vala no es visible
cuando defines una propiedad publica sin get/set
basicamente estas anhadiendo un miembro a la estructura publica
lo que en C vendria a ser
objeto->propiedad = 5;
lo cual es bastante peligroso
porque impide cambiar el comportamiento del objeto en el futuro
mientras que una propiedad de GObject es distinta
tiene funciones de get/set y se identifica con una cadena
|
| raster |
Entendido. Gracias.
|
| aruiz |
raster, :-)
raster, lo contrario es valido para propiedades privadas
raster, no es nada practico definir propiedades privadas (get/set)
raster, ahi si quieres usar la notacion de miembro privado, dado que luego eso no es expuesto en la \
api \
publica
neosergio, mas preguntas?
|
| neosergio |
hasta el momento solo las de ddasd y raster
|
| ddasd |
sería una buena poder usar las referencias (bibliotecas) de Mono en Vala?
sería una buena idea poder usar las referencias (bibliotecas) de Mono en Vala?
perdon
|
| aruiz |
bueno, no creo que sea posible
vamos, directamente, no es posible
Mono/C# y Vala tienen una naturaleza totalmente distinta
Mono es una maquina virtual y Vala es un compilador de C# a C
lo unico que tienen en comun es el lenguaje
lo que si se puede hacer es portar ciertas cosas deC# a Vala con un esfuerzo relativamente bajo
|
| fmaq |
aruiz, la implementación de vala por lo que se menciona, no es completa, está vala en la \
actualidad listo par ser usado en projectos de mayor envergadura que pequeñas \
aplicaciones?
|
| aruiz |
pero Mono y Vala son dos mundos aparte
fmaq, si y no
:)
|
| fmaq |
aclarando pls
|
| aruiz |
fmaq, Vala el lenguaje y su compilador son bastante estable
estables*
fmaq, los bindings sin embargo aun no son del todo estables
fmaq, en Codethink utilizamos Vala para proyectos bastante grandes, y en general nos salva dolores \
de cabeza con respecto a utilizar C, ahorramos mucho \
tiempo
fmaq, pero de vez en cuando tenemos que arreglar bindings porque utilizamos funciones que no se \
habian probado antes \
fmaq, con cosas como Gio/Gtk+ no deberias tener ningun problema
|
| fmaq |
aruiz, en porcentaje cuanto se estima que es el faltante en materia de estabilidad?
|
| aruiz |
en septiembre sale la 1.0
el lenguaje sera perfectamente estable a partir de ahi
vala utiliza gobject-introspection para generar los bindings
|
| fmaq |
humm, eso es muy prometedor
|
| aruiz |
asi que en parte, la pregunta real seria, cuanto le hace falta a gobject-introspection para estar \
completo?
:)
no se
para cosas muy probadas como Gtk+ o Gio, poppler... Vala es perfectamente valido
y estable
para cosas nuevas como Clutter 1.0, es un poco mas complicado
|
| ddasd |
Gio que es?
|
| aruiz |
ddasd, gio, la libreria de acceso a ficheros de glib
|
| ddasd |
a ok
|
| neosergio |
alguien mas presente si desea hacer preguntas, haganlas de frente, recuerden ya no hay moderacion
|
| aruiz |
mas preguntas?
|
| neosergio |
vamos cerca de las 2 horas :)
|
| aruiz |
bueno, llevamos casi 2 horas aqui
jeje
si
si no hay mas preguntas yo me retiro
:)
|
| raster |
ok. Estuvo muy bien la charla
gracias
|
| aruiz |
:)
|
| neosergio |
bueno parece que ya no hay mas preguntas
|
| aruiz |
nada
bueno, echenle un ojo a los otros ejemplos
|
| ddasd |
en vala se puede hacer lo mismo que en c#
|
| neosergio |
Excelente Charla
|
| aruiz |
:)
|
| ddasd |
no importa
excelente charla
|
| aruiz |
ddasd, hablamos en otro rato, necesito desconectar un poco
:)
|
| diegoe |
aruiz, gracias :D
clap clap clap clap
|
| ddasd |
oks
|
| neosergio |
El log de la charla estara disponible en unos momentos en \
http://es.gnome.org/Eventos/CharlasIRC/CharlaAgosto2009
|
| aruiz |
diegoe, nada
|
| diega |
aruiz, muchas gracias, buena charla
|
| aruiz |
jeje
|
| ddasd |
me gusta Vala es mejor que C o C++
|
| diegoe |
frade, vas a tener que esforzarte! ;-)
|
| fmaq |
ok aruiz, muy buena charla
|
| aruiz |
me dejo bastantes cosas en el tintero en realidad
no descarto ahcer una segunda parte
:)
|
| fmaq |
no es mala idea
|
| ddasd |
=D
|
| neosergio |
es muy bueno que lo de las charlas de Gnome Hispano vuelvan, genial
|
| aruiz |
me alegro mucho que les haya gustado
y si hay cosas de los ejemplos que no hayan entendido o no han quedado claras, por favor, diganmelo
|
| fmaq |
ademas todo compiló ;)
|
| aruiz |
:)
jajaja
|
| neosergio |
:) genial aruiz
|