Template Django com Haml
28 de Maio de 2011, 0:00 - sem comentários aindaHaml (HTML Abstraction Markup Language) é uma linguagem simples, que é usado para descrever XHTML de qualquer documento web sem precisar ficar abrindo e fechando tags HTML. Ele foi projetado para resolver muitos dos problemas de templates, bem como fazer marcação tão elegante como ela pode ser.
Em Python temos a biblioteca HamlPy ela pega os files HAML e gera o HTML para usarmos em nossos sistemas.
Vamos logo para a pratica, chega de lero lero.
%html{'xmlns':"http://www.w3.org/1999/xhtml", 'lang':"en", "xml:lang":"en"}
%head
%title Testando Haml
%style{'type': 'text/css'}
body{font-family: verdana;}
%script{'type':'text/javascript', 'src':'https://www.google.com/jsapi?key=ABQIAAAAUgaJsDgRTDbR5vvhnJ3iYBT2yXp_ZAY8_ufC3CFXhHIE1NvwkxS2j2XMXVpjyqg8A7TkHl2W04abvA'}
%script{'type': 'text/javascript'}
google.load("jquery", "1.6.1");
%body
#header
%h1#lero
.test Haml
%ul.navigation
- for run in varloop
%li= run
#content
Testando para ver se funciona o HamlPy
Esse é um layout feito com haml, é muito simples pois não precisamos ficar fechando as tags, assim os erros de html é 100% resolvido, como converte o haml para html:
/Users/avelino/.virtualenvs/haml/bin/hamlpy template/index.haml template/index.html
O binario hamlpy recebe dois parâmetros o primeiro é o input file haml o segunda é o output a saída html, depois de rodarmos o hamlpy temos uma saida da seguinte forma:
<html lang='en' xmlns='http://www.w3.org/1999/xhtml' xml:lang='en'>
<head>
<title>Testando Haml</title>
<style type='text/css'>
body{font-family: verdana;}
</style>
<script src='https://www.google.com/jsapi?key=ABQIAAAAUgaJsDgRTDbR5vvhnJ3iYBT2yXp_ZAY8_ufC3CFXhHIE1NvwkxS2j2XMXVpjyqg8A7TkHl2W04abvA' type='text/javascript'></script>
<script type='text/javascript'>
google.load("jquery", "1.6.1");
</script>
</head>
<body>
<div id='header'>
<h1 id='lero'>
<div class='test'>Haml</div>
<ul class='navigation'>
{% for run in varloop %}
<li>{{ run }}</li>
{% endfor %}
</ul>
</h1>
</div>
<div id='content'>
Testando para ver se funciona o HamlPy
</div>
</body>
</html>
Minha views do Django declaro sempre com o arquivo .html que foi gerado com o hamlpy. Veja como ficou o meu views:
# -*- coding: utf-8 -*-
"""
views
:copyright: (c) 2011 by the Avelino Labs, see Thiago Avelino <thiago@avelino.us> for more details.
:license: BSD, see LICENSE for more details.
"""
from django.shortcuts import render_to_response
from django.template import RequestContext
def index(request):
return render_to_response(
'index.html',
context_instance=RequestContext(request))
Entendendo na pratica como funciona a linguagem Go
25 de Maio de 2011, 0:00 - sem comentários aindaA linguagem Go é um projeto open source para tornar os programadores mais produtivos.
Go foi desenvolvido para utilização maxima do CPU, tornando um processo simples para criar aplicação Multithreaded, o processo de utilização de maquinas na rede para processar determinado programa também é bem simples, assim tornando um software mais flexível e modular.
Vamos montar um servidor HTTPD em Go.
package main
import (
"http";
"io";
"fmt";
)
func HelloServer(c *http.Conn, req *http.Request) {
io.WriteString(c, "hello, world!\n");
}
func main() {
fmt.Printf("http://localhost:8080/hello\n");
http.Handle("/hello", http.HandlerFunc(HelloServer));
err := http.ListenAndServe(":8080", nil);
if err != nil {
panic("ListenAndServe: ", err.String())
}
}
O HelloServer() é o que vai fazer a parte de renderização, o man() ele sobre o servidor HTTP na porta 8080, e caso o usuário tente processar um URL que não esteja no fmt ele vai cair no err onde vai processar o erro e apresentar o panic. Simples assim já temos um servidor HTTP para toda HTTP.
[TOPICOFF] Site fora do ar, DataCenter tirando meu sono
29 de Abril de 2011, 0:00 - sem comentários aindaPeço 1001 desculpas por o Avelino.US ter ficado fora do ar durante os últimos 4 dias.
Depois de 8 mês o DataCenter onde estava meu site ele colocou algumas regrar para serviço contratado daquela data para frente e depois de 2 mês o DataCenter lançou a regra para os que já tinha servidor alugado, ou seja, todos os IP do servidor caiu.
Migramos de DataCenter e não vai mais ocorrer esse tipo de problema.
Upload da arquivo no Google App Engine (BlobProperty)
23 de Abril de 2011, 0:00 - sem comentários aindaEssa semana que passou tive uma necessidade para um sistema de trabalhar com UPLOAD de arquivos, ate ai é simples, só que o sistema estava em Google App Engine, depois de apanhar um pouco resolvi fazer um post aqui no Blog para deixar documentado como não é complicado trabalhar com BlobProperty no BigTable.
Primeiro vamos criar um Modal onde vai ter dois campo o arquivo e o mimetype dele:
class DatastoreFile(db.Model):
data = db.BlobProperty(required=True)
mimetype = db.StringProperty(required=True)
Agora vamos criar a views onde ele vai processar o formulario e o POST do formulario:
class MainHandler(webapp.RequestHandler):
def get(self):
self.response.out.write(template.render("upload.html", {}))
def post(self):
file = self.request.POST['file']
entity = DatastoreFile(data=file.value, mimetype=file.type)
entity.put()
file_url = "http://%s/%d/%s" % (self.request.host, entity.key().id(), file.name)
self.response.out.write("Your uploaded file is now available at %s" % (file_url,))
Podemos notar que na definição get() temos apenas a renderização do "upload.html", o conteudo dele é bem simples, temos um input do tipo file e outro submit:
<html>
<head>
<title>File Upload</title>
</head>
<body>
<form method="post" action="/" enctype="multipart/form-data">
<input type="file" name="file" />
<input type="submit" value="Upload" />
</form>
</body>
</html>
Falando da definição post() que esta na classe MainHandler ela que faz o trabalho de fazer o UPLOAD do arquivo para dentro do BlobProperty, é um processo bem simples, a variável "file" recebe o POST do input file, depois disso chamamos o modal que tem o nome de DatastoreFile passando dois parâmetros que é os dois campos criados, o data e mimetype, depois disso é só fazer o put() que seja salvo no banco de dados. Dentro do post() eu gero o link para download do arquivo na variável file_url, onde passo o HOST (url do sistema), id() (do arquivo que foi feito upload) e file name (Nome do campo que recebeu o arquivo).
Agora temos que fazer a classe para download do arquivo onde vamos mudar o Content-Type do response para o mime-type do arquivo que foi feito o upload, exemplo: fiz o upload de um arquivo no formato JPG o mime type dele é "image/jpeg", então tenho que fazer o responser renderizar em formatado "image/jpeg".
Na URL que montamos para download passamos a seguinte informação id e file name onde temos que criar uma definição get() que receba essas informações:
class DownloadHandler(webapp.RequestHandler):
def get(self, id, filename):
entity = DatastoreFile.get_by_id(int(id))
self.response.headers['Content-Type'] = entity.mimetype
self.response.out.write(entity.data)
Recebendo as duas variáveis podemos fazer um consulta no BigTable de forma simples onde busco o id, pego o retorno do banco de dados e coloco que o response.headers['Content-Type'] é o mime-type que esta salvo no banco e depois é só escrever o arquivo na tela.
Agora vamos criar as rotas da URL:
def main():
application = webapp.WSGIApplication([
('/', MainHandler),
('/(\d+)/(.*)', DownloadHandler)
],debug=True)
util.run_wsgi_app(application)
if __name__ == '__main__':
main()
Quem ainda estiver com duvida pode dar uma olhar no repositorio: https://bitbucket.org/avelino/post_py_upload_de_arquivo_no_gae/src
Criando sistema com Multithreaded em Python
1 de Abril de 2011, 0:00 - sem comentários aindaMultithreaded é quando temos mais de um programa executando ao mesmo tempo, totalmente diferente de executar duas vez o mesmo programa, com "threads" o sistema vai ser executado apenas uma vez e via thread vai processar mais de uma função ao mesmo tempo, isso é necessario para concorrência em sistema.
Algumas vantagens de trabalha com threads:
- Múltiplos processo ao mesmo tempo e pode, portanto, compartilhar informações e comunicar uns com os outros mais facilmente do que se fossem processos separados;
- Menos consumo de memória, pois o mesmo vai consumir mais CPU.
Uma thread tem um começo, meio e fim, assim podemos colocar um ponteiro de instrução para acompanhar onde esta sendo processado cada thread dentro de seu contexto.
- Ela pode ser antecipada (interrompido);
- Pode ser temporariamente suspensos (também conhecido como sleep), enquanto outros segmentos estão em execução - isso é chamado de rendimento.
Iniciando uma nova Thread:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import thread
import time
# Definição da função de thread
def print_time( name, delay):
count = 0
while count < 5:
time.sleep(delay)
count += 1
print "%s: %s" % ( name, time.ctime(time.time()) )
# Criar dois tópicos
try:
thread.start_new_thread( print_time, ("Thread-1", 2, ) )
thread.start_new_thread( print_time, ("Thread-2", 4, ) )
except:
print "Erro: não conseguiu iniciar a thread"
while 1:
pass
Executando:
avelino:multithreading/ [11:01:01] $ python example.py
Thread-1: Thu Mar 31 11:03:20 2011
Thread-2: Thu Mar 31 11:03:22 2011
Thread-1: Thu Mar 31 11:03:22 2011
Thread-1: Thu Mar 31 11:03:24 2011
Thread-2: Thu Mar 31 11:03:26 2011
Thread-1: Thu Mar 31 11:03:26 2011
Thread-1: Thu Mar 31 11:03:28 2011
Thread-2: Thu Mar 31 11:03:30 2011
Thread-2: Thu Mar 31 11:03:34 2011
Thread-2: Thu Mar 31 11:03:38 2011
Se repararmos temos alguns processo concorrendo ao mesmo tempos, dessa forma já estamos trabalhando com Thread.
Modulos da biblioteca thread
- threading.activeCount(): Retorna o número de objetos de thread que estão ativos.
- threading.currentThread(): Retorna o número de objetos de thread no controle do chamador de thread.
- threading.enumerate(): Retorna uma lista de todos os objetos de thread que estão atualmente activas.
- run(): Método é o ponto de partida para uma thread.
- start(): Método inicia uma thread, chamando o método de execução.
- join([time]): Espera para terminar.
- isAlive(): Método verifica se uma thread ainda está em execução.
- getName(): Método retorno o nome de uma thread.
- setName(): Método declaro o nome de um thread.
Trabalhando com Python e MongoDB
28 de Março de 2011, 0:00 - sem comentários aindaHoje MongoDB está começando ficar bem comentado na internet (famosos Database NoSQL). Tenho bastante aplicações em produção trabalhando com MongoDB e outros database NoSQL ambas escrita em Python, vou escrever um pouco como usar o MongoDB na linguagem Python.
Como em qualquer outra linguagem, não tem muito segredo. No Python temos a LIB chamada PyMongo, que simplifica muito o trabalho do programador.
Contando que o PyMongo já estejá instalado, seguimos em frente.
Como fazer um conexão:
>>> from pymongo import Connection
>>> connection = Connection()
OU
>>> connection = Connection('localhost', 27017)
Usar/Criar um Database: >>> db = connection.forum_database
OU
>>> db = connection['forum-database']
O MongoDB usa um formato jSON para sua syntax, veja abaixo:
>>> forum = {"author": "Thiago Avelino",
... "text": "Python e MongoDB",
... "tags": ["mongodb", "python", "pymongo"]}
Inserindo em um Documento, usando o método insert():
>>> imaster = db.imaster
>>> imaster.insert(forum)
ObjectId('4c7400f42d73303fd2000000')
Após rodar o insert() ele criou um documento fisico no servidor, podemos ver este registro da seguinte forma:
>>> db.collection_names()
[u'imaster', u'system.indexes']
Selecionando apenas um documento com find_one()
>>> imaster.find_one()
{u'text': u'Python e MongoDB', u'_id': ObjectId('4c7400f42d73303fd2000000'), u'author': u'Thiago Avelino', u'tags': [u'mongodb', u'python', u'pymongo']}
Filtrando, usando condições para selecionar:
>>> imaster.find_one({"author": "Thiago Avelino"})
{u'text': u'Python e MongoDB', u'_id': ObjectId('4c7400f42d73303fd2000000'), u'author': u'Thiago Avelino', u'tags': [u'mongodb', u'python', u'pymongo']}
Contando:
>>> imaster.count()
1
Temos também alguns ORM Python que trabalha com o MongoDB, um exemplo é o MongoEngine que trabalha exatamente igual o ORM do Django. Veja um exemplo usando MongoEngine:
class BlogPost(Document):
title = StringField(required=True, max_length=200)
posted = DateTimeField(default=datetime.datetime.now)
tags = ListField(StringField(max_length=50))
class TextPost(BlogPost):
content = StringField(required=True)
class LinkPost(BlogPost):
url = StringField(required=True)
# Create a text-based post
>>> post1 = TextPost(title='Using MongoEngine', content='See the tutorial')
>>> post1.tags = ['mongodb', 'mongoengine']
>>> post1.save()
# Create a link-based post
>>> post2 = LinkPost(title='MongoEngine Docs', url='hmarr.com/mongoengine')
>>> post2.tags = ['mongoengine', 'documentation']
>>> post2.save()
# Iterate over all posts using the BlogPost superclass
>>> for post in BlogPost.objects:
... print '===', post.title, '==='
... if isinstance(post, TextPost):
... print post.content
... elif isinstance(post, LinkPost):
... print 'Link:', post.url
... print
...
=== Using MongoEngine ===
See the tutorial
=== MongoEngine Docs ===
Link: hmarr.com/mongoengine
>>> len(BlogPost.objects)
2
>>> len(HtmlPost.objects)
1
>>> len(LinkPost.objects)
1
# Find tagged posts
>>> len(BlogPost.objects(tags='mongoengine'))
2
>>> len(BlogPost.objects(tags='mongodb'))
1
Certificado EV SSL
28 de Março de 2011, 0:00 - sem comentários aindaCertificados Digitais EV SSL, ou em português SSL de Validação Avançada, são certificados qualificados que se apresentam aos usuários da Internet de forma distinta dos demais certificados, garantindo assim aos usuários que o site acessado possui um certificado SSL emitido segundo um processo altamente seguro e verificado através de uma auditoria.
História
O Comércio via Internet está enfrentando uma crise de segurança. A confiança na segurança de sites está diminuindo, e o número de consumidores que estão deixando de fazer transações on-line está aumentando. Segundo o instituto Forrester Research, ao final de 2005, 24% dos usuários de Internet não compraria via web para os feriados de final de ano pois não se sentiam seguros e 61% reportou que haviam reduzido as compras online por algum motivo.
Agora em 2007 empresas com operações online poderão mostrar definitivamente sua identidade para os seus clientes – e os clientes poderão confirmar esta identidade antes de confiar no site. Essa oportunidade se deve ao resultado da grande evolução no backbone de segurança WEB nos últimos 10 anos. É a introdução de um novo tipo de certificado SSL, o primeiro desde a origem desta tecnologia há mais de uma década atrás.
Estes novos certificados são chamados Certificados Extended Validation SSL e eles representam mais de um ano de esforços feitos pelo CA/Browser Fórum, um consórcio de empresas líderes em manutenção de Browser e Autoridades Certificadoras de SSL. Os Certificados EV SSL irão facilitar o comércio online em todas as suas formas, aumentando a confiança dos usuários, legitimando sites e reduzindo significativamente a eficácia dos ataques de fraude e roubo de senha.
EV SSL no Brasil
No Brasil o certificado está sendo comercializado pela Certisign, Unicert, Comodo e Secsign. Até o final do ano estima-se que do total de vendas de certificados para servidores, 20% sejam no modelo EV SSL. Segundo a projeção da Certisign, isso significa a venda de quase 4.500 certificados.
Espera-se que no prazo de dois anos todas as empresas que se prestam a realizar transações on-line (como sites de e-commerce, bancos, etc...) adotem este produto, pois ele garante identificação visual, maior segurança e conforto para o consumidor.
Coding Dojo o melhor lugar para pratica Programação
21 de Fevereiro de 2011, 0:00 - sem comentários aindaNós da Comunidade Python São Paulo estamos no 10' Dojo.Parabéns a todos os organizadores e participantes.
Agradeço a todas as empresa que abriu a porta para nós da Comunidade Python São Paulo poder realizar o Coding Dojo.
Dojo é uma reunião onde um grupo de programadores se reúnem para trabalhar em um desafio de programação. Eles estão lá para se divertir e se envolver em prática a fim de melhorar suas habilidades.
Veja a baixo videos gravado no 10' Dojo da Comunidade Python São Paulo onde foi realizado na empresa Gonow Tecnologia:
Veja o post completo que foi postado no Blog da Gonow.
Meu ambiente de trabalho em 7 itens
20 de Fevereiro de 2011, 0:00 - sem comentários aindaO Licio me convidou para entrar no ritmo dos "7 itens" então vamos lá...-
GIT + Mercurial
Geralmente procuro usar Mercurial no Bitbucket mas costumo usar bastante Git no Github. Uso o Github porque vejo ele muito mais do que um espaço para criar repositórios, e sim uma rede social de Desenvolvedor.
-
VIM
Depois de muito testar o Emacs, TextMate e VIM, resolvi afirma que para mim o melhor é o VIM, consigo fazer tudo que preciso e não tenho tantos problemas com " como no TextMate. Falando um pouco sobre o Emacs, realmente é um ótimo editor, só que cansa brincar de street fighter quando vou programar (Para os que conhece Emacs vai entender).
Depois de conhecer o QMX (Evangelista VIM) comecei ver o VIM como um ótimo editor.
-
OS X
Depois de passar muito tempo com ambiente Linux, vi que não bastava a simplicidade de um gerenciamento de pacote como yum ou apt-get e sim um sistema onde conseguisse uma melhor integração com a camada de hardware. Por isso hoje uso Macbook, com o sistema operacional OS X.
E a bateria dura muito mais tempo do que qual quer outro Notebook que eu tive.
-
iterm2 + homebrew
Utilizo o iterm2 como terminal do meu Mac e tem me agradado muito a parte de troca de abas, como gerenciador de pacote utilizo o homebrew (que me foi apresentado pelo Fabio Akita, automaticamente já sabemos que é escrito em Ruby :/ )
-
pip + virtualenv + virtualenvwrapper
Como sou desenvolvedor Python não temos trabalhar com ultiplos projetos sem um Virtualenv para isolar meus ambientes para cada projeto, o Virtualenvwrapper uso para simplificar a criação de cada ambiente e o pip uso para instalar bibliotecas Python.
-
Dropbox
Realmente o Dropbox me salvou muitas vezes, com o uso dele não preciso ficar levando pen drive para cliente ou qual quer local que eu for.
- Google Apps (Gmail) Não sei qualificar quantos % da minha vida profissional esta encima do Google Apps, mas sei que tem muita coisa lá.
Agora para seguir com o meme, convido meus amigos:
Christiano Anderson
Bruno Rocha
Bernardo Heynemann
Rodrigo Bernardo Pimentel
Curso Desenvolvimento ágil com Django
27 de Janeiro de 2011, 0:00 - sem comentários aindaComece a desenvolver com um framework de alto nível, que estimula o desenvolvimento rápido e limpo. Aprenda Django agora!O Curso esta no valor de R$ 69,00.
No curso explico como fazer um site completo com Django onde contemplo valores que o profissional vai usar no desenvolvimento de sistemas, no curso tem materiais suficiente para que você possa criar e ajuda qual quer projeto Open Source escrito em Python e Django.
O curso esta sendo realizado com apoio do iMasters Pro onde temos outros curso com uma qualidade excelente.