All work and no play makes Jack a dull boy

quarta-feira, 16 de outubro de 2013

Verifica se usuário está no grupo

Como verificar se o usuário está em um grupo específico no Django? E como fazer isso em forma de decorator?

Vamos lá:
from django.contrib.auth.decorators import user_passes_test


def esta_no_grupo_Alunos(user):

    return user.is_authenticated() and not user.groups.filter(name='Alunos').exists()


@user_passes_test(esta_no_grupo_Alunos, login_url='/login/')

def nome_da_view(request):

    # código da sua view

Use com o user_passes_test para restringir acesso a usuários autenticados e que estejam no grupo.

O decorator user_passes_test tem um argumento obrigatório: um objeto User e retorna True, caso o usuário tenha permissão. Como user_passes_test não verifica automaticamente se o usuário está logado, então foi necessário incluir essa verificação.

Como bem notou Luan Fonseca, no Facebook, perceba que, para o caso de redirecionar para login, você pode muito bem usar o decorator @login_required antes do user_passes_test e remover o is_authenticated() da função.

sexta-feira, 11 de outubro de 2013

grep em tipos de arquivos

Imagina que você está em um projeto Django eu precisa buscar por 'ajax' em todos os arquivos, exceto os arquivos javascript .

Como fazer grep em certos tipos de arquivos?

$ grep 'ajax' --exclude=*.js -Rn ./

nesse caso inclui, por costume, os parâmetros R e n:
- R ou r é para buscar recursivamente
- n mostra o número da linha

Caso o grep apenas em arquivos python:

$ grep 'ajax' --include=*.py -Rn ./

terça-feira, 1 de outubro de 2013

dict comprehension

Sim, existe uma forma de fazer um comprehension para dicionários e, pasme, até há uma PEP para isso.

A sintaxe é bem simples:
{ i : chr(65+i) for i in range(26) }

Assim, você acabou de criar um dicionários com as letras do alfabeto:
{0: 'A', 1: 'B', 2: 'C', 3: 'D', 4: 'E', 5: 'F', 6: 'G', 7: 'H', 8: 'I', 9: 'J', 10: 'K', 11: 'L', 12: 'M', 13: 'N', 14: 'O', 15: 'P', 16: 'Q', 17: 'R', 18: 'S', 19: 'T', 20: 'U', 21: 'V', 22: 'W', 23: 'X', 24: 'Y', 25: 'Z'}

Você também chegaria no mesmo resultado se fizesse da seguinte maneira:
dict([ (i, chr(65+i)) for i in range(26) ])

=]

terça-feira, 6 de agosto de 2013

Autoenconding para python no SublimeText

Pacote SublimeText da vez é o Auto Enconding for Python.

#quemnunca acabou esquecendo de declarar o encoding do arquivo python?

Então, para sua preguiça seu auxílio há um pacote para Sublime Text que dá uma mão nisso.

Ele simplesmente inclue para você:
#!/usr/bin/env python
# -*- coding: utf-8 -*-#
Dá uma conferida.

segunda-feira, 5 de agosto de 2013

loops, list comprehension e generators

loops, list comprehension generators
Qual a diferença de tempo (performance também?) entre alguns modos de montar uma lista em python? Resolvi fazer um teste de tempo de execução de um código simples. A idéia é comparar o tempo que leva para montar uma lista contentdo 1 milhão de números.

Segue a sequência com seus respectivos tempos. Ah! Para medir o tempo usei o 'time' do linux e rodei todos com o comando a seguir no terminal do ubuntu 12.04 64bits.


$ time python teste.py

Apesar de óbvia a diferença entre usar  range()  e  xrange()  no python, fiz questão de deixar para mostrar/constatar em relação a tempo de execução.

lista = []
for i in range(1000000):
    lista.append(i)
# TEMPO GASTO 0.198s

for i in xrange(1000000):
    lista.append(i)

# TEMPO GASTO 0.169s

Dica rápida: instancie o método  append() , isso ajuda um pouco.
lista_append = lista.append
for i in range(1000000):
    lista_append(i)

# TEMPO GASTO 0.158s


lista_append = lista.append
for i in xrange(1000000):
 lista_append(i)

# TEMPO GASTO 0.156

List comprehension e generators
lista = [i for i in range(1000000)]
# TEMPO GASTO 0.141s

lista = [i for i in xrange(1000000)]
# TEMPO GASTO 0.100s

lista = (i for i in range(1000000))
# TEMPO GASTO 0.065s

lista = (i for i in xrange(1000000))
# TEMPO GASTO 0.021s


Bacana a diferença de tempo entre o primeiro e último, não?

quarta-feira, 17 de julho de 2013

python lint? SublimeLinter ajuda!

Vez ou outra faço buscas aleatórias no github, hoje foi por pacotes ligados a python e Sublime. Encontrei o SublimeLinter.

Instalar é tranquilo, basta usar o PackageControl e instalar, sem complicações.

O SublimeLinter já tem linters incluidos para: C/C++, CSS, Git, HTML, Javascript, Python, Ruby, PHP, XML e outras.

O linter por padrão roda no background, mas você pode setar para verificar a cada save.

Depois de instalado (claro!), vá em  Preferences > Package Settings > SublimeLinter > Settings - Default  e mude a linha:

"sublimelinter_popup_errors_on_save": false,

para
"sublimelinter_popup_errors_on_save": true, 

Ele ainda permite configurações customizadas para cada projeto seu no Sublime. Vale uma olhada.

segunda-feira, 27 de maio de 2013

git reset {soft | hard | mixed} - como lembrar

Qual a diferença entre o soft, hard e mixed do commando git reset ? Veja um jeito fácil de lembrar. Bem, considere que você está trabalhando no seu código a partir de um git checkout . Então você segue trabalhando, coda, compila, testa e então faz  git add  e  git commit  Seria algo:
$ git checkout trampo
…. coda …. compila …. testa …
$ git add ….
$ git commit
Se nesse ponto você fizer um git reset , veja como cada tipo de reset afeta as coisas:
$ git checkout trampo
 # --hard fará o reset nesse ponto
…. coda …. compila …. testa …
 # --mixed (é o padrão) reseta nesse ponto
$ git add ….
 # --soft reset até esse ponto
$ git commit
Vale falar que o git commit --amend faz com que o git reset --soft se torne um tanto redundante.
{fonte}

domingo, 26 de maio de 2013

Como trocar a url de um repositório remoto Git

 git
Trocar a url do repositório remoto git? Sim, é possível!

Toda vez que clonamos um repositório local, a url clonada fica armazenada como "origin" no repositório local.

Como saber qual o remote do Git?

$ git remote -v
origin https://github.com/joncasdam/repositorio.git (fetch)
origin https://github.com/joncasdam/repositorio.git (push)

Mas se você quer ter mais informações sobre o "origin", por exemplo:
$ git remote show origin
* remote origin
  Fetch URL: https://github.com/joncasdam/repositorio.git
  Push  URL: https://github.com/joncasdam/repositorio.git
  HEAD branch: master
  Remote branches:
    dev    tracked
    master tracked
  Local branches configured for 'git pull':
    dev    merges with remote dev
    master merges with remote master
  Local refs configured for 'git push':
    dev    pushes to dev    (up to date)
    master pushes to master (local out of date)

Agora, se você precisa trocar a url do repositório, há um comando no git que permite fazer essa alteração:
$ git remote set-url origin https://github.com/user/repositorio.git

agora confirme a alteração:
$ git remote -v
origin https://github.com/user/repositorio.git (fetch)
origin https://github.com/user/repositorio.git (push)
pronto!

quinta-feira, 16 de maio de 2013

Apache: Could not bind address to port (make_sock)

Um tanto em função do último post, passei por uma situação bem semelhante ao post abaixo que resolvi traduzi-lo.
--
Se você está atualizando software ou alterando a configuração das portas, provavelmente dará de cara com esse erro ao tentar reiniciar o Apache.

O Apache está tentando 'ouvir' (Listen) a porta 8080, um exemplo, mas não consegue porque já está em uso. Eis algumas razões pelas quais isso pode acontecer.

Problema de configuração da porta
Se tiver entradas duplicadas para Listen, o Apache irá reclamar. Certifique-se que seu apache.conf e ports.conf NÃO tenham ambos essa diretiva. Se ela for listada apenas uma vez (veja o exemplo do arquivo ports.conf abaixo), então verifique se acidentalmente você não duplicou inadvertidamente seus ports.conf em algum lugar do seu Apache

NameVirtualHost *:81

Listen 81

<IfModule mod_ssl.c>
    Listen 443
</IfModule>

<IfModule mod_gnutls.c>
    Listen 443
</IfModule>

Vale também dar uma olhada nas configurações de seus Virtualhosts, pois já vi a declaração Listen ser feita junto dos VirtualHosts, então, se for o caso, veja em apache2/sites-enabled.

Outro servido pode estar usando a porta
Quando me deparei com esse erro, foi porque outra instância do apache já estava usando-a. Esse próximo exemplo usa netstat, grep e kill para resolver o problema.

$ netstat -tulpn | grep :8888

Que retornará:
tcp   0   0 0.0.0.0:8888    0.0.0.0:*     LISTEN      30661/apache2

Então faça:
$ sudo kill -9 30661 (ease é o PID que aparece para a instância)

Lembre-se que você deve investigar e avaliar problemas no servidor antes de simplesmente reiniciá-lo. Dei o boot quatro vezes antes de assumir que eu deveria ter errado em algo.

terça-feira, 14 de maio de 2013

Mais de um apache no servidor

 Você sabia que é possível ter múltiplas instâncias de apache no seu servidor? Sabia que ter 2 apaches no servidor (ou mais) já é algo previsto e préprogramando pelo próprio Apache?

Sim! Porém, antes é bom pensar: por que precisamos rodar múltiplas instâncias do apache no host?

Boa pergunta, afinal, com uma boa configuração em VirtualHost, você consegue ter tudo bem separado e organizado. Contudo esse caminho pode, com o tempo, te levar a um servidor pesado e lento.

Imagine que você trabalhe com diferentes sites, com requisitos distintos: um com mod_python outro com mod_php e etc); você configuraria isso tudo em uma instãncia apache, mas como resultado teria  grande consumo de memória.

Uma solução provida pelo próprio apache é ter configurações mais leves e separadas para, por exemplo, cada mod, usando portas diferentes.

E como fazer? Não precisa fazer uma série de sudo cp em tudo que é pasta.
$ sh /usr/share/doc/apache2.2-common/examples/setup-instance NOMEDAINSTANCIA