Showing posts with label django. Show all posts
Showing posts with label django. Show all posts

Monday, August 19, 2013

Writing a django json propery serializer

Writing a django json PROPERTY serializer.

So, what's up? This will be my first blog post in english, and for the rest of my writing here in this blog that the language i'll use. The main reason is because most of the traffic that is coming here is from people outside my home land (which is Brazil).

Anyway, this blog post is about the django framework, well not exactly the framework itself but a little part that i use daily.
But before the code! A little background showing the why i did this...

Most of my time i use PHP as my main programming language to write web software (not that i like that, but anyway... i have to). Right at the beginning we (means me and my coworkers) start using Zend Framework to write our web apps, and we return JSON strings as part of the response. Simply because we used ExtJs togheter! Pretty slick at that time, but also pretty heavy (ok, not that much).
Since then i've been learn more and more about python e django to the point that they bacame my main programming language (and framework, off course) used to make my hobbiest projects! :D

So, there came the need of write my own JsonSerializer, because django default serializer don't serialize propertys... for me, propertys are a way to enhance the data viewed by a user inside a grid.
Nowdays i dont use anymore ExtJs (perhaps ill use in future projects), but i build my own jquery grid! (ill put this code on github, since i make some cleanup!) But this little grid jquery plugin still eat up JSON as the main format.

And that's why i change the default JsonSerializer and made this PropertyJsonSerializer!
Anyway... here's the fucking code! And if you dear reader find any bugs on this... write that up on the comments or use the gist tool...

JsonPropertySerializer.py
https://gist.github.com/rdenadai/6095815

thanks a lot!

Monday, September 17, 2012

Melhorando a performance de sistemas web.


Melhorando a performance de sistemas web.

Com a grande migração de muitos sistemas para a internet após o ano 2000, muitas técnicas foram propostas para a melhoria no processo de carregamento de sistemas web. Essas melhorias visam, claro, uma melhor performance de acesso para os usuários dos sistemas.
Nesse post irei tratar de algumas técnicas que são principais, de fácil identificação e que podem ser implantadas rapidamente. Um detalhe importante é que todas as informações colocadas aqui são as mais simples possíveis, por conseguinte se forem implantadas em ambientes de produção pode vir a ser necessário algum tipo de análise de segurança (não que todas irão precisar claro!). Por onde começar?


Um start interessante é instalar estas duas ferramentas, as quais irão proporcionar uma visão de como nossa página é carregada e sugerir melhorias a serem feitas:


Após isso, comece realmente a melhorar sua performance!


Minify your files!!!

A primeira técnica e que considero a mais simples de todas, é minificar e agrupar seus arquivos estáticos. Mas o que são arquivos estáticos? Eles são como páginas estáticas (Static Web Pages[1]), ou seja seu conteúdo não muda de acordo com o acesso. Os exemplos mais comuns são arquivos javascript, css e imagens!
Normalmente esses arquivos não são tratados para contemplar esse tipo de situação, e isso pode vir a se tornar um problema de payload[2] conforme vamos adicionando mais e mais bibliotecas, classes e imagens sem otimiza-los.
Algumas soluções para esse problema se resumem em minimizar manualmente os arquivos usando ferramentas como (estes são os top 4 na minha busca do Google) e posteriormente agrupando todos em 1 (um) só arquivo:

Javascript


CSS:


Dentre os outros milhões de ferramentas online, eles podem nos ajudar a melhorar a performance de nossa aplicação no que concerne no carregamento da bibliotecas e códigos que utilizamos, mas não são nem um pouco produtivos, pois devemos fazer manualmente essa cópia e compressão e ainda precisamos manter 2 (dois) arquivos (o original e o minificado).
Como melhorar isso? E sermos mais produtivos?

Podemos utilizar ferramentas automáticas que façam isso, alternativas é o que não faltam também. Particularmente conheço muito poucas ferramentas desse tipo em PHP, mas uma me chamou ultimamente:


A idéia aqui é a mesma, otimizar e automatizar a minificação dos arquivos estáticos, lembrando que ele não serve para imagens, mas sim para javascript e css.
Em outras linguagens temos alternativas ja incorporadas nos frameworks (que não é necessariamente o caso do Zend Framework[3], mas o minify pode ser usado em conjunto[4]), por exemplo em Django[5] temos um app chamado django-compressor[6] que faz a minificação e agrupamento dos arquivos automaticamente, sendo necessário apenas ativar o package.

Para imagens, podemos utilizar de alguns programas para compressão, alguns exemplos bem interessantes, sugeridos pelo Google são [7]:




GZIP[8] on the fly!

Outra técnica bastante utilizada em sistema/sites da web é de comprimir seus arquivos, aqui vale a máxima de que 10% de redução pode diminuir em muito o payload de seu usuário!
Vou dar um exemplo bem simples e surpreendente, eu utilizo a biblioteca ExtJs[9] que tem um arquivo .js de 1Mb! Isso mesmo, e é 1Mb ja minificado! Usando gzip diminuímos esse payload para 400Kb, ainda é muito? Pode ser, mais é um ganho de 50%. Ou seja 50% menos de carga que um usuário terá de carregar em cada acesso ao sistema.
Devo dizer que o gzip não serve apenas para arquivos estáticos, podemos comprimir todos os arquivos e nossas respostas AJAX[10] também, ou seja, todo nosso site será mais leve para o usuário carregar. O lado ruim? nosso servidor deve aguentar a carga para comprimir todos os dados antes de enviar de volta para nosso usuário.

Para habilitar o gzip em nosso servidor apache devemos apenas habilitar o módulo mod_deflate! Simples não? Claro que tem-se muitas configurações, mas de modo simplista devemos apenas executar em shell:

$ a2enmod deflate

Fazendo isso estamos prontos, todo o conteúdo do nosso site será compresso para cada requisição realizada. Outros servidores podem possuir outras configurações.
Em Django podemos habilitar a compressão via gzip sem precisar interagir com o servidor, para isso basta habilitarmos o middleware GZipMiddleware[11], fazendo com que nosso sistema use script’s em python para a compressão!




Finalizando por aqui...
Seus usuários agradecem, mesmo não sabendo disso... :D!

Estas são duas regras muito simples que podemos habilitar em nossos sistemas, fazendo com que a performance de carregamento seja melhorada.
No próximo post vou tratar sobre o varnish cache e cache headers no apache!








falowaer

Friday, July 13, 2012

Currículum Vitae

Currículum Vitae

Boas! Essa postagem será um pouco mais técnica. Na verdade, nos últimos dias eu fiquei colocando no ar um "site" que na verdade é um currículo online meu. Pois é, você pode se perguntar: Currículo online? Mas não tem vários sites que fazem isso?

A resposta é sim, e ao mesmo tempo não.

Sim, existem vários sites que permitem você colocar la seu currículo, e muitos são bem bacanas! Mas ano passado, eu ouvi e vi um cara falar o seguinte:
"Então você trabalha com informática, e não tem um currículo online que você mesmo fez?"

Fiquei pensando sobre o assunto e cheguei a conclusão de que um currículo online feito por mim mesmo, passa a idéia, de que:
  • Eu sei fazer design de um site, mesmo que pequeno;
  • Sei codificar na linguagem que eu escolher pro meu "site";
  • Sei usar o banco de dados o qual escolhi;
  • Sei configurar, mesmo que basicamente um server.
Realmente eu sei fazer tudo isso, mas como colocar em 1 página A4 todas essas informações e outras mais para alguém avaliar? Alguns podem até afirmar que um currículo extenso vai afugentar os contratantes, mas se você possuir as duas opções (um curriculo em pdf de 1 página A4, e um "site" com uma bela descrição), pode vir a facilitar o contratante, quem se interessar poderia ir la no seu "site" e ler mais sobre você.

Perceba que a intenção não é ser um blog, mas talvez uma página agregadora, com informações extras que você queira colocar, no formato que você escolher!

Bom, finalmente resolvi fazer isso, e pra começar aprendendo mesmo, resolvi usar o heroku!
Como eu gosto muito de python e ja faz um tempinho que o heroku habilitou python la, resolvi que iria utilizar ambos!
Mas ai fiquei com uma dúvida, seria ideal usar o django pra fazer uma mera página? Achei mesmo que não, e acabei escolhendo usar o flask e não me arrependo não. É um framework bem simples, leve e rápido de aprender.
Acabei o "site", ficou muito legal, mas sabe quando você pode melhorar? Foi o que fiz!
Resolvi colocar o mongodb e o mongoengine rodando, para fazer algumas coisas simples e usar para evitar repetição de html (na parte das keywords e livros). Ficou jóia!
Com toda a certeza, ainda tem coisas que posso melhorar e acrescentar, como por exemplos os projetos que tenho online! É, eu tenho uns "programinhas" disponíveis na internet (mais especificamente no Google Code, mas vou coloca-los no github), que podem enriquecer ainda mais meu currículo online, sendo que no pdf A4 de 1 página não caberia (beleza que num tem tanto programa assim neh).

Resumindo? Não espero que consiga altos empregos com isso, mas acredito que possa dar um pouco mais de visibilidade para quem um dia poderá me contratar!


Quer ver como ficou o trabalho "pronto"? Clique aqui!

Na próxima postagem eu coloco todos os passos que fiz!
falowaer ;)