Fleepy – Um Cliente para a API do Fleep

Para quem não sabe, Fleep é um chat que tem como foco ser simples, rápido e almeja substituir o seu email. Já tendo usado Fleep, Slack e Hipchat, todos eles possuem diferentes casos de uso. Mas se você ou seu time precisa lidar com muita gente de fora da sua organização, Fleep é certamente algo a ser considerado já que a sua integração com email é um recurso que permite você adicionar convidados usando seus emails sem que eles necessitem ter uma conta no Fleep ou a aplicação instalada.

Dito isso, estou desenvolvendo um projeto para a Universidade de Tartu e esse projeto necessita que eu use a API do Fleep. É uma API RESTful simples, porém eu não consegui achar um cliente atualizado para ela. Então resolvi criar essa biblioteca em um par de dias.

Ela é extremamente simples e tenta espelhar a API da maneira mais fiel possível.

Alguns exemplos:

Criar uma sala de chat com um tópico e mensagem inicial

O exemplo abaixo loga, cria uma sala de chat com 3 pessoas e envia uma mensagem. A mensagem usa recursos de estilo do Fleep, você pode vê-los aqui.

from fleepy import Fleepy
 
api = Fleepy()
api.account.login("your@email.com", "yourpassword")
 
 
api.conversation.create(
    topic='This is a Room Topic',
    emails=['your@email.com', 'guest1@email.com', 'guest2@email.com'],
    message="""*Hello*, everyone!
 
    Something has just been posted in our Issue tracker.
 
    http://issue.tracker.com<>
    """)
 
api.account.logout()

Fazendo o upload de um arquivo

from fleepy import Fleepy
 
api = Fleepy()
api.account.login("your@email.com", "yourpassword")
 
api.file.upload('/path/to/afile.jpg')
api.account.logout()

O código se encontra em https://github.com/nicholasamorim/fleepy

Use Facebook to Comment on this Post

Arquitetura/Engenharia de Software na Teoria, na Prática, na Guerra

Aviso: Foco em Python. Links em inglês.

Então. Pensei que podia compartilhar uma coleção excelente de vídeos e blogs de engenharia de grandes empresas (Instagram, PayPal, Dropbox, etc…). Nada demais ou segredo, só um post centralizado com algumas coisas interessantes.

Não tem muitos vídeos sobre uma ferramenta “Tal” ou “Aquela Outra Lá” e sim vídeos em um nível mais conceitual. É o que prefiro assistir. Acredito que se você tem um entendimento profundo sobre um determinado tipo de problema, o resto são só ferramentas. Em outras palavras, é primeiro preciso descobrir  se aquilo é de fato um prego para só então correr atrás do martelo.

Entretanto, os blogs de engenharia comumente entram em um pouco mais de detalhes sobre uma ferramenta ou outra. Mas a parte importante é sempre entender porquê escolheram usar uma coisa e não outra. É engraçado perceber enganos que eles cometeram, coisas que às vezes achamos ser impossíveis nesses lugares cheios de talentos.

A escolha de novas (porém testadas) tecnologias pode cumprir um grande papel. Em tempos tão competitivos, pode ser uma advantagem possuir um certo tipo de know-how em tecnologia cutting edge (não tanto, mas vá lá…).

E bem, achei que alguém poderia fazer bom uso disso. Isso é conhecimento no que acredito ser sua mais pura forma: comunitário. Então continuo a passar em frente.

Para os vídeos, eu criei uma playlist (continuarei a adicionar coisas):

https://www.youtube.com/playlist?list=PLm5JiQ4yORZoml627aVKiNa4SO3g9p0l8

Lista de blogs de engenharia:

http://nerds.airbnb.com/
http://techblog.netflix.com/
https://www.paypal-engineering.com/
http://blog.echen.me/
https://codeascraft.com/
https://blogs.dropbox.com/tech/
http://engineering.tumblr.com/
http://code.flickr.net/
http://engineering.quora.com/
https://blog.twitter.com/
http://engineering.foursquare.com/
http://engineering.heroku.com/
http://highscalability.com/
http://instagram-engineering.tumblr.com/
http://engineering.linkedin.com/blog
http://engineering.pinterest.com/
http://feeds.feedburner.com/soundcloudapiblog
https://corner.squareup.com/
https://github.com/blog
http://engineeringblog.yelp.com/

Três agregadores de blogs de Python:

http://planetpython.org/
http://planet.twistedmatrix.com/
http://wiki.python.org.br/planet/

Um agregador de vídeos de conferências de Python (PyCon, DjangoCon, etc…):

http://pyvideo.org/

Se você não sabe, existem vários livros (muito) bons sobre Python e seus usos:

Dive into Python
Think Python
The Hitchhiker’s Guide to Python
Think Complexity
Think Stats
Guide to Data Mining
Test-Driven Development with Python
Text Processing in Python
BioPython Tutorial and Cookbook
Guide to Python Standard Library
Natural Language Processing with Python
Programming Computer Vision with Python

Não é Python, mas é incrível:

The Architecture of Open Source Applications

Python e Algoritmos:

Problem Solving with Algorithms and Data Structures
Data Structures and Algorithms with Object-Oriented Design Patterns in Python

Use Facebook to Comment on this Post

Entendendo Python: Lambda

O que é lambda ?

Lambda não é nada mais que funções anônimas que aceitam argumentos (inclusive opcionais) e que só suportam uma expressão. Ao executar lambda, Python retorna uma função ao invés de atribuí-la à um nome como acontece com def, por isso são anônimas. O conceito e o nome são emprestados de Lisp, uma linguagem funcional.

Hum…. Quê ?

Basicamente, você vai usar lambda quando precisar de uma função que não seja seja complexa o suficiente para criá-la com def. Você pode pensar em lambdas como funções de uma linha só. Como muitas coisas na vida real, é melhor ver na prática para entender. Vamos começar transformando uma função que recebida uma lista de palavras, devolve uma lista com o tamanho de cada uma das palavras.

def size_each(words):
    return [len(w) for w in words]
 
words = ['look', 'so', 'car', 'ice', 'melted']
 
print size_each(words)
>>> [4, 2, 3, 3, 6]
 
size_each = lambda words: [len(w) for w in words]
 
print size_each(words)
>>> [4, 2, 3, 3, 6]

Viu só ? É simples como parece. lambda cria uma função e atribuí ela a variável size_each que passa a ter a função anônima, bastando executá-la; return é implícito. Lambda toma a forma de:

lambda argumento1, argumento2,… argumentoN :expressão usando argumentos

Lambda é uma expressão – Por causa disso, lambda pode aparecer em lugar que um def não pode – dentro de uma lista ou nos argumentos de chamada de uma função, por exemplo. Tal como uma expressão, retorna algo e esse algo é a função em si.

Mundo real

Exemplos didáticos sempre tendem a ser burocráticos e pouco inspirados em casos reais. Tentarei usar um exemplo mais prático aqui.

replace = True
func = replace and (lambda s: s.replace(' ', '_')) or (lambda s: s)
 
phrase = 'Look at the sky, blue mama'
 
print func(phrase)
>>> Look_at_the_sky_blue_mama

Ainda bem burocrático, mas ilustra um bom ponto. Se replace é True, retorna para func a primeira função lambda que aceita um argumento (s) e retorna o mesmo com a devida substituição feita… Se replace é false, retorna a segunda função que simplesmente retorna o argumenento (s) como ele é. Lembre-se, return é implícito em lambdas.

Você pode também ter um dicionário de ações usando lambda… Digamos:

actions = {
    'sum': lambda x, y: x + y,
    'sub': lambda x, y: x - y,
    'mul': lambda x, y: x * y,
}
 
func = actions['sum']
 
print func(10, 20)
>>> 30

Para finalizar, lambda é basicamente uma questão de estilo. Não são necessárias, mas podem ajudar seu código em termos de legibilidade e praticidade. Eu sempre uso lambdas ao invés de várias funções de uma linha só.

Espero que tenha ficado claro o suficiente e que possa usar lambda para melhorar seu código. Uma vez passado o susto inicial, lambdas podem ser suas melhores amigas ao lado de list comprehensions.

Use Facebook to Comment on this Post

Tratando XML como um objeto Python

Algumas vezes, o XML como ele vem é praticamente o que você precisa, sem necessidade de parsear o XML para suas necessidades. Algum tempo atrás eu enfrentei esse “problema”, não queria fazer o parsing do XML pois o formato dele já atendia minhas necessidades. Existem algumas soluções, mas todas precisam do DTD do XML para poderem converter a árvore do XML em objetos. Felizmente, o lxml (sempre ele) veio a salvação. É realmente a melhor biblioteca XML do Python.

from lxml import objectify
 
xml = """
<test>
<inside>2</inside>
<another>
<deep>so deep</deep>
</another>
</test>"""
 
obj = objectify.fromstring(xml)
 
print obj.inside
print obj.another.deep

E você ainda pode percorrer as tags filhas e tudo mais, nada muda.

Use Facebook to Comment on this Post