gpoo | bien Recomenzamos las charlas de programación en GTK+/GNOME las cuales tienen el interes de permitir a mas programadores acercarse a este mundo de programacion La charla de hoy sera glib basico donde se tocaran topicos como: tipos de datos, mensajes de salida, cadenas, temporizadores algunas indicaciones: La charla tiene una duracion de 1 hora las preguntas me las formulan a mi, para evitar distraer al expositor y yo les doy voz para que puedan plantearlo en la medida que el expositor me lo indique posteriormente habra 30 minutos de consultas las cuales seran libres sin moderacion si desean guardar los logs, no olviden dejar su cliente IRC en modo "Conference" para evitar que salgan los mensajes de entrada y salida de usuarios en Xchat se habilita con el boton "<" de abajo en la derecha sin mas que decir dejo con ustedes a Roberto Majadas, quien es coautor del libro GNOME http://libros.es.gnome.org/librognome/index.php adelante telemaco |
telemaco | Hola buenas noches o buenas tardes segun donde esten situados en el planeta ;) como bien ha dicho gpoo teneis en la ultima url un poco de documentacion que estamos desarrollado los chicos de gnome-hispano que aunque no esta terminada , nos va a ser muy utils para empezar , voy a hablar un poco de que es glib como una vision global y despues pasare a explicar conceptos basicos Glib es una libreria desarrollada para hacer la vida mas sencilla al desarrollador es ante todo es un libreria que ofrece a los desarrolladores una serie de ventajas es una libreria que es multiplataforma lo cual significa que podriamos usarla en gnu/linux , unix , bsd y no tendriamos que hacer un esfuerzo muy significativo para adaptarnos a ella es una libreria que ofrece una serie de tipos basicos y tipos asbtractos de datos que ya veremos mas adelante |
gpoo | <PeSa> glib es multiplataforma, cuales plataformas??? |
telemaco | hay una pregunta gnu/linux , unix , solaris , hpux , macosX y tambien funciona en windows ;) |
gpoo | <unimauro> Pordriamos utilizar aplicaiones de Glib en windows? |
telemaco | aunque esta mas probada en sistemas gnu/linux y unix si que se podria |
gpoo | <epplestun> que digan todas las soportadas por glib <epplestun> todas del tipo unix e incluso windows |
telemaco | de hecho he oido decir , es un rumor , que en la 2.2 se certifica su uso en win bueno , prosigo y otra caracteristica importantisima es GObject que es nuestra implementacion de un sistema de objetos que anteriormente estaba en gtk+ , lo cual no era muy beneficioso , porque a GNOME siempre le ha gustado que las cosas que vayan por debajo sean independientes de las X y de cualquier entorno grafico Luego tambien implementa cosas como manejo de hilos , de modulos dinamicos , gestion de pilas , colas , listas enlazadas , arboles , temporizadores .... vamos , todo lo que se suele usar a diario en la vida de un programador y que es muy molesto de implementar Hasta aqui alguna pregunta ? bueno pues sigo ahora vamos a empezar por lo mas basico de glib los tipos ---------- |
gpoo | telemaco, hay algunas preguntas |
telemaco | adelante |
gpoo | <PeSa> Gobject permite reflexion? |
--- gpoo fija modos [#gnome-hispano +v PeSa] | |
telemaco | PeSa: define reflexion ? no entiendo el termino PeSa: puedes hablar ahora :) |
PeSa | reflexion es si se puede indagar sobre el objeto osea puedo en tiempo de ejecucion saber que metodos usa un objeto y todo eso... en java seria Class... pues la clase Class |
telemaco | PeSa: mmm , pues nunca me lo habia planteado |
gpoo | es lo que usa el programa de Joaquin Cuenca capaz de tomar un programa GTK+/GNOME en proceso |
telemaco | me imagino que se podria rastrear la estrutura |
gpoo | lo "interroga" y genera un archivo XML de su interfaz todo en tiempo de ejecucion |
PeSa | he mirado el programa... pero el hace la reflexion a travez de una libreria que captura los datos osea que lo que se hace es espiar mensajes... pero no hay problema continuemos. |
gpoo | otra pregunta: |
telemaco | dime |
gpoo | <ekeko> GObjects, desde qué versión está fuera de gtk? |
telemaco | desde Gnome2 |
--- gpoo fija modos [#gnome-hispano -v PeSa] | |
gpoo | otra mas: <epplestun> una pregunta, glib es un acopele de C para gnome <epplestun> es decir retocado el C para programar sobre gnome ... |
telemaco | no , es una libreria que te permite hacer ciertas cosas de modo mas sencillo pero es ansi c de toda la vida algo mas ? |
gpoo | no, nada mas solo quiero mencionar que para no retrasar tanto la charla dejare un ronda breve en 25 minutos mas y luego el resto despues de terminada la charla pero envienme las consultas, que las voy apilando :-) |
telemaco | por mi ok |
gpoo | adelante telemaco |
telemaco | como decia , glib implementa una serie de tipos de datos que les va a resultar muy similares a los C estandar si mirais la tabla 4.1 de libro veis las tipos que implemeta glib Tipos Glib Tipos estándar C gchar char gint int gshort short glong long gfloat float gdouble double mmmm no me ha salido muy bonita sorry .) bueno , eso son dos columnas una es la de los tipos de glib y otra es la de los de C en realidad son los mismos , solo que tienen una g delante osea , si quieres trabajar con un char , pues tienes gchar si quieres trabajar con long , pues tienes glong .... la idea de crear estos tipos es para mejorar la protabilidad de las aplicaciones porque un double puede ser diferente entre dos plataformas luego , tambien se dispone de una serie de tipos , no tan conocidos por un programador de C que no haya visto nunca glib como puede ser gpointer ... que en realidad es un tipo de datos al que se le asocia un puntero guint ... que es un unsigned int de C , osea un entero sin signo que como podeis ver su labor es mejora entre otras cosas la legibilidad del codigo que has generado Otros tipos que son muy curiosos y de los cuales tenemos disponibilidad en glib son los tipos del tipo gint8 gint16 gint32 ... que sirven para cuando haces una aplicacion y quieres que en todas las plataformas en entero que has alojado en una variable tengan en mismo numero de bits pues con estos tipos tu podrias asegurarte este factor Y por ultimo , hay algunos tipos que no tienen equivalente en ansi C que son por ejemplo gboolean , que no es mas que un tipo de caracter booleano (VERDADERO/FALSO) y gsize , gssize que sirve para reprensetar tamaños en estructuras Y estos seria los tipos mas clasicos Aunque no se asusten , porque los que mas se usan son los tipicos que mapean a los de C gchar , gint , gdouble , gboolean .... ------------- Bueno ahora pasamos a los mensajes de salida Para empezar tenemos una funcion que es identica al "printf" de C estandar esta funcion es g_print g_print es una funcion que en uso es identica a printf osea g_print recive como parametros primero una cadena de texto en la cual se indica el texto que se quiere pasar por pantalla y despues los nombre de las variables separados por comas que interviene dentro del texto que deseemos pasar por pantalla ejemplo . #include <glib.h> int main (int argc, char *argv[]) { gint numero = 1; gchar *palabra="hola"; g_print ("glib te saluda : %s\nglib te dice un número : %d\n", palabra, numero); return 0; } Como podeis ver esto es un programa en C que hace que glin te salude y te diga un numero Lo cual me lleva a dos cosas , por ser el primer programa primero , para usar glib en un programa de c , hay que incluir la linea #include <glib.h> y segundo hay que pasarle al compliador la posicion de las librerias de glib lo ultimo ahora es muy sencillo , porque ahora disponemos de un programa llamado pkg-config que nos resuelve este tema asi que para compilar eso tendriamos que poner esto gcc `pkg-config --libs --cflags glib-2.0` ejemplo.c -o ejemplo y lo que haria el pkg-config seria decir al gcc que librerias debe usar y donde estan y donde estan de hecho si ejecuto a secas `pkg-config --libs --cflags glib-2.0` me saldria esto telemaco@lolita:~$ echo `pkg-config --libs --cflags glib-2.0` -I/opt/include/glib-2.0 -I/opt/lib/glib-2.0/include -L/opt/lib -lglib-2.0 veis lo que realmente hace ? bueno , con esto podreis compilar cualquier ejemplo de glib Continuando con el ejemplo primero tendriamos un variable que aloja un entero gint numero = 1; luego tendriamos un puntero a gchar que aloja una cadena gchar *palabra="hola"; y luego g_print se encargaria de generar la cadena glib te saluda : hola glib te dice un número : 1 --- esto seria lo que generaria el programa de ejemplo Una de las ventajas que tiene g_print es que es personalizable nosotros podriamos decir a g_print que cuando sea llamado imprima o retoque la cadena que le pasasemos esto lo podeis ver en el ejemplo 4.2 del libro y la funcion que hace esta maravilla es GPrintFunc g_print_set_handler (GPrintFunc función ); GPrintFunc g_print_set_handler (GPrintFunc función ); esta funcion permite que se le pase como parametros el nombre de una funcion que es la que usar para hacer la personalizacion si observais el ejemplo 4.2 , vereis lo sencillo que resulta hasta aqui alguna pregunta ? |
gpoo | su si tenemos algunas <epplestun> tengo una pregunta sobre el tema de tipo de datos, al final formulala por favor, en C el tratar strings es algo complicado, glib aporta alguna facilidad para ello? o se a de trabajar mediante matrices o punteros? |
telemaco | para trabajar con cadenas tenemos GString que hace muy sencillo en tratamiento de cadenas es lo siguiente que daremos algo mas ? |
gpoo | <epplestun> encuanto a eso <epplestun> parecido a lo que hace PHP? |
telemaco | pues es en plan cadena = g_string_new ("hola caracola , soy una cadena"); y luego tienes funciones para añadir , insertar , borrar ... luego lo veremos algo mas |
gpoo | otra mas <nahoo> que pasa si asignas a un gboolean un 5, por ejemplo <nahoo> daría un error como en Ada (por ejemplo) |
telemaco | pues , no creo que te dejara asignarle ese valor ya que solo acepta 1 ó 0 |
gpoo | <PiotR> pregunta: porque implementar Glib si ya esta Libc? |
telemaco | entonces si le pasases un 5 al compilar el gcc te diria que no es tipo compatible porque libc no implementa cosas que glib si |
gpoo | telemaco: una acotacion |
telemaco | ademas que hay de vez en cuando problemas portanto entre dos libc's de dos sistemas diferntes gpoo: si ? |
gpoo | en C, cualquier numero distinto de cero es verdadero asi que 5 es valido en el contexto de gboolean vamos a la siguiente: <|tuko|> Hola. Mi pregunta es: ¿por qué en el C estándar hay que utilizar unos includes dependiendo de la función que quieras usar, y en glib es suficiente con el include <glib.h>? |
telemaco | glib.h no es mas que un fichero cabecero que incluye varios cabeceros pero supongo que se puso asi , por esa misma razon porque te sale el codigo mas legible |
gpoo | la ultima, antes de la siguiente ronda <PeSa> glib tiene funciones para sockets??? |
telemaco | dentro de glib no , pero dispones de la liberia libgnet que esta basada en glib que si los maneja alog mas ? |
gpoo | <|tuko|> ¿significa eso q se incluyen todas las cabeceras independientemente de las funciones q llegues a usar? |
telemaco | en efecto glib.h es esto ----- #include <glib/galloca.h> #include <glib/garray.h> #include <glib/gasyncqueue.h> #include <glib/gbacktrace.h> #include <glib/gcache.h> #include <glib/gcompletion.h> #include <glib/gconvert.h> #include <glib/gdataset.h> #include <glib/gdate.h> #include <glib/gdir.h> .... .... sigo ? |
gpoo | adelante telemaco al final dejamos el resto de las preguntas |
telemaco | lo siguente que voy a exponer son funciones para cazar errores que implementa glib la primera es una de las mas utiles esta funcion es g_assert ( expresion ); esta funcion verifica que la expresion que hay dentro es cierta y si no lo fuera interrumpiria el programa ejemplo : si yo tuviera una funcion del tipo void transformo_cadenas (gchar *cadena) { g_assert (cadena != NULL); .... .... } pues lo que pasaria es que cuando usasemos esta funcion g_assert comprobaria si el contenido de la variable cadena esta llena si esta vacia , pues interrumpiria el programa esta funcion la encontrareis mucho , mucho , mucho en el codigo de GNOME porque es muy utils no creeis ;)) luego tambien disponeis de funciones para manejar la bitacora esta funciones nos para saber por donde van nuestros programas a traves de mandar mensajes a consola esto sirve para hacer lo tipico que hemos hecho todos de printf ("hola estoy en esta parte del programa\n"); ;DD pero de modo mas bonito tenemos principalmente 4 funciones g_message (...); g_warning (...); g_critical (...); g_error (...); g_message es una macro que emite un mensaje normal con la información que se le ha pasado como parámetro. La información que emite esta macro no tiene por que estar asociada a un error en el programa. Su principal aplicación es el envío de mensajes con la información que se crea conveniente en el proceso de realización del programa. g_warning emite un mensaje de aviso con la información que le ha sido pasada como parámetro. Esta información puede servir para ser avisados de situaciones peligrosas que se podrían dar en el programa. g_critical cumple la misma función que g_warning sólo que este además tiene la posibilidad de abortar el programa usando la función g_log_set_always_fatal(). g_error emite el mensaje que le haya sido pasado como argumento y además aborta irremediablemente la ejecución del programa. Esta macro se usa para obtener información de donde ha sucedido el error irrecuperable con la seguridad de que a causa de este error el programa terminara abortando su ejecución de todas maneras. ---- si observais el ejemplo 4.5 vereis como se usa alguna pregunta ? okis pues sigo |
gpoo | al final formulare las preguntas apiladas |
telemaco | lo siguiente que voy a dar son el tratamiento de cadenas en glib http://libros.es.gnome.org/librognome/librognome/librognome/glib-strings.html primero veremos algunas funciones para trabajar con el contenido de una cadena de texto y despues veremos el uso de GString Dentro de glib , disponemos de una serie de funciones que realizan diversas tareas sobre el contenido de una cadena y que ademas son las utiles para la vida diaria de un desarrollador para empezar tenemos unas funciones que duplican cadenas esta funciones son gchar * g_strdup (const gchar * cadena_para_duplicar ); y gchar * g_strndup (const gchar * cadena_para_duplicar , gsize longitud_maxima ); las dos reciven como parametros una cadena y la duplican como valor devuelto de la funcion la diferencia entre una y otra es que la segunda , g_strndup , se le puede especificar cual es la longitud maxima Tambien disponemos de funciones para verificar caracteres osea , funciones que sirven para responder preguntas como ¿esto es un caracter? ¿esto es un entero? ... esta funciones son g_ascii_isalnum es un caracter alfanumérico g_ascii_isalpha es un caracter del alfabeto g_ascii_iscntrl es un caracter de control g_ascii_isdigit es un dígito g_ascii_isgraph es un caracter imprimible y no es un espacio g_ascii_islower es una letra del alfabeto en minúscula g_ascii_isprint es un caracter imprimible g_ascii_ispunct es un caracter de puntuación g_ascii_isspace es un espacio g_ascii_isupper es una letra del alfabeto en mayúscula estas funciones las podeis ver en laa tabla 4.5 y como estas funciones podeis encontrar en el api unas cuantas mas |
* | telemaco buscando la pagina del api , para que lo veais |
telemaco | http://developer.gnome.org/doc/API/2.0/glib/glib-String-Utility-Functions.html en esta pagina podreis ver todas las funciones con las que podeis trabajar con el contenido de una cadena ----- Ahora vamos a ver GString GString , es un tipo abstrato de datos el cual se encarga de hacer mas facil el trabajo con cadenas El tipo GString es una estruntura que tiene esta forma struct GString { gchar *str; (1) gsize len; (2) gsize allocated_len; }; donde el puntero *str es la cadena que estamos almacenando y "len" su longitud pero esto a nosotros no nos importa demasiado a la hora de trabajar con GString Imaginemos que necesitamos alojar una cadena de text con GString solo tendriamos que usar la siguiente funcion GString * g_string_new (const gchar * cadena_inicial ); esta funcion recibe como parametro una cadena y devuelve un TAD GString con el que seguiremos trabajando cuando queramos modifica o trabajar con la cadena por ejemplo : #include <glib.h> main (){ GString *cadena ; cadena = g_string_new ("¡Qué fácil es hacer una cadena!"); g_print ("la cadena que hemos alojado : %s\n", cadena->str); g_print ("la longitud de la cadena es : %d\n", cadena->len); } con este programa , creariamos un Gstring y pasariamos sus datos por pantalla Y si nosotros quisieramos liberar una cadena de texto alojada usariamos esta funcion gchar * g_string_free (GString * cadena , gboolean liberar_contenido_cadena que nos permite liberar el GString --- Ahora que si nosotros quisieramos añadir texto a la cadena ya sea por delante o por detras usariamos esas funciones |
--- gnomero fija modos [#gnome-hispano +o telemaco] | |
--- gnomero fija modos [#gnome-hispano +o raciel] | |
--- raciel fija modos [#gnome-hispano -o raciel] | |
--- gnomero fija modos [#gnome-hispano +o telemaco] | |
gpoo | tenemos un problema con telemaco que se ha caido mientras esperamos que vuelva oh. volvio :-) parece que tiene serios problemas con el boton cerrar mientras, formulare algunas de las preguntas apiladas para ir respondiendolas y ganar tiempo <PeSa> Teniendo en cuenta la similitud de glib y nspr (netscape portable runtime), porque coexisten en el proyecto mozilla que es parte de gnome El proyecto Mozilla no es parte de GNOME existe interaccion entre ambos proyecto, pero Mozilla no es parte de GNOME <PeSa> http://www.gnome.org/projects/ <PeSa> en esa pagina se lista a mozilla alli se listan muchos proyectos relacionados con GNOME pero no son parte de GNOME o GNOME no tiene gran injerencia en su desarrollo <cyphra> Quería preguntar si existe en glib alguna facilidad para tablas hash, arboles B etc... efectivamente, glib provee el manejo para listas enlazadas, doblemente enlazadas, hashes, arboles las cuales se iran explicando en las charlas siguientes <epplestun> encuanto a lo de g_assert no hay algo parecido a isset o empty ?¿? funciones que lo hagan directamente como en PHP para verificar una variable, si es puntero como el caso mas problematico, se emplea la comparacion != NULL que es la que te indica si tiene algun valor o no en PHP puedes invocar variables sin haberlas definido, y es por eso que se necesita de isset, en C no es necesario |
telemaco | ya he vuelto siento la tardanza , pero el winmodem me ha tirado el sistema :) |
gpoo | telemaco, me encontraba respondiendo algunas preguntas en tu ausencia |
telemaco | termino con lo de GStrings ? |
gpoo | si adelante |
telemaco | pues como decia , si quisieramos añadir , insertar o borrar texto en un GStrinh pues como decia , si quisieramos añadir , insertar o borrar texto en un GString disponemos de estas funciones GString * g_string_append (GString * cadena , gchar * cadena_para_añadir_al_final ); GString * g_string_prepend (GString * cadena , gchar * cadena_para_añadir_al_principio ); GString * g_string_insert (GString * cadena , gssize posicion , gchar * cadena_para_insertar ); GString * g_string_erase (GString * cadena , gssize posicion , GString * numero_de_caracteres_que_desea_borrar ); que nos facilitaran enormemente la tarea de trabajar con GStrings s/GStrings/cadenas aparte , de estas disponemos de otras tantas , para añadir caracteres , añadir texto preformateado .... y con esto se acabaria lo de GStrings y creo que ya no sigo , porque llevo mucho :) no crees gpoo ? |
gpoo | ya estamoas pasados 30 minutos vamos a la ronda de preguntas que hay varias |
telemaco | ok |
gpoo | <PeSa> glib maneja espreciones regulares para gstring? como perl? |
telemaco | no gstring se encarga de alojar una cadena y hacer mas facil su tratamiento no obstantate en libc tienes funciones para hacer eso y en glib hay implementados funciones para analizadores lexicos y alguna cosa mas |
gpoo | la siguiente: <wildfire> una pregunta se pone solo el glib.h porque esta libreria por medio ifincludes elige que sub librerias elegir? |
telemaco | se pone solo glib.h , porque ahi estan incluidos los demas cabeceros que componen la funcion |
gpoo | <Kakutsi> ¿hay alguna manera de modificar la forma en que g_assert interrumpe el programa? |
telemaco | osea que cuando incluyes glib.h , incluyes todos los cabeceros creo que si que la habia creo que g_assert es personalizable |
gpoo | <Kakutsi> para despues: ¿que es "allocated_len" en la estructura GString? |
--- kiwnix es ahora conocido como kiwnix_sleep | |
telemaco | pero no estoy seguro , ahora lo estoy mirando ahora te respondo allocate_len es la memoria fisica que tiene gchar *str len es la longitud de la cadena |
gpoo | <epplestun> galeon si es parte de gnome no?¿ |
telemaco | pues no g_assert no es personalizable creo que forma parte de gnome-office o del fith-toe pero en cualquier lugar yo creo que todos pensamos que si es parte de GNOME ;) |
gpoo | <bit0> ¿algún objeto para manejar listas estáticas? |
--- gpoo fija modos [#gnome-hispano +v bit0] | |
telemaco | para que quieres manejar una lista estatica ? |
bit0 | cad = g_new0(gchar,10); for (i=0;i<20;i++) { sprintf(cad,"%d",i); lista=g_list_append(lista,cad);} g_free(cad); |
telemaco | una lista estatica es un array |
bit0 | quiero hacer eso |
telemaco | y no te vale una lista dinamica para eso ? |
bit0 | daría 19, 19,19,19,19,19 |
telemaco | no tiene porque como que da 19 , 19 , 19 si vas añadiendo al final o al principio te da lo que quieras es hacer una lista dinamica e ir añadiendo los datos a la cola de esa lista |
bit0 | GList es una lista de punteros |
telemaco | aahh |
bit0 | lo que estoy buscando es una lista de gchar* o GString o ... |
telemaco | no , no te pillo |
gpoo | bit0: con GList lo puedes hacer solo hay que hacerlo de la forma correcta :-) |
telemaco | y con GList no puedes ? |
bit0 | pero si reasignas el puntero, ... cambia el valor, lógicamente |
gpoo | que luego te podemos explicar, porque GList es parte de lo que viene la proxima semana |
bit0 | bien, espero entonces gracias |
gpoo | y asi no cofundimos a los novatos |
telemaco | mas preguntas ? |
--- gpoo fija modos [#gnome-hispano -v bit0] | |
gpoo | <unimauro> aun tengo problemitas para compliar gcc , cuando lo hago me dice que pkg-config -libs -cflags glib-2.0: No existe el fichero o el directorio |
--- gpoo fija modos [#gnome-hispano +v unimauro] | |
telemaco | unimauro: tienes gnome2 ? |
unimauro | si |
telemaco | para compilar tienes que tener gnome2 y los paquetes con los cabeceros de las funciones osea , los paquetes -dev y el pkg-config |
unimauro | bueno algo no entendi de esa parte de lacompilacion |
telemaco | y ademas es pkg-config --libs --cflags glib-2.0 |
unimauro | si si puse eso en la terminal |
telemaco | con dos guiones en libs , cflags |
unimauro | pero de alli me salia que no habia encontrado los archivos |
unimauro unixOZ | |
gpoo | unimauro: entonces te falta instalar el paquete pkg-config |
unimauro | ok |
telemaco | algo mas ? |
unimauro | gracia ahora mismo lo pruebo |
unimauro unixOZ | |
unimauro | la proxima charla se complatara los temas de glib? |
gpoo | un comentario: <epplestun> una sugerencia <epplestun> par alos novatoses muybuieno como es mi caso <gpoo> adelante <epplestun> usar un IDE tipo anjuta facilita mucho la vida al incluir librerias <epplestun> en vez de andar en la linea de comandos para el k no sepa <epplestun> en la parte de configuracion del compilador |
unimauro unixOZ | |
--- gpoo fija modos [#gnome-hispano -v unimauro] | |
gpoo | unimauro: si la ultima pregunta al parecer: <Kakutsi> y entonces, g_assert, como termina los programas, los mata y ya esta, o da informacion sobre donde ocurrio el fallo y ese tipo de cosas? |
telemaco | los mata y te dice donde los ha matado y que condicion no ha cumplido y creo que la linea y la funcion donde estaba el g_assert |
gpoo | alguna pregunta mas? |
telemaco | epplestun: tienes razon , pero no se si anjuta tiene soporte para gnome2 |
gpoo | telemaco: si lo tiene, aunque no esta transparente como gnome1.4 antes de finalizar recordarles que en el libro GNOME se encuentra el capitulo de Glib bastante avanzado (sino completo) donde podeis practicar la semana siguiente se retomara Glib |
telemaco | y que ademas nos teneis aqui casi todo el dia para ayudaros en lo que querais |
gpoo | comenzando con temporizadores, estructuras de datos, sockets |
telemaco | y tenemos listas de correo |
gpoo | tenemos pregunta: <epplestun> una pregunta <epplestun> donde se puede comprar el fabuloso libro ese :) |
telemaco | epplestun: todavia no se puede comprar porque no esta terminado |
gpoo | epplestun: se encuentra en linea en http://libros.es.gnome.org/librognome/index.php |
telemaco | epplestun: pero este es esa url |
--- gpoo fija modos [#gnome-hispano -m] | |
gpoo | pues bien brindemosle un aplauso a telemaco que nos ha introducido en el mundo de glib |
epplestun | plas plas plas |
gpoo | y nos vemos el proximo domingo |
epplestun | mu bien :) |
Kakutsi | plas,plas,plas |
epplestun | congratilations :) |
nahoo | xD |