Thanks to visit codestin.com
Credit goes to corecode.wordpress.com

Feeds:
Posts
Comments

Archive for the ‘Gtk’ Category

How many time mates?

Nesse post vou mostrar como criar o mais simples plugin no Rhythmbox. Vou narrar meu passo a passo nessa odisseia.

Tudo começa no lastfm, alguns de vocês  talvez saibam o que é isso. O Lastfm é um site, rede social para amantes de música. Nele você tem seus amigos, vizinhos que são listados com base no grau de afinidade musical e claro tem uma lista com as músicas e bandas que você mais ouve, está ouvindo ou já ouviu. O Rhythmbox atual já vem com um plugin do lastfm que quando você ativa pode marcar as suas músicas favoritas e ter uma lista de bandas similares, etc.  Todo esse plugin foi feito claro com a API do  last  que se encontra totalmente disponível para que você brinque. Mas o ponto não é usar a API do lastfm e sim usar alguém que já usa este recurso. “Como assim Kirotawa?”. Vou explicar, existem inúmeros recursos oferecidos por terceiros no last um deles é adicionar gráficos das bandas mais ouvidas por nomes ou gênero. Veja esse exemplo abaixo:

O que estes recursos fazem é calcular através do seu login do lastfm  os estilos musicais que mais gosta (a imagem acima) e criar um link para uma imagem com o gráfico. Feito isso tudo que você tem a fazer é copiar o link e adicionar no seu perfil e páh! Esta feito.

Agora vamos entender o que o meu simples plugin faz, quais os recursos que eu usei e como ele funciona. O site que gera a imagem que vai pro meu plugin é esse aqui sivy.net. Este site gera uma imagem, neste caso, com a capa dos cds dos artistas que mais escuto, o top 10. Gerando um link que se posto no lastfm mostra a imagem.  Até aqui tudo bem. O problema é que este site cobra para ficar atualizando, ou seja, se você quer que a imagem mude sempre você terá de pagar ou ficar atualizando na mão. Eu até sou a favor de pagar, mas sou liso e queria que a minha imagem se atualizasse sem eu ter que pagar. Como eu sabia exatamente como fazer isso, crawleando o site e pegando o link e depois só teria que injetar no lastfm, bem, não deu muito certo. Primeiro tentei fazer isso usando o GAE  (google app engine) como intermediário, mas graças ao tempo que o sky.net leva para gerar a imagem, mais de 5/10 segundos, o GAE me xinga e não resolve o meu problema, pois dá time expired.  Usei o urllib open, depois o urlfetch do próprio GAE e nadas! Foi então que desisti de fazer um webcrawler pra por a imagem atualizada no meu lastfm =/ e pensei – horas bolas porque não tacar isso no rhythmbox. Foi o que fiz. Mas antes vou descrever tudo que fiz, alguns passos devem ser inúteis, mas eu precisava testar cada um deles, eu simplesmente gosto de ver como as coisas funfam ;).

Passos.:
1) Usei uma bazuka para matar uma mosca. Como o sky.net faz post dos dados eu precisava saber o que tanto ele passava para poder preencher o form do jeito certo. Para descobrir isso eu apelei ao wireshark um sniffer que me mostra todos os dados que estão sendo passados por post. Bastou usar esse filtro: http.request.method == “POST”. Assim eu pude ver tudo que era necessário a ser passado no form e páh, só precisei nomear as variáveis e preencher elas em um dicionário.

values =
    {
     'nick':'kirotawa','type':2,'period':'3month','count':10, 'align':1,
     'font':20,'font_zoom':100,'generate':'Generate', 'colortext':'0;0;0',
     'colorbackground':'255;255;255'
    }

2) Criar o webcrawler usando o urlopen e o BeautifulSoup. Deem uma lida neste blog e vão saber do que estou falando.

3) Com o link para a imagem eu só precisei salvá-la ou usar o link e carregar ela no pixbuf do gdk (como eu já testei e deu paw quando tento carregar ela via url no pixbuf eu preferi salvá-la).  A mágica para fazer ela, a imagem, ser sempre atualizada com minha lista, é gerar  uma nova imagem sempre que entro no rhythmbox pela primeira vez. “Como você fez isso?”. Usei a força, joguei a imagem salva na pasta /tmp e pronto :P. Ele só gera uma vez a cada entrada no rhythmbox pela primeira vez após login. Porém isso tem um custo, um preço caro. Como disse antes o sivy.net é lento, logo a resposta pro urllib é lenta, logo o rhythmbox fica ? LENTO, isso se não trava. Pesquisando achei algo falando de um tal de rb.get_url, mas a documentação do rhythmbox é pobre e não me ajudou muito, por isso o plugin vai ficar lento por enquanto até que eu descubra como esse trem (get_url) funciona. Afinal eu preciso passar tudo via post, recuperar o html todo e filtrar só minha IMAGE_URL.

Finalizando, o plugin não é lá essas coisas, é o mais simples e burro, mas tive de revisar tanta coisa e estudar outras (GAE, urllib, BeautifulSoup, gtk, gdk ) que valeu muito a pena. Segue abaixo o código do meu plugin :P.


import os
import urllib
import urllib2
from BeautifulSoup import BeautifulSoup
from gi.repository import GdkPixbuf, GObject, RB, Peas, Gtk, Gdk

IMAGE_PATH = "/tmp/top10.jpeg"

class Load(object):
    ''' Class load and make the low level that is necessary '''

    url = "http://lastfm.sivy.net/?do=albumForm-submit"

    values = {
        'nick':'login_here','type':2,'period':'3month','count':10, 'align':1,
        'font':20,'font_zoom':100,'generate':'Generate', 'colortext':'0;0;0',
        'colorbackground':'255;255;255'
    }

    def __init__(self):

        data = urllib.urlencode(self.values)
        request = urllib2.Request(self.url, data)

        response = urllib2.urlopen(request)
        document = response.read()
        soup = BeautifulSoup(document)

        image = soup.find('textarea').contents[0]
        image = image.split('[img]')[1].split('[/img]')[0]

        file_image = open(IMAGE_PATH,'wb')
        file_image.write(urllib.urlopen(image).read())
        file_image.close()

class Top10Plugin(GObject.Object, Peas.Activatable):
    object = GObject.property(type=GObject.GObject)

    def __init__(self):
        super(Top10Plugin, self).__init__()

        if not os.path.exists(IMAGE_PATH):
            Load()

    def do_activate(self):
        shell = self.object
        self.image = Gtk.Image()
        self.pixbuf = GdkPixbuf.Pixbuf.new_from_file (IMAGE_PATH)
        self.image.set_from_pixbuf(self.pixbuf) # , 175, 328)

        self.container = Gtk.VBox ()
        self.container.pack_start (self.image, True, True, 6)

        shell.add_widget(self.container, RB.ShellUILocation.RIGHT_SIDEBAR, False, True)
        self.container.show_all()

    def do_deactivate(self):
        shell = self.object
        shell.remove_widget(self.container, RB.ShellUILocation.RIGHT_SIDEBAR)
        self.image = None
        self.pixbuf = None
        self.container = None

O que faz o plugin…

Read Full Post »

Hoje em dia não é  mais novidade que o futuro dos desktop sejam a web, a computação nas nuvens anda mudando tudo de lugar cada vez mais,  e você descobre, vasculhando por ai, que quase tudo tem um pé na web. Um bom exemplo é o Qt com seu QML, mas calma, não quer dizer que você usa QML pra criar sites, quer dizer que você usa um pé da web no QML. A linguagem (se é que posso chamar assim) declarativa do Qt (QML) é baseada na sintaxe dos objetos em  JavaScript (lembram do JSON?) . Além disso, é possível, por exemplo, usar o QtWebKit e criar uma aplicação com JavaScript +  HTML e QML (além de Python e C++). Mas vamos deixar o Qt de lado, afinal o assunto aqui é o Gtk, mais precisamente Gtk  + JavaScript.

Vasculhando pela web por uma forma de criar aplicações em JavaScript no linux, e lançá-las no desktop, esbarrei com o Seed. Seed, é um binding (wrapper) do JavaScript usando WebKit e GObject para rodar aplicações no linux, mas precisamente no gnome, já que o projeto é mantido por um cara de lá. Mas, por que raios você iria usar JavaScript aquela linguagem tosca que usam em sites para criar aplicações Desktop; e como raios é esse bicho, JavaScript + Gtk?  Pelo que li a grande vantagem de se usar esse binding do JavaScript é o de poder integrar com as diversas libs do projeto gnome, quando falo diversas me refiro a; GLib, GTK, GIO, Gstreamer, Clutter, GObject, etc. Logo de cara você percebe que a integração é larga, mas não bastasse isso criar aplicações em Seed (JavaScript) + Gtk, por exemplo, é muito mais barato (computacionalmente falando) do que criar aplicações em PyGtk, e menos complicado do que criar com C puro (ansi C) e Gtk.
Para vocês não dizerem que estou inventando coisas aqui vai um código exemplo de como criar uma aplicação ‘Hello World’  com Seed + Gtk.

CODE

#!/usr/bin/env seed

Gtk = imports.gi.Gtk;
Gtk.init(null, null);

var window = new Gtk.Window({title:"Core Code Teste"});
window.signal.hide.connect(Gtk.main_quit);
var button = new Gtk.Button({label: "click me"});

button.signal.clicked.connect(function(w) {
        Seed.print("Hello World =D");
});
window.add(button);
window.show_all();

Gtk.main();

Viu, fácil né?! Agora observe bem e lembre-se, qual é uma das melhores características que o JavaScript possui? Se você não lembra eu vou te ajudar, aquela coisa de função anônima dentro de função, lembrou? É isso mesmo, os closures. Essa é uma das vantagens, também, de se usar Seed para construir suas aplicações, você vai poder abusar dos closures, e claro, da sua prática em JavaScript. Pra você que achava que ia morrer programando JQuery e JavaScript pra web, que tal se aventurar no mundo do desktop com Gtk, clutter,Gio, Glib…etc. Afinal, segundo os criadores desse binding esse foi um dos propósitos do projeto, atrair desenvolvedores web/JavaScript par ao ambiente Gnome.
Finalizando, para instalar o seed no ubuntu basta usar a força: sudo apt-get install seed =P.
Que a força esteja com vocês padawans!!

Referências

[1] http://developer.gnome.org/seed/stable/

[2] http://live.gnome.org/Seed/Tutorial

Read Full Post »

Nesse post irei mostrar como criar uma aplicação em PHP-GTK compilada usando o bcompiler no linux (ubuntu 8.04).  A fonte para o tutorial de instalação do bcompiler é o  artigo do Patrick Mendes no site do PHP-GTK Brasil.

Instalando o bcompiler no seu ubuntu 8.04

kirotawa@xxx:~$wget -c http://pecl.php.net/get/bcompiler-0.8.tgz
kirotawa@xxx:~$tar -xzvf bcompiler-0.8.tgz
kirotawa@xxx:~$cd bcompiler-0.8
kirotawa@xxx:~$phpize
kirotawa@xxx:~$./configure
kirotawa@xxx:~$make
kirotawa@xxx:~$make install
kirotawa@xxx:~$echo ‘extension=bcompiler.so’ >> /etc/php5/cli/php.ini

Lembre-se de um detalhe o comando make install deve ser realizado como root.  Para não haver nenhum problema faça tudo como root, só pra garantir.

Agora que você instalou o bcompiler é hora de usar ele.  Antes vamos criar uma aplicação simples em PHP-GTK.

CODE

<?php

  $janela = new GtkWindow();
  $janela->set_default_size(100,50);
  $janela->set_title("Janela Compilada");
  $Label = new GtkLabel("Nome");
  $Nome = new GtkEntry();
  $Botao = new GtkButton("_OK",true);
  $box = new GtkHbox();

  $box->add($Label);
  $box->add($Nome);
  $box->add($Botao);
  $janela->add($box);

  $Botao->connect_simple('clicked','fExibeTexto',$Nome );

  $janela->show_all();
  $janela->connect_simple('destroy', array('gtk', 'main_quit'));
  function fExibeTexto($campotexto)
  {
    $texto = $campotexto-> get_text();
    $dialog = new GtkMessageDialog(null, Gtk::DIALOG_MODAL,
    gtk::MESSAGE_WARNING, Gtk::BUTTONS_OK, $texto );
    $dialog->run();
    $dialog->destroy();
  }

   Gtk::main();
?>

O código acima é só pra explicar. O que ele faz é criar uma janela com um GtkLabel, GtkButton e um GtkEntry. Quando o botão é pressionado abre-se um GtkMessageDialog com o conteudo do GtkEntry.
Agora vamos a parte que realmente interessa. Criar a tal  aplicação compilada.  Criamos um arquivo com o seguinte contéudo:

CODE

<?php
     $arq = fopen("janela.phb", "w");//Cria o arquivo que conterá  o bytecode
     bcompiler_write_header($arq); //Escreve a parte do cabeçalho do arquivo bcompiler.
     bcompiler_write_file($arq, "teste1.php"); //Essa função lê o arquivo que você quer gera o     bytecode e escreve no arquivo recem criado
     bcompiler_write_footer($arq); //Escreve o caracter \x00 para indicar o Fim dos dados compilados.
     fclose($arq); //Fecha o arquivo
?>

Agora que temos o códio para nossa aplicação, e temos o código que vai gerar a aplicação compilada. é só digitar:

kirotawa@xxx:~$php bcompilerteste.php

Ele vai gerar o arquivo janela.phb. Para executar essa janela você pode digitar:

kirotawa@xxx:~$php janela.phb

Ou fazer o que eu fiz setar que os arquivos .phb devem ser abertos com o php. Pronto agora você pode proteger as suas aplicações em PHP-GTK.  Para saber mais dá uma conferida nas referências abaixo.

Referências

Artigo do Patrick Mendes
Wbly/Emilio
XoopsCube

Read Full Post »

Três vezes GTK

Há muito tempo atrás quando mal conhecia o que eram GUI’s, comecei a estudar algo chamado Tk, mas precisamente Tcl/Tk. Comecei a estudar esta linguagem quando vi que o aMSN era todo feito nela. Minha ambição era criar um aMSN ou melhora-lo (hehe), mas infelizmente faculdade rouba nosso tempo, tempo no qual poderia-mos está aprendendo sozinho, mas temos que tirar a nota X pra poder passar, etc. Mas o que raios esse papo tem haver com GTk? Acho que nada, foi só pra introduzir o artigo (hehe), mas espere! Tem sim haver, estamos falando de GUIS, e assim como Tk GTK é uma Biblioteca para criar aplicações gráficas. Ao contrário do que aconteceu com meus estudos em Tcl/Tk, com relação a GTK eu fui adiante e hoje estudo três linguagens diferentes que fazem uso desta mesma biblioteca, dai vem o título deste artigo e também o assunto do mesmo.

Neste artigo pretendo apresentar a todos a biblioteca GTK usada no gnome das distribuições linux. Também pretendo mostrar três linguagens que fazem uso desta biblioteca, e deixar que você escolha a mais poderosa, a mais fácil ou a que você sabe, para que você crie suas aplicações gráficas utilizando GTK.

Antes de falar dessas três linguagens vamos dá uma olhada no histórico da biblioteca GTK.

GTK quer dizer Gnome tool kit, e é usado inteiramente no gnome. Um dos aplicativos gráficos mais famosos do mundo open source, o gimp, possui sua parte gráfica toda feita em GTK. Além de ser fácil de aprender, esta biblioteca é muiltiplataforma, logo você vai poder criar aplicações unix ou win32. Mas como criar tais aplicações e quais as três linguagens que você disse que fazem uso da GTK? São elas PHP-GTK2, C e Python, isso claro sem citar tantas outras que também fazem uso da GTK.

Agora é a hora da verdade, vou mostrar três exemplos de codigos diferentes nestas três linguages e vocês escolhem em qual delas deseja começar a programar usando GTK.

Em C

#include <gtk/gtk.h>

static void destroy( GtkWidget *widget,
                     gpointer   data );

int main( int   argc,
          char *argv[] )
{
    GtkWidget *window ,*label;

    gtk_init (&argc, &argv);
    //Cria a janela e a ponhe no topo
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    //Da um tamanho a janela
    gtk_window_set_default_size(GTK_WINDOW (window),300,200);
    //Da um titulo a janela
    gtk_window_set_title(GTK_WINDOW (window),"Ola mundo");

    //Cria o label com a frase Ola mundo :P!
    label = gtk_label_new("Ola Mundo :P!");
    //Adiciona o label a janela
    gtk_container_add(GTK_CONTAINER (window), label);
    //Adiciona a funcao destroy para fechar a janela
    g_signal_connect (G_OBJECT (window), "destroy",
		      G_CALLBACK (destroy), NULL);

    //Diz pra mostrar todos os widgets da janela
    gtk_widget_show_all (window);
    //loop do gtk
    gtk_main ();

    return 0;
}
//Funcao pra quando clicar no x da janela ela fechar
static void destroy( GtkWidget *widget,
                     gpointer   data )
{
    gtk_main_quit ();
}

Achou em C complicado? Então que tal em PHP-Gtk2.

PHP-Gtk2

<?php

$wnd = new GtkWindow();
$wnd->set_title('Olá mundo');
$wnd->set_size_request(300,200);
$wnd->connect_simple('destroy', array('gtk', 'main_quit'));

$label_ola= new GtkLabel("Olá Mundo :P!'");
$wnd->add($label_ola);

$wnd->show_all();
Gtk::main();
?>

Se ainda assim você achou difícil ou não gostou de PHP-Gtk2, então tenta ai no python.

Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import pygtk
pygtk.require( '2.0' )
import gtk

def main():
	window = gtk.Window(gtk.WINDOW_TOPLEVEL)
	window.set_title( "Ola Mundo" )
	window.set_size_request(300,200)
	window.connect('destroy',gtk.main_quit)

	label = gtk.Label(' Ola Mundo :P!' )
	window.add(label)

	window.show_all()

	gtk.main()

if __name__ == '__main__':
	main()

E ai está os três códigos fazem a mesma coisa, mostram uma janela com um label dizendo “ola mundo”. Agora se você não conhece nenhuma dessas linguagens ou não gosta delas há outras opções para você, eis a lista de linguagens que fazem uso da Gtk:

C++  	gtkmm
C# 	Gtk#
Java 	java-gnome
Python 	PyGTK
Perl 	gtk2-perl
R 	RGtk2
Guile 	guile-gnome
Ruby 	Ruby-GNOME2
PHP 	PHP-GTK
Ada 	GtkAda
OCaml 	LablGTK
Haskell Gtk2Hs
Lua 	lua-gtk
S-Lang 	SLgtk 	      

Viu quantas possibilidades você tem. Até aquela linguagem verborratica e chata que começa com J usa o Gtk. E além disso você pode usar o Glade que é uma ferramenta onde você pode construir sua interface gráfica sem digitar código, apenas fazendo uso do projeto que o Glade gera e utilizando um parser. Mas essa historia fica para uma próxima oportunidade. A quem desejar aprender mais sobre Gtk, dêem uma olhada nas referências ou se liguem aqui no Core Code que em breve vou criar um tutorial de C gtk, pygtk e claro php-gtk2 com o uso do glade e sem o uso do glade.

Referências

http://www.gtk.org/

http://library.gnome.org/devel/gtk-tutorial/stable/c24.html

www.php-gtk.com.br

gtk.php.net

www.kksou.com/

www.pygtk.org/

Read Full Post »

Design a site like this with WordPress.com
Get started