<?xml version="1.0" encoding="utf-8" ?>

<rss version="2.0" 
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:admin="http://webns.net/mvcb/"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
   xmlns:wfw="http://wellformedweb.org/CommentAPI/"
   xmlns:content="http://purl.org/rss/1.0/modules/content/"
   >
<channel>
    <title>Novanebula blog - Articulos programación</title>
    <link>http://www.novanebula.net/blog/</link>
    <description>Noticias</description>
    <dc:language>es</dc:language>
    <generator>Serendipity 1.2.1 - http://www.s9y.org/</generator>
    <pubDate>Mon, 13 Oct 2008 17:51:00 GMT</pubDate>

    <image>
        <url>http://www.novanebula.net/blog/templates/default/img/s9y_banner_small.png</url>
        <title>RSS: Novanebula blog - Articulos programación - Noticias</title>
        <link>http://www.novanebula.net/blog/</link>
        <width>100</width>
        <height>21</height>
    </image>

<item>
    <title>El cache de Smarty</title>
    <link>http://www.novanebula.net/blog/archives/105-El-cache-de-Smarty.html</link>
            <category>Articulos programación</category>
    
    <comments>http://www.novanebula.net/blog/archives/105-El-cache-de-Smarty.html#comments</comments>
    <wfw:comment>http://www.novanebula.net/blog/wfwcomment.php?cid=105</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.novanebula.net/blog/rss.php?version=2.0&amp;type=comments&amp;cid=105</wfw:commentRss>
    

    <author>nospam@example.com (Abraham Covelo)</author>
    <content:encoded>
    Smarty es un sistema de plantillas diseñado para acelerar la presentación de las páginas html. Para poder emplear la cache simplemente debes instalar smarty en tu frameword de desarrollo e introducir las siguientes líneas:&lt;br /&gt;
&lt;br /&gt;
$plantilla = new Smarty;&lt;br /&gt;
$plantilla-&gt;caching = 1; //Activa la cache&lt;br /&gt;
$plantilla-&gt;display(&#039;planilla.tpl&#039;); //El fichero planilla.tpl debe contener la planilla a devolver&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También es posible llamar a&lt;br /&gt;
&lt;br /&gt;
$html = $plantilla-&gt;fetch(&#039;planilla.tpl&#039;);&lt;br /&gt;
&lt;br /&gt;
Para no volcar al navegador el html y tenerlo almacenado en la variable $html.&lt;br /&gt;
&lt;br /&gt;
Antes de llamar a display o a fetch podemos modificar el comportamiento del sistema de caché de smarty&lt;br /&gt;
&lt;br /&gt;
Por ejemplo:&lt;br /&gt;
&lt;br /&gt;
$plantilla-&gt;cache_dir = &#039;/tmp/smarty/&#039;;&lt;br /&gt;
&lt;br /&gt;
Grabará las planillas cacheadas en este directorio (smarty cachea el contenido en disco por defecto)&lt;br /&gt;
&lt;br /&gt;
$plantilla-&gt;cache_lifetime = 300;&lt;br /&gt;
&lt;br /&gt;
El contenido permanece en cache 5 minutos (300 segundos) antes de ser reemplazado. El valor por defecto es una hora.&lt;br /&gt;
&lt;br /&gt;
$plantilla-&gt;compile_check = true; &lt;br /&gt;
&lt;br /&gt;
Verifica si la plantilla ha sido actualizada desde la última vez que se regeneró la caché. Introduce una pequeña sobrecarga al tener que averiguar y comparar la fecha de modificación de la plantilla.&lt;br /&gt;
&lt;br /&gt;
$plantilla-&gt;force_compile = true;&lt;br /&gt;
&lt;br /&gt;
Siempre regenerará la cache&lt;br /&gt;
&lt;br /&gt;
$plantilla-&gt;is_cached(&#039;plantilla.tpl&#039;);&lt;br /&gt;
&lt;br /&gt;
Detecta si una plantilla está en el cache o no.&lt;br /&gt;
&lt;br /&gt;
$plantilla-&gt;assign(&#039;variable&#039;,$var);&lt;br /&gt;
&lt;br /&gt;
La plantilla puede ahora leer la variable $var, con el nombre {variable} generando así contenido realmente dinámico&lt;br /&gt;
&lt;br /&gt;
$plantilla-&gt;clear_cache(&#039;plantilla.tpl&#039;);&lt;br /&gt;
&lt;br /&gt;
Elimina la cache para esta plantilla&lt;br /&gt;
&lt;br /&gt;
$plantilla-&gt;clear_all_cache();&lt;br /&gt;
&lt;br /&gt;
Elimina todas las caches (en el directorio de cache)&lt;br /&gt;
&lt;br /&gt;
Es posible eliminar el cache por grupos de plantillas. Estos grupos de plantillas se pueden definir de la siguiente manera:&lt;br /&gt;
&lt;br /&gt;
$plantilla-&gt;display(&#039;index.tpl&#039;,&#039;sports|basketball&#039;);&lt;br /&gt;
&lt;br /&gt;
Y entonces borrar la caché del grupo sports|basketball así:&lt;br /&gt;
&lt;br /&gt;
$smarty-&gt;clear_cache(null,&#039;sports|basketball&#039;);&lt;br /&gt;
&lt;br /&gt;
o borrar sólo el index.tpl del grupo sports|basketball así:&lt;br /&gt;
&lt;br /&gt;
$smarty-&gt;clear_cache(&#039;index.tpl&#039;,&#039;sports|basketball&#039;);&lt;br /&gt;
&lt;br /&gt;
Funcionando como una especie de espacio de nombres&lt;br /&gt;
&lt;br /&gt;
Es posible introducir contenido no cacheable dentro de una plantilla cacheada utilizando {insert}.&lt;br /&gt;
&lt;br /&gt;
{insert} funciona de una manera idéntica a {include} con la particularidad de su comportamiento ante el cache.&lt;br /&gt;
&lt;br /&gt;
Veamos como funciona con un ejemplo&lt;br /&gt;
&lt;br /&gt;
{insert name=&quot;obtenerPublicidad&quot; localizacion=#banner_location_id# id=#site_id#}&lt;br /&gt;
&lt;br /&gt;
Lo que hará a continuación smarty será llamar a la funcion insert_obtenerPublicidad, que debes tener definida en tu código, pasandole como argumento un array asociativo.&lt;br /&gt;
&lt;br /&gt;
Suponiendo que #banner_location_id# valga 5 y #site_id# valga 8. Se ejecutará:&lt;br /&gt;
&lt;br /&gt;
insert_obtenerPublicidad(array(&#039;localizacion&#039;= &amp;gt; &#039;5&#039; , &#039;id&#039;= &amp;gt &#039;8&#039;));&lt;br /&gt;
&lt;br /&gt;
y lo que devuelva esta función será añadido en la plantilla.&lt;br /&gt;
&lt;br /&gt;
Para saber más sobre &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/www.smarty.net/manual/es/caching.php&#039;);&quot;  href=&quot;http://www.smarty.net/manual/es/caching.php&quot;&gt;smarty y su sistema de cache&lt;/a&gt; visita su página oficial.&lt;br /&gt;
&lt;br /&gt;
Otros métodos para acelerar tu servidor web a otros niveles son &lt;a href=&quot;http://www.novanebula.net/blog/archives/94-Memcache.html&quot;&gt;memcache&lt;/a&gt;, &lt;a href=&quot;http://www.novanebula.net/blog/archives/102-XCache.html&quot;&gt;x-cache&lt;/a&gt; o apc.&lt;br /&gt;
&lt;br /&gt;
 
    </content:encoded>

    <pubDate>Mon, 13 Oct 2008 19:51:00 +0200</pubDate>
    <guid isPermaLink="false">http://www.novanebula.net/blog/archives/105-guid.html</guid>
    
</item>
<item>
    <title>¿Como medir la complejidad?</title>
    <link>http://www.novanebula.net/blog/archives/22-Como-medir-la-complejidad.html</link>
            <category>Articulos programación</category>
    
    <comments>http://www.novanebula.net/blog/archives/22-Como-medir-la-complejidad.html#comments</comments>
    <wfw:comment>http://www.novanebula.net/blog/wfwcomment.php?cid=22</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.novanebula.net/blog/rss.php?version=2.0&amp;type=comments&amp;cid=22</wfw:commentRss>
    

    <author>nospam@example.com (Abraham Covelo)</author>
    <content:encoded>
    &amp;#160;&amp;#160;&amp;#160;&amp;#160;Con este pequeño artículo trataré de explicar como es posible medir la complejidad de algo, computacionalmente hablando. Aunque ciertamente estas ideas podrían ser utilizadas en otras muchas ramas en donde se presenta un problema que debemos resolver y la eficiencia de su resolución (en tiempo) sea un parámetro importante.&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;La resolución práctica de un problema computacional exige por una parte un algoritmo o método de resolución y por otra un programa o codificación (implementación) de ese algoritmo en un ordenador real. El algoritmo es esencial a diferencia de la codificación que puede convertirse en anecdótica, aunque lo más normal es que no lo sea, a fin de cuentas los bugs están en la implementación y no en el algoritmo.&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;A efectos prácticos además hay que tomar en consideración la cantidad de recursos, tanto de tiempo como de memoria que la implementación de un algoritmo puede precisar. Este suele depender del tamaño del problema pues el algoritmo y la implementación se deban adaptar a diferentes parámetros de entrada, por ejemplo, no es lo mismo ordenar alfabéticamente un array con nombres para un tamaño de array de 100 que para otro de tamaño 100.000 tanto en tiempo como en memoria empleada. El concepto exacto que mide el tamaño del problema depende de la lógica del mismo y es por lo tanto imposible dar una regla para  su medición.&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Aunque el tamaño en memoria que una implementación pueda ocupar debe ser tomado en consideración esto ha dejado de ser problemático debido al aumento de la capacidad de memoria de los equipos y aunque puede parecer que a la capacidad de cálculo le pasa lo misma esto no es así. Y es &lt;strong&gt;un error común pensar que la optimización del código pueda ser dejada de lado&lt;/strong&gt; confiando en la potencia de cálculo de nuestros equipos o de equipos futuros. Es pues el tiempo de ejecución el principal baremo a tener en cuenta a la hora de diseñar un algoritmo o afirmar que un algoritmo es &quot;mejor&quot; que otro.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;&lt;a href=&quot;http://www.novanebula.net/blog/archives/22-Como-medir-la-complejidad.html#extended&quot;&gt;Continua leyendo &quot;¿Como medir la complejidad?&quot;&lt;/a&gt;
    </content:encoded>

    <pubDate>Wed, 05 Mar 2008 23:31:00 +0100</pubDate>
    <guid isPermaLink="false">http://www.novanebula.net/blog/archives/22-guid.html</guid>
    
</item>
<item>
    <title>IPC: Sockets</title>
    <link>http://www.novanebula.net/blog/archives/37-IPC-Sockets.html</link>
            <category>Articulos programación</category>
    
    <comments>http://www.novanebula.net/blog/archives/37-IPC-Sockets.html#comments</comments>
    <wfw:comment>http://www.novanebula.net/blog/wfwcomment.php?cid=37</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.novanebula.net/blog/rss.php?version=2.0&amp;type=comments&amp;cid=37</wfw:commentRss>
    

    <author>nospam@example.com (Abraham Covelo)</author>
    <content:encoded>
    &amp;#160;&amp;#160;&amp;#160;&amp;#160;Los sockets son una abstraccion que nos proporciona un estructura de direccionamiento y un conjunto de protocolos utilizado para la comunicacion entre procesos. Estos procesos pueden estar en la misma maquina (dominio local) o en distintas maquinas (dominios de internet).&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Los tipos de sockets definen las propiedades de la comunicación que estarán disponibles para la aplicación. Los procesos solamente pueden comunicarse mediante sockets del mismo tipo. Existen 5 tipos diferentes:&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Stream socket - comunicación en dos sentidos, secuenciada y segura (SOCK_STREAM). En el dominio de internet utiliza el protocolo TCP (similar a una conversación telefónica)&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Datagram socket - comunicación en dos sentidos, no asegura la secuencialidad de los mensajes enviados (un mensaje que ha sido enviado después de otro puede llegar antes que este) y tampoco es segura (el equipo de origen no sabe si el mensaje ha alcanzado su objetivo o no) (SOCK_DGRAM). En el dominio de internet utiliza UDP (similar al envío y recepción de correos)&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Secuencial packet socket - comunicación en dos sentidos, secuenciada y segura para datagramas de tamaño fijo (SOCK_SEQPACKET). No existe protocolo en internet que implemente este tipo de socket.&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Raw socket - Proporciona acceso a la capa de comunicaciones.&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Los sockets son orientados a datagramas pero sus características exactas dependen del interfaz proporcionado por el protocolo.&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;La utilidad de conocer y poder realizar aplicaciones que utilizen sockets es indiscutible. Si deseas comunicar tu aplicación con otras aplicaciones en otras maquinas o incluso dentro de tu maquina mismo debes conocer a utilizar los sockets.&lt;br /&gt;
 
    </content:encoded>

    <pubDate>Wed, 07 Mar 2007 00:48:00 +0100</pubDate>
    <guid isPermaLink="false">http://www.novanebula.net/blog/archives/37-guid.html</guid>
    
</item>
<item>
    <title>GTK, desarrollo de interfaces graficas (II)</title>
    <link>http://www.novanebula.net/blog/archives/36-GTK,-desarrollo-de-interfaces-graficas-II.html</link>
            <category>Articulos programación</category>
    
    <comments>http://www.novanebula.net/blog/archives/36-GTK,-desarrollo-de-interfaces-graficas-II.html#comments</comments>
    <wfw:comment>http://www.novanebula.net/blog/wfwcomment.php?cid=36</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.novanebula.net/blog/rss.php?version=2.0&amp;type=comments&amp;cid=36</wfw:commentRss>
    

    <author>nospam@example.com (Abraham Covelo)</author>
    <content:encoded>
    &amp;#160;&amp;#160;&amp;#160;&amp;#160;Para poder ahondar en la programación de interfaces gráficas con GTK es necesario tener un buen conocimiento de todos los objetos que podemos crear, sus características y todos las señales/eventos ante las cuales pueden reaccionar. Esta lista es muy extensa y únicamente te remito a la &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/developer.gnome.org/doc/API/2.0/gtk/index.html&#039;);&quot;  href=&quot;http://developer.gnome.org/doc/API/2.0/gtk/index.html&quot;&gt;referencia de GTK2&lt;/a&gt; para que puedas consultarlo segun tus necesidades.&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Sin embargo hay muchas mas características de las librerías que necesitamos conocer para realizar aplicaciones mas completas. Hare un pequeño resumen algunas de estas funciones.&lt;br /&gt;
&lt;br /&gt;
boolean gtk_init_check(&amp;argc, &amp;argv)&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Te permite verificar antes de ejecutar gtk_init que se va poder inizializar sin problemas GTK, es decir que la llamada a gtk_init no fallara.&lt;br /&gt;
&lt;br /&gt;
g_signal_handler_disconnect( gpointer object, gulong id);&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Elimina el registro de un determinado evento en tu aplicación. g_signal_connect y g_signal_connect_swapped retornan el valor id que se debe utilizar en esta función como parámetro.&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Tambien puedes deshabilitar y habilitar el registro de un evento utilizando estas funciones&lt;br /&gt;
&lt;br /&gt;
g_signal_handler_block (gpointer object, gulong id);&lt;br /&gt;
&lt;br /&gt;
g_signal_handler_block_by_func (gpointer object, GCallback func, gpointer data);&lt;br /&gt;
&lt;br /&gt;
g_signal_handler_unblock (gpointer object, gulong id);&lt;br /&gt;
&lt;br /&gt;
g_signal_handler_unblock_by_func (gpointer object, GCallback func, gpointer data);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Para poder modificar el titulo de una ventana, suponiendo que window es una ventana:&lt;br /&gt;
&lt;br /&gt;
gtk_window_set_title (GTK_WINDOW (window), &quot;Nuevo titulo&quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Creacion de una caja (elemento invisible que puede contener varios objetos)&lt;br /&gt;
&lt;br /&gt;
GtkWidget &lt;strong&gt;box;&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;box es ahora un objeto&lt;br /&gt;
&lt;br /&gt;
box = gtk_hbox_new (FALSE,0);&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;box es ahora una objeto tipo caja horizontal, los objetos que contendrá se colocaran uno al lado del otro de izquierda a derecha o a la inversa segun los parámetros que se le pasen o:&lt;br /&gt;
&lt;br /&gt;
gtk_vbox_new (FALSE,0);&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;La caja vertical con los objetos uno encima del otro, de arriba a abajo o a la inversa.&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Siendo window un objeto ventana incluimos la caja en la ventana como siempre con:&lt;br /&gt;
&lt;br /&gt;
gtk_container_add(GTK_CONTAINER (window,box);&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;ahora creamos y asignamos las señales a los objetos que deseamos añadir a la caja cuando tengamos listo CADA objeto ejecutamos esto&lt;br /&gt;
&lt;br /&gt;
gtk_box_pack_start (GTK_BOX(box), button, TRUE, TRUE, 0);&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;suponindo que button es un objeto claro y:&lt;br /&gt;
&lt;br /&gt;
gtk_widget_show(button);&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Atencion: Podemos reutilizar la variable button después de esto para definir otros objetos.&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Finalmente ejecutamos &lt;br /&gt;
&lt;br /&gt;
gtk_windget_show(box);&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;y&lt;br /&gt;
&lt;br /&gt;
gtk_widget_show(window);&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Aqui tenemos un ejemplo completo:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;br /&gt;
#include &lt;gtk/gtk.h&gt;&lt;br /&gt;
&lt;br /&gt;
/&lt;/strong&gt; Our new improved callback.  The data passed to this function&lt;br /&gt;
 &lt;strong&gt; is printed to stdout. &lt;/strong&gt;/&lt;br /&gt;
static void callback( GtkWidget &lt;strong&gt;widget,&lt;br /&gt;
                      gpointer   data )&lt;br /&gt;
{&lt;br /&gt;
    g_print (&quot;Hello again - %s was pressed\n&quot;, (gchar &lt;/strong&gt;) data);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/&lt;strong&gt; another callback &lt;/strong&gt;/&lt;br /&gt;
static gboolean delete_event( GtkWidget *widget,&lt;br /&gt;
                              GdkEvent  *event,&lt;br /&gt;
                              gpointer   data )&lt;br /&gt;
{&lt;br /&gt;
    gtk_main_quit ();&lt;br /&gt;
    return FALSE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main( int   argc,&lt;br /&gt;
          char &lt;strong&gt;argv[] )&lt;br /&gt;
{&lt;br /&gt;
    /&lt;/strong&gt; GtkWidget is the storage type for widgets */&lt;br /&gt;
    GtkWidget *window;&lt;br /&gt;
    GtkWidget *button;&lt;br /&gt;
    GtkWidget &lt;strong&gt;box1;&lt;br /&gt;
&lt;br /&gt;
    /&lt;/strong&gt; This is called in all GTK applications. Arguments are parsed&lt;br /&gt;
     &lt;strong&gt; from the command line and are returned to the application. &lt;/strong&gt;/&lt;br /&gt;
    gtk_init (&amp;argc, &amp;argv);&lt;br /&gt;
&lt;br /&gt;
    /&lt;strong&gt; Create a new window &lt;/strong&gt;/&lt;br /&gt;
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);&lt;br /&gt;
&lt;br /&gt;
    /&lt;strong&gt; This is a new call, which just sets the title of our&lt;br /&gt;
     &lt;/strong&gt; new window to &quot;Hello Buttons!&quot; &lt;strong&gt;/&lt;br /&gt;
    gtk_window_set_title (GTK_WINDOW (window), &quot;Hello Buttons!&quot;);&lt;br /&gt;
&lt;br /&gt;
    /&lt;/strong&gt; Here we just set a handler for delete_event that immediately&lt;br /&gt;
     &lt;strong&gt; exits GTK. &lt;/strong&gt;/&lt;br /&gt;
    g_signal_connect (G_OBJECT (window), &quot;delete_event&quot;,&lt;br /&gt;
        G_CALLBACK (delete_event), NULL);&lt;br /&gt;
&lt;br /&gt;
    /&lt;strong&gt; Sets the border width of the window. &lt;/strong&gt;/&lt;br /&gt;
    gtk_container_set_border_width (GTK_CONTAINER (window), 10);&lt;br /&gt;
&lt;br /&gt;
    /&lt;strong&gt; We create a box to pack widgets into.  This is described in detail&lt;br /&gt;
     &lt;/strong&gt; in the &quot;packing&quot; section. The box is not really visible, it&lt;br /&gt;
     &lt;strong&gt; is just used as a tool to arrange widgets. &lt;/strong&gt;/&lt;br /&gt;
    box1 = gtk_hbox_new (FALSE, 0);&lt;br /&gt;
&lt;br /&gt;
    /&lt;strong&gt; Put the box into the main window. &lt;/strong&gt;/&lt;br /&gt;
    gtk_container_add (GTK_CONTAINER (window), box1);&lt;br /&gt;
&lt;br /&gt;
    /&lt;strong&gt; Creates a new button with the label &quot;Button 1&quot;. &lt;/strong&gt;/&lt;br /&gt;
    button = gtk_button_new_with_label (&quot;Button 1&quot;);&lt;br /&gt;
    &lt;br /&gt;
    /&lt;strong&gt; Now when the button is clicked, we call the &quot;callback&quot; function&lt;br /&gt;
     &lt;/strong&gt; with a pointer to &quot;button 1&quot; as its argument &lt;strong&gt;/&lt;br /&gt;
    g_signal_connect (G_OBJECT (button), &quot;clicked&quot;,&lt;br /&gt;
        G_CALLBACK (callback), (gpointer) &quot;button 1&quot;);&lt;br /&gt;
&lt;br /&gt;
    /&lt;/strong&gt; Instead of gtk_container_add, we pack this button into the invisible&lt;br /&gt;
     &lt;strong&gt; box, which has been packed into the window. &lt;/strong&gt;/&lt;br /&gt;
    gtk_box_pack_start (GTK_BOX(box1), button, TRUE, TRUE, 0);&lt;br /&gt;
&lt;br /&gt;
    /&lt;strong&gt; Always remember this step, this tells GTK that our preparation for&lt;br /&gt;
     &lt;/strong&gt; this button is complete, and it can now be displayed. &lt;strong&gt;/&lt;br /&gt;
    gtk_widget_show (button);&lt;br /&gt;
&lt;br /&gt;
    /&lt;/strong&gt; Do these same steps again to create a second button &lt;strong&gt;/&lt;br /&gt;
    button = gtk_button_new_with_label (&quot;Button 2&quot;);&lt;br /&gt;
&lt;br /&gt;
    /&lt;/strong&gt; Call the same callback function with a different argument,&lt;br /&gt;
     &lt;strong&gt; passing a pointer to &quot;button 2&quot; instead. &lt;/strong&gt;/&lt;br /&gt;
    g_signal_connect (G_OBJECT (button), &quot;clicked&quot;,&lt;br /&gt;
        G_CALLBACK (callback), (gpointer) &quot;button 2&quot;);&lt;br /&gt;
&lt;br /&gt;
    gtk_box_pack_start(GTK_BOX (box1), button, TRUE, TRUE, 0);&lt;br /&gt;
&lt;br /&gt;
    /&lt;strong&gt; The order in which we show the buttons is not really important, but I&lt;br /&gt;
     &lt;/strong&gt; recommend showing the window last, so it all pops up at once. &lt;strong&gt;/&lt;br /&gt;
    gtk_widget_show (button);&lt;br /&gt;
&lt;br /&gt;
    gtk_widget_show (box1);&lt;br /&gt;
&lt;br /&gt;
    gtk_widget_show (window);&lt;br /&gt;
    &lt;br /&gt;
    /&lt;/strong&gt; Rest in gtk_main and wait for the fun to begin! */&lt;br /&gt;
    gtk_main ();&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Nos vemos ... 
    </content:encoded>

    <pubDate>Tue, 25 Jul 2006 00:03:00 +0200</pubDate>
    <guid isPermaLink="false">http://www.novanebula.net/blog/archives/36-guid.html</guid>
    
</item>
<item>
    <title>GTK, desarrollo de interfaces graficas (I)</title>
    <link>http://www.novanebula.net/blog/archives/35-GTK,-desarrollo-de-interfaces-graficas-I.html</link>
            <category>Articulos programación</category>
    
    <comments>http://www.novanebula.net/blog/archives/35-GTK,-desarrollo-de-interfaces-graficas-I.html#comments</comments>
    <wfw:comment>http://www.novanebula.net/blog/wfwcomment.php?cid=35</wfw:comment>

    <slash:comments>2</slash:comments>
    <wfw:commentRss>http://www.novanebula.net/blog/rss.php?version=2.0&amp;type=comments&amp;cid=35</wfw:commentRss>
    

    <author>nospam@example.com (Abraham Covelo)</author>
    <content:encoded>
    &amp;#160;&amp;#160;&amp;#160;&amp;#160;Este tutorial se basa en el que esta disponible en la pagina oficial de la GTK. Esta dedicado a la versión 2 de GTK+ que es la mas actual en el momento que escribo este mensaje (si lees esto después del 2010 no te olvides de actualizar tus conocimientos).&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Bueno para todos aquellos que nunca han programado en entorno gráfico les dedico el siguiente párrafo.&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Los sistemas gráficos están plagados de ventanas con botones, menús, imágenes, barras de scroll y demas objetos (en GTK todos estos elementos se llaman widgets -traduccion cacharro, atilugio. Si, utilizare el termino ingles o la termino objeto) que pueden ser activados/utilizados en cualquier momento. Para poder tratar estos elementos GTK (y otros sistemas para la creación de interfaces gráficas) utiliza un sistema basados en señales/eventos que llaman a funciones que son los que realizan el comportamiento asociado a cada objeto (widget).&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Basicamente una aplicacion grafica en GTK inizializa el sistema, crea cada uno de los objetos&lt;br /&gt;
que requiere la aplicacion (ventanas, botones, etc), asigna los eventos asociados a cada objeto, los muestra por pantalla y deja la aplicacion es estado de espera a la llegada de cada uno de esos eventos (tambien llamados señales aunque no tienen relacion alguna con el sistema de señales de Unix).&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Veamos un ejemplo sencillo&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;br /&gt;
#include &lt;gtk&gt;&lt;br /&gt;
&lt;br /&gt;
static void hello( GtkWidget *widget, gpointer   data )&lt;br /&gt;
{&lt;br /&gt;
   g_print (&quot;¡Hola mundo!\n&quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static gboolean delete_event(GtkWidget *widget, GdkEvent  *event, gpointer   data )&lt;br /&gt;
{&lt;br /&gt;
   g_print (&quot;Evento de borrado detectado\n&quot;);&lt;br /&gt;
   return TRUE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static void destroy(GtkWidget *widget, gpointer data)&lt;br /&gt;
{&lt;br /&gt;
   gtk_main_quit ();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main( int   argc, char *argv[] )&lt;br /&gt;
{&lt;br /&gt;
   GtkWidget *window;&lt;br /&gt;
   GtkWidget *button;&lt;br /&gt;
  &lt;br /&gt;
   gtk_init (&amp;argc, &amp;argv);&lt;br /&gt;
  &lt;br /&gt;
   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);&lt;br /&gt;
&lt;br /&gt;
   g_signal_connect (G_OBJECT (window), &quot;delete_event&quot;, G_CALLBACK (delete_event), NULL);&lt;br /&gt;
&lt;br /&gt;
   g_signal_connect (G_OBJECT (window), &quot;destroy&quot;, G_CALLBACK (destroy), NULL);&lt;br /&gt;
&lt;br /&gt;
   gtk_container_set_border_width (GTK_CONTAINER (window), 10);&lt;br /&gt;
&lt;br /&gt;
   button = gtk_button_new_with_label (&quot;Hello World&quot;);&lt;br /&gt;
&lt;br /&gt;
   g_signal_connect (G_OBJECT (button), &quot;clicked&quot;, G_CALLBACK (hello), NULL);&lt;br /&gt;
&lt;br /&gt;
   g_signal_connect_swapped (G_OBJECT (button), &quot;clicked&quot;, G_CALLBACK (gtk_widget_destroy), G_OBJECT (window));&lt;br /&gt;
&lt;br /&gt;
   gtk_container_add (GTK_CONTAINER (window), button);&lt;br /&gt;
&lt;br /&gt;
   gtk_widget_show (button);&lt;br /&gt;
&lt;br /&gt;
   gtk_widget_show (window);&lt;br /&gt;
&lt;br /&gt;
   gtk_main ();&lt;br /&gt;
  &lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Para compilarlo en linux con gcc instalado ejecuta esto en una shell. Debes tener instaladas las librerias GTK+-2.0&lt;br /&gt;
&lt;br /&gt;
# gcc hello_world.c `pkg-config --cflags --libs gtk+-2.0`&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Con el sistema X en ejecucion puedes ver tu aplicacion ejecutando:&lt;br /&gt;
&lt;br /&gt;
#./a.out&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;pkg-config es una herramienta que sirve para localizar los directorios donde estan situados las librerias y los archivos necesarios para la compilacion.&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;El programa define 4 funciones, 3 de ellas hello, delete_event y destroy son las funciones que se llamaran cuando se dispare un evento dentro de nuestra ventana. Main es la cuarta funcion. Dentro de ella se crean los objetos (ventana y boton), se inicializa el sistema (con gtk_init). GtkWidget declara las variables como objetos (widgets). gtk_window_new y gtk_button_new_with_label crean la ventana y el boton respectivamente.&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Las funciones g_signal_connect y g_signal_connect_swapped registran cada uno de los eventos que deseemos implementar e informan de cual es la funcion que se ejecutara en cada caso.&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Ademas debemos incluir el boton dentro de la ventana con:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;br /&gt;
gtk_container_add (GTK_CONTAINER (window), button);&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Finalmente se muestra los objetos utilizando gtk_widget_show&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;br /&gt;
gtk_widget_show (button);&lt;br /&gt;
&lt;br /&gt;
gtk_widget_show (window);&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;La aplicacion queda a la espera de los eventos con la linea&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;gtk_main ();&lt;/blockquote&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Las señales que se registran son las siguientes&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;g_signal_connect (G_OBJECT (window), &quot;delete_event&quot;, G_CALLBACK (delete_event), NULL);&lt;/blockquote&gt;&lt;br /&gt;
&lt;br /&gt;
delete_event (ventana) -- Se dispara cuando intentamos cerrar la ventana utilizando los controles que estan en la barra de titulo de la ventana (o el botón x de la esquina derecha o en el menú la opción cerrar). En nuestro programa se ejecuta la función &quot;delete_event&quot; que simplemente imprime en consola &quot;Evento de borrado detectado&quot;. En la función delete_event el return TRUE; informa que el evento no precisa llamar a otras funciones para completar su funcionalidad. &lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;El sistema GTK tiene una implementación por defecto para cada una de las señales/eventos que detecta. Si deseamos que ejecute su implementación por defecto tenemos que o bien no registrar en nuestro programa la señal o si lo hacemos debemos hacer que la función asignada a la señal devuelva TRUE para indicar que no deseamos ejecutar la implementación por defecto. FALSE en caso contrario.&lt;br /&gt;
&lt;br /&gt;
destroy (ventana) -- Se llama cuando se destruye el objeto, en nuestro caso la ventana. La función asociada ejecuta simplemente un:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;gtk_main_quit ();&lt;/blockquote&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;que termina la ejecucion de espera de gtk_main ();&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;clicked (botón) -- Se ejecuta cuando se hace clic sobre el botón (obviamente) llama a la function  hello que imprime el mensaje hola mundo por consola y ademas llama a la función &lt;span style=&quot;font-style:italic;&quot;&gt;gtk_widget_destroy&lt;/span&gt; de la ventana y no del boton, por eso utilizamos la funcion &lt;span style=&quot;font-style:italic;&quot;&gt;g_signal_connect_swapped&lt;/span&gt; en lugar de &lt;span style=&quot;font-style:italic;&quot;&gt;g_signal_connect&lt;/span&gt; ya que el objeto sobre el que actua el evento no es el mismo que el que lo recibe.&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;La función &lt;span style=&quot;font-style:italic;&quot;&gt;gtk_widget_destroy&lt;/span&gt; destruye el objeto ventana y emite la señal &quot;destroy&quot; que llama a nuestra función destroy que a su vez llama a  gtk_main_quit (); que termina la ejecución del gtk_main(); en la función main.&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Bueno a partir de aquí y con alguna &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/developer.gnome.org/doc/API/2.0/gtk/ch01.html&#039;);&quot;  href=&quot;http://developer.gnome.org/doc/API/2.0/gtk/ch01.html&quot;&gt;documentacion de referencia sobre los objetos y los eventos que tenemos a nuestra disposición&lt;/a&gt; ya podemos empezar a crear nuestras propias pequeñas aplicaciones.&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Animo y en breve seguire con la saga...&lt;br /&gt;
 
    </content:encoded>

    <pubDate>Mon, 24 Jul 2006 00:36:00 +0200</pubDate>
    <guid isPermaLink="false">http://www.novanebula.net/blog/archives/35-guid.html</guid>
    
</item>
<item>
    <title>GTK, desarrollo de interfaces graficas - Presentacion</title>
    <link>http://www.novanebula.net/blog/archives/34-GTK,-desarrollo-de-interfaces-graficas-Presentacion.html</link>
            <category>Articulos programación</category>
    
    <comments>http://www.novanebula.net/blog/archives/34-GTK,-desarrollo-de-interfaces-graficas-Presentacion.html#comments</comments>
    <wfw:comment>http://www.novanebula.net/blog/wfwcomment.php?cid=34</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.novanebula.net/blog/rss.php?version=2.0&amp;type=comments&amp;cid=34</wfw:commentRss>
    

    <author>nospam@example.com (Abraham Covelo)</author>
    <content:encoded>
    &amp;#160;&amp;#160;&amp;#160;&amp;#160;Bueno este interesante proyecto de libreria grafica de codigo abierto te permite desarrollar interfaces en una buena cantidad de lenguages entre los que se incluyen C/C++, perl y python aunque hay muchos mas como por ejemplo el php o C#. El siguiente enlace contine una &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/www.gtk.org/bindings.html&#039;);&quot;  href=&quot;http://www.gtk.org/bindings.html&quot;&gt;lista completa de lenguajes soportados por GTK&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Su licencia es la LGPL ya que es un proyecto de la GNU (estos chicos son increíbles :D, no os olvideis de llamar GNU/Linux al sistema operativo y Linux al kernel que tiene). En principio GTK se diseño para el desarrollo de aplicaciones/plugins para el GIMP de hay la G que aparece en su nombre (GTK - GIMP toolkit).&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Ademas de para el GIMP GTK es utilizado por una gran cantidad de proyectos, sobre todo para aplicaciones a ejecutar en GNOME, si quieres saber de que es capaz mira una &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/www.gnomefiles.org/&#039;);&quot;  href=&quot;http://www.gnomefiles.org/&quot;&gt;lista de proyectos que utilizan GTK&lt;/a&gt;. Aunque GTK también puede desarrollar aplicaciones gráficas para otros sistemas operativos (MAC, Windows ...) e interfaces graficas (como KDE).&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;Bueno seguro que estas deseando aprenderlo todo (¡pues vete al siguiente post! ¡a que esperas!). 
    </content:encoded>

    <pubDate>Sun, 23 Jul 2006 00:26:00 +0200</pubDate>
    <guid isPermaLink="false">http://www.novanebula.net/blog/archives/34-guid.html</guid>
    
</item>

</channel>
</rss>