Esse período foi bastante corrido, mau postei devido a falta de tempo. Foi projeto de Banco de Dados, de Organização de Computadores, Circuitos Digitais Sequenciais, Redes de Computadores entre outros. Ah também tive meu primeiro artigo aceito – A Novel Restoration Algorithm Based on Optical Signal to Noise Ratio for Transparent Optical Network, SBrT 2011.

Abaixo seguem algumas imagens que disso tudo…

 

Plugin desenvolvido para Google Chrome

Justiça seja feita. Tenho que agradecer ao meu grupo por todos esses projetos, Anderson, Sergio, Rodrigo Morais, e Jamersson. Valeu!  Que venha Arquitetura o 7º Período!

Depois que conheci o bot do Google Talk Guru, fiquei curioso em saber como eram feitos esses bots. A princípio pensei que fosse alguma API do Google, até porque o google tem api para tudo, mas acabei descobrindo o IMified.

O IMified, como o próprio site explica, é uma plataforma escalável para criação e hospedagem de bots para IM, através de sua API é possível criar bots para Twitter, Google Talk, AIM, MSN e outros IMs. Bem, por enquanto vou parar por aqui mas nos próximos posts vou fazer um passo a passo para criar um bot para o Gtalk utilizando Python, Google App Engine e o IMified.

It’s working!

Há vários blogs e sites na web que mascaram a URL de algum download com o intuito de lhe vender ou fazer cadastrar em alguma promoção “imperdível”. No inicio isso dava para ser ignorado já que a própia URL da promoção/cadastro contia o destino desejado. Algo como:

http://www.promocaoimperdivel.com.br/?url=http://www.megaupload.com.br/uasdD

Bastava copiar e colar.

Bem, o problema é que a galera hoje em dia está se usando tática de guerra. A URL do destino não está  tão fácil como era antigamente.

Hoje:

http://www.promocaoimperdivel.com.br/?url=Ddsau/rb.moc.daolpuagem.www//:ptth

Qualquer pessoa consegue notar que o destino foi invertido,  reinverter – ou desinverter – a url é necessário. Eu mesmo sempre fazia esses passos

  1. Buscava no google “inverter, desinverter url” – mais rápido que print url[::-1].
  2. Entrava nesse site.
  3. Colava a url invertida.
  4. Clicava lá em “Inverter URL” e pronto.

Bem para mim era algo simples mas chato. Então resolvi hoje colocar a mão na massa e usar o Google App Engine para fazer o meu próprio reinvertedor. O que muda nele é que algumas dessas etapas foram retiradas. Vamos dizer que a época do ctrl+c e ctrl+v na URL voltou.

O funcionamento é  bem simples.

Por exemplo se fulano quisesse reinverter esse caminho /tp/lisarb/gro.ecaepneerg.www//:ptth

Basta digitar no browser o site da aplicação e colocar a url

http://reinverta.appspot.com/?url=/tp/lisarb/gro.ecaepneerg.www//:ptth

Ou seja, fazer uma requisição ao site, passando no argumento url o site a ser reinvertida. Logo após isso, o que vai acontecer é que fulano já seria redirecionado para a URL sem ter que fazer mais nada.

O código é muito simples, basicamente tudo acontece entra as linhas 6 e 8.

from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app

class MainPage(webapp.RequestHandler):
	def get(self):
		url = self.request.get('url')
		if url:
			self.redirect(url[::-1])
		else:
			pass # Mostrar pagina estatica

application = webapp.WSGIApplication([('/',MainPage)],debug=False)

def main():
	run_wsgi_app(application)

if __name__ == "__main__":
	main()

Fica ai a dica.

http://reinverta.appspot.com/?url=COLOCAR-URL-A-SER-INVERTIDA

Ahh, por enquanto não está criada a página estática que permitiria reinverter da forma tradicional mas em breve isso vai está funcionando.

Depois que comecei a participar do CIRG, Computational Intelligence Research Group, assisti várias palestras onde a técnica do PSO e sua variações eram utilizadas.Para quem não conhece o PSO (Particle Swarm Optimization) é uma técnica de computação inteligente criado pelos pesquisadores Kennedy e Eberhart em 1995. Sua descoberta foi feita a partir dos estudos do comportamento dos pássaros em um bando em vôo. Enfim, não vou me ater muito a explicar o PSO porque esse não é o foco mas para quem não conhece, recomedo a leitura do artigo que o propôs.

Num desses momentos de loucura eu tive a seguinte ideia:

“Se eu usasse o PSO e a API do Google Elevation para tentar encontrar o Everest?”

Dai para frente foi só implementar o PSO com a ajuda do @serginhfr e ver o que ia acontecer. Alguns detalhes sobre a implementação:

  • O espaço de busca era a Terra ou seja duas dimensões. Latitude: -90° a 90° e Longitude -180° a 180°.
  • Se por acaso a particula saisse do espaço de busca, seria como se ela tivesse dadouma volta na terra. Ex.: Logitude: -200° se tornaria 20°.
  • Foi usado a topologia de comunicação global (Gbest).
  • A função de fitness da particula é calculada fazendo uma requisição a API do Elevation passando o local em que a partícula se encontra no espaço de busca.
import simplejson
from urllib import urlopen
ELEVATION = "http://maps.google.com/maps/api/elevation/json?locations=%f,%f&sensor=false"

class Particle(object):
...
def _fitness(self,position):
   site = ELEVATION %(position.latitude,position.longitude)
   dicionario = simplejson.load(urlopen(site))
   if dicionario['status'] == 'OK':
      fit = dicionario['results'][0]['elevation']
   else:
      raise Exception # Criar uma exception digna.
   return fit

O retorno da requisição a o Elevation é um arquivo json – poderia ser um xml – como esse aqui . É utilizado o metodo load do modulo simplejson para transformar as informações contidas no json em um Dicionário (dict) que é um tipo padrão de Python.

  • A forma de atualizar a velocidade foi a seguinte:
from random import random
class Particle(object):
   ...
   def update_velocity(self,i,gbest):
       w = (0.9-(0.5*(i/self.iteracoes)))
       self.velocity.x = w * self.velocity.x + random()*2.05*(self.pbest.longitude - self.position.longitude) + random()*2.05*(gbest.position.longitude -self.position.longitude)
       self.velocity.y = w * self.velocity.y + random()*2.05*(self.pbest.latitude - self.position.latitude) + random()*2.05*(gbest.position.latitude -self.position.latitude)

Resultados!
Adianto logo que o mais próximo que ele chegou do Everest, foi um ponto na China. Basicamente a melhor partícula sempre se encontra na Antártida. O que me leva a crer que essa minha implementação foi baseada no comportamento dos pinguins  😀

A minha explicação:

  • Realmente a Antártida possui pontos elevados, o 6º ponto mais alto é o Vinson Massif na Antártica com 4.892 m.
  • O formato de topologia de comunicação GBest tem maior probabilidade de deixar o exame presas em pontos de minimo, como o Visson Massif.

Por enquanto ainda não achei o Everest mas quando fizer novos testes mudando o formato de comunicação espero ter melhores resultados.

Visão dos 8 pontos mais altos do mundo

O dia foi bem legal. Paintball pela tarde com o pessoal da faculdade e a noite revi Anakin, O perturbado, se revoltar contra os Jedi em  Star Wars Episódio III, A Vingança do Sith.

Certo, mas o post não tem nada haver com o que falei. Queria dizer é que apesar da minha ausência, não esqueci do blog. Só estou com pouco sem tempo devido as minhas obrigações com a faculdade, iniciação científica e com o lazer – ninguém é de ferro –  , mas em breve vou está postando coisas legais, eu prometo.

Bem, fora isso eu queria mostrar toda minha alegria ao compartilhar com vocês que Python pela segunda vez ganhou o Tiobe Programming Language AwardChupa bambizada! Python eoo! .

Para finalizar vou deixar um script em python que acabei de fazer para o Problema 22 do Project Euler, acho que está entendível uma vez que a maioria das coisas que usei já expliquei aqui no blog.

Problem 22

Using names.txt (right click and ‘Save Link/Target As…’), a 46K text file containing over five-thousand first names, begin by sorting it into alphabetical order. Then working out the alphabetical value for each name, multiply this value by its alphabetical position in the list to obtain a name score.

For example, when the list is sorted into alphabetical order, COLIN, which is worth 3 + 15 + 12 + 9 + 14 = 53, is the 938th name in the list. So, COLIN would obtain a score of 938 × 53 = 49714.

What is the total of all the name scores in the file?

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

from urllib import urlopen
import string

#Pegar os arquivos com os nomes
nomes = urlopen('http://projecteuler.net/project/names.txt').read()

# partir a string e filtrar o resultado
nomes = filter(lambda x: x not in string.punctuation,nomes.split(','))

# retirar as aspas e transformar os nomes em minúsculo para facilitar a
# busca da posicao da letra.
nomes = map(lambda x: x.strip('"').lower(),nomes)
nomes.sort() # ordenar

# Fazer a soma de todos os nomes utilizando a regra do problema.
print sum(map(lambda (posicao,nome): (posicao+1)*sum(map(lambda letra: string.letters.find(letra)+1,nome)),enumerate(nomes)))
#Resposta: 871198282

Hoje no IX Encontro do Python User Group de Pernambuco apresentei
uma palestra relâmpago no I Toró de palestras do PUG-PE. Nessa
palestra apresentei uma forma de resolução para o problema abaixo
utilizando uma abordagem funcional. Esse problema foi uma proposta
de Dojo enviada por Marcel Caraciolo a nossa lista de discussão.
Depois encontrei na internet que essa ele fazia parte da etapa
de inscrição para o Google Developer Day 2010.
Abaixo segue a descrição: 

Na pacata vila campestre de Arquivonaoencontradoville, todos os
telefones têm 6 dígitos. A companhia telefônica estabelece as
seguintes regras sobre os números:
  • Não pode haver dois dígitos consecutivos idênticos, porque isso é chato;
  • A soma dos dígitos tem que ser par, porque isso é legal;
  • O último dígito não pode ser igual ao primeiro, porque isso dá azar.
Então, dadas essas regras perfeitamente razoáveis, bem projetadas
e maduras, quantos números de telefone na lista abaixo são válidos?

215228, 218415, 221632, 224722, 229644, 230847, 233798,
237903, 239224, 241832, 242112, 243248, 246147, 247652,
250688, 252940, 255721, 256882, 259134, 262578, 263327,
266656, 268796, 270350, 272863, 275245, 278601, 278606,
281963, 283751, 288259, 291562, 296545, 298528, 302103,
303431, 307561, 311979, 315548, 320440, 322278, 324469,
324740, 327417, 330263, 331179, 334147, 334932, 336085,
338096, 338106, 342991, 347187, 347590, 348863, 350187,
353246, 354032, 358616, 363056, 363251, 366141, 369906,
371046, 372684, 377077, 381177, 382086, 385627, 385694,
386105, 388179, 390251, 392624, 394225, 395328, 398698,
400102, 404224, 408064, 410386, 411711, 413621, 415653,
417168, 419269, 424197, 427202, 430639, 432570, 437462,
442412, 444990, 447613, 452039, 456750, 459927, 462532,
465756, 467051, 468297, 469089, 471562, 474900, 475534,
476833, 478910, 480437, 482085, 485647, 487736, 489897,
493033, 495182, 498463, 502539, 502785, 505926, 508246,
511720, 515395, 515595, 516362, 520927, 525025, 529957,
530139, 531015, 533760, 534588, 538184, 541403, 542913,
546141, 548038, 549095, 552509, 556808, 560382, 563503,
565304, 567165, 567675, 572218, 573856, 576408, 578085,
578997, 579553, 584487, 589220, 590967, 593234, 597867,
599823, 603666, 607878, 611482, 611854, 612811, 614119,
615956, 617547, 621070, 621309, 626105, 626885, 631080,
635911, 639606, 640175, 641607, 645158, 647958, 652199,
656507, 658615, 662663, 662947, 664704, 666668, 667544,
669440, 673512, 675931, 676963, 677113, 678606, 682716,
682998, 684883, 686140, 688963, 689054, 692042, 695458,
697031, 697457, 697623, 698026

Apresentação.


Script Python.
http://ideone.com/3SPKF

Os Telefones

Na pacata vila campestre de Arquivonaoencontradoville, todos os telefones têm 6 dígitos. A companhia telefônica estabelece as seguintes regras sobre os números:

  • Não pode haver dois dígitos consecutivos idênticos, porque isso é chato;
  • A soma dos dígitos tem que ser par, porque isso é legal;
  • O último dígito não pode ser igual ao primeiro, porque isso dá azar.

Então, dadas essas regras perfeitamente razoáveis, bem projetadas e maduras, quantos números de telefone na lista abaixo são válidos?

215228, 218415, 221632, 224722, 229644, 230847, 233798, 237903, 239224, 241832, 242112, 243248, 246147, 247652, 250688, 252940, 255721, 256882, 259134, 262578, 263327, 266656, 268796, 270350, 272863, 275245, 278601, 278606, 281963, 283751, 288259, 291562, 296545, 298528, 302103, 303431, 307561, 311979, 315548, 320440, 322278, 324469, 324740, 327417, 330263, 331179, 334147, 334932, 336085, 338096, 338106, 342991, 347187, 347590, 348863, 350187, 353246, 354032, 358616, 363056, 363251, 366141, 369906, 371046, 372684, 377077, 381177, 382086, 385627, 385694, 386105, 388179, 390251, 392624, 394225, 395328, 398698, 400102, 404224, 408064, 410386, 411711, 413621, 415653, 417168, 419269, 424197, 427202, 430639, 432570, 437462, 442412, 444990, 447613, 452039, 456750, 459927, 462532, 465756, 467051, 468297, 469089, 471562, 474900, 475534, 476833, 478910, 480437, 482085, 485647, 487736, 489897, 493033, 495182, 498463, 502539, 502785, 505926, 508246, 511720, 515395, 515595, 516362, 520927, 525025, 529957, 530139, 531015, 533760, 534588, 538184, 541403, 542913, 546141, 548038, 549095, 552509, 556808, 560382, 563503, 565304, 567165, 567675, 572218, 573856, 576408, 578085, 578997, 579553, 584487, 589220, 590967, 593234, 597867, 599823, 603666, 607878, 611482, 611854, 612811, 614119, 615956, 617547, 621070, 621309, 626105, 626885, 631080, 635911, 639606, 640175, 641607, 645158, 647958, 652199, 656507, 658615, 662663, 662947, 664704, 666668, 667544, 669440, 673512, 675931, 676963, 677113, 678606, 682716, 682998, 684883, 686140, 688963, 689054, 692042, 695458, 697031, 697457, 697623, 698026,

Tutorial bastante conhecido de Django refeito pelo próprio Massimo de Pierro, o criador da framework Web2py .

Quem quiser saber mais diferenças entre Web2py e Django, há um artigo muito bom no AlterEgo.

Python possui o módulo fractions que permite a manipulação de aritmética de racionais de uma forma bastante simples,como pode ser visto nos exemplos a abaixo

>>> from fractions import Fraction
>>> x = Fraction(2,21)
>>> x
Fraction(2, 21)
>>> y = Fraction('4/28')
>>> y
Fraction(1, 7)
>>> y+2
Fraction(15, 7)
>>> x*3
Fraction(2, 7)
>>> x+y
Fraction(5, 21)
>>> Fraction('-.25')
Fraction(-1, 4)
>>> Fraction('-.25')**2
Fraction(1, 16)

O construtor de Fractions pode receber um outro Fraction, um float, ou
um decimal(módulo decimal) além dos utilizados acima. Nesse mesmo módulo, fractions, há uma função para calcular o Máximo Divisor Comum (mdc) entre dois números.


>>> from fractions import gcd
>>> gcd(147,105)
21
>>> gcd(25,35)
5
>>> gcd(7,3)
1
>>> gcd(348,156)
12

Demorou mas estou postando aqui a minha apresentação no último encontro do PUG-PE.

Palestra + exemplos

Foi um dos melhores encontros já realizados pelo grupo, todos  realmente estão de parabéns. Quem perdeu pode ler o resumo do nosso encontro e em breve ver as palestras no Blip.tv.

Álbum de foto do VI Encontro do PUG-PE