BossaConference, ai vou eu!

Finalmente tudo certo para a minha participação no BossaConference.

Para quem não sabe, BossaConference é um evento que está sendo promovido pelo Instituto Nokia de Tecnologia, e tratará sobre mobilidade, multimedia e opensource.

Estarão presentes grandes nomes, falando sobre vários assuntos relacionados a mobilidade. Destaque pra Mika Rytkonen do Open C, Jurgen Scheible e Jukka Laurila com Python S60, Marcel Holtmann do Bluez, sem contar a presença de nomes nacionais como Marcelo Eduardo e Osvaldo Santana do Pythonologia.

É isso ae, agora é só esperar dia 12 de março.

Mas e ae? Alguém mais vai?

ps.: O evento será em Porto de Galinhas - PE

IP x CEP, como saber de quem é este IP?

Aos administradores de sites: Quantas vezes já não pensamos/precisamos saber em que cidade mora um indivíduo dono de um certo IP?

Eu pessoalmente já precisei desta informação muitas vezes, mas infelizmente nunca encontrei um lugar aonde pudesse fazer esta pesquisa.

Até hoje!

Navegando na internet descobri um site chamado http://www.ipgeo.com.br/, aonde eu dou a ele um endereço IP no Brasil e o sistema retorna pra mim, com uma precisão muito grande, a cidade aonde este indivíduo reside.
Também existe a opção de localizar CEP pelo IP, que é um resultado obtido por aproximação, mas também é muito interessante.

O sistema funciona com endereços IP’s fixos ou dinâmicos. Muito interessante! Vale a pena conferir!

[]’s

Danilo Cesar

Gdesklets, um pouco mais que o basicão

Hoje vou apresentar o aplicativo Gdesklets.

Para quem não sabe, este aplicativo permite que o usuário rode pequenas aplicações “applets” diretamente no desktop. Possui por padrão vários applets prontos, como relógios, monitores de desempenho de hardware, previsão do tempo, entre outras coisas. Segue uma screenshot do meu desktop:

Gdesklets Desktop

Tá tá! Você usuário linux mediano provavelmente já saiba disso: Já conhecia o Gdesklets, e muito provavelmente também já usava, certo? Então o que esse post tem de diferente?

Como desenvolver seus próprios Applets

Para iniciar, digo que é muito fácil desenvolver aplicativos para o Gdesklet. Para quem está acostumado com HTML, vai lembrar de alguns conceitos como posicionamento, tags, ID’s, etc…

O que vou passar aqui pra vocês é o que eu aprendi sobre gdesklets nesta semana.

Cada parte do Gdesklets

Cada applet consiste em:

  • Uma janela, definida em um arquivo.display, que é, na verdade, um xml.
  • Um sensor, que é responsável por controlar e retornar dados para o display

Primeiros Passos com o Display

Inicialmente vamos chamar nosso aplicativo de PrimeirosPassos (Sugestivo não?)
Crie uma pasta com ~/mkdir .gdesklets/Displays/PrimeirosPassos

Dentro desta pasta, crie um arquivo chamado PrimeirosPassos.display com o seguinte conteúdo

  1. < ?xml version=“1.0″ encoding=“UTF-8″ ?>
  2.     <display id=“WPrimeirosPassos”>
  3.     </display>

E esta aí a estrutura básica de um Display no Gdesklets. Resumidamente, tudo o que você quiser colocar na sua tela você deverá colocar dentro da Tag display

Para incrementar um pouco mais, vamos fazer o clássico HelloWorld

  1. < ?xml version=“1.0″ encoding=“UTF-8″?>
  2.  
  3. <display id=“WPrimeirosPassos”>
  4.     <label value=“HelloWorld com GDesklets!” font=“Serif 20″ color=“red”/>           
  5. </display>

Aprendemos então uma nova Tag no Desklet: A Tag Label, que possui as seguintes propriedades:

color, Permite escolher a cor

font, Permite escolher a fonte

value, Define o conteúdo que o label terá na tela.

Agora vamos ver como o Desklet aparece na tela.
Ola mundo em gdesklets

Agrupamentos

Na estrutura XML do Desklet, existe também a TAG Group, que é utilizada para agruar elementos da estrutura. Um exemplo seria:

  1. <group x=“20″ y=“20″ bg-color=“green”>
  2.         <label x=“0″ y=“0″ value=“#2″/>
  3.         <label x=“0″ y=“50″ value=“#3″/>
  4.         <label x=“50″ y=“0″ value=“#4″/>
  5. </group>

Dentro da tag group, vemos também as propriedades X e Y, que logicamente definem o posicionamento X Y do elemento na tela.

Posicionamento relativo e âncoras

A estrutura desklet permite a existencia do chamado posicionamento relativo.
Posicionamento relativo nada mais é do que o posicionamento XY relativo ao um outro objeto

Por exemplo: o usuário quer que o segundo elemento label fique ao lado do primeiro elemento:

  1. <label font=“Sans 14px” color=“white” id=“label1″ value=“Ola “ />
  2.     <label relative-to=“label1, x” font=“Sans 14px” color=“green” value=“Mundo”/>

A propriedade relative-to dos elementos recebem dois parametros: O primeiro é o Identificador do objetivo, e o segundo é a que propriedade queremos esta relatividade. Este valor pode ser X, Y ou XY.

Podemos também definir aonde queremos esta relatividade através da propriedade anchor. O valor default é NW (superior esquerdo). Os outros valores são:

  • nw - Topo esquerdo
  • n - Meio do topo
  • ne - Topo Direito
  • e - Meio do canto direito
  • se - Canto inferior direito
  • s - Meio de baixo
  • sw -Canto inferior esquerdo
  • w - Meio da lateral direita
  • center - Centro

Fase dois

Bem, precisamos de uma aplicação descente para fazermos nossos testes, certo? Como não quero fazer um applet de previsão do tempo (pois já existem muitos), resolvi fazer um para receber dados de ações diretamente da Bovespa! O nome do projeto será Bovespa (lembre-se de utlizar o nome das pastas como Bovespa).

Interface

O código da interface é o seguinte:

  1. < ?xml version=“1.0″ encoding=“UTF-8″?>
  2.  
  3. <display id=“win” anchor=“ne” window-flags=“sticky, below”>
  4.  
  5.     <sensor id=“sens” module=“Bovespa,posi3″/>
  6.  
  7.     <meta name=“Bovespa” version=“0.01″ category=“Misc” author=“Danilo Cesar” description=“Bovespa’s Home Broker utility “/>
  8.               
  9.     <frame id=“border”>
  10.         <group id=“panel” width=“5cm” height=“2,5cm”>
  11.             </group><group id=“Titleobjs” width=“100%”>
  12.                 <image id=“logo” x=“2″ y=“2″ uri=“/usr/share/icons/gnome/48×48/stock/document/stock_new-spreadsheet.png”/>
  13.                 <label relative-to=“logo,x” x=“1cm” id=“title” value=“Bovespa” font=“Sans 20px” color=“black”/>
  14.                 <label anchor=“se” relative-to=“title,xy” y=“.6cm” watch=“value=sens:nome” value=“Carregando” font=“Sans 20px” color=“white”/>
  15.             </group>
  16.             <group id=“values” width=“100%” relative-to=“Titleobjs, y”>
  17.                 <label font=“Sans 14px” color=“white” id=“lblo” value=“Oscilacao: “ />
  18.                 <label relative-to=“lblo, x” watch=“value=sens:oscilacao, color=sens:color” font=“Sans 14px” color=“green” value=“carregando”/>
  19.                 <label relative-to=“lblo, y” font=“Sans 14px” color=“white” id=“lblp” value=“Preço:        “ />
  20.                 <label relative-to=“lblp, x” watch=“value=sens:price, color=sens:color” font=“Sans 14px” color=“green” value=“carregando”/>
  21.             </group>
  22.        
  23.     </frame>
  24. </display>

Aqui nós temos duas coisas novas:
A primeira é a tag sensor, que possui 2 argumentos:
id: Que será como o sensor será referenciado pelo display.
module: Que define qual sensor deverá ser utilizado. Queremos o sensor Bovespa, e seu argumento será posi3 (código da positivo informática na Bolsa de São Paulo).

A outra informação nova é parâmetro watch nos labels, que é um receptor de dados do sensor. Vamos dar um exemplo:

<label watch=”color=sens:cor”
Significa que o parâmetro Color do Label será preenchido pela propriedade “cor” do sensor “sens”. Simples não?

Programação do sensor

Os sensores são arquivos criados com o nome __init__.py. No caso do nosso exemplo, criemos um arquivo chamado: ~/.gdesklets/Sensors/Bovespa/__init__.py . O arquivo mais básico para um sensor deve conter pelo menos o seguinte conteúdo:

  1. from sensor.Sensor import Sensor
  2.  
  3.  
  4. class Bovespa(Sensor):
  5.     def __init__(self, *args):
  6.         Sensor.__init__(self)
  7.  
  8. def new_sensor(args): return Bovespa(*args)

A Classe Bovespa extende a classe sensor, por isso dentro dela podemos chamar algumas funções especiais. Listo algumas abaixo:

self._add_timer(tempo,funcao,parametros) nos permite executar uma função funcao e seus paremetros a cada tempo milisegundos. A função executada deverá retornar sempre true,e caso retorne false, a função deixará de ser executada.

output = self._new_output() cria uma porta de saída para o display. É a forma que o python tem de enviar seus dados para o display. O objeto output possui um método importante: output.set(‘nome’, ‘valor’), que grava o argumento ‘nome’ com o valor ‘nome’.

self._send_output(output), que é o método responsável em enviar uma lista de output’s para o display.

Com estes conhecimentos poderemos agora desenvolver nosso sensor. Que ficará da seguinte forma:

  1. from sensor.Sensor import Sensor
  2. from utils.datatypes import *
  3. import re
  4. import urllib
  5.  
  6. class Bovespa(Sensor):
  7.  
  8.     def __init__(self, acoes = ‘posi3′):
  9.  
  10.                 # call the constructor of the super class
  11.         Sensor.__init__(self)
  12.        
  13.         self.acoes = acoes[0]
  14.        
  15.         # Atualização do tipo ONLOAD, que ocorre apenas
  16.         # uma vez pois retorna um False
  17.         self._add_timer(0, self.refresh, False)
  18.  
  19.         # Atualizações do sistema a cada 60 segundos
  20.         self._add_timer(60000, self.refresh, True)
  21.  
  22.    
  23.     def refresh(self, FT):
  24.        
  25.         f = urllib.urlopen (‘http://www.bovespa.com.br/Cotacoes2000/CotacaoRapidaHome.Asp?PaginaReferente=home_right.Asp&txtCodigo=’ +self.acoes)
  26.         self._text = contents = f.read()
  27.         f.close()
  28.        
  29.         self._text = self._text.replace(‘&nbsp;’, ‘ ‘)
  30.  
  31.         # Definindo variáveis para enviar ao Display
  32.         output = self._new_output()
  33.         output.set(‘nome’, self.acoes.upper())
  34.         output.set(‘oscilacao’, self.get_oscilacao())
  35.         output.set(‘price’, self.get_price())
  36.         output.set(‘color’, self.get_color())
  37.        
  38.        
  39.         self._send_output(output)
  40.  
  41.         return FT
  42.  
  43.         # Procura por expressao regular a string com o preco da acao
  44.     def get_price(self):
  45.         ips = re.search(‘R\$ [0-9][0-9]{0,3},[0-9]{1,2}’,self._text)
  46.         if ips <> None:
  47.             return ips.group(0)
  48.         else:
  49.             return ‘Erro!’
  50.     #Procura por ER a string com a ascilacao da acao
  51.     def get_oscilacao(self):
  52.         ips = re.search(‘(-|\+)?[0-9][0-9]?,[0-9][0-9]%’,self._text)
  53.         if ips <> None:
  54.             return ips.group(0)
  55.         else:
  56.             return ‘Erro!’
  57.         # Escolhe a cor para mostrar a acao.
  58.         # Vermelhor para erro ou acao negativa
  59.         # verde para acao positiva
  60.     def get_color(self):
  61.         ips = self.get_oscilacao();
  62.         if (ips[0] == ‘-’ or ips == ‘Erro!’):
  63.             return ‘red’
  64.         else:
  65.             return ‘green’
  66.            
  67.            
  68. def new_sensor(args): return Bovespa(args)

Nosso applet ficará assim:
Aplicativo Bovespa

Não citei como fazer as seções de configuração e algumas outras coisas porque também ainda não tive tempo de ver.
Aos interessados, podem fazer aqui o download completo do applet Bovespa aqui

Alguns links interessantes são:

E é isso. Espero que vocês tenham boa sorte com seus applets, e melhor sorte do que eu em suas ações!