Habilitando plpythonu no PostgreSQL

Olá pessoal,

pra quem não sabe, banco de dados relacionais não apenas SQL. Eles também aceitam criar funções (procedurais) bem complexas, que podem depois ser utilizadas dentro de uma query SQL. No PosgreSQL, a linguam procedural padrão é a plpgsql, mas é possível instalar (e habilitar) outras linguagens, como Python, por exemplo. E é isso que eu “”””ensino”””” agora!

Primeiro, instalamos ela via apt-get (Ubuntu/Debian). Certifique-se sobre qual versão do PosgreSQL você está usando. No meu caso, estou usando a versão 9.3.

apt-get install postgresql-plpython-9.3

Agora, se você verificar as extensões disponíveis para o seu PostgreSQL,

SELECT name, default_version, installed_version FROM pg_available_extensions;

você verá que plpythonu encontra-se lá, mas não está habilitada.
plpython
Basta então habilitá-la.

createlang -d nomedoseubanco plpythonu

Pronto, plpythonu deverá estar habilitada para você utilizar!
plpythonu
[]’s

Problema de Locale no Ubuntu/Debian

Olá pessoal,

não sei aqui quantos aqui tem/tiveram um problema com o Locale do Ubuntu/Debian:

perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LC_CTYPE = "UTF-8",
LANG = "en_US.UTF-8"
are supported and installed on your system.
perl: warning: Falling back to a fallback locale ("en_US.UTF-8").

Pois bem. Depois de muito procurar e quebrar a cabeça com sudo locale-gen “en_US.UTF-8” e sudo dpkg-reconfigure locales e nada funcionar. Bom, para solucionar isso, edite o arquivo /etc/environment e coloque as seguintes variáveis:

LC_ALL=en_US.UTF-8
LC_CTYPE = "UTF-8"

Reinicie o ambiente (shutdown -r now) e pronto! =D

[]’s

Categorias:Linux Tags:, ,

Git + permissões de arquivos

Olá pessoal, essa aqui será rápida!

Imagino que muitos aqui usam o Git né? Pois bem, já passaram pela situação onde mudamos a permissão de algum arquivo dentro da nossa estrutura de diretórios, mas não queremos que isso reflita no Git? Se não querem que isso aconteça, é possível configurar uma “flag” dentro do repositório para que o Git ignore isso:

git config core.filemode false

Com isso, se você alterar alguma permissão nos arquivos, o Git simplesmente irá ignorar essa mudança. Caso queira persistir uma mudança desse tipo, basta ativar novamente a “flag”.

git config core.filemode true

Bom, é isso! 😉

[]’s

Categorias:Git Tags:

Transformando objetos python complexos em JSON

Olá pessoal,

como vocês devem saber, hoje em dia retornar um objeto JSON em qualquer tipo de serviço tornou-se meio que uma obrigação. Pois bem, em Python existe um pacote muito simples para converter dicionários (dict) em JSON chamado simplejson. 

import simplejson

my_obj = dict(name="Nameless Terror")

my_obj_json = simplejson.dumps(my_obj)

Se você der um inspect no object, verá que o seguinte resultado:

‘{“name”: “Nameless Terror”}’

Lindo não? Pois bem, e se ao invés de termos um dicionário, tivermos um objeto python complexo?

import simplejson

class MyComplexObject(object):

    def __init__(self, name):
        self.name = name

my_complex_obj = MyComplexObject("Nameless Terror")
my_complex_obj_json = simplejson.dumps(my_complex_obj)

Você deve ter notado que ao executar esse código acima, um erro foi lançado:

TypeError: <__main__.MyComplexObject object at 0x102e1ed10> is not JSON serializable

Isso ocorreu pois o simplejson não tem idéia de como converter esse objeto. Uma forma simples de resolver isso seria simplesmente chamar o atributo __dict__ do objeto e passá-lo para o simplejson que no fim o transformaria sem problema, mas e se além do atributo name tivessemos um atributo creation_date que receberia um objeto datetime? Ou até mesmo uma tivessemos uma lista com vários objetos desconhecidos? o.O Teriámos que iterar por todos os atributos e chamar o __dict__ de cada um deles? Lembrando que o datetime não possui __dict__! PÂNICO! o.O

Calma, método dumps do simplejson recebe um parâmetro chamado defualt que nada mais é que uma função que é chamada quando ele não sabe como transformar em json um objeto qualquer.

import simplejson
import datetime

def default_parser(obj):
    if getattr(obj, "__dict__", None):
        return obj.__dict__
    elif type(obj) == datetime:
        return obj.isoformat()
    else:
        return str(obj)

class MyComplexObject(object):

    def __init__(self, name, other_object=None):
        self.name = name
        self.creation_date = datetime.datetime.now()
        self.other_object = other_object


my_other_complex_obj = MyComplexObject("Just to mess")
my_complex_obj = MyComplexObject("Nameless Terror", my_other_complex_obj)
my_complex_obj_json = simplejson.dumps(my_complex_obj, default=default_parser)

Se inspecionarmos agora o objeto my_complex_obj_json:

‘{“other_object”: {“other_object”: null, “name”: “Just to mess”, “creation_date”: “2014-07-24 15:43:26.515125”}, “name”: “Nameless Terror”, “creation_date”: “2014-07-24 15:43:26.518914”}’

Lindo não? =D

Pois então, espero que vocês curtam aí a dica, me de um trabalhinho até chegar nessa solução aí! 😉

[]’s

Categorias:datetime, Python Tags:, ,

Versionamento de banco de dados com Gradle + Flyway

Olá pessoal,

atualmente estou trabalhando em um sistema onde nossa base de dados é bem estável, ou costumava ser… pois bem, agora andei precisando fazer várias alterações e com isso achei melhor usar uma ferramenta para controle de versão da base. Há um bom tempo atrás eu usei o Liquibase e, na época, achei bem legal. Mas como isso já tem um bom tempo, achei que talvez houvesse uma boa alternativa (algo mais simples inclusive). Foi ai que me deparei com o Flyway. Super simples e com diversos plugins para as mais diversas ferramentas. Resolvi testá-lo e é claro, acabei encontrando alguns problemas (quem nunca não é??).

Para esse post, me focarei em chamar o Flyway usando o Gradle mas fazendo que ele ignore o arquivo de configuração e aceite os parâmetros via linha de comando. Pode parecer besta, mas vai por mim, isso pode ser uma mão na roda quando você tem várias máquinas distintas (ambientes de desenvolvimento, teste e produção por exemplo) com várias outras configurações distintas.

O meu aquivo build.gradle está +/- assim:

flyway {
url = ‘jdbc:postgresql://33.33.33.10:5432/my_db’
user = ‘myuser’
password = ‘mypassword’
schemas = [‘public’]
}

Então, todo vez que eu digitava “gradle fC fM”, o gradle chamava o plugin do Flyway, executava o clean e o migrate na minha maquina virtual (quem observou o ip deve ter notado que eu estou usando o vagrant). Minha configuração default é para o meu ambiente de desenvolvimento. Agora e quando eu vou executar em outro ambiente? Uma opção (a mais burra eu diria) seria simplesmente alterar o arquivo build.gradle e colocar a configuração da maquina que eu quero acessar. Nada prático né?

Que tal então passar os parâmetros que eu quero que o gradle ignore por linha de comando?

gradle flywayInfo -Pflyway.user=otheruser -Pflyway.url=jdbc:postgresql://other_url:5432/my_other_db

Dessa forma, eu simplesmente chamei o mesmo script (para fazer apenas o info da base) com outro usuário e em outra máquina/base, assumindo que os passwords são iguais. Legal né?

Bom, é isso pessoal!

[]’s

Python e Datas

Olá pessoal,

ultimamente eu venho trabalhando com Python e acabei quebrando bastante a cabeça quando tive que começar a trabalhar com datas e timestamps. Imagino que minha maior dificuldade tenha vindo do fato d’eu ser um mais acostumado com Java (System.currentTimeMillis(), por exemplo).

Bom, então para facilitar (minha vida principalmente) aqui está uma pequena cola:

Unix Time (ou timestamp):

import time

timestamp =int(time.time()) * 1000
Unix Time para datetime:

import datetime

parsed = datetime.datetime.fromtimestamp(timestamp/1000.0)
Flw e espero que ajude alguém 😉
Fontes:
Categorias:Python Tags:,

Acesso SSH com private key sem usar password

Olá pessoal,

nos últimos dias andei tendo problemas em acessar um servidor remoto para fazer deploy automático usando uns scripts, tudo isso porque o ssh acabava que pedindo senhas de acesso e isso meio que atrapalhava o quesito “automático”. Pois bem, fucei um pouco e descobri algumas coisas a respeito de acesso ssh usando chaves privadas sem a necessidade de senha, vou colocar aqui alguns passos então:

  1. Criar uma chave ssh sem password: “ssh-keygen -t rsa” (na hora de digitar o password, aperte enter para deixar em branco)
  2. Enviar a chave pública (o comando acima, deverá gerar 2 chaves, uma privada e uma pública) para o servidor no qual você quer acessar via ssh usando a chave.
  3. No servidor, logado com o usuário com o qual você quer acessar, faça “apend” do arquivo authorized_keys com a chave pública que foi gerada no passo 1. (exemplo: “cat id_rsa.pub >> /home/<usuario>/.ssh/authorized_keys”)
  4. Ainda no servidor, lembre-se de verificar se a pasta e o authorized_keys tem permissão 700 (chmod -R 700 /home/<usuario>/.ssh)

Nesse ponto, você já pode tentar fazer ssh da maquina cliente (da qual você gerou a chave) para o servidor, usando a chave privada (“ssh -i ~/.ssh/id_rsa <usuario>@<servidor>”). Se ele mesmo assim negar o acesso, você pode tentar debugar o acesso executando o mesmo ssh, mas usando a flag -vvv (1 “v” para cada nivel de verbose). Exemplo: “ssh -vvv -i ~/.ssh/id_rsa <usuario>@<servidor>”.

Ele provavelmente irá te dizer qual é o problema. No meu caso, é que ele não estava achando minha chave dentro do .ssh do meu usuário (sim, eu gerei minha chave com nome direferente do id_rsa) e por isso tinha que adicioná-la ao ssh-agent usando o comando ssh-add (“ssh-add <suachaveprivada>”). Se nesse ponto ele disser que não pode conectar ao ssh-agent, você provavelmente terá que iniciar uma nova sessão do mesmo. Para tal, execute “eval $(ssh-agent)”, ele irá criar uma nova instância do ssh-agent e setará as variáveis de ambientes necessárias para o ssh-add achá-lo. Logo após, tente executar novamente o ssh-add (“ssh-add <suachaveprivada>”).

Pronto, agora é só tentar fazer o ssh novamente e correr para o abraço! =D

[]’s

Fontes: https://coderwall.com/p/rdi_wq