All work and no play makes Jack a dull boy

terça-feira, 29 de dezembro de 2015

listar todas as urls do seu projeto Django

Não pense em um porquê, mas imagine que um dia você precisa listar todas as urls de seu projeto Django, com caminho completo e parâmetros de forma organizada.

Como você faria?

Há algumas formas de escrever isso, mas o django-extensions tem algo pronto.

$ ./manage.py show_urls

pronto.
sim, só isso!

=]

terça-feira, 20 de outubro de 2015

deletar arquivos no terminal por intervalo de datas

Para deletar arquivos filtrando por um período de datas específico, usar o find é a saída:
find ./ -type f -newermt 2015-01-01 ! -newermt 2015-08-01 -delete

O find possui o parâmetro -delete tornando mais simples esse tipo de operação.

=]

terça-feira, 29 de setembro de 2015

encurtando urls no google usando python

É bom avisar logo que é bem tranquilo de fazer.



Antes de começar, é preciso que você crie um chave da API no console do google developers. As instruções você encontra aqui.

Bem, esse é o código.

import requests
import json

api_url = 'https://www.googleapis.com/urlshortener/v1/url'
api_key = 'AIzaSyD-wgUbjlaBOORxF0mrXzeNsOOafKrnw0U'
url = '{0}?key={1}'.format(api_url, api_key)

headers = {'content-type': 'application/json'}
params = json.dumps({'longUrl': 'http://www.google.com'})

response = requests.post(url, data=params, headers=headers)

if response.ok:
print (response.json()['id'])
else:
print (response.status_code, response.reason)


Algumas notas:
- não esquecer de passar no header o content-type
- o pacote requests só da alegria
- no requests.post() não passar os parâmetros usando 'params', a chave correta é 'data' (não que você vá esquecer ou confundir, mas como eu fiz, não custa avisar).

=]


sexta-feira, 25 de setembro de 2015

Pesquisa sobre Class Based Views


Agradeço se puder preencher.


Powered by Typeform


=]

quarta-feira, 16 de setembro de 2015

extraindo colunas de csv e excel usando pandas

(ou criando subsets de dados usando pandas)



Já mostrei como é fácil ler e exportar dados de arquivo csv ou xls usando pandas, mas digamos que diante de um dataset com várias colunas, você precise isolar algumas.

Dado o seguinte:
In [1]:
import pandas as pd
In [3]:
dados = pd.read_csv('file.csv')
In [4]:
dados
Out[4]:
abcd
01234
15678

Caso você queira um range de colunas você pode:
In [5]:
dados.ix[:,1:3]
Out[5]:
bc
023
167


Caso queira separar pelo header:
In [6]:
dados[['b','d']]
Out[6]:
bd
024
168


Após isso, em ambos, caso queira os dados de uma coluna, basta usar:
In [7]:
novo = dados[['b', 'd']]
In [8]:
novo['b']
Out[8]:
0    2
1    6

=]

ps: usei o https://try.jupyter.org/ para construir esses exemplos e, lá, sempre são impressos à esquerda o número das colunas.

sexta-feira, 11 de setembro de 2015

verificando se template existe no Django

Há uma forma simples de se verificar se um template existe. Vou apresentar aqui uma forma criando um template_tag.

from django import template

register = template.Library()

@register.simple_tag
def template_exists(template_name):
    try:
        django.template.loader.get_template(template_name)
        return u"Template existe"
    except template.TemplateDoesNotExist:
        return u"Template não existe"

No template ficaria:

{% template_exists 'algumapp/nome_template.html' %}

Note que essa é a implementação mais básica para se verificar. A partir daí é possível fazer bastante coisa.

=]

sexta-feira, 4 de setembro de 2015

como instalar pygame no OSX com python 2.7

pygame

Vamos lá, instalar pygame no OSx tendo python 2.7.x como versão principal, pelo visto, rendeu uma issue movimentada no bitbucket.

Nada complicado.

Antes de instalar o pacote, é preciso cuidar das dependências. Uma instalação com brew já resolver

$ brew install sdl

sdl ou Simple DirectMedia Layer é uma biblioteca que provê uma camada de abstração de baixo nível no hardware - bem útil para jogos.

Depois disso, basta instalar apontando para o repositório:

$ pip install https://bitbucket.org/pygame/pygame/get/default.tar.gz
Aqui, caso não tenha instalado o X11, será necessário baixar e instalar XQuartz.

=]

listar todos os virtualenv com virtualenvwrapper

Para listar todos os virutalenvs que você possui, o virtualenvwrapper tem, dentre vários de seus comandos, um específico para isso:

$ lsvirtualenv

o comando possui 3 parâmetros:
-b breif ou breve. lista apenas os nomes do ambientes
-l long ou longo. é o mais verboso e, também, o default.
-h help, óbvio clássico

Aqui fica a lista de todos os comandos.

=]

terça-feira, 1 de setembro de 2015

de excel para csv com pandas em 3 linhas


Veja como é ridiculamente fácil transformar um arquivo do Excel em csv usando pandas do python
import pandas as pd
data = pd.read_excel("arquivo.xls")
data.to_csv("arquivo.csv")
simples assim.

ainda há outros parâmetros em cada um desses métodos usados, você pode:
- indicar qual 'sheet' do xls e mais
- indicar encoding, colunas, header do csv e muito mais.

Só lembre-se que, para essa operação, é necessário instalar o pacote xlrd.


terça-feira, 25 de agosto de 2015

juntar arquivos CSV usando pandas



pandas ou Python Data Analysis Library é um biblioteca open-source que provê ferramentas de alta performance para estrutura e análise de dados para python.

É uma biblioteca bem poderosa e aqui um exemplo bem simples de como usá-la.

Considere:

primeiro.csv
coluna1,coluna2
1,a
2,b
3,c

segundo.csv
coluna3,coluna4
z,m
x,n
c,h

Para mesclar esses dois csv:

import pandas as pd
primeiro = pd.read_csv('primeiro.csv')
segundo = pd.read_csv('segundo.csv')
mesclado = pd.concat([primeiro, segundo], axis=1)

A saída será algo como:

coluna1coluna2coluna3coluna4
01azm
12bxn
23cch

A documentação cobre, obviamente, muito mais - corre lá.


terça-feira, 18 de agosto de 2015

encontrar arquivo ou pasta usando o terminal

Para encontrar arquivos no terminal, por exemplo, no Ubuntu ou mesmo no OSX há uma forma simples.

Suponha que a busca seja pelo error.log:
$ find ~/ -type f -name "error.log"

Ou se fosse por uma pasta (duas formas):
$ find ~/ -type d -name NOME_PASTA

$ find ./ -type d | grep NOME_PASTA

Fonte

segunda-feira, 10 de agosto de 2015

habilitar HTTP_AUTHORIZATION no Apache

Direto ao ponto.

Caso não exista, crie um arquivo .htaccess no seu projeto.

Insira ou adicione as seguintes linhas e pronto:
RewriteEngine on
RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization},last]

=]

sábado, 8 de agosto de 2015

enviar artigos para o Kindle

Essa é mais uma das incontáveis soluções para "ler depois" na sua navegação pela internet. Por exemplo, se você usa muito o Evernote, tem o Clearly, mas hoje me fiz essa pergunta:
"E se eu quiser ler depois no kindle?"
Das opções com melhor rating, eu peguei a Send to Kindle by Klip.me.


Depois de instalar, você só precisa cadastrar o email deles nas configurações da sua conta na Amazon e, a partir daí, com um clique ou apenas um atalho de teclado a extensão salva uma versão para você ler no Kindle.

A extensão tem versões para Chrome, Safari e etc.

quinta-feira, 6 de agosto de 2015

vi / vim: abrir um arquivo direto numa função ou número de linha

Como fazer para abrir um arquivo usando o VIM ou VI e ir para uma linha específica?

O editor VI / VIM suporta comandos executados na seguinte sintaxe:
vi +comando NomeArquivo
ou
vi +numerodalinha NomeArquivo
ou
vi +/TermoQueVoceProcura NomeArquivo

Para abrir, por exemplo, um arquivo e ir para a linha 15907:
$ vim +15907 dump.sql

Para abrir o arquivo e ir direto para uma função chamada xablau(), digite:
$ vim +/xablau views.py

Fonte

quarta-feira, 29 de julho de 2015

automatizando coisas no virtualenv

Trabalhando com virtualenvwrapper você possui alguns hooks auxiliares que podem ser úteis.
$ cat ~/.virtualenvs/postactivate 
#!/bin/bash
# This hook is run after every virtualenv is activated.
e
$ cat ~/.virtualenvs/postmkvirtualenv 
#!/bin/bash
# This hook is run after a new virtualenv is activated.
Os nomes são autoexplicativos, eu diria. Se bem que o comentário do postmkvirtualenv poderia dizer após o virtualenv ser criado.
O seu postmkvirtualenv poderia conter algo como:
$ cat ~/.virtualenvs/postmkvirtualenv 
#!/bin/bash
# This hook is run after a new virtualenv is activated.
pip install ipython
pip install nose
pip install coverage
E por ai vai.. pode colocar variáveis de ambiente, instalar mais pacotes e etc

=]

segunda-feira, 27 de julho de 2015

grep excluindo pasta

Como fazer um grep mas quer excluir alguma pasta da busca?

Simples, simples
$ grep "alguma coisa" -Rn ./ | grep -v essa_pasta_nao

=]

sexta-feira, 24 de julho de 2015

InfoQ downloader


InfoQ sempre tem vídeos bem interessantes de tecnologia, incluindo Luciano Ramalho, TDC e outros.

Felizmente existe uma forma bacana de baixar o vídeo e slides.
git clone https://github.com/joncasdam/infoq-downloader.git
cd infoq-downloader
pip install -r requirements.txt
E o uso é mais fácil ainda:
python infoq_downloader.py http://www.infoq.com/produtividade-e-qualidade-em-python

pega lá meu fork:
https://github.com/joncasdam/infoq-downloader

=]



terça-feira, 21 de julho de 2015

Instalando versões antigas de fórmulas no brew

 http://brew.sh/

Digamos que você está com um projeto legado em mãos e deseja, portanto, instalar as dependências e, dentre as tais, está uma versão antiga de uma fórmula.

Eis o que passei recentemente:

A versão corrente do PostgreSQL é 9.x, mas o projeto precisa da 8.x

Se você usar:
$ brew install postgres
Como é de se esperar, ele instala a versão mais nova.

Primeiro você precisa descobrir quais as versões disponíveis para instalação.

$ brew search postgres
check_postgres    homebrew/versions/postgresql9
homebrew/versions/postgresql92   postgres-xc
homebrew/versions/postgresql8    homebrew/versions/postgresql91
homebrew/versions/postgresql93  postgresql
Caskroom/cask/navicat-for-postgresql    Caskroom/cask/postgres

Tendo encontrado a versão que precisava, use:
$brew install homebrew/versions/postgresql8
Be happy.

terça-feira, 14 de julho de 2015

retornar JSON com Django

Antes de tudo, vamos deixar claro que a partir do Django 1.7, há uma classe responsável para isso.
Sim, isso mesmo: a classe JsonResponse:
from django.http import JsonResponse
return JsonResponse({'foo':'bar'})

Agora, se você ainda está em uma versão do Django anterior a 1.7, há uma forma bem simples:
from django.http import HttpResponse
return HttpResponse(json.dumps(dados), content_type="application/json")

=]

quarta-feira, 8 de julho de 2015

semantic matters

*post (auto)convidado

Quando comecei a programar minha primeira preocupação era:

Como djabus eu faço isso?!

Depois de algumas horas testando, quebrando a cara e lendo documentação comecei a me encontrar nesse universo. Não entendia muito bem como tudo isso funcionava. Não sabia bem o que eram variáveis, loops, funções, etc mas tinha uma ideia de como usar tudo isso então minha primeira preocupação como programador passou a ser sintaxe. Afinal, se a sintaxe não estiver correta seu código não roda e não serve para nada.

Depois de algum tempo comecei a me dar bem com a sintaxe. Escrevia, o código rodava e eu ficava feliz :D Porém, eventualmente, o código rodava mas não fazia o que eu queria. Eis que essa se tornou minha primeira preocupação como programador: O código devia fazer o que eu queria que fizesse.

Em pouco tempo me deparei com uma ordenação. Queria ordenar minha lista de músicas em meu mIRC Script então descobri o Bubble Sort. Entendi como funcionava, implementei no mIRC e rodei. Eram quase 10 minutos para ordenar minhas 300 e poucas músicas em ordem alfabética. Foi aí que descobri duas coisas: Não adianta rodar e fazer o que eu quero mas levar 10 minutos para isso; Não adianta tentar reinventar a roda: Alguém já deve ter implementado isso que você quer. Comecei a me preocupar com desempenho e aprender como melhorá-lo e essa passou a ser minha primeira preocupação (principalmente por trabalhar numa linguagem de script num computador lento)

Algum meses depois precisei corrigir algum código antigo que não estava funcionando como eu queria e sabe o que eu descobri? Que era impossível entender aquela merda que eu tinha feito! Tinha linhas com literalmente centenas de caracteres que, na época, podiam fazer sentido mas agora eram puro lixo! Então fazer um código inteligível passou a ser minha primeira preocupação.

Mais algum tempo se passou e conheci o Python. Fiquei feliz, era simples, fácil, tinha todas as rodas inventadas já implementadas, meu código rodava e fazia o que eu queria! Mas não era "pythônico" :( Então essa passou a ser minha primeira preocupação: Tinha que ser pythônico. Comecei a estudar esse tal de python, PEPs, ver códigos de outras pessoas, me converti a "Igreja Pythônica, PEP8 é meu pastor e tudo commitarás" então não bastava rodar, fazer o que eu queria, ser rápido e compreensível. Tinha que ser pythônico.

Hoje acho que posso dizer que domínio bem esse tal de Python, meus códigos são "pythônicos", diria que 99,5% PEP8 e PEP257 clean, fazem o que eu quero, são compreensíveis e rodam. Qual a próxima principal preocupação? Agora estou me preocupando com semântica. Ao ter que trabalhar em códigos completamente sem semântica alguma percebi o quanto isso é importante, afinal, se você encontra uma variável chamada "pessoa" você espera que ela represente uma pessoa e não uma lista de cachorros.

Então esse pensamento em semântica tem me ajudado muito também para nomear coisas. Antes eu pensava: "O que tem dentro dessa variável?" e a resposta me ajudava a dar um nome a ela. Com isso eu tinha variáveis como "pessoa_attr_dict", "lista_pessoa_ativa". Funcionava, certo, mas eram bons nomes? Hoje penso: "O que essa variável representa?" então passei a ter variáveis como "pessoa", "pessoas_ativas". Melhor, não? Então se você faz um request na API da loja o retorno não será "resposta_api_loja" ou "dados_loja" e sim simplesmente "produtos". E passei a ter refactories "inúteis" como:
ruim.py

bom.py

Com isso seguem algumas "normas" que criei/copiei e tenho usado bastante:

- Se representa uma Coisa a variável se chama "coisa".
- Se representa um conjunto de Coisas a variável é um array chamado "coisas".
- Todo plural representa um array e todo array estará no plural.
- Se a variável contém partes de Coisa e partes de Treco, pense duas vezes. Faz sentido ter isso dentro de uma variável?
- Não dê tipo aos nomes. "lista_pessoas", "dict_coisa" não é legal
- Pense em como você vai usar. Se você tem a classe "Stuff" e quer um método que retorne a coisa ativa use "get_active" ao invés "get_active_stuff" pois você já vai usar "Stuff.get_active()". Não precisa de "Stuff.get_active_stuff()"
- E a universalmente útil: Sempre que você duplica um código Deus mata um gatinho. (Diogenes, Humberto)


--
Fábio Pachelli Pacheco, autor do que acabaste de ler, é um ex-coworker meu, sagaz em várias artes, inclusive nas informáticas.


quarta-feira, 18 de fevereiro de 2015

iterar lista dois itens por vez com python


Como iterar um lista e retornar pares dos itens usando python?

O itertools do python é bem versátil:

from itertools import tee, izip
def pares(lista):
    a, b = tee(lista)
    next(b, None)
    return izip(a, b)
Considerando a lista:
lista = [1,2,3,4,5,6,7,8,9,10]

Aplique assim:
for v, w in pares(lista):
    print v, w
1 2
2 3
3 4
...
ou dessa forma:
for i in pares(lista):
    print i
(1, 2)
(2, 3)
(3, 4)
...
Repare que a função não retorna uma lista, mas um objeto de itertools.

Como funciona: primeiro, com o tee() criamos dois iteráveis paralelos, ambos apontando para o primeiro item da lista. Em seguida move-se o segundo, b, para o segundo item com next(). Dessa forma o a está no lista[0] e b está no lista[1].

fonte

quinta-feira, 29 de janeiro de 2015

ping com porta

Como fazer se você quiser dar um ping especificando uma porta?

Não dá.

Veja o que o help do ping mostra:
$ ping google.com 80
usage: ping [-AaDdfnoQqRrv] [-b boundif] [-c count] [-G sweepmaxsize]
            [-g sweepminsize] [-h sweepincrsize] [-i wait] [−k trafficclass]
            [-l preload] [-M mask | time] [-m ttl] [-p pattern]
            [-S src_addr] [-s packetsize] [-t timeout][-W waittime] [-z tos]
            host

Para isso use o telnet.

$ telnet google.com 80
Trying 74.125.226.48...
Connected to google.com.
Escape character is '^]'.

quarta-feira, 28 de janeiro de 2015