Gran parte del tiempo de el chico “que sabe de computadoras” en el trabajo se ve invadido por cataratas de consultas por los famosos virus transportados por los pendrives. Usuarios de windows, claro.
Acá les dejo un instructivo de como formatear un pendrive en cualquier Linux de forma rápida:
1° ponemos el pendrive
2° lo desmontamos:
$ sudo umount /media/pendrive (siendo que lo haya montado ahi)
3° lo formateamos:
$ sudo mkfs.vfat /dev/sda1 (siendo /dev/sda1 el dispositivo del pendrive)
Listo. El pendrive formateado y sin virus!
Cómo saber donde está montado el pendrive y como se llama el dispositivo? Con el comando mount:
$ mount
Este comando listará los dispositivos montados, uno de las últimas líneas serán
/dev/sda1 /media/pendrive
O similar. Si es similar, entonces usar esos valores que arroja el comando mount para desmontar y después formatear.
Django es fantástico con el mapeo de modelos a base de datos, simplemente hay que correr el comando ‘python manage.py syncdb’ y genera las tablas previamente definidas en ‘models.py’. Este comando sabe a poco cuando modificamos los modelos, ya sea agregando columnas o cambiando tipos de datos, ya que syncdb ignorará todos estos cambios. Para que todo siga andando, una vez modificado el modelo, tenemos que modificar a mano la base de datos. Cosa que ya deja de ser tan atractivo…
La solución a este problema son los sistemas de migraciones de esquemas, aplicaciones de terceros que hacen este trabajo por nosotros.
Hace un tiempo que había comenzado a usar django-evolution, estaba muy contento, pero todo indica que el proyecto será discontinuado, y los caminos conducen a South, único sobreviviente de todos los que habían surgido para atacar este problema.
Así que es un buen momento para migrar el sistema de migraciones!
Instalar South:
Si estamos usando virtualenv:
‘pip install -E entorno/ South’
Sino,
‘pip install south’ (algunos puritanos lo instalan via apt-get)
agregamos south a nuestras aplicaciones en ‘INSTALLED_APPS’
Comenzar a usarlo
Comenzar a utilizar shoth desde cero:
‘python manage.py schemamigration myapp –initial’ (se crea la migración incial)
‘python manage.py migrate myapp’
Agregar South a nuestra aplicación
Si ya teníamos un proyecto andando y le agregamos south para manejar las migraciones:
‘python manage.py convert_to_south myapp’
Migrar modelos
Una vez que modificamos los modelos en ‘models.py’, para que se refleje en nuestra base de datos,
‘python manage.py schemamigration myapp –auto’ (crea una nueva migración)
‘python manage.py migrate myapp’ (aplica esta nueva migración creada)
Así de simple, para cosas más complicadas, vamos a la documentación oficial
Referencias:
http://south.aeracode.org/
http://mitchfournier.com/2010/06/23/getting-started-with-south-django-database-migrations/
http://lucasbonomo.com.ar/2011/06/20/jugando-con-south/
August 3rd, 2011 in
software |
1 Comment
Después del rotundo éxito de cómo usar django con apache y mod_wsgi y demostradas las virtudes de utilizar virtualenv, veamos como usar todo esto junto.
Es muy similar al ejemplo anterior, solamente tenemos que agregar unas pocas líneas al archivo de configuración django.wsgi (si seguimos con el ejemplo pasado) en nuestro proyecto para que utilice python y django de nuestro entorno creado y no el python y django global.
import site
site.addsitedir('/home/patricio/dev/python/envs/entorno/lib/python2.7/site-packages')
Como un breve resumen:
Tenemos instalado nuestro entorno en:
/home/patricio/dev/python/envs/entorno
Tenemos nuestro proyecto django andando en:
/home/patricio/dev/python/sources/proyecto
En nuestro proyecto de trabajo creamos el archivo django.wsgi con el siguiente contenido:
import os
import sys
import site
site.addsitedir(’/home/patricio/dev/python/envs/dj-fbcb/lib/python2.7/site-packages’)
sys.path.append(’/home/patricio/dev/python/sources’)
sys.path.append(’/home/patricio/dev/python/sources/proyecto’)
os.environ['DJANGO_SETTINGS_MODULE'] = ‘proyecto.settings’
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
En nuestro virtualhost quedaría lo siguiente:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName localhost
DocumentRoot /home/patricio/dev/python/sources/proyecto
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /home/patricio/dev/python/sources/proyecto >
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
WSGIScriptAlias / /home/patricio/dev/python/sources/proyecto/django.wsgi
Esto sería todo, reiniciar apache y debería salir todo andando!
Días atrás me encontré en el trabajo con un equipo que tenía instalado un cliente de correo Mozilla Thunderbird 1.0.2 en un Windows XP y como yo lo había instalado allá por el año 2006, alguna solución tenía que brindar. La pc destino sería un Ubuntu 11.04 con Thunderbird 3.1.10, asé que había que hacer un salto importante entre versiones.
Un amigo (que tiene un peluche de thunderbird) me pasó una guía de mozillaes acerca de que se guarda en los perfiles, me vino realmente muy bien.
Lo primero que hacemos es una copia del perfil a restaurar.
Luego vamos a la editamos nuestro profile.ini que está en /home/usuario/.thunderbird y lo editamos.
Cambiamos el parámetro de isRelative, de 1 a 0 y especificamos la ruta al perfil.
[General]
StartWithLastProfile=1
[Profile0]
Name=default
IsRelative=0
Path=/ruta_al_perfil_viejo/rswrrrmt.default
Listo, iniciamos thunderbird y sale andando todo. Correo, direcciones, filtros, aprendizaje del antispam.
[1] http://www.mozillaes.org/documentacion/index.php?title=Perfil_%28Mozilla_Thunderbird%29
May 18th, 2011 in
software |
2 Comments
Una de las cosas que me traje del último pyday en Córdoba de fin de abril, fue la idea de empezar a usar virtualenv.
Virtualenv es un software que virtualizar entornos python. Esto permite tener distintas configuraciones sin romper la dependencia de paquetes entre los distintos proyectos. Permite tener distintas versiones de paquetes instalados y sobre todo para cuando necesitamos instalar paquetes, no tenemos permisos de root y tenemos que andar rogando al sysadmin que los instale.
A continuación unas notas de instalación y uso. Fueron hechas usando ubuntu, pero son similares en debian y parecidas en cualquier otro linux. Para los demás, vean la doc oficial de virtualenv.
Instalando
Lo primero es instalar virtualenv y pip para instalar los paquetes dentro de nuestro entorno.
apt-get install python-virtualenv
apt-get install python-pip
Creando el entrono
Crearemos nuestro primer virtualenv en el directrio env,
patricio@plg:~/dev/python$ virtualenv --distribute --no-site-packages env/
New python executable in env/bin/python
Installing distribute........done.
Installing pip...............done.
Listo, tenemos una copia de nuestro python pelado en env/
Esto sería bueno hacerlo con cada uno de los proyectos que emprendamos.
Instalando paquetes
Para instalar paquetes desde fuera del entorno usamos la opción -E de pip. Por ejemplo, si queremos la última versión de django disponible en pypi:
patricio@plg:~/dev/python$ pip install -E env/ Django
Downloading/unpacking Django
Downloading Django-1.3.tar.gz (6.5Mb): 6.5Mb downloaded
Running setup.py egg_info for package Django
Installing collected packages: Django
Running setup.py install for Django
changing mode of build/scripts-2.6/django-admin.py from 644 to 755
changing mode of /home/patricio/dev/python/env/bin/django-admin.py to 755
Successfully installed Django
Cleaning up...
patricio@plg:~/dev/python$
Activando y desactivando
Para activar el entorno usamos source, para desactivarlo, deactivate:
patricio@plg:~/dev/python$ source env/bin/activate
(env)patricio@plg:~/dev/python$
(env)patricio@plg:~/dev/python$ deactivate
patricio@plg:~/dev/python$
Turbulencias
Podemos llegar a tener complicaciones al instalar ciertos paquetes, que no son puramente python. Por ejemplo, al querer instalar MySql-python mediante pip, larga algunas excepciones.
Tenemos que instalar antes libmysqlclient-dev y python-dev.
patricio@plg:~/dev/python$ pip install -E env/ MySQL-python
Downloading/unpacking MySQL-python
Running setup.py egg_info for package MySQL-python
sh: mysql_config: not found
Traceback (most recent call last):
....
sudo apt-get install libmysqlclient-dev
sudo apt-get install python-dev
ahora si,
patricio@plg:~/dev/python$ pip install -E env/ MySQL-python
Downloading/unpacking MySQL-python
...
Successfully installed MySQL-python
Cleaning up...
Probando cosas
Ya que estamos, probamos un proyecto que teníamos con una versión menor de django donde nos muestra algunos warnings.
patricio@plg:~/dev/python$ source env/bin/activate
(env)patricio@plg:~/dev/python$ cd django/nutricion/
(env)patricio@plg:~/dev/python/django/nutricion$ python manage.py runserver
Validating models...
/home/patricio/dev/python/env/lib/python2.6/site-packages/django/db/__init__.py:19:
DeprecationWarning: settings.DATABASE_* is deprecated; use settings.DATABASES instead.
DeprecationWarning
/home/patricio/dev/python/env/lib/python2.6/site-packages/django/db/__init__.py:60:
DeprecationWarning: Short names for ENGINE in database configurations are deprecated.
Prepend default.ENGINE with 'django.db.backends.'
DeprecationWarning
0 errors found
Django version 1.3, using settings 'nutricion.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
Clonando entornos
Cuando trabajamos con virtualenv es facil reproducir el entrono. Con el comando freeze podemos ver el estado actual de paquetes en el entorno.
(env)patricio@plg:~/dev/python$ pip freeze
Django==1.3
MySQL-python==1.2.3
distribute==0.6.15
wsgiref==0.1.2
Para reproducir el entorno, exportamos la lista de paquetes instalados y después lo replicamos en otro lado.
(env)patricio@plg:~/dev/python$ pip freeze > instalacion.txt
patricio@plg:~/dev/python$ virtualenv --distribute --no-site-packages otroEnv/
patricio@plg:~/dev/python$ pip install -E otroEnv/ -r instalacion.txt
Referencias:
http://pypi.python.org/pypi/virtualenv
http://www.saltycrane.com/blog/2009/05/notes-using-pip-and-virtualenv-django/

Acaba de empezar el otoño y justo coincidió con una seguidilla de días de fresquito. En eso miro la planta de albahaca que estaba en la maceta y mucha vida no le quedaba. Con el frío se empieza a achicharrar y con las heladas se quema del todo, así que antes que el señor invierno me la lleve, había que hacer algo con ella.
Una opción era un pesto para unos ravioles o ñoquis, que más o menos andábamos por el 29, pero no me convencía mucho la idea. Mejor hacer una prueba de pan saborizado con pesto, había probado con algunas otras cosas, y estaba bastante seguro que podía funcionar. Una vez hecho les aseguro, no falla!
Antes de ir a la receta les repito, vale la pena sacrificar esa plantita de albahaca antes que se queme con la helada.
Por último, les pregunto a los admiradores de los hornitos eléctricos si pueden hacer algo parecido a esto.
Read the rest of this entry »
Desde hace un par de años tengo una Dell Inspiron 1420 con Ubuntu andando sin problemas, pero el otro día hablando por skype me doy cuenta que no me andaba la camarita.
La verdad que no se cuándo habrá dejado de funcionar, pero no andaba más.
El comando lsusb me decía que la camara era una OmniVision
patricio@plg:~$ lsusb
Bus 002 Device 003: ID 05a9:2640 OmniVision Technologies, Inc. OV2640 Webcam
Buscando en internet llegué a una solución [1] para recargar el módulo del kernel correspondiente en 2 pasos:
patricio@plg:~$ sudo rmmod uvcvideo
patricio@plg:~$ sudo modprobe uvcvideo
Fantástico, se prendió y apagó la luz de la cámara, todo funcionando nuevamente.
[1] http://diogomelo.net/drupal/blog/10/webcam-problem-dell-inspiron
March 1st, 2011 in
software |
2 Comments
Esta es una receta sencilla de cómo configurar desplegar aplicaciones django en apache usando mod_wsgi, ya que mod_python está desaconsejado y en versiones próximas de django no va a estar soportado.
Ahora vamos a hacer dos configuraciones, una simplemente para ver que ande mod_wsgi y la otra para que haga andar nuestro proyecto.
Empezamos con la configuración para verificar que esté andando mod_wsgi.
Comenzamos instalando mod-wsgi para apahce. Si no teníamos apache o django, los instalamos también!
patricio@plg:~$ sudo apt-get install libapache2-mod-wsgi
Creamos el directorio donde alojar el proyecto de pruebas
/home/patricio/dev/django/test/
En ese directorio creamos el archivo app.wsgi con la respuesta http para probar que funciona el mod_wsgi
def application(environ, start_response):
status = '200 OK'
output = 'Hello World!'
response_headers = [('Content-type', 'text/plain'),
('Content-Length', str(len(output)))]
start_response(status, response_headers)
return [output]
Editamos el arcivo /etc/hosts para que resuelva nuestra petición agregando estas líneas
127.0.1.1 djangoserver
127.0.1.1 test.djangoserver
Ahora creamos un host virtual llamado test-wsgi:
sudo gedit /etc/apache2/sites-available/test-wsgi
y ahi ponemos lo siguiente:
<VirtualHost *:80>
ServerName test.djangoserver
DocumentRoot /home/patricio/dev/django/test
<Directory /home/patricio/dev/django/test >
Order allow,deny
Allow from all
</Directory>
WSGIScriptAlias / /home/patricio/dev/django/test/app.wsgi
</VirtualHost>
ahora activamos el host virtual y reiniciamos apache:
sudo a2ensite test-wsgi
sudo /etc/init.d/apache2 reload
Esto es todo, probamos que todo esté andando
http://test.djangoserver
Debería devolver un hermoso y original “Hello World”
El proceso es similar al anterior.
Trabajaremos sobre un proyecto django llamado “proyecto”. De nuevo muy originales!
Creamos un archivo llamado django.wsgi
/home/patricio/dev/django/proyecto/apache/django.wsgi
con el siguiente contenido
import os
import sys
sys.path.append('/home/patricio/dev/django')
sys.path.append('/home/patricio/dev/django/proyecto')
os.environ['DJANGO_SETTINGS_MODULE'] = 'proyecto.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
Ahora creamos la entrada en hosts.conf
127.0.1.1 proyecto.djangoserver
creamos el host virtual, lo activamos y reiniciamos apache
sudo gedit /etc/apache2/sites-available/proyecto
<VirtualHost *:80>
ServerName test.djangoserver
DocumentRoot /home/patricio/dev/django/proyecto
<Directory /home/patricio/dev/django/proyecto >
Order allow,deny
Allow from all
</Directory>
WSGIDaemonProcess proyecto.djangoserver processes=2 threads=15 display-name=%{GROUP}
WSGIProcessGroup proyecto.djangoserver
WSGIScriptAlias / /home/patricio/dev/django/proyecto/apache/django.wsgi
</VirtualHost>
sudo a2ensite proyecto
sudo /etc/init.d/apache2 reload
Finalizada la configuración básica, para probarlo
http://proyecto.djangoserver
Esto es solamente la configuración básica, para mayores detalles, ir al sitio oficial de mod_wsgi
http://code.google.com/p/modwsgi/wiki/IntegrationWithDjango
February 26th, 2011 in
software |
7 Comments

Volviendo a publicar una receta a fines de diciembre, igual que en el 2009. Pero no esperen una receta para las fiestas de fin de año. Para eso tienen la popularmente aceptada torre de panqueques, el pan dulce artesanal o la lengua a la vinagreta.
Ahora vamos con el chucrut, que si bien no es apta para la fiestas navideñas, sí es muy bueno para esta época del año en el hemisferio sur, ya que va muy bien con la cerveza fría. Ideal para un patio cervecero, o como en nuestro caso, para un balcón cervecero.
El cucrut es una comida típica de Alemania y Polonia basada en la fermentación del repollo. Su forma tradicional de cocinarlo es harto compleja y requiere de varios días de preparado y muchos cuidados para que el repollo vaya fermentando en forma saludable.
Lo que haremos ahora es un chucrut expres (o falso chucrut para algunos puristas). Para eso debemos simular la fermentación del repollo mediante la cocción y el agregado de vinagre de alcohol para sustituir al generado en el proceso original. De esta forma, en un par de horas, y con mínimo esfuerzo tenemos un chucrut express listo en un par de horas y de sabor muy parecido al alemán que bien acompañan a unas salchichas snaks.
Amigos residentes en el viejo mundo pueden aportar mejoras…
Vamos con la receta entonces…
Read the rest of this entry »
December 30th, 2010 in
recetas |
1 Comment
Después de una larga carrera llena de obstáculos, dragones y otras ficciones, mi amigo Juanjo Conti llega a publicar su primer libro de cuentos para compartir (CC by-nc-sa) “La máquina de los cuentos y otras ficciones”.

Acaba de salir la primer edición impresa y un ejemplar puede ser tuyo antes que se agote. Navidad está cerca y un libro siempre es un buen regalo!
Una breve reseña del libro.
En este volumen Juanjo Conti nos invita a hacer una excursión por sus mejores cuentos, que fueron escritos entre los años 2007 y 2010. Si bien los relatos presentan temáticas muy diversas, todos tienen un punto en común: lo sorpresivo de sus finales. Y esto le dará un toque mágico a cada una de las narraciones, en las que el pasado, presente y futuro se combinan para dar vida a los más diversos personajes y objetos: unos padres que reciben una llamada en la que les es anunciado el trágico destino de su hijo —un estudiante de medicina—, unos pueblos de la Edad Media que están pasando por un conflicto bélico, como así también una magnífica máquina del futuro que es capaz de otorgarle a quien le inserte una moneda, brillantes ideas para crear las historias más originales.
Si todavía estás interesado podés seguir leyendo por acá: http://www.juanjoconti.com.ar/cuentos/