terça-feira, 14 de agosto de 2012

Forçando atualizações contra vontade do Pagespeed


O PageSpeed, ferramenta muito útil que compacta e une arquivos estáticos( css, js, etc) às vezes atrapalha um pouco durante o desenvolvimento.

Depois de alguma alteração, e o envio da mesma no servidor, o antigo arquivo ainda é executado, devido ao cache desta ferramenta.

Para isso basta utilizar o filtro abaixo:



import os
from django import template
from django.utils import version
from django.conf import settings

register = template.Library()

@register.simple_tag
def revision_number():
    rev = version.get_svn_revision(settings.STATIC_PATH)
    return rev.split('-')[1]
Lembre-se de configurar o STATIC_PATH para o caminho de seus arquivos estáticos no settings.py.

E no html onde fizer a requisição do arquivo adcionar um parâmetro por GET para forçar uma nova atualização:
<script type="text/javascript" src="/static/site/js/js_all.js?v={% revision_number %}"></script>

<link rel="stylesheet" type="text/css" href="/static/site/style.css?v={% revision_number %}" media="all" />


hasta!

segunda-feira, 2 de julho de 2012

Como criar um decorator


Decorators são muito úteis quando se precisa de certas condições antes da execução de determinadas views, como por exemplo, views que obrigam o usuário estar logado para ter acesso, tais como Meus Pedidos, Meu Painel,  etc.
Para isso utiliza-se o decorator login_required, disponível no pacote django.contrib.auth.decorators. Basta adicioná-lo antes da view desejada da seguinte forma:

@login_required
def sua_view(request):
     #seu código aqui
Também é possível criar decorators personalizados, para verificar certas situações, como preenchimento completo de algum cadastro, se o cliente está com a assinatura de conteúdo em dia, etc. Para criar um decorator, basta fazê-lo da como mostra o exemplo abaixo, em qualquer arquivo ".py". Recomendo criar um arquivo separado para isso.

Exemplo:

Crie um arquivo admin.py na raiz do seu projeto com o seguinte conteúdo:
def nome_decorator(f):
     def verifica(request, *args, **kwargs):
          if <CONDICAO DE FALHA A SER TESTADA>
               # INTERROMPE O FLUXO NORMAL E NÃO EXECUTA A VIEW ASSOCIADA
          else:
               # CONDICAO DE SUCESSO, RETORNA AO FLUXO NORMAL
               return f(request, *args, **kwargs)
     verifica.__doc__= f.__doc__
     verifica.__name__= f.__name__
     return verifica

Em seu arquivo views.py, onde existe a view a ser associada ao decorator utilize:

from admin import nome_decorator

@nome_decorator
def sua_view(request):
     #seu código aqui
Fique atento para o caminho da importação do decorator, dependendo de onde salvar, pode ser que haja alteração a ser feita na linha de import.


Pode ser que precise de 2 decorators para uma mesma view como no exemplo abaixo:



@login_required
@nome_decorator
def sua_view(request):
     #seu código aqui


Para estes casos, as validações se darão na ordem que forem colocados os decorators, de cima pra baixo, ou seja, para o exemplo acima, primeiro será avaliado se o visitante está logado para depois verificar as condições colocadas no decorator personalizado que foi criado.


hasta!

sexta-feira, 18 de maio de 2012

Sublime Text 2: Meu (provavelmente) Último Editor

A tempos procurava um editor com recursos interessantes para aumentar a produtividade. Tomei conhecimento do TextMate do Mac e muito me interesssei. No ambiente de trabalho por ser Windows ( triste, eu sei ), buscava algo similar. Foi quando conheci o Intype (http://inotai.com/intype/) e encontrei na net boas almas que converteram os bundles do TextMate para o Intype.
No Intype, acabei utilizando todos os bundles que haviam disponíveis e foi uma experiencia satisfatória. A questão é que o intype se tornará pago cedo ou tarde, então outra alternativa precisava ser encontrada.



Eis que surge o Sublime Text 2 (http://www.sublimetext.com/). Com versões gratuita e paga, ele supera todos os editores que já trabalhei. Possui vários recursos interessantes, tais como:
  • Highlighting para várias linguagens como C, C++, C#, CSS, D, Erlang, HTML, Groovy, Haskell, HTML, Java, JavaScript, LaTeX, Lisp, Lua, Markdown, Matlab, OCaml, Perl, PHP, Python, R, Ruby, SQL, TCL, Textile e XML e mais para download 
  • Modo Full Screen (F11) com recurso Distraction Free (Shift + F11) 
  • Scroll com o minimap do código 
  • Auto save, jamais perca algo. 
  • Vários temas disponíveis, particularmente prefiro o Monokai 
  • Somente modo texto. Sem frescura. 
  • Seleção múltipla 
  • Busca incremental durante a digitação 
  • Seleção em coluna 
  • Mantém o case durante o replace 
  • Busca e substituição por expressão regular 
  • Auto complete 
  • Snippets e Pacotes que otimizam o tempo (e viciam) durante o uso. 
  • e muitos outros. 
Os Pacotes e Snippets, merecem uma descrição a parte. Primeiramente instale o Package Control seguindo esse tutorial. Com ele será possível instalar vários pacotes com os mais diversos recursos para melhorar sua produtividade. Alguns interessantes:
  • Alignment
  • SideBarEnhancements
  • JQuery
  • HTML5
  • e muitos outros disponíveis, basta dar uma olhada no Package Control. 
Estou utilizando estes aqui:


O mais interessantes do esquema do  Package Control, é que tudo é feito diretamente pelo Sublime, sem burocracia de download, instalação, etc. 

Os Snippets são os mais utilizados, na minha opinião. Da mesma forma que no TextMate, o Sublime completa trechos de códigos pré-configurados após a digitação de um termo (gatilho, vulgo tab trigger) e pressionar a tecla Tab. O mais interessante é que é possível editar e criar novos de uma maneira bem fácil. Basta ir pelo menu Tools >> New Snippet. O exemplo fornecido é muito óbvio, mas vamos a ele:


<snippet>

<content><![CDATA[

Hello, ${1:this} is a ${2:snippet}.

]]></content>

<!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
<!-- <tabTrigger>hello</tabTrigger> -->
<!-- Optional: Set a scope to limit where the snippet will trigger -->
<!-- <scope>source.python</scope> -->

</snippet>


Todos os termos começados com $, seguido de um número são os parâmetros editáveis do bloco inserido pelo Sublime, descrito no content, possuindo navegação através do Tab, de acordo com a ordem numérica. O valor seguido dos ":"  são os valores padrões para cada parâmetro inserido. Descomente a linha do tabTrigger e digite o gatilho de sua preferência.

Além da possibilidade de criar novos snippets, é possivel importar  todos os bundles do TextMate com uma simples operação de ctrl + c , ctrc + v ( sim, simplesmente colar os arquivos) para a pasta do Sublime. Ele se encarrega de fazer funcionar. Única alteração é que quando copiar os arquivos .tmbundle para o Windows, eles virão como se fosse um pasta com essa extensão. Retire a extensão e salve essas pastas em:
C:\Users\<USUARIO DA MAQUINA>\AppData\Roaming\Sublime Text 2\Packages (Windows)
<USUARIO DA MAQUINA>/Biblioteca/Application Suport/Sublime Text 2/Packages (MAC)

Com isso, será disponibilizado os pacotes no canto inferior direito do Sublime.

Com uma interface amigável, vários recursos fantásticos e leve, o Sublime Text 2 tem se mostrado com o melhor editor que já trabalhei. Disponível para Windows, Linux e Mac, possibilita uma interface única para quem, como eu trabalha em ambientes diferentes.


Lista de Comandos – Mac
Navegar entre os arquivos: Command + P
Layout de 2 colunas: Command + Option + 2
Modo de distração livre: Command + Option + Shift + F
Find: Command + F
Find / Replace: Command + Option + F
Find / Where / Replace: Command + Shift + F
Indentação à esquerda: Command + [ ou Shift + Tab
Indentação à direita: Command + ] ou Tab
Comentário: Command + /
Multi-select: Command pressionado + Clique em várias linhas
Code Folding – Minimiza Bloco: Command + Option + [
Code Folding - Maximiza Bloco: Command + Option + ]
Code Folding – Minimiza Atributos: Command + K + Command + T
Code Folding – Maximiza Atributos: Command + K + Command + 0
Console: Ctrl + `
Menu: Command + Shift + P
Haiku: Ctrl + Option + Enter
Prefixr: Command + Ctrl + X
JSHint: Ctrl + J
JSMinifier: Ctrl + Option + M

Lista de Comandos – Windows/Linux
Navegar entre os arquivos: Ctrl + P
Layout de 2 colunas: Alt + Shift + 2
Modo de distração livre: Shift + F11
Find: Ctrl + F
Find / Replace: Ctrl + H
Find / Where / Replace: Ctrl + Shift + H
Indentação à esquerda: Ctrl + [
Indentação à direita: Ctrl + ]
Comentário: Ctrl + / ou Ctrl+;
Multi-select: Ctrl pressionado + Clique em várias linhas
Code Folding – Minimiza Bloco: Ctrl + Shift + [
Code Folding - Maximiza Bloco: Ctrl + Shift + ]
Code Folding – Minimiza Atributos: Ctrl + K + Ctrl + J
Code Folding – Maximiza Atributos: Ctrl + K + Ctrl + 1
Console: Ctrl + `
Menu: Ctrl + Shift + P
Haiku: Ctrl + Alt + Enter
Prefixr: Ctrl + Alt + X
JSHint: Ctrl + J
JSMinifier: Ctrl + Alt + M

Bônus
Deletar linha: Ctrl + Shift + K (Windows/Mac/Linux)
Duplicar linha – Mac – Command + Shift + D – Windows/Linux – Ctrl + Shift + D
Troca de linhas: Mac – Command + Ctrl + Seta (cima ou baixo) – Windows/Linux – Ctrl + Shift + Seta (cima ou baixo)

E mais
Jade – Syntax Highlight – https://github.com/miksago/jade-tmbundle
Stylus – Syntax Highlight – https://github.com/LearnBoost/stylus
JSHint – https://github.com/uipoet/sublime-jshint


Algumas configurações interessantes para se colocar no Preferences > Settings - User:

{
     "bold_folder_labels": true,
    "color_scheme": "Packages/Color Scheme - Default/Monokai.tmTheme",
    "font_face": "Monaco",
    "font_size": 13,
    "highlight_line": true,
    "ignored_packages":["Vintage"],
    "rulers": [72],
    "scroll_past_end": true,
    "shift_tab_unindent": false,
    "theme": "Soda Dark.sublime-theme",
    "trim_trailing_white_space_on_save": false,
    "trim_trailing_white_space_on_save": true,
}


Façam download e experimentem. Vale a pena.
Hasta!