Mostrando postagens com marcador python. Mostrar todas as postagens
Mostrando postagens com marcador python. Mostrar todas as postagens

quinta-feira, 26 de julho de 2012

Python Script to get the lastest chromium snapshot

# -*- coding: utf-8 -*-
"""
Created on Tue Jul 24 18:08:13 2012

@author: killown
"""

import urllib
import os, pwd
import os.path
import urllib2
import shutil
import zipfile



chromium_browser = """#!/bin/sh

# Chromium launcher

# Authors:
# Fabien Tassin
# License: GPLv2 or later

APPNAME=chrome
LIBDIR=~/.chromium-browser
GDB=/usr/bin/gdb
BUILD_DIST="Ubuntu 12.04"

usage () {
echo "$APPNAME [-h|--help] [-g|--debug] [--temp-profile] [options] [URL]"
echo
echo " -g or --debug Start within $GDB"
echo " -h or --help This help screen"
echo " --temp-profile Start with a new and temporary profile"
echo
echo " Other supported options are:"
MANWIDTH=80 man chromium-browser | sed -e '1,/OPTIONS/d; /ENVIRONMENT/,$d'
echo " See 'man chromium-browser' for more details"
}

if [ -f /etc/$APPNAME/default ] ; then
. /etc/$APPNAME/default
fi

# Prefer user defined CHROMIUM_USER_FLAGS (fron env) over system
# default CHROMIUM_FLAGS (from /etc/$APPNAME/default)
CHROMIUM_FLAGS=${CHROMIUM_USER_FLAGS:-"$CHROMIUM_FLAGS"}

# FFmpeg needs to know where its libs are located
if [ "Z$LD_LIBRARY_PATH" != Z ] ; then
LD_LIBRARY_PATH=$LIBDIR:$LD_LIBRARY_PATH
else
LD_LIBRARY_PATH=$LIBDIR
fi

export LD_LIBRARY_PATH

# For the Default Browser detection to work, we need to give access
# to xdg-settings if it's not present on the system (ensures that the system
# xdg-utils is recent enough). Also set CHROME_WRAPPER in case xdg-settings is
# not able to do anything useful
if [ ! -e /usr/bin/xdg-settings ] ; then
export PATH="$LIBDIR:$PATH"
fi
export CHROME_WRAPPER="`readlink -f "$0"`"
export CHROME_DESKTOP=$APPNAME.desktop

# lsb_release is slow so try to source the static file /etc/lsb-release
# instead, and fallback to lsb_release if we didn't get the information we need
if [ -e /etc/lsb-release ] ; then
. /etc/lsb-release
fi
DIST=${DISTRIB_ID:-"`lsb_release -si`"}
RELEASE=${DISTRIB_RELEASE:-"`lsb_release -sr`"}

# Set CHROME_VERSION_EXTRA visible in the About dialog and in about:version
if [ "$DIST $RELEASE" = "$BUILD_DIST" ] ; then
export CHROME_VERSION_EXTRA="$DIST $RELEASE"
else
export CHROME_VERSION_EXTRA="Built on $BUILD_DIST, running on $DIST $RELEASE"
fi

want_debug=0
want_temp_profile=0
while [ $# -gt 0 ]; do
case "$1" in
-h | --help | -help )
usage
exit 0 ;;
-g | --debug )
want_debug=1
shift ;;
--temp-profile )
want_temp_profile=1
shift ;;
-- ) # Stop option prcessing
shift
break ;;
* )
break ;;
esac
done

if [ $want_temp_profile -eq 1 ] ; then
TEMP_PROFILE=`mktemp -d`
CHROMIUM_FLAGS="$CHROMIUM_FLAGS --user-data-dir=$TEMP_PROFILE"
fi

if [ $want_debug -eq 1 ] ; then
if [ ! -x $GDB ] ; then
echo "Sorry, can't find usable $GDB. Please install it."
exit 1
fi
tmpfile=`mktemp /tmp/chromiumargs.XXXXXX` || { echo "Cannot create temporary file" >&2; exit 1; }
trap " [ -f \"$tmpfile\" ] && /bin/rm -f -- \"$tmpfile\"" 0 1 2 3 13 15
echo "set args $CHROMIUM_FLAGS ${1+"$@"}" > $tmpfile
echo "# Env:"
echo "# LD_LIBRARY_PATH=$LD_LIBRARY_PATH"
echo "# PATH=$PATH"
echo "# GTK_PATH=$GTK_PATH"
echo "# CHROMIUM_USER_FLAGS=$CHROMIUM_USER_FLAGS"
echo "# CHROMIUM_FLAGS=$CHROMIUM_FLAGS"
echo "$GDB $LIBDIR/$APPNAME -x $tmpfile"
$GDB "$LIBDIR/$APPNAME" -x $tmpfile
if [ $want_temp_profile -eq 1 ] ; then
rm -rf $TEMP_PROFILE
fi
exit $?
else
if [ $want_temp_profile -eq 0 ] ; then
exec $LIBDIR/$APPNAME $CHROMIUM_FLAGS "$@"
else
# we can't exec here as we need to clean-up the temporary profile
$LIBDIR/$APPNAME $CHROMIUM_FLAGS "$@"
rm -rf $TEMP_PROFILE
fi
fi
"""

def download(link):
url = link

file_name = url.split('/')[-1]
u = urllib2.urlopen(url)
f = open(file_name, 'wb')
meta = u.info()
file_size = int(meta.getheaders("Content-Length")[0])
print "Downloading: %s Bytes: %s" % (file_name, file_size)

file_size_dl = 0
block_sz = 8192
while True:
buffer = u.read(block_sz)
if not buffer:
break

file_size_dl += len(buffer)
f.write(buffer)
status = r"%10d [%3.2f%%]" % (file_size_dl, file_size_dl * 100. / file_size)
status = status + chr(8)*(len(status)+1)
print status,

f.close()


url = "".join( urllib.urlopen("http://commondatastorage.googleapis.com/chromium-browser-snapshots/Linux_x64/LAST_CHANGE") )

userpath = pwd.getpwuid(os.getuid()).pw_dir

fulluserpath = os.path.join(userpath,".config/chromium-check")

current = "".join(open(fulluserpath))




def get_chromium():
print "New version available"
print "Downloading"
download("http://commondatastorage.googleapis.com/chromium-browser-snapshots/Linux_x64/"+ url + "/chrome-linux.zip")
chromium_path = os.path.join(userpath,".chromium-browser/")
chromium_file = os.path.join(userpath,"chrome-linux.zip")
chromium_move = os.path.join(chromium_path + "chrome-linux/")
chromium_exec = os.path.join(chromium_path,"chrome")
shutil.rmtree(chromium_path)
os.makedirs(chromium_path)

file_zip = zipfile.ZipFile(chromium_file, 'r')
file_zip.extractall(chromium_path)
file_zip.close()

files = os.listdir(chromium_move)

for i in files:
src = chromium_move + i
dst = chromium_path
shutil.move(src, dst)

os.chmod(chromium_exec, 0755)


if int(url) > int(current):
get_chromium()
cc = open(fulluserpath,"w")
cc.write(url)
cc.close()

else:
print "You're already using the lastest revision"

if not os.path.isfile("/usr/bin/chromium-browser"):
print chromium_browser
print "Copy/Paste the output above into /usr/bin/chromium-browser and make it chmod executable +x"

if not os.path.isfile(fulluserpath):
get_chromium()
cc = open(fulluserpath,"w")
cc.write(url)
cc.close()


Agistech.com.br

sábado, 3 de março de 2012

Sobre o Problema Da Soma De Sub-Ítens Do noskleta

Referente ao post do nosklo http://pythonlog.wordpress.com/2010/01/19/problema-da-soma-de-sub-itens/ O código a seguir consegue executar todos os testes de dados_teste.txt em menos de 2 segundos em um processador x4 955 overclock 4ghz
from itertools import chain, combinations
       
itens = range(-2000, 1, 1) + range(1,10, 3)
a = sorted([i for i in itens if i > 0], reverse=True)
b =  sorted([i for i in itens if i < 0], reverse=True)
found = False
totalB = abs(sum(b))
 
if sum(a) < totalB:
    a, b = b, a
    totalB = abs(sum(b))            
   
       
if b != [] or a != []:
  
    if len(a) < 30:
 
        for i in chain.from_iterable(combinations(a, n+1)
                           for n in xrange(len(b),0,-1)):
        
            if abs(sum(i)) - totalB == 0:
                currentList = a+b
                sublist =  list(i)+b
                absoluteValue= (abs(sum(i)) + totalB)
                print  "com %s retornou %s Cujo o Valor absoluto é: %s  " \
                                  % (currentList,  sublist,  absoluteValue)
                found = True
                break
         
    else:
 
        loop = True
        size = len(a)
         
        while loop and size >= 2:       
   
            for i in chain.from_iterable(combinations(a, n+1)
                                 for n in xrange(size,0,-1)):
   
                if sum(abs(j) for j in i) >=  totalB:
                    size-=1
                    break
                else:
                    loop = False
                break
             
        for i in chain.from_iterable(combinations(a, n+1)
                                  for n in xrange(size,0,-1)):
        
            if abs(sum(i)) - totalB == 0:
                currentList = a+b
                sublist =  list(i)+b
                absoluteValue= (abs(sum(i)) + totalB)
                print  "com %s retornou %s Cujo o Valor absoluto é: %s  " \
                          % (currentList,  sublist,  absoluteValue)
                found = True
                break

    if not found:
        for i in chain.from_iterable(combinations(itens, n+1)
                         for n in xrange(len(itens), 0, -1)):
            if abs(sum(i)) == 0:
                currentList = itens
                sublist =  list(i)
                absoluteValue= sum( abs(j) for j in i )
                print  "com %s retornou %s Cujo o Valor absoluto é: %s  " \
                                  % (currentList,  sublist,  absoluteValue)
                found = True
                break
        
   
    if not found:     
        print "%s Nenhuma sublista" % itens
Agistech.com.br

quinta-feira, 6 de outubro de 2011

smtplib - Enviando E-mails com anexo

def email():
    import smtplib
    from email.MIMEMultipart import MIMEMultipart
    from email.MIMEBase import MIMEBase
    from email.MIMEText import MIMEText
    from email.Utils import formatdate
    from email import Encoders
    import os
    user = "user@email.com" 
    password = "password" 
    subject = "email teste" 
    fromaddr = 'from@email.com' 
    toaddrs = 'to@email.com' 
    msg = MIMEMultipart()
    msg['Date'] = formatdate( localtime = True )
    
    msg['Subject'] = 'subject'

    msg.attach( MIMEText( 'oi' ) )
    part = MIMEBase( 'application', "octet-stream" )
    open( 'teste.txt', 'w' ).write( 'teste')
    part.set_payload( open( 'teste.txt', "rb" ).read() )
    Encoders.encode_base64( part )
    part.add_header( 'Content-Disposition', 'attachment; filename="teste.txt"' )
    msg.attach( part )
        
    servidor = smtplib.SMTP( 'smtp.domain:port' )
    servidor.ehlo()  
    servidor.starttls()  
    servidor.ehlo()  
    servidor.login( user, password )  
    servidor.sendmail( fromaddr, toaddrs, msg.as_string() )
Agistech.com.br

quinta-feira, 9 de junho de 2011

python - armazenando a saída de programas com subprocess

outputCMD = subprocess.Popen(['ls'], stdout=subprocess.PIPE)
outputCMD = outputCMD.stdout.readlines()
Agistech.com.br

sexta-feira, 27 de maio de 2011

python sorting - organizando uma lista em uma ordem alfabética pré-definida

alfabeto = "zyxwvutsrqpomnlkjihgfedcba"
s = ['asdf', 'werwer', 'asgfd','wesasd','yasdfas','zsadf']

print sorted(s, key=lambda w: [alfabeto.index(i) for i in w])
Agistech.com.br

quinta-feira, 19 de maio de 2011

Python - criando um plugin para xchat

Simples plugin para xchat feito em python

# -*- coding: utf-8 -*-

__module_name__ = "First_letter_uppercase"
__module_version__ = "0.1"
__module_description__ = "foobar"

import xchat

def intercept_print(word, word_eol, userdata):
    line = word_eol[0].capitalize()
    xchat.command(" ".join(["msg", xchat.get_info("channel"), line]))
    return xchat.EAT_ALL


xchat.hook_command("", intercept_print)



word_eol, é o texto que você vai enviar, então através de slice [0] pegamos a primeira palavra e fazemos com que a primeira letra seja maiúscula.

o hook_command envia o texto modificado para o canal

Agistech.com.br

sexta-feira, 18 de março de 2011

Enviando E-mail do gmail através do Python

import smtplib  
usuario = "seu usuário do gmail"  
senha = "sua senha do gmail"  
subject = "email teste"  
fromaddr = 'seuemail@gmail.com'  
toaddrs = 'Email-Destinatario@Email.com'  
msg = 'Mensagem enviada pelo Python utilizando Gmail'  
s = """From: %s\r\nTo: %s\r\nSubject: 
       %s\r\nX-Mailer: My-Mail\r\n\r\n 
    """ % (fromaddr,toaddrs, subject)  
servidor = smtplib.SMTP('smtp.gmail.com:587')  
servidor.ehlo()  
servidor.starttls()  
servidor.ehlo()  
servidor.login(usuario,senha)  
servidor.sendmail(fromaddr, toaddrs, s+msg)  
servidor.quit() 
Agistech.com.br

domingo, 6 de março de 2011

Python - Compreendendo o yield

O yield é uma keyword que aparece juntamente com um bloco de iteração, sinalizando ao compilador que o valor retornado por ele faz parte da coleção retornada pelo método principal.

Para compreender o que o yield faz, você primeiro deve compreender o que são geradores.

Iteradores

Quando você cria uma lista, você pode ler os itens um por um, e esse processo é chamado de iteração:

>>> minha lista = [1, 2, 3]
>>> for i in minha lista :
...    print(i)
1
2
3
minhalista é um iterador, quando você usa uma comprehension list, você cria uma lista e então um iterador:

>>> minhalista = [x*x for x in range(3)]
>>> for i in minhalista :
...    print(i)
0
1
4

Qualquer coisa que vc puder usar sobre um "for... in..." é um iterador: listas, strings, arquivos...



Geradores

Geradores são iteraveis, mas você pode apenas lê-los um por vez. Isso é porque eles não salvam os valores na memória.

>>> meugerador = (x*x for x in range(3))
>>> for i in meugerador :
...    print(i)
0
1
4


Yield

Yield é uma palavra-chave que é usada como o return, exceto que a função ira retornar um gerador.

>>> def Criargerador() :
...    minhalista = range(3)
...    for i in minhalista :
...        yield i*i
...
>>> meugerador = Criargerador()
>>> print(meugerador) # meugerador é um objeto

>>> for i in meugerador:
...     print(i)
0
1
4

Agistech.com.br

domingo, 3 de outubro de 2010

if else em uma linha

muitas vezes precisamos usar condições simples, por exemplo:
a = 'b'
b = a
if a ==b: print 'sim'
else: print 'nao'

mas que tal utilizar o if e else em uma linha?

a = 'b'
b = a
print 'sim' if a == b else 'nao'
sim

economizar linhas de código é sempre bom, mas não quando isso influi na legibilidade, porém nesse caso é uma forma clara e legível.

sexta-feira, 1 de outubro de 2010

complexidade para calcular 2**3 + 5**2 comparação asm vs python

uma comparação de complexidade entre asm e python para para fazer um simples calculo

#o propósito deste código é para mostrar como funciona uma função
#mas resolvi fazer uma comparação entre o tamanho do código entre python e asm
#utilizando o gasm para calcular 2**3 + 5**2
.section .data
.section .text
.globl _start
_start:
pushl $3
pushl $2
call power
addl $8, %esp
pushl %eax
pushl $2
pushl $5
call power
addl $8, %esp
popl %ebx
addl %eax, %ebx
movl $1, %eax
int $0x80

.type power, @function
power:
pushl %ebp
movl %esp, %ebp
subl $4, %esp
movl 8(%ebp), %ebx
movl 12(%ebp), %ecx
movl %ebx, -4(%ebp)
power_loop_start:
cmpl $1, %ecx
je end_power
movl -4(%ebp), %eax
imul %ebx, %eax


movl %eax, -4(%ebp)
decl %ecx
jmp power_loop_start

end_power:
movl -4(%ebp), %eax
movl %ebp, %esp
popl %ebp
ret

teste realizado no linux.

salve o código em um arquivo chamado teste.as
compile o código
as teste.as -o teste.o
depois é preciso linkar
ld teste.o -o teste
e então execute o programa
não imprimirá na tela o valor 33, portanto para obter o resultado é necessário usar echo $? .


em python vc só precisa entrar no interpretador e calcular 2**3 + 5**2 e retornará 33 como resultado.

então da pra notar o nível de dificuldade de programação entre python e asm.

segunda-feira, 23 de agosto de 2010

usando difflib para calcular a porcentagem de semelhança entre duas strings

import difflib

>>> difflib.SequenceMatcher(None, 'olá Brasil', 'olá Brazil').ratio()
0.90909090909090906

>>> difflib.SequenceMatcher(None, 'olá Brasil', 'olá Brasil').ratio()
1.0

terça-feira, 10 de agosto de 2010

python - utilizando o set para manipular strings, listas, tuplas etc.

Um objeto set é uma coleção desordenada de objetos hashable.
assim como em outras coleções, os sets suportam x in set, len(set), e for x in set. Sendo
uma coleção desordenada, os sets não salvam a posição dos elementos ou a ordem da inserção.
consequentemente, sets não suportam indexação...
Existe atualmente dois tipos de set built-in, que são frozenset e set. O tipo frozenset é imutável e o tipo set é mutável e o conteúdo pode ser modificado usando metodos como add() e remove().

exemplos de uso:

remove()
remove elementos do set
>>> a = set('abcd')
>>> a.remove('a')

>>> print a
set(['c', 'b', 'd'])

add()
adiciona elementos ao set
>>> a = set('abcd')
>>> a.add('a')

>>> print a
set(['a', 'c', 'b', 'd'])


intersection()
set(a) & set(b) é o mesmo que set(a).intersection(b)
exibe os itens em comum entre as listas a e b
a = [1,2,3,'a','b','c']
b = [1,2,'c','d','b']

>>> set(a) & set(b)

6: set([1, 2, 'b', 'c'])

difference()
set(a) - set(b) é o mesmo que set(a).difference(b)
retorna a diferença entre as duas listas retornando somente
os itens que não são comuns entre elas
a = [1,2,3,'a','b','c']
b = [1,2,'c','d','b']

>>> set(a) - set(b)

8: set([3, 'a'])

union()
set(a) | set(b) que é o mesmo que set(a).union(b)
junta os itens da lista a e b
a = [1,2,3,'a','b','c']
b = [1,2,'c','d','b']

>>> set(a) | set(b)

10: set([1, 2, 3, 'a', 'b', 'c', 'd'])

symmetric_difference()
set(a) ^ set(b) é o mesmo que set(a).symmetric_difference(b)
retorna a diferença das listas mostrando os elementos que não são comum em ambas
a = [1,2,3,'a','b','c']
b = [1,2,'c','d','b']

>>> set(a) ^ set(b)

135: set([1, 2, 'a'])

pop()
remove e retorna um elemento arbitrário do set
a = [1,2,3,'a','b','c']
b = [1,2,'c','d','b']

>>> s = set(a) ^ set(b)
>>> print s
set(['a', 1, 2])

>>> s.pop()
144: 'a'

>>> print s
set([1, 2])

>>> s.pop()
145: 1

>>> print s
set([2])


clear()
remove todos os elementos do set
>>> s = set('1a3b5c6789')
>>> print s
set(['a', 'c', 'b', '1', '3', '5', '7', '6', '9', '8'])

>>> s.clear()
>>> print s
set([])

isdisjoint()
retorna True se o set a e b não tem elementos em comum.
>>> a
252: set(['a', 'b', 'c', 'd'])

>>> b
253: set(['1', 'f'])

>>> a.isdisjoint(b)
254: True

>>> b = set(['1','a'])
>>> a.isdisjoint(b)
255: False


issubset()
a <= b é o mesmo que a.issubset(b) verefica se os elementos no set a contem no set b
>>> a = set('abcd')
>>> b = set('abcd')

>>> a <= b
263: True

>>> b = set('abc')

>>> a <= b
264: False


issuperset()
a >= b é o mesmo a.issuperset()
verifica se os elementos do set b contem no set a
>>> a
283: set(['a', 'b', 'c', 'd'])

>>> b
284: set(['a', 'b', 'c'])

>>> a >= b
285: True

>>> a = set('asdf')
>>> a >= b
286: False

update()
atualiza do set a com os elementos do set b
>>> a = set('123')
>>> b = set('456')
>>> a.update(b)

>>> a
299: set(['1', '2', '3', '4', '5', '6'])

sábado, 24 de julho de 2010

executando programas de forma assíncrona com glib.spawn_async

a função glib.spawn_async executa um programa assincronamente (seu código não ira bloquear esperando pelo fim da execução do programa)

o programa é especificado por um único argumento que deve ser fornecido. Por padrão, deve-se especificar o path do programa, exemplo "/bin/ls".

exemplo de uso:
import glib, gtk, os

class spaw_async(object):
   
    def __init__(self):
       
        pid = glib.spawn_async(["/bin/sleep", '3'])[0]
        glib.timeout_add(100, self.terminar, pid)
       
       
    def terminar(self, pid):

        try:
            os.kill(pid, 0)
            return True
           
        except OSError:
            print "o processo terminou"
            gtk.main_quit()
            return False
       
spaw_async()
gtk.main()

glib.spawn_async retorna uma tupla com 4 itens que são: pid stdin stdout e stderr.

quarta-feira, 21 de julho de 2010

gerando strings ou inteiros em ordem sequencial

em haskell, listas podem gerar uma sequência de inteiros ou strings apenas usando ellipsis, exemplo:
['1'..'9']++['A'..'F']

não tenho haskell instalado para testar, mas o resultado deveria ser algo como
"123456789ABCDEF"

como em python não tem nenhuma função que se comporte desse maneira, resolvi criar um pequeno exemplo para simular o que o haskell faz


import string

def strint(*args):
    n = []
    for i in [(args[x-2:x]) for x in range(2,len(args)+2,2)]:
        n.append(string.printable[string.printable.index(i[0]) \
        :string.printable.index(i[1])+1])
    return "".join(n)




>>> strint('1','9','a','f')
1: '123456789abcdef'

lembrando que existe string.hexdigits
>>> strint('0','9','a','f','A','F')
9: '0123456789abcdefABCDEF'

>>> strint('0','6','1','3','a','F')
10: '0123456123abcdefghijklmnopqrstuvwxyzABCDEF'





quinta-feira, 1 de julho de 2010

python - twisted - testando a conectividade de uma porta.

um exemplo de como verificar se uma porta de um host está disponivel para conexão

from twisted.internet import reactor, defer, protocol


class CallbackAndDisconnectProtocol(protocol.Protocol):
    def connectionMade(self):
        self.factory.deferred.callback("")
        self.transport.loseConnection()

class ConnectionTestFactory(protocol.ClientFactory):
    protocol = CallbackAndDisconnectProtocol

    def __init__(self):
        self.deferred = defer.Deferred()

    def clientConnectionFailed(self, connector, reason):
        self.deferred.errback(reason)

def conteste(host, port):
    Fabrica = ConnectionTestFactory()
    reactor.connectTCP(host, port, Fabrica)
    return Fabrica.deferred

def sucesso(result,port):
    print "conexao feita com sucesso na porta %i" % port
    reactor.stop()

porta = 80
conn = conteste('google.com',porta)
conn.addCallback(sucesso, porta)
reactor.run()

quando uma conexão é feita, o  ConnectionTestFactory é chamado, então, o connectionMade chama self.factory.deferred.callback("") enviando uma string qualquer, indicando que a conexão foi completada.
na função conteste temos host e port , criamos uma Fabrica e passamos isso para o reactor.connectTCP que faz o teste de conexão e então retorna um atributo Fabrica.deferred  que é um objeto Deferred que retorna se a tentativa de conexão foi bem sucedida.
se a conexão é bem sucedida é chamada a função sucesso, mas o que acontece se a conexão falhar?
o reactor não vai dar resposta alguma ,  para que seja possivel receber uma resposta caso a conexão falhe precisamos adicionar um addEErback "conn.addErrback(função, porta)"
assim como em add.Callback é necessario uma função que imprima na tela uma string que informe que a conexão falhou ao tentar se conectar a porta.

terça-feira, 29 de junho de 2010

twisted - tutorial basico sobre reactor e Deferreds

twisted é uma event-driven framework, isso significa que ao invés de ter as funções dos programas chamados em uma sequência especificada pelo programa logicamente, eles são chamados em resposta a ações externas ou eventos.

por exemplo:
um programa feito em gtk , pode ter um código para responder um evento de 'button pressed' o desenvolvedor desse programa não vai saber exatamente quando tal evento irá ocorrer, mas ele escreve uma função para responder a esse evento sempre que isto ocorrer, essa função é conhecida como event-handler, toda framework orientada a eventos , engloba uma função especial chamada por um event loop , Uma vez iniciado, um event loop executa indefinidamente, enquanto ele está rodando, ele espera por eventos e Quando um evento ocorre, o event loop inicia event handler apropiado.

Usar um event loop requer uma certa habilidade de compreensão por parte do programador
pois é bem diferente da forma tradicional que é uma programação sequencial.
Uma vez que vc inicia um event loop, vc não vai ter o controle diretamente de instruir seu programa de o que fazer, seu programa só vai pode executar ações em resposta a eventos. Por isso , quando você estiver projetando seu programa, vc precisa pensar em termos de eventos e event handler.
No twisted, existe um objeto especial que implementa o event loop,  este objeto é chamado de "reactor" e vc pode imaginar o "reactor" como o sistema nervoso central de uma aplicação twisted, sendo o responsável pelo event loop.
Quando vc roda o reactor com reactor.run() e ele fica esperando algo acontecer, e quando acontece ele chama uma função.

exemplo sobre o objeto reactor:

from twisted.internet import reactor

def tempo(segundos):
    print 'Passaram-se %s segundos...' % segundos

def programa():
    print 'comecou'
    # chama a funcao tempo daqui a 2s, passando como parametro a string 'dois':
    reactor.callLater(2, tempo, 'dois') 

    # chama a funcao tempo daqui a 3s, passando como parametro a string 'tres':
    reactor.callLater(3, tempo, 'tres') 

    # termina o programa daqui a 4s:
    reactor.callLater(4, reactor.stop)

protocol "twisted.internet.protocol" é uma conexão, uma instância da class protocol pode ser instânciada por conexões sobre demanada e podem terminar quando a conexão estiver finalizada.
isso significa que a configuração persistente não é salva em Protocol.

twisted.internet.protocol.Factory
a configuração persistente é mantida na class Factory, no qual geralmente é herdada de
twisted.internet.protocol.Factory.
A class factory padrão instâncía cada Protocol, e então é definido um atributo chamado factory qual é apontado para sí mesmo.
As factories ou fábricas são somente objetos que criam protocolos, a cada conexão, a fábrica cria uma instância separada do protocolo ,isso geralmente é útil por ser capaz de oferecer os mesmo serviços em multiplas portas ou endereços de rede.

Exemplo de uso de factory:
from twisted.internet import reactor, protocol

class ConnectProtocol(protocol.Protocol):
    def connectionMade(self):
        """
        Esta funcao sera chamada automaticamente quando a conexao for 
        estabelecida
        """
        
        print 'Conectei!'
        self.transport.loseConnection() # desconecta
        reactor.stop() # para o loop principal, terminando o programa
        
class ConnectFactory(protocol.ClientFactory):
    protocol = ConnectProtocol
    def clientConnectionFailed(self, connector, reason):
        """
        Esta funcao sera chamada automaticamente se a conexao falhar
        """
        print 'Conexao falhou! Motivo: ', reason.getErrorMessage()
        reactor.stop()
    
f = ConnectFactory()
reactor.connectTCP('google.com', 80, f)

# inicia o programa
reactor.run()

uma breve explicação sobre deferred:
depois de toda essa explicação sobre o reactor, vamos falar sobre deferred.
Deferreds ou como podemos dizer: uma "promessa" de uma resposta, são provavelmente os mais importantes objetos usado no twisted, você ira trabalhar com Deferreds frequentemente em aplicações feitas com twisted, então, é essencial que vc compreenda como isso funciona.
Deferreds pode parecer um pouco confuso de compreender, mas o seu propósito é bem simples, manter o rastro ou melhor dizendo manter uma trilha de ações assíncronas, e receber os resultados assim que forem completados.

Deferreds podem ser ilustrados dessa forma: vc vai ao restaurante, onde vc vai esperar por uma mesa, e imagine que esse restaurante tenha um sistema que possa te informar quando sua mesa estiver disponível, algo como um sistema de pager, então vc terá a liberdade de sair do restaurante e fazer qualquer coisa até que vc receba um beep informando que sua mesa está disponivel, então vc volta para o restaurante e se senta.

Deferred é como um sistema de pager. ele da a seu programa uma forma de encontrar quando algumas tarefas assincronas são finalizadas, em propósito de ter a liberdade de fazer outras coisas durante esse meio tempo. Quando uma função retorna um objeto Deffered, ela está dizendo que vai existir um tempo de espera antes do resultado final de uma função se tornar disponível.
Para se controlar o que acontece quando o resultado se torna disponivel, vc pode determinar event handlers para o Deferred.
mas como seria isso?
seria, escrevendo uma função que inicia uma ação assíncrona que retorna um objeto Deferred.

por exemplo:
se vc dá um getPage pra baixar uma página na internet ao invés de te retornar a página, getPage() te retorna uma instância de Deferred significa que a página ainda não chegou, mas quando chegar, essa "promessa" será cumprida, daí vc adiciona callbacks ao deferred ,  callbacks significa: quando a promessa rolar, chame a função x,  d.addCallback(trataPagina) significa que trataPagina() será chamado quando chegar a página.


um programa exemplo:
from twisted.internet import reactor, defer, protocol

class CallbackAndDisconnectProtocol(protocol.Protocol):

    def connectionMade(self):
        self.factory.deferred.callback("Connected!")
        self.transport.loseConnection( )


class ConnectionTestFactory(protocol.ClientFactory):
    protocol = CallbackAndDisconnectProtocol

    def __init__(self):
        self.deferred = defer.Deferred( )

    def clientConnectionFailed(self, connector, reason):
        self.deferred.errback(reason)

def testConnect(host, port):
    testFactory = ConnectionTestFactory( )
    reactor.connectTCP(host, port, testFactory)
    return testFactory.deferred

def handleSuccess(result, port):
    print "Connected to port %i" % port
    reactor.stop( )

def handleFailure(failure, port):
    print "Error connecting to port %i: %s" % (
        port, failure.getErrorMessage( ))
    reactor.stop( )

if __name__ == "__main__":
    import sys
    if not len(sys.argv) == 3:
        print "Usage: connectiontest.py host port"
        sys.exit(1)

    host = sys.argv[1]
    port = int(sys.argv[2])
    connecting = testConnect(host, port)
    connecting.addCallback(handleSuccess, port)
    connecting.addErrback(handleFailure, port)
    reactor.run( )

$ python foo.py google.com 80

Connection to port 80.




como já foi dito, cada deferred é uma "promessa" de uma resposta, vc pode usar a palavra "promessa".
vc pode adicionar quantos callbacks quiser a um deferred, todos serão chamados na ordem
o que um callback retornar passa pro próximo callback , mas só começa a sequencia de chamadas quando a promessa se cumprir.
no entanto, se você mesmo criar o deferred exemplo: com defer.Deferred() aí é vc que está prometendo
logo quando acontecer o que for que você estiver promentendo, vc tem que iniciar a chamada da sequência de callbacks
meuDeferred = defer.Deferred() ; e na hora certa... meuDeferred.callback('dados')
isso vai chamar o primeiro callback que foi adicionado a meuDeferred, passando como parâmetro "dados"
uma instância de deferred é uma promessa de algo que vai acontecer
é um objeto que representa a promessa, nele vc pode adicionar callbacks,
que são o que vc quer que aconteça quando a promessa for cumprida.

em
def __init__(self):
self.deferred = defer.Deferred( )

deferred é criado

em
self.factory.deferred.callback("Connected!")
o deferred é definido como atributo da factory
quando a factory cria o protocolo, ela se coloca como atributo do protocolo automaticamente
então, em self.factory.deferred.callback("Connected!"), self.factory é a factory
self.factory.deferred é o self.deferred da factory

em class ConnectionTestFactory(protocol.ClientFactory):
no corpo da fábrica o programa define protocol = CallbackAndDisconnectProtocol
então significa que o protocolo que essa fábrica vai criar será o CallbackAndDisconnectProtocol
significa que cada vez que essa fábrica conectar, uma instância de CallbackAndDisconnectProtocol será criada para gerenciar esta conexão

no __main__
em
função testConnect
essa função cria uma instância da fábrica
testFactory = ConnectionTestFactory()
isso chama o __init__ da fábrica
no __init__ da fábrica, é criado um deferred, uma promessa
self.deferred = defer.Deferred()
como já foi dito, esse deferred é armazenado como atributo da fábrica

em seguida, a função testConnect, manda o reactor fazer uma conexão via TCP/IP
usando essa fábrica para gerenciar as conexões
ou seja, quando o reactor conseguir conectar, ele vai mandar a fábrica criar um protocolo
a fábrica então vai criar o protocolo CallbackAndDisconnectProtocol
que foi o protocolo definido na definição da fábrica
vc passa a fábrica pro reactor
quando conectar, a fábrica vai criar um protocolo, pode demorar a conexão, o programa não para esperando.

em
connecting = testConnect(host, port) , o testConnect retorna o deferred que foi criado na fabrica

em
connecting.addCallback(handleSuccess, port) adiciona um callback chamado handleSuccess a este deferred
o primeiro parâmetro aí, é a função a ser chamada quando o deferred for "disparado" o resto dos parâmetros, são parâmetros extra que serão passados a essa função  e vc pode colocar quantos parâmetros quiser.
toda deferred quando dispara, recebe 1 parâmetro, o restante são parâmetros definidos quando vc adicionou o callback ao deferred, quando ele dispara o deferred , self.factory.deferred.callback("Connected!") isso está disparando o deferred
em seguida chama o handleSuccess, o parâmetro result de handleSuccess (primeiro parâmetro) recebe o "Connected!"

em
connecting.addErrback(handleFailure, port) adiciona um Errback caso haja uma falha, óbivio.

e por fim quando este deferred for cumprido, vai chamar esta função handleSuccess
em seguida, ele roda o reactor, reactor.run() nessa hora, o reactor vai tentar conectar
o programa para e o reactor fica tentando conectar quando o reactor conseguir conectar, vai solicitar que a fábrica crie um protocolo.
A fábrica vai criar uma instância de CallbackAndDisconnectProtocol e em seguida o reactor vai chamar connectionMade no protocolo criado para indicar que a conexão foi estabelecida.
a função connectionMade,ela cumpre a promessa do deferred, ela diz assim: beleza, consegui conectar.
esse parâmetro "Connected!" é passado para os callbacks dessa deferred , no caso ,  ele vai cair no parametro "result" de handleSuccess o handleSuccess não faz nada com ele , todo callback de deferred recebe um parâmetro qualquer, poderia ser None mas no exemplo foi passado uma string, poderia ser qualquer objeto.

segunda-feira, 14 de junho de 2010

codepad - facilitando a postagem de códigos.

código em python destinado a facilidade em postar códigos no codepad.
o uso é bem simples, basta copiar algo e em seguida vc executa o código
então ele vai te retornar o link da postagem na área de transferência, é tão simples quanto copiar e colar.

#!/usr/bin/python
import pygtk
#pygtk.require('2.0')
import gtk
import urllib
import urllib2

clipboard = gtk.Clipboard()
content = clipboard.wait_for_text()

url = 'http://codepad.org'
values = {'lang' : 'Python',
          'code' : content,
          'submit':'Submit'}

data = urllib.urlencode(values)
req = urllib2.Request(url, data)
response = urllib2.urlopen(req)
the_page = response.read()

for href in the_page.split(""):
    if "Link:" in href:
        ind=href.index('Link:')
        found = href[ind+5:]
        for i in found.split('">'): 
            if '<a href=' in i:
            link =  i.replace('<a href="',"").strip()
clipboard = gtk.clipboard_get()
text = clipboard.wait_for_text()
text = clipboard.set_text(link)
clipboard.store()
try:
    import pynotify
    if pynotify.init("My Application Name"):
        n = pynotify.Notification("Codepad content",content)
        n.show()
    else:
        print "there was a problem initializing the pynotify module"
except:
        print "you don't seem to have pynotify installed"


segunda-feira, 26 de abril de 2010

python - copiando arquivos de forma simples

copia o conteudo de um arquivo para outro.

def copiar(mecopia, votecopiar):
    mecopia1 = open(mecopia, "r")
    votecopiar1 = open(votecopiar, "w")
    while 1:
        texto = mecopia1.read()
        if texto == "":
            break
        votecopiar1.write(texto)
    mecopia1.close()
    votecopiar1.close()
    return

domingo, 25 de abril de 2010

python - [função] callable()

>>> def test():
...     print 'works'
... 
>>> 
>>> callable(test)
True
>>> if callable(test) is False:
...     print "object is not callable"
... else:
...     print "object is callable"
... 
object is callable

objeto chamável é qualquer objeto sobre qual vc pode usar () como test()

python - [função] bin

>>> bin(1)
'0b1'
>>> bin(100)
'0b1100100'
>>> bin(50)
'0b110010'
>>> bin(123456)
'0b11110001001000000'
converte numeros inteiros em binários