Django + Postgresql dockerizada!


WOW! "Dockerizada", que palabrita!

Luego del comentario de gilgamezh sobre docker y como utilizarlo como alternativa a instalar un motor en la maquina host, y la charla de Ricardo en la PyCon, decidí sentarme y aprender a utilizar docker como herramienta de desarrollo.

Así es que preparé una pequeña charla para el primer meetup que se realizó acá en San Rafael, sobre Docker y Docker-Compose. Me sirvió como excusa para comenzar a utilizarlo. La presentación que armé para esa charla la podés encontrar acá.

Pero bueno, vayamos al objetivo de este post. Utilizar docker y docker compose para administrar contenedores que nos permitan utilizar un motor PostgreSQL sin necesidad de instalarlo en la máquina.

Voy a suponer que sabés que es Docker y que conocés de la herramienta de su staff Docker Compose.

Basándome en este script, creé mi propia imagen y la subí a Docker Hub (matuu/postgresql). Podés usar esa o cualquier otra con postgres instalado.

Dentro de la carpeta del proyecto Django creamos un archivo docker-compose.yml con el siguiente contenido:

data:
  restart: always
  image: matuu/postgresql:latest
  volumes:
    - /var/lib/postgresql
  command: "true"

postgres:
  restart: always
  image: matuu/postgresql:latest
  volumes_from:
    - data
  ports:
    - "5432:5432"

Básicamente, lo que hacemos con este archivo es indicarle a Docker Compose cómo tiene que orquestar todo el entorno de desarrollo del proyecto. Indicamos que cree un contenedor para el storage, y un contenedor con el motor postgresql exponiendo el puerto 5432.

Para arrancar el entorno completo (todo lo que indicamos con el archivo docker-compose.yml), hacemos:

sudo docker-compose up -d

Esto creará y ejecutará los contenedores. Con -d indicamos que se ejecute en background.

sudo docker-compose ps
Name                     Command               State           Ports
-----------------------------------------------------------------------------------
web_data_1       true                             Up
web_postgres_1   /usr/lib/postgresql/9.3/bi ...   Up      0.0.0.0:5432->5432/tcp

Genial! Están ambos ejecutandose.

Probemos entonces si podemos acceder al motor.

$ psql -Udocker -h localhost -W docker
Contraseña para usuario docker:
psql (9.4.5, servidor 9.3.10)
conexión SSL (protocolo: TLSv1.2, cifrado: DHE-RSA-AES256-GCM-SHA384, bits: 256, compresión: desactivado)
Digite «help» para obtener ayuda.

docker=#

¡¡Éxito!!

La imagen tiene configurada un usuario docker (con password docker) y una base de datos docker, por lo que tendrémos que reflejar esos datos en los settings del proyecto.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'docker',
        'USER': 'docker',
        'PASSWORD': 'docker',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}

Acá ya podemos hacer syncdb o migrate

Importando la base de datos desde un dump

Viendo que nos podemos conectar directamente al motor del contenedor, podemos restaurar la base de datos normalmente con:

cat dump.sql | psql -Udocker -h localhost -W docker

Tené en cuenta que quizás tengas, o bien, que modificar tu dump cambiando el nombre de la base de datos y/o usuario a docker, o bien, añadiendo la base de datos y usuario correspondiente.

Cualquier cosa, dejame un comentario.

Abrazo!

Django + Postgresql - Configuración inicial del entorno


Trabajando con Postgresql

/images/dj+postgresql+python.png

En reiteradas ocaciones tuve que instalar y configurar un entorno de desarrollo para django con postgres, por lo que me hice esta pequeña guia.

Instalamos:

sudo aptitude install postgresql pgadmin3

Una vez finalizada la instalación, continuamos con la configuración. Tengan especial atención al usuario que ejecuta el comando. user@equipo es tu usuario, root@equipo es el root del sistema. postgres@equipo es el usuario postgres del sistema (se creará una vez finalizada la instalación del motor).

Nos pasamos al usuario root

user@equipo:$ sudo -i

Establecemos una clave al usuario postgres (recordala!)

root@equipo:# passwd postgres
root@equipo:# exit

Como usuario normal nos pasamos al usuario postgres, nos pedirá el pass

user@equipo:$ su - postgres
postgres@equipo:$

Creamos usuario y base de datos

postgres@equipo:$ createuser user
postgres@equipo:$ createdb db1

Establecemos la clave del usuario y los permisos de este sobre la base de datos

postgres@equipo:$ psql template1
template1=# \password user
template1=# GRANT ALL PRIVILEGES ON DATABASE db1 to user

Habilitar el acceso a usuarios locales mediante password

sudo vim /etc/postgresql/9.4/main/pg_hba.conf  # puede cambiar el numero de versión en tu sistema

Buscar las lineas:

# "local" is for Unix domain socket connections only
local   all            all                      peer

Cambiar por:

local   all            all                      md5

Reiniciar el servicio

sudo services postgresql restart

Probamos la conexión a la nueva base de datos con el nuevo usuario

psql -U user -W db1

Password for user user:
psql (9.4.4)
Type "help" for help.

user=>

Éxito!

Importar base de datos

Es común importar a la base de datos vacia un dump de otra base. Esto es sencillo. Suponiendo que el dump de la base de datos se llama dump.sql y te encuentras en la misma carpeta, ejecutá:

psql -U user -W db1 < dump.sql

Te solicitará la contraseña y comentará a importar cada instrucción del archivo.

Suerte! y cualquier cosa dejá un comentario.

Bye!

python + vim - Entorno de trabajo


Esta es una simple guía de los pasos que suelo seguir para configurar un entorno de trabajo con python, usando vim como editor+IDE.

/images/dj+vim+python.png

VIM

Uso la config de fisa fisa-vim-config

Instalo vim, git y dependencias

sudo apt-get install vim exuberant-ctags git

Verifico que vim tiene soporte para python

vim --version | grep +python

Otras dependencias para python

sudo pip install dbgp vim-debug pep8 flake8 pyflakes isort

Abro vim para instalar los plguins

vim

PYTHON

Verifico versión de python y versión de pip

python --version
pip --version

Instalo virtualenv

sudo apt-get install virtualenv

Creo carpeta de para virtualenv

mkdir ~/.virtualenvs

Instalo virtualenv-wrapper

sudo pip install virtualenvwrapper

Configuro virtualenv-wrapper

echo "export WORKON_HOME=~/.virtualenvs" >> ~/.bashrc
echo ". /usr/local/bin/virtualenvwrapper.sh" >> ~/.bashrc

Recargo bashrc

. ~/.bashrc

Compruebo el funcionamiento

workon  # esto debe mostrar tus entornos virtuales, vacio si lo acabamos de instalar

Creo un entorno

mkvirtualenv new_env

Verás que el prompt cambia y ahora empieza con (new_env). Eso indica que estás en un entorno virtual.

Especifico la carpeta del proyecto - útil para moverse a la carpeta una vez ingresado en el entorno virtual:

cd [project_root]  # reemplaza [project_root] por la carpeta del proyecto
pwd > ~/.virtualenvs/new_env/.project

Chequeo que funcione OK con

cdproject

Hasta acá llega la guía. La iré actualizando según vaya añadiendo pasos en la configuración del entorno.

¿Tenés pasos extra en tu configuración? ¿O tenés algún consejo para dar?

Por favor, deja un comentario!! :-)

Abrazo

Django + mysql - Cambio de COLLATION y CHARSET


En un proyecto django en el que vengo trabajando estaba teniendo problemas con el tipo de caracter usado en la base de datos MySql. Los datos se obtienen a través de una api (cuyo encoding es UTF-8) y al guardar los datos recibidos solía obtener un:

_mysql_exceptions.Warning: Incorrect string value: 'xECx9AxB4 xECx9D...' for column 'name' at row 1

Esto sucedia aleatoreamente en distintas tablas y campos, por lo que decidí modificar todas las tablas de la aplicación django en cuestión.

El problema es que eran muuuchas tablas y se debe establecer el charset y collation individualmente (por tabla).

Usando esta respuesta como base hice lo siguiente:

  1. Ejecuté este script para obtener el script (valga la redundancia) que me convertiría cada tabla (app_django en el nombre de la aplicación django cuya base de datos quiero actualizar):
SELECT CONCAT('ALTER TABLE `', t.`TABLE_SCHEMA`, '`.`', t.`TABLE_NAME`,
    '` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;') as spt
FROM `information_schema`.`TABLES` t
WHERE 1 AND t.`TABLE_SCHEMA` = 'app_django' and t.`table_name` like "app_django_%"
ORDER BY 1

Esto genera una salida por tabla a actualizar:

ALTER TABLE `app_db`.`app_django_country` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE `app_db`.`app_django_customeraddress` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE `app_db`.`app_django_customer` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
  1. Ejecutamos la salida anterior para modificar todas las tablas de la app django.

Anduvo de maravillas.

Saludos

PyCamp 2015 en La Serranita - Córdoba


Entre los días 14 y 17 de agosto se realizó, en La Serranita, Córdoba, el pycamp 2015.

/images/pycamp2015/pano_pycamp.jpg

Este evento, organizado anualmente por la comunidad de python argentina (pyAr), tiene como principal objetivo reunir a sus integrantes en un lugar alejado de las grandes ciudades, y trabajar durantes estos días conjuntamente en distintos proyectos relacionados con python.

Éste fue el primer pycamp al que asisto, y seguramente no sea el último. Para mi fue genial conocer a todas esas personas que leo hace años. pyAr está compuesto por un gran grupo humano, además de técnico, y eso lo pude sentir personalmente en este, mi primer contacto con el grupo. Con respecto al lugar, para mi estuvo muy bien elegido. La Serranita es muy lindo, seguramente vuelva dentro de poco con la flia, la verdad es que me encantó.

/images/pycamp2015/collageSerranita.jpg

Es cierto que el SUM no fue todo lo espacioso que quizás necesitamos, pero el lugar contaba con otros espacios al aire libre, y los días acompañaron.

Si hablamos de la comida, SARPADO!! Comimos abundantemente, y el asado del domingo fue exquisito!

¿Se nota que la pase bien?

Si hablamos de proyectos, yo estuve partcipando de algunos. El viernes estuvimos trabajando en una herramienta web para eventos tipo hackaton. Esta herramienta se llama htools (Hackaton TOOLS), y podríamos decir que nació de HTV (HashTag Viewer), la sencilla aplicación que construí para el Hackaton San Rafael.

/images/pycamp2015/planproject.jpg /images/pycamp2015/slots.jpg

Htools tiene el objetivo de brindar las funcionalidades útiles para un hackaton, que entendemos son: un visualizador de Twitter con determinado #hashtag, un tablero con los distintos proyectos (tomado de hackdash.org) y un timer del tipo countdown para marcar el tiempo restando del evento.

El sábado en la mañana estuve en modo read only en el grupo que estaban con el tema de arduido, raspberry py y esas yerbas, y en la tarde me puse a trabajar en un issue de fades (FAst DEpendencies for Scripts).

Fades es un sistema que automatiza el manejo de virtualenvs encontrando los requerimientos en el código, en un requirements.txt, o si son pasados por parámetros, creando o cargando un virtualenv adecuado y ejecutando el script dentro de él. Mi aporte fue la funcionalidad de poder especificar los requerimientos en el docstrings del script. Seguramente, en estos días se integrará esa funcionalidad.

/images/pycamp2015/sum1.jpg /images/pycamp2015/sum2.jpg

El mismo sábado, pero después de cenar, comencé a mirar TOTA, ya que me intrigaba cómo era el juego y cómo competían esos bot. Me enganché tanto que mi domingo se dividió en terminar lo de fades, y dotar de habilidades a mi bot. En el torneo me fue muy mal, pero me gustó muchísimo esa actividad.

Realmente, me gustó mucho el pycamp, conocí muchas excelentes personas, hice amigos, me acerqué a pyAr. Es un evento muy recomendable!!

Django + mysql - Error en mysql_config


Si estás configurando un entorno para trabajar con django y mysql, puede ocurrir un error al instalar MySQL-python (el conector python para el motor MySQL).

La solución es simple (ubuntu / debian):

sudo apt-get install libmysqlclient-dev

Haciendo esto pude instalar correctamente MySQL-python.

Combates TOTA en el pyCamp!


Última noche en el pycamp, en La Serranita (Cba). Ya comimos, charlamos y bebimos. Algunos juegan juegos de mesas, otros programan, y nosotros combatimos con nuestros bot de TOTA.

Tota es un juego creado por @fisadev para el pycamp de este año, en cuál la idea es que una serie de creeps comandados por un heroe defiendan a su rey y torre, y destruyan a los enemigos.

La competencia se centra en desarrollar la lógica que comanda a tu heroe, de modo de tomar las decisiones correctas en cada "tick" del juego.

Siete participantes desarrollaron su bot, y en estos momentos están combatiendo un todos contro todos, para luego realizar semi-final de los mejores 4.

/images/tota.gif

Mañana se realizará la final, la cual se proyectará alimentando a una visualización 3D realizada por otro grupo.

Cada juego, genera una salida json con la info de cada movimiento. Esta es la entrada para generar la visualización.

Mañana les cuento como resultó todo.

Bye!

Hackatón San Rafael, un éxito!


Cómo algunos de ustedes sabrán el pasado 6 y 7 de Junio se realizó el primer hackaton de San Rafael. Fue todo un éxito.

San Rafael no está acostumbrada a este tipo de eventos, por lo que esperábamos una participación de 50 personas o menos. Fueron más de 90, muchísimos estudiantes de la ciudad, y los alrededores (incluso chicos y chicas del secundario). Hasta se vino un chico desde Neuquén. Realmente no esperábamos tanta gente!

El primer día se dieron las charlas, la mayoría de los participantes se quedaron a todas, desde las 10hs hasta casi las 20hs. Gran participación de los asistentes, con preguntas e inquietudes (y eso que se jugaba la final de la champion!).

Luego nos fuimos a un bar cercano en el cuál tomamos cerveza y comimos algo (además de charlar de informática). Realmente estábamos muy contentos.

Al día siguiente se realizó el hackaton. 9am de la mañana, estaban la mayoría de los participantes esperando en el hall de la facultad. No podíamos creer el entusiasmo de todos. Tantos los organizadores como los participantes, la mayoría no habíamos participado de un hackaton, por lo que la organización fue medio caótica, pero productiva. Salieron proyectos muy interesantes.

El proyecto elegido, fue premiado con entradas para el Startup Weekend Mendoza 2015, que se realizó este fin de semana. El proyecto VeoVeo, salió segundo en ese certamen.

La verdad, que todo salió muy bien.

Si querés conocer detalles sobre los proyectos, comparto la nota de prensa. Igualmente, pronto vamos a subir las diapos de las charlas.

Quería destacar lo piola que estuvo mostrar en una pantalla gigante, los tweet que se iban escribiendo con el hashtag #hackatonSanRafael. Se realizó utilizando un pequeño proyecto personal llamado HashTagViewer.

Los organizadores subíamos fotos y anunciábamos el título de la charla, el nombre del disertante, cuestiones relativas al hackaton y al hackdash, etc, mientras los participantes (muchos adolescentes) comentaban lo piola que estaba el evento, subían selfies y hasta alguien se animó a pedir por el partido final de la champion (en modo de joda). Sé que pareciera que esto distrae en las charlas, pero no fue así. Estaban todos muy enganchados.

#hackatonSanRafael fue TT en la zona cuyo según nos dijeron un par de twiteros.

Pronto les traeré las diapos de las charlas y más datos sobre este evento.

Saludos