Pesquisar este blog

domingo, 28 de fevereiro de 2010

PyDev+Eclipse+Django=bom!

Senhores, esses dias tive a boa idéia de instalar 1gb adicional de memória em meu humilde notebook. Esta feliz decisão me proporcionou mais resultados práticos do que esperava. Além de um computador mais rápido e sem "travadinhas", uma série de programas que eu não utilizava devido ao seu consumo insaciável de memória agora passaram a ser excelentes opções para mim. E quando eu falo de programas, eu me refiro a ferramentas de desenvolvimento.

Sempre gostei de testar IDE's de todo gênero. Escritas em Python, Java, C/C++, etc. O eclipse, feito em Java, é uma delas. Na época, eu queria usar o PyDev com o eclipse para desenvolver meus aplicativos, incluindo aplicativos django. Acontece que, com apenas 1Gb de memória, utilizar o eclipse era lento e tedioso. O tempo passou, adiquiri meu novo gigabyte e as coisas melhoraram. A IDE está rápida e rodando perfeitamente. Devido a este fato maravilhoso, resolvi escrever essa postagem explicando como integrar o eclipse, pydev e django, para o desenvolvimento rápido e prátivo de aplicativos.

O eclipse é conhecido de muita gente. IDE rápida, multiplataforma, escrita em Java e acompanhada de uma infinidade de plugins, ela te permite desenvolver em várias tecnologias de forma prática. Dentre essas tecnologias, está o python. Munido do plugin PyDev, que pode instalado fácilmente pelo gerenciador de plugins, como descrito na página do mesmo, é possível escrever código python com highlight e codecompletition, suporte a projetos, edição de arquivos tipicamente web (css, html, xml, etc) dentre outras funcionalidades. Até aqui, tudo bem. O grande (táh, médio...) segredo está em criar e gerir projetos django com facilidade. Como se faz isso? Fácil! 

Para criar e gerir um projeto Django com o eclipse, inicie um projeto django qualquer (django-admin startproject) e através do menu:
File => New -> Project
crie um projeto simples. Em "Use default location", aponte para o diretório do projeto django que você criou e conclua. Certifique-se que o pydev está instalado (a url do update manager é: http://pydev.org/updates) e configurado (window=>preferences->interpreter python) e mude o perfil para pydev.

Mude para o perfil do pydev clicando no ícone acima, em destaque.

Na coluna a esquerda, onde está o seu projeto, clique com o botão direito e vá na opção properties.

Nela, vá na opção Run/Debug Settings e adicione uma configuração do tipo Python Run. É aqui onde ocorre a mágica. Nesta tela você irá configurar os comandos para iniciar o servidor local do django e a sincronia do banco. Outros comandos podem ser adicionados também.

Basicamente você vai configurar o caminho para seu projeto, o caminho para o arquivo manage.py e os argumentos na tela de argumentos. Algo assim, funciona:


Você pode mudar runserver por syncdb ou outro comando.

Clique no botão de run (o verde com um triângulo, perto do menu) e adicione seus comandos prediletos. No meu caso, RunServer e SyncDB podem ser encontrados lá. 

Bem, basicamente, é isso. Adicione também o plugin de edição de HTML/CSS/ETC e seja feliz! ; )

dica:  em "Main module" utilize ${project_loc}/manage.py ao invés de workspace_loc.

segunda-feira, 22 de fevereiro de 2010

Fatos da vida...

Enquanto eu lia sobre fatos da vida (não da minha) importantíssimos para a raça humana (http://www.onlineschools.org/blog/15-breasts/breasts.gif), lembrei que meus estudos estão precisando de uma adiantada. Após alguns longos minutos brigando com o Turbogears2 para utilizar o Jinja2 como template engine (sem sucesso...), resolvi dar uma recauchutada no Java.

Como não poderia deixar de ser, fui atrás do que havia de mais novo e mais "tchan" em frameworks web, que é o que está dando bom dinheiro hoje em dia. Com o que me deparei? Basicamente, com o Grails, que é um framework "a lá" rails escrito em Groovy, uma linguagem horrorosa que alguém muito c****** resolveu fazer para estragar o meu dia.

Acho que Groovy é até pior que Ruby. Linguagem mutante feia do caramba. De quebra o Leonardo Pires, amigo meu, que vez por outrasome, me mostrou uma linguagem mais feia ainda, ObjectiveC. Quem quiser ver como não fazer as coisas, leia sobre ObjectiveC. 

De qualquer forma, isso fez com que meus planos mudassem. Grails é mau porque usa Groovy. Então volto para o digníssimo Java, que, com todos os seus defeitos, ainda é uma linguagem legal. De framework web "joinha" para Java existe o MyFaces, velho companheiro de guerra, e o Play! que parece bem interessante, pois procura implementar funcionalidades legais vistas em frameworks escritos em linguagens de altíssimo nível, com Java.

Não sei se o Play! vai pegar no mercado Cearense, que só sabe copiar o mercado do sul e sudeste, mas por enquanto, vou estudar esse framework e ver no que dá. Se tudo der certo, coloco um tutorial aqui depois. 

ps: diferente dos meus posts anteriores, que tinham alguma utilidade, esse aqui é mais um relato de estudo e um aviso sobre quão ruins algumas linguagens conseguem ser.

ps2: Grails não é novo, mas como saiu a nova versão a pouco e talz, rsrsrs, coloquei que ele é novo. 

quarta-feira, 17 de fevereiro de 2010

Por que o CleverCSS é legal e como você pode ser também!

Senhores, hoje a postagem é sobre gerador de código CSS. Não me refiro aos editores gráficos poderosos que algumas empresas como a Adobe fornecem. Nosso foco hoje é o CleverCSS, uma biblioteca escrita em python que permite gerar código CSS de forma rápida e bastante maleável.

A grade idéia do CleverCSS é possibilitar a codificação de arquivos CSS fazendo uso fruto das facilidades de linguagens de programação, como funções e variáveis. Por exemplo, já pensou ser capaz de mudar todo o esquema de cores de seu site mudando apenas uma variável de um arquivo em formato CleverCSS?

A forma como isso tudo é feito também é bastante interessante. O CCSS se utiliza de uma DSL (domain specific language) bastante semelhante ao próprio css onde você pode definir suas regras de estilo, variáveis e funções (macros). Essa DSL, como não poderia deixar de ser, tem sua estrutura semelhante a uma mistura de python com CSS. Do python, foi retirada a identação, que serve para definir os blocos de regras de estilo, substituindo os usuáis caracteres de chave.

Do CSS foi retirado quase todo o resto. Vejamos uma regra simples, escrita em formato clevercss:
variavel = red
a:
    color: $variavel
    &:hover:
        color: $variavel.brighten()
Na primeira linha, temos a definição da variável variavel que irá guardar o valor de red, que já é definido (igual seria no css puro). Em seguida, temos a declaração do conjunto de regras para tags a. Nessa declaração, utilizamos a identação para definir o bloco com as regras, ou seja, tudo que estiver abaixo de a e dentro de sua identação será aplicado a a.

As regras definidas foram:
  • Todo elemento a deve ter a cor armazenada em $variavel ($ dá acesso ao conteúdo de variavel).
  • Ao ocorrer o evento hover (meta seletores), a cor da variável deve ser $variavel, só que mais clara (a macro brighten devolve a cor armazenada na variável 20% mais clara).
Caso você tivesse um site grande que usasse um padrão de cores composto por duas ou três cores, o exemplo acima poderia lhe ser bastante útil pois você poderia utilizar com diferentes graus de claridade baseados no esquema do site sem ter que escrever as cores toda vez.

Além do brighten, outro método interessante é o darken, que permite obter o valor da cor da variável escurecido em 20%. Ambos os métodos aceitam como argumento o grau de clareamento ou escurecimento da cor. Caso você queira que variável seja clareada em 10%, você escreveria: $variavel.brighten(10).

Um detalhe importante é que, código em formato CleverCSS não pode ser utilizado diretamente nos seus arquivos HTML. Eles devem ser primeiro convertidos para o formato CSS antes de serem utilizados. Para isso, você pode codificar seu próprio script de conversão, pode usar uma variação deste script, disponível no site do pocoo:




Ou pode utilizar o seguinte snippet:



Outros exemplos, tipos e macros são possíveis e estão definidos na DSL. Para uma referência mais completa, veja: http://sandbox.pocoo.org/clevercss/. 
Abraço senhores! 

sexta-feira, 5 de fevereiro de 2010

Como tornar seu projeto django mais rápido!

Hoje a postagem é direcionada para quem já sabe django e quer melhorar o desempenho de uma aplicação sua. Existem diversas formas de se melhorar o desempenho geral de uma aplicação Django, entretanto, vou falar de duas técnicas bastante simples e eficazes. 

Quando se fala em melhorar o desempenho de uma aplicação, desenvolvedores com background em outras linguagens e frameworks logo pensam em adicionar cache e "melhorar o sql" das consultas. Em Django, esta não é uma forma eficiente de fazer as coisas. 

O fato de nem todo site necessitar de cache e do cache, às vezes, não poder ser usado, por possibilitar retornar dados previamente carregados quando a última informação do banco deve ser mostrada sempre, são argumentos pertinentes contra o uso de cache. Quanto a melhorar o SQL, em Django, que possui um ORM poderoso, responsável por cuidar de todo o SQL gerado, esse se torna uma melhoria que muitas vezes terá impacto imperceptível. Se você não estiver bastante conciente sobre os acessos mais comuns ao seu site e sobre a complexidade de suas querys, outras formas mais simples de melhoramento podem ser adicionadas ao seu projeto.

Evite usar locals()

No Django, normalmente, cada view é uma função responsável por receber uma requisição e retornar uma resposta adequada. A forma mais usual de retornar essas respostas é através da função render_to_response, que se encarrega de carregar o arquivo com o template Django, populá-lo com os dados de um dicionário e retorná-lo utilizando o mimetype adequado. O problema aqui está na forma como o render_to_response pode ser usado.  Vejamos a assinatura do método:
render_to_response(template[, dictionary][, context_instance][, mimetype])
Assinatura simples, com poucos argumentos. template é o nome do arquivo (html, por exemplo) que será renderizado, enquanto dictionary é um dicionário com todas as variáveis que serão disponibilizadas no template. O problema ocorre quando, para o argumento dictionary, é usado o resultado do método locals(), que retorna todas as variáveis locais. Isso ocasiona que, ao invés de usar apenas as variáveis pertinentes na renderização do template, tudo que estiver como variável local também será fornecido como argumento, tornando a busca de valores das variáveis menos eficiente e diminuindo a qualidade do código. Então, primeira regra, não use o locals no render_to_response. 

Utilize o middleware Gzip

A utilização do middleware Gzip é uma das formas mais fáceis e rápidas de melhorar o desempenho geral de um projeto django. A integração deste middleware no seu projeto fará com que os dados enviados ao navegador do usuário sejam compactados com gzip antes de ser enviados. Isso permite diminuir o tráfico geral de dados consideravelmente. Como adicionar o middleware gzip a um projeto é muito fácil, ele é a melhor forma de melhorar o desempenho de um projeto rápidamente. 

Para adicioná-lo a um projeto, edite o arquivo settings.py adicionado:

'django.middleware.gzip.GZipMiddleware',

ao seu dicionário MIDDLEWARE_CLASSES.

Além destas duas dicas simples, outras formas de melhorar o desempenho do seu site são:
  • utilizar o wsgi em detrimento ao mod_python
  • servir o conteúdo estático do seu site diretamente pelo servidor
  • não utilizar o método len() em querysets sem necessidade
Bem senhores, é isso. Espero ter ajudado. Abraço e comentem!