sexta-feira, 27 de novembro de 2009

Notificações do Gnome - Usando LibNotify no Python

De alguns tempos para cá, o Gnome vem utilizando um sistema centralizado de notificações, chamado Galago Project. Este sistema é um conjunto de APIs, UIs e um mecanismo que permite que aplicativos, serviços, plugins ou qualquer outro processo possam notificar o usuário sobre alguma coisa que valha a pena ser notificada.

O sistema consiste de um daemon de notificação, API chamada LibNotify, um cliente que implementa essa API na forma de um executável, um sistema baseado no DBus, para juntar tudo, e finalmente bindings para várias linguagens (até o momento, sei de bindings para Python, Ruby e C/C++).

A maneira mais simples de fazer uma notificação é utilizando o comando notify-send (que pode ser instalado no Ubuntu com o comando sudo aptitude install libnotify-bin), como mostra a imagem abaixo:

Esta é realmente a forma mais simples de se criar uma notificação, mas infelismente é bastante limitada e não tão interessante.

Se você quiser realmente usar a biblioteca sem precisar destes artifícios, o melhor caminho é usar a API.



Libnotify no Python

Usar essa biblioteca no Python não é nada difícil. Na realidade, é tão simples que nem valeria um post, se realmente o recurso de notificação não fosse tão interessante e procurado. Segue um exemplo de notificação básica:

import pynotify
if pynotify.init("Nome da Aplicação"):
    n = pynotify.Notification("Título", "Sua mensagem")
    n.show()
else:
    print "Oops, problemas com a inicialização do módulo pynotify"

Como eu disse, não é nada complexo. No entanto, a biblioteca dispõe de outros recursos interessantes também. Entre eles, a possibilidade de definir o nível de urgência de uma mensagem:

n.set_urgency(pynotify.URGENCY_LOW)
n.set_urgency(pynotify.URGENCY_NORMAL)
n.set_urgency(pynotify.URGENCY_CRITICAL)

Outra opção é a de se usar ícones nas notificações, que podem ser feitas de três maneiras diferentes:

1: Com o path do ícone, no formato URI ("file://path/icone.png")
2: Usando um ícone padrão do Gnome, a partir de seu nome ("gnome-terminal")
3: Usando um pixbuf

Para os dois primeiros métodos, simplesmente informe o nome ou a URI do ícone em um terceiro parâmetro no método Notification():

n = pynotify.Notification("Título", "Sua mensagem", "gnome-terminal")

Caso queira utilizar um pixbuf em memória, você pode usar o método set_icon_from_pixbuf(), passando o pixbuf como parâmetro:

n.set_icon_from_pixbuf(pixbuf)



Você ainda pode setar o tempo que a mensagem ficará no ar, em segundos:

n.set_timeout(10)

Posicionar a mensagem próximo de algum widget:

n.attach_to_widget(widget) # 'self' funciona aki

Pode também, se quiser, expecificar diretamente a posição da notificação na tela:

n.set_hint("x", 250)
n.set_hint("y", 300)

Outra função interessante é a de poder fechar a notificação antes que seu tempo tenha expirado, para o caso em que vc já leu a mensagem e a mesma não se faz mais necessária:

n.close()

E muitos outros recursos a mais. É possível desde colocar botões na janela de notificação até setar funções de callback que retornam informações como cliques ou outros eventos notificáveis.

Caso esteja interessado em saber mais, o pacote pynotify têm vários exemplos de uso mais avançado da biblioteca.

Só para constar, coloco também um exemplo em C, só pra vcs não ficarem tristinhos. Realmente em C as coisas não são tão simples e práticas quanto no Python, como vc pode ver abaixo:

#include 

int main(int argc, char **argv) {
    // inicializando o GTK
    gtk_init(&argc,&argv);

    char nome[60] = “Exemplo de Notificação”;

    // iniciando a biblioteca
    notify_init(nome);

    // criando uma nova notificação
    NotifyNotification *exemplo;
    exemplo = notify_notification_new(nome, “Hello World!”, NULL, NULL);

    // criando um ícone para a notificação
    GtkStatusIcon *icone = gtk_status_icon_new_from_stock(GTK_STOCK_YES);
    gtk_status_icon_set_visible(icone, TRUE);
    notify_notification_attach_to_status_icon(exemplo, icone);

    // configurando a duração da notificação para 10 segundos
    notify_notification_set_timeout(exemplo, 10000);

    // configurando a categoria da notificação
    char categoria[40] = “Notificações de Teste”;
    notify_notification_set_category(exemplo, categoria);

    // configurando o nível de urgência da notificação
    notify_notification_set_urgency(exemplo, NOTIFY_URGENCY_CRITICAL);

    GError *error = NULL;

    notify_notification_show(exemplo, &error);

    return 0;
}

Só lembrando de, na hora de compilar, fazer a ligação com a biblioteca:

$ gcc `pkg-config –cflags –libs gtk+-2.0` notify.c -o notify -l notify

No geral é isso pessoal. Minha intenção foi mostrar o uso desse recurso que muito ajuda (e irrita, no caso do Pidgin e do Empathy) principalmente para vc saber quando uma determinada atividade que você disparou já terminou ou que chegou algo pra vc. Uma das utilidades é pro pessoal que escreve scripts em shellscript. Acho que essa oportunidade de notificação era uma boa coisa a ser explorada.

Entre os projetos que estou em mente é alterar meu Simplex Python Terminal Chat para passar a usar essa biblioteca.

Abração, e até mais.

Fontes:
man notify-send
Galago Projetc

sexta-feira, 20 de novembro de 2009

Teorema Fundamental do Salário

Estava hoje relembrando os velhos tempos do meu site offline, descaradamente copiado do meu antigo amigo Narcotic, encontrei então esse texto que há muito tempo não via mais. Eh um texto em que cito o famoso quadrinho Dilbert (pra quem não conhece) em uma de suas mais célebres descobertas: A relação entre trabalho, conhecimento e dinheiro...


Teorema Fundamental do Salário


O "Teorema Fundamental do Salário" de Dilbert estabelece que: "Os engenheiros e cientistas nunca devem ganhar mais que os executivos e os funcionários do departamento comercial".

Este Teorema pode ser demonstrado matematicamente a partir de dois postulados:

- Postulado I: "Conhecimento é Poder"
- Postulado II: "Tempo é Dinheiro"

Transformando os postulados em axiomas, definidos abaixo:

» Poder = trabalho/tempo

Como conhecimento é poder, nós temos

» Conhecimento = trabalho/tempo

Como tempo é dinheiro, nós temos

» conhecimento = trabalho/dinheiro

Fazendo a regra de três, temos o seguinte

» Dinheiro = trabalho/conhecimento

Nesta equação podemos desmembrar a variável dinheiro, de onde obtemos dinheiro = trabalho/conhecimento.

Então, se "conhecimento" tende a zero, o "dinheiro" tende ao infinito, independente da quantidade de "trabalho" feito.

Demonstrado: Quanto menos você souber, mais você ganhará.

quinta-feira, 12 de novembro de 2009

Dropbox - Tenha seus arquivos em qualquer lugar

Bom dia leitores! Muitos de vocês já devem ter passado pela chata experiência de ter mais de um computador e manter seus arquivos sincronizados entre todos eles, não é mesmo? Hoje você está em seu notebook, viajando, e edita um documento ali e, quando volta para casa, se esqueceu de atualizar no desktop e editou aquele também, e agora você têm duas versões diferentes do seu documento, o que certamente lhe dará uma dor de cabeça dobrada para fazer a comparação e alteração, não é ? (Linuxers, desconsidero que vocês usam o diff pra facilitar hehehe)

Bom, e como manter seus arquivos sempre sincronizados entre seus computadores? Talvez salvar tudo em um pendrive e ... oops, vc perde ele ... Exatamente, não são seguros. Outra forma é usar uma ferramenta de pasta virtual, que emula uma pasta pra ti, quando seus arquivos estão na realidade no servidores deles e ... epa, passaram a cobrar, e vc perdeu todos os seus arquivos! Chato né? Talvez você mesmo possa implementar sua ferramenta de rsync mas, putz, como isso é chato de fazer!

Como nada disso resolvia meus problemas por completo, eu deixei de lado essa preocupação, até que um belo dia, descobri uma ferramenta chamada Dropbox...




Cadastre-se aqui: You're invited to join Dropbox

O que o Dropbox têm de bom? Segundo a Wikipédia:

"Enquanto o Dropbox funciona como um serviço de storage, seu foco é em sincronização e compartilhamento. A sincronização utiliza SSL para transferências, com encriptação AES de 256 bits e suporta histórico de revisões dos arquivos, sendo que arquivos excluídos podem ser recuperados em qualquer dos computadores sincronizados ao serviço".

A grande diferença do Dropbox para os outros serviços de storage é relacionada ao fato que o Dropbox sincroniza os arquivos de uma determinada pasta com o espaço de armazenamento virtual deles. Se algum dia o serviço for descontinuado, seus arquivos ainda estarão à salvo em seu computador e caso vc exclua algum arquivo em um dos seus computadores, o Dropbox automaticamente restaura ele para você.

Sem contar que se você estiver em um computador público e não tem como instalar o Dropbox, você pode usar sua interface web para acessar seus arquivos. Maravilha, não?

O Dropbox disponibiliza inicialmente 2Gb de espaço de armazenamento, abrindo a possibilidade de aumentar 3Gb por indicação do serviço, ou ainda para 50Gb e histórico infinito, no caso daqueles que se dispuserem a pagar os 10 obamas que eles pedem. Eu não acho caro, é uma ótima solução pra quem realmente precisa desse espaço todo.

Até aí tudo bem né, nada de novo. Só é um pendrive virtual, não é mesmo? Pois é, já que vocês não pensaram, eu penso por vocês. Com uma solução dessas, vcs só conseguem pensar em compartilhar arquivos?

Uma coisa útil que vejo é a de compartilhar itens (no MSN por exemplo) usando o Dropbox, colocando o item que vc quer compartilhar na pasta Public e com o botão direito escolher Copy Public Link, no submenu Dropbox.

Bom, eu penso em várias coisas a mais, que citarei abaixo:

Sincronizando o Firefox através do Dropbox

Sincronizar o Firefox é uma tarefa relativamente fácil.

1 - Primeiramente, feche todas as janelas do Firefox antes de prosseguir;

2 - Na sua pasta do Dropbox, crie uma pasta para armazernar o perfil do Firefox. Exemplo: "Profiles\Firefox"

3 - Abra o firefox no modo de edição de perfis: firefox -profilemanager

4 - Na tela que se abre, vc escolherá Novo perfil, o que abrirá um assistente do estilo Avançar->Avançar->Concluir;

5 - No assistente, você deverá dar um nome para o perfil, por exemplo "Firefox Dropbox" e no botão abaixo, selecionar a pasta criada no começo deste tutorial. No meu exemplo, ficaria: "C:\Users\Caeryn\Documents\My Dropbox\Profiles\Firefox".

Fazendo isso, o firefox irá criar um perfil novo, vazio, que pode ser compartilhado via Dropbox. Se você quiser aproveitar seus favoritos, histórico e outros, pode simplesmente copiar os arquivos do prefil antigo para o novo perfil, que se encontra em: "C:\Users\Caeryn\AppData\Roaming\Mozilla\Firefox\Profiles" dentro da pasta "ezfo6n70.default".

Só lembrando que esta pasta se encontra em lugares diferentes, dependendo do sistema operacional utilizado. Na maioria dos Windows, encontra-se em Documents and Settings\\Dados de Aplicativos e nos linux, normalmente em .firefox ou .mozilla

Agora, é só configurar cada um dos seus computadores para usar esta pasta do Dropbox e cada alteração feita em uma delas refletirá em todas as outras. One Browser to Rule them all!!

Sincronizando o Safari

No caso do Safari, a solução é mais simples. Simplesmente mova a pasta de perfis do Safari para o Dropbox e crie um link simbólico desta para a localidade original ...

mkdir ~/Dropbox/Profiles/Safari
mv ~/Library/Safari ~Dropbox/Profiles/Safari
ln -s ~/Dropbox/Profiles/Safari/ ~/Library/Safari


Se quiser sincronizar somente os bookmarks:

ln -s ~/Library/Safari/Bookmarks.plist ~/Dropbox/Profiles/Safari/Bookmarks.plist

Sincronizando qualquer tipo de pasta no Dropbox

Essa dica é útil e simples. Trata-se de somente criar links simbólicos das pastas para dentro do Dropbox. Tudo bem, no MacOS e no Linux é fácil, mas e no Windows?

Vc pode usar o comando chamado Junction (MSDN) para fazer o trabalho de criar o link simbólico.

1 - Mova a pasta desejada para o Dropbox
move "C:\MinhaPasta" "C:\Documents and Settings\User\My Documents\My Dropbox\"

2 - Crie o link simbólico com o comando Junction
junction "C:\MinhaPasta" "C:\Documents and Settings\User\My Documents\My Dropbox\MinhaPasta"

3 - Se vc é um usuário do Windows Vista/Seven pode usar o comando mlink, já disponível para estas distribuições
mklink /D "C:\MinhaPasta" "C:\Users\Caeryn\Documents\Dropbox\MinhaPasta"

Dica: Você pode até sincronizar Meus Documentos, mas não é uma solução elegante.

Dica 2: Evite criar os links simbólicos dentro do Dropbox. A solução ideal é colocar os arquivos dentro da pasta do Dropbox e então criar o link simbólico fora de lá. Em caso contrário, o Dropbox substitui o link simbólico pelo arquivo real e isso quebra o link ...

Carregar torrents automaticamente em casa, de qualquer computador

Essa dica é pra mim uma das melhores.

Quantos de vocês não encontraram em algum lugar aquele torrent mara, mas não tinha como baixar no trabalho, na lan house ou mesmo viajando, e mantêm um computador conectado à internet o tempo todo? Essa dica é para vocês. Usar o Dropbox pra fazer o seu cliente de torrents carregar automaticamente seu torrent é o que rola. A dica é fácil.

Para aqueles que usam o pTorrent, é só abrir a tela de Preferências, escolher a opção Directories e habilitar a opção Automatically load .torrents from e no item abaixo, escolher uma pasta dentro do Dropbox para fazer o trabalho, por exemplo, "Dropbox\Torrents". Se você achar interessante, pode marcar também a caixa "Delete loaded .torrents" mas pessoalmente prefiro não, pq ocasionalmente grandes torrents (200-500k) demoram alguns segundos pra carregar e o cliente pode ocasionalmente excluir o torrent. Cabe a cada um decidir o que fazer

Bem, é isso. Pra quem quiser criar uma conta no Dropbox pode usar o seguinte link, que dá direto à criação da conta: https://www.dropbox.com/referrals/NTIxNzkyMjE5?src=tocadoelfo. Se você fizer isto por aqui, estará me ajudando, pq a cada cadastro efetuado, eu ganho 250Mb de espaço de armazenamento. Você também poderá fazer o mesmo, mostrando para todo o mundo como esse serviço é ótimo e especial para esses dias de nuvens e de web semântica ...

Abração, e até um próximo post.

Dicas Extras:

Instalação no Ubuntu (Para o 9.04 e 9.10 é só substituir o intrepid por jaunty ou karmic, respectivamente, ou usar o pacote .deb fornecido no site do Dropbox)
Instalação no Slackware
Instalação no Windows

Mais dicas e truques em:
wiki.dropbox.com

sexta-feira, 6 de novembro de 2009

O que é um peido para quem está todo cagado?

Muitos já devem ter ouvido a expressão que dá nome à este post, não é mesmo? No entanto, vcs já ouviram a história que mostra o quão profunda é essa frase? Não? Acompanhem então.

Dizem por aí que esse texto é uma obra de Luis Fernando Veríssimo, mas não boto tanta fé assim nesse texto não. Ele é simples, fora do estilo dele, mas muito engraçado.

O que é um peido para quem está todo cagado?

Aeroporto Santos Dumont, 15:30.

Senti um pequeno mal-estar causado por uma cólica intestinal, mas nada que uma urinada ou uma barrigada não aliviasse. Mas, atrasado para chegar ao ônibus que me levaria para o Galeão, de onde partiria o vôo para Miami, resolvi segurar as pontas.

Afinal de contas são só uns 15 minutos de busão.

'Chegando lá, tenho tempo de sobra para dar aquela mijadinha esperta, tranqüilo, o avião só sairía às 16:30'.