Chronosbox

Introdução ao PostgreSQL e HTML 5 (WTH!?)

by Felipe 'chronos' Prenholato on Quarta, 01 Setembro/2010, under Databases, HTML5, PostgreSQL

O MySQL é um banco muito conhecido, e muitos sabem ‘usar’. O PostgreSQL já não é tão conhecido e muitos só já ouviram falar. Com este fato, a pouco tempo, comecei a desenvolver uma série de slides introdutórios ao PostgreSQL, tendo como alvo uma palestra na Lightcomm, empresa onde trabalho.

Os slides em si, são bastante introdutórios, apenas ao nível básico, então se quem conhece bem PostgreSQL quiser dar uma revisada eu ficaria muito honrado :) . A parte interessante destes slides para quem já conhece PostgreSQL e até mesmo para quem nunca mecheu, é que elas usam como ‘engine’ os slides demonstrados no html5rocks.com, todo baseado em HTML5 / CSS3 / JS … Atualmente só testei ele no Chrome, e o resultado, na minha opnião foi muito bom.

Desenvolvi a palestra com muito conforto, pois é puro HTML / CSS, os slides ainda do html5rocks.com ainda vem com demos de uso de SVG, vídeo e áudio, o que pode realmente ser muito útil em palestra mais complexas (introdução ao Django por exemplo). Eu adotei esse método como o meu default para construção de slides, o código está no github [1] e se quiser você pode fazer o download do pacote tgz / zip [2] :)

Eu aconselho a experimentar! Quem quiser pode contribuir melhorando a palestra, traduzindo para outras línguas ou só me apontando bugs :)

[1]http://github.com/chronossc/postgres_presentation/

[2] http://github.com/chronossc/postgres_presentation/downloads

See ya

Leave a Comment :, , ,

JSONResponse – Trabalhando com JSON em Django, o jeito fácil.

by Felipe 'chronos' Prenholato on Quarta, 14 Abril/2010, under Apps e extensões, Django, python

Existem por ai dezenas de artigos e snippets sobre como trabalhar com JSON
em Django, entretanto vi que a maioria é um pouco vaga e a solução envolve serializar com simplejson e mandar para o HttpResponse. Existem alguns detalhes que normalmente não se cobrem e eu apresento a maneira fácil de trabalhar e um exemplo funcional de JSON em um formulário.
(continue reading…)

1 Comment :, , , ,

Vim confs prontas para trabalhar com Python e Django

by Felipe 'chronos' Prenholato on Terça, 09 Março/2010, under Dicas, Django, Linux, VIM - Vi IMproveded, python

Este fim de semana eu reescrevi meu .vimrc e gastei um tempo extra para fazer
as coisas funcionarem melhores para mim com python e django :) . Eu acabei
fazendo um belo trabalho e agora estou codando com muito mais eficiência.

Os resultados são:

  • Um .vimrc muito bem comentado e com muitas customizações.
  • Suporte para python omnicomplete.
  • Adição dos paths python e django automáticos ao ambiente do vim.
  • Adição da DJANGO_SETTINGS_MODULE automaticamente ao ambiente do vim, para completar seu próprio código.
  • Suporte do SnipMate para código django e django templates.
  • Django templates com suporte para highlighting das tags e uso do ‘%’ com o plugin matchit.
  • Python folding e suporte a python jumping.
  • O tema acinzentado wombat com algumas customizações minhas.
  • Um gerenciador de sessões para o Vim para facilitar sua vida em manter o ambiente de trabalho.

Aqui estão os arquivos para download:

Se você preferir, este é o endereço no github: http://github.com/chronossc/my-vim-confs

O pacote não poderia ter sido criado sem alguns plugins e artigos, segue a referência:

Adicionalmente (thx Handrus), eu sugiro para quem escreve muito HTML, dar uma olhada no SparkUp vim and textmate plugin ;) . Eu não testei, mas pareceu muito bom.

Muito obrigado a quem ler, a todos que escreveram os plugins, ao pessoal do canal #vim na freenode e a ótima documentação do vim!
Agora bora codar com o vim ;)

** Atualizado
2010-03-07: Eu criei novamente o tar porque eu removi algumas mensagens de debug, então faça o download novamente se você já fez ;) .
2010-03-09: Eu criei novamente o tar, fiz alguns fixes e adicionei no github.

3 Comments :, , , , , , , , , , , , , ,

Mudar charset e quebra de linha recursivamente no Linux

by Handrus Nogueira on Quarta, 14 Abril/2010, under Dicas, Linux

A algum tempo atrás precisei passar uma aplicação web que utilizava quebras de linha no formato linux e charset iso-8859-1 (US-Latin) para UTF-8 com quebra de linha no formato windows. Na época codifiquei com a ajuda do chronos este script que agora compartilho:

1
2
3
4
5
6
7
8
9
10
#!/bin/sh
#change extensions filter as you need ;)
find -type f | egrep "\.php|\.css|\.js|\.html|\.htm" | egrep -v "\.svn" > ./charset_list.txt;
while read -r line;do
#charset change
iconv -f LATIN1 -t UTF-8 "$line" > "${line}2";
mv "${line}2" "$line";
#we adopted dos format for line breaks
unix2dos "${line}";
done < ./charset_list.txt > ./charset_after.log 2>&1 #receive list of params and send output to log

Explicações: O script gera uma lista com todos os arquivos da pasta onde ele se encontra e suas subpastas subsequentes (conforme o filtro explicado na segunda linha do código).
Depois ele lê a lista e aplica as alterações num arquivo cópia. Move o arquivo sobre o anterior e depois altera as quebras de linha. Bastante simples, I LOVE BASH!

Leave a Comment

Migrando bases de dados LATIN1 para UTF-8 com o PostgreSQL

by Felipe 'chronos' Prenholato on Segunda, 08 Março/2010, under Databases, Debian/Ubuntu, Dicas, Gentoo, Linux, PostgreSQL, Servidores

Nos dias atuais é um padrão que todos os sites e servidores web rodem ao menos com UTF-8 como encoding default, entretanto pode-se encontrar casos onde ainda se roda LATIN1 ou até mesmo ASCII.

O caso que tratamos hoje é de um servidor Debian, versão 5.0.3 (lenny), que usava o encode LATIN1 quando instalado e configurado o Postgresql, e não me deixava criar uma base de dados UTF-8, gerando o seguinte erro:

debian:~# su postgres -c 'createdb teste3  -E UTF-8'
createdb: database creation failed: ERROR:  encoding UTF8 does not match server's locale en_US
DETAIL:  The server's LC_CTYPE setting requires encoding LATIN1.

(continue reading…)

1 Comment :, , , , , , , , , , , ,

Configurando múltiplos ambientes Python

by Felipe 'chronos' Prenholato on Quarta, 27 Janeiro/2010, under Dicas, Django, Gentoo, python

Múltiplos ambientes python

Trabalhar com várias versões de ambientes python tem se tornado algo comum em minha vida, e acredito que um meio fácil de ’setar’ estes ambientes seja algo útil e não tão simples para a maioria das pessoas.

Eu criei um simples bash script que seta este ‘ambiente’, trata-se de uma função que você cria no seu .bash_profile. Executa-se ela com a versão do python em seguida e pronto, seu ambiente esta configurado. Vamos ver no código como eu fiz, o script está com comentários em inglês:

export ORIGINALPATH=$PATH
loadpyenv(){
    # $PV is our control variable, get from $1, first argument on shell
    # anything that you need to put here and depend for python version ${PV} is your var ;)
    export PV=$1
    echo -e "\n:: Setting environ to use python $PV"
 
    # Put here various aliases that you can use
    # put a python alias
    alias python="python${PV}"
    # m and runserver a kick alias for Django common actions
    alias m="python${PV} manage.py"
    alias runserver="python${PV} manage.py runserver :8000"
    # easy and fast install of python packages, in right path with localpyinstall
    alias localpyinstall="python${PV} setup.py install --prefix=~/.py/${PV}/"
    echo -e "\n:: New aliases"
    # print aliases :)
    alias python m runserver localpyinstall
 
    echo -e "\n:: New PATH"
    # setup aplications path, be careful about not use $ORIGINALPATH.
    #
    # I use a path structure like that:
    # ~/.py/
    # |-- 2.4
    # |-- 2.5
    # `-- 2.6
    export PATH="${HOME}/.py/${PV}/bin/:${ORIGINALPATH}"
    echo $PATH
    echo -e "\n:: New PYTHON PATH"
    # setup new python path, don't need to add system wide path, just our custom paths
    export PYTHONPATH="${HOME}/.py/${PV}/lib/python${PV}/site-packages/"
    # print more some info
    python$PV -c "import sys;print sys.path"
    echo -e "\n:: Django version & file"
    python$PV -c "import django;print 'version %s ... file %s' % (django.get_version(),django.__file__);"
}

Agora crie uma estrutura de diretórios com o comando:

$ mkdir -pv ~/.py/{2.4,2.5,2.6}

E cada vez que for usar uma versão diferente do python, carregue com:

$ loadpyenv VERSÃO

Onde VERSÃO é a versão escolhida do python.

Várias versões do Python no Gentoo

O Gentoo Linux, minha distro do dia a dia, me dá um bom bonus quanto a múltiplas versões do python, configure no /etc/make.conf a seguinte linha:

USE_PYTHON="2.4 2.5 2.6"

Instale os pythons nas versões escolhidas e execute o seguinte comando para re-compilar seus pacotes:

emerge $(eix -I dev-python/* | grep "\[I\]" | cut -d' ' -f2)

O eix é uma aplicação de indexação do portage, muito comum nas máquinas Gentoo.

Cada pacote python é recompilado para as 3 versões (no caso), mas tive problemas em compilar alguns pacotes para a 2.4, fiquem avisados :)

Bom, é isso, até mais!

2 Comments :, , , , , , , , , ,

Compilando fácil com Debian/Ubuntu

by Handrus Nogueira on Domingo, 03 Janeiro/2010, under Debian/Ubuntu, Linux, Servidores

Como usuário do bom e velho gentoo, sempre senti falta da possibilidade de compilar softwares para ganhar uma certa performance. Principalmente em se tratando e softwares de uso em servidor, como Java, PHP, apache, mysql e porstgres. Nos meus testes sempre senti diferença entre as versões pré-compiladas e compilada in loco.
No Debian/Ubuntu a descoberta do apt-build me ajudou a contornar o problema com a mesma classe e quase a mesma eficiência que o portage.

Vamos ao passo-a-passo:

Para instalar o apt-build:
sudo apt-get install apt-build auto-apt

Configure para sua máquina:
dpkg-reconfigure apt-build
Escolha sua arquitetura de processador e o nível de otimização, o indicado é o médio.
As opções ficam salvas no arquivo /etc/apt/apt-build.conf ; Vamos apenas ajustar o número de processadores na ultima linha do arquivo altere-o para
make_options = " -j4"
onde o número é igual ao número de “cores” + 1. Portanto um quadcore seria “-j5″.

Para evitar que os pacotes compilados sejam atualizados pelos pacotes oficiais vamos editar o arquivo /etc/apt/preferences adicionando:
Package: *
Pin: release o=apt-build
Pin-Priority: 990

Não se esqueça de adicionar os repositórios de código fonte (deb-src) e pronto!
Agora ao invés do tradicional apt-get install utilize apt-build install

Exemplo: sudo apt-build install xchat emesene

Tutorial rápido sobre apt-build:

apt-build install –reinstall para reinstalar
apt-build upgrade Upgrade nos softwares instalados
apt-build world Recompila todo o sistema
apt-build remove programa Remove o programa
apt-build clean-build Remove pacotes compilados
apt-build clean-sources Remove os códigos fonte baixados.

4 Comments

Manipulando erros Http 403 (permissão negada) no Django

by Felipe 'chronos' Prenholato on Quarta, 25 Novembro/2009, under Apps e extensões, Django

Olá pessoal :) . Recentemente, precisei usar o módulo Auth do Django e suas permissões. É bastante interessante como você pode definir permissões por módulo e usar nas views, templates, etc.

Nosso código de hoje vem da necessidade de trabalhar facilmente com permissões negadas, onde o Django fornece apenas um HttpResponseForbidden, o que não é exatamente interessante de manipular, pois o ideal seria algo como a manipulação de erros 404.

Com essa necessidade desenvolvi um Middleware que intercepta exceções Http403 (vem junto com o pacote), e retorna uma das seguintes opções, na ordem de prioridade:

  1. Uma view customizada, configurada usando handler403 no seu urls.py
  2. Renderiza o template 403.html
  3. Renderiza um template Hardcoded

Para usar o Middleware, siga os procedimentos:

  1. Baixe o projeto no fim deste post, vamos usa-lo de exemplo, ele se chama http403project.
  2. Descompacte e copie o arquivo http.py para algum lugar do seu projeto, no http403project ele fica na raiz.
  3. Adicione o middleware ao settings.py:
    MIDDLEWARE_CLASSES = (
          # ...
          'http403project.http.Http403Middleware',
    )
  4. De raise na view, ex:
    from http import Http403
    def Http403View(request):
      raise Http403(u"This is custom message for permission denied.")
  5. Configure sua view customizada ou template se desejar. Seu template deve ter o nome de 403.html, sua view recebe os argumentos request e exception, o argumento exception contem a mensagem enviada pelo usuário :) . No projeto exemplo ele está renderizando o template 403.html, mas existe uma view de exemplo bastante simples no arquivo urls.py

Projeto: http403project.tgz

Ok, é isto, super simples, por hoje é só :) , divirtam-se!

Leave a Comment :, , , , , ,

Pensamento rápido – “ilike” SQL

by Handrus Nogueira on Sexta, 04 Setembro/2009, under Dicas, Django, Multi Database, MySQL

Hoje vi um post num dos blogs que acompanho, onde um camarada disse ter conseguido 1000% de melhora na performance de uma aplicação trocando um:

SELECT * FROM TABLE WHERE fieldname ILIKE 'abc%';

Para

SELECT * FROM TABLE WHERE lower(fieldname) LIKE 'abc%';

(diferença de ilike para lower… like)
Eu achei tosco (hehehe), óbviamente que esse ganho absurdo só pode ter ocorrido numa massa gigantesca de dados e provavelmente num campo sem índice.
Mas a minha dica é outra:
Além do ganho em performance o “ilike” não é suportado no mysql e sqlite.Portanto seu uso é extremamente desaconselhável, principalmente se você estiver trabalhando com Django, Rails ou qualquer aplicação que forneça um layer multi-db.
Claro que nos frameworks citados acima o único jeito de fazer isso é forçar o uso de “ilike”, suas ORMs conseguem lidar com situações assim muito bem.

Conclusão
Evite “ilike” em queries de sql, use o “lower()… like” ou “upper… like”; E se lembre de mudar sua variável para upper/lower!

1 Comment

Atualize o hosts.deny para bloquear tentativas de brute force

by Felipe 'chronos' Prenholato on Quarta, 02 Setembro/2009, under Linux, Servidores

Ai embaixo um simples script para você bloquear hosts tentando brute force no seu SSH, muitas das vezes pode sanar o problema de ter uma porta diferente pro ssh :)

O script varre o /var/log/messages para detectar tentativas de invasão, pega os hosts, e adiciona no /etc/hosts.deny

Código:

#!/bin/bash</code>
 
cp /etc/hosts.deny /var/tmp/hosts.deny
 
# Jun  8 00:39:43 mintaka sshd[23332]: User root from 222.77.183.51 not allowed because not listed in AllowUsers
egrep "$(date +%b) ($(date +%d)|$(date +%e)).*User .* from [a-z0-9\.]* not allowed because not listed in AllowUsers" /var/log/messages | sed -e 's/.* from \([a-z0-9\.]*\) .*/\1/' | sort | uniq | sed -e 's/^/ALL:/' &gt; /etc/hosts.deny ;
#Jun  8 11:54:33 mintaka sshd[31221]: Invalid user bob from 62.204.145.224
egrep "$(date +%b) ($(date +%d)|$(date +%e)).*Invalid user .* from [a-z0-9\.]*$" /var/log/messages | sed -e 's/.*Invalid user .* from//' | sort | uniq | sed -e 's/^/ALL:/' &gt;&gt; /etc/hosts.deny ;
 
diff -u /etc/hosts.deny /var/tmp/hosts.deny &amp;&gt;/dev/null || (echo "** hosts.deny updated **" ; cat /etc/hosts.deny)

Script funcionando:

Sep 2 16:55:02 mintaka -- MARK --
Sep 2 13:58:10 mintaka sshd[20790]: Did not receive identification string from 189.2.118.72
Sep 2 13:58:34 mintaka sshd[20795]: Invalid user suporte from 189.2.118.72
# Tentativa de brute force
Sep 2 13:58:41 mintaka sshd[20798]: Invalid user suporte from 189.2.118.72
Sep 2 13:58:43 mintaka sshd[20800]: Invalid user suporte from 189.2.118.72
Sep 2 13:58:46 mintaka sshd[20802]: Invalid user suporte from 189.2.118.72
Sep 2 13:58:49 mintaka sshd[20804]: Invalid user suporte from 189.2.118.72
Sep 2 13:58:51 mintaka sshd[20806]: Invalid user suporte from 189.2.118.72
Sep 2 13:59:24 mintaka sshd[20817]: Did not receive identification string from 189.2.118.72
# Script roda
** hosts.deny updated **
ALL:74.221.239.100
ALL: 189.2.118.72
ALL: 200.27.79.101
ALL: 74.221.239.100
# E os hosts agora estão bloqueados
Sep 2 14:00:09 mintaka sshd[20826]: Invalid user teste2008 from 189.2.118.72
Sep 2 14:00:10 mintaka sshd[20864]: refused connect from 189.2.118.72 (189.2.118.72)

Eu rodo em minha máquina a cada 2 minutos :)

6 Comments :, , , , ,

StatPress

Visits today: 84 Visits since 6 de abril de 2009: 15776 Visitors now: %visitoronline%