domingo, 15 de septiembre de 2013

Fotos con webcam usando Django 1.5 y JpegCam

Hola nuevamente

Tenia un poco abandonado mi blog, debido a razones de trabajo, hoy vengo nuevamente a hablarles de Django, el framework de Python, esta vez, vamos a ver cosas interesantes como el tomar una instantánea o fotografía desde nuestra webcam utilizando una librería de Flash y Javascript.

Jpegcam es un interesante componente de Flash/JavaScript para capturar y guardar imágenes desde la webcam del usuario. Se puede utilizar por ejemplo para permitir a los usuarios hacer una imagen de sí mismos como avatares, o para completar su perfil.

Es un widget que a través de flash muestra una vista en vivo de la webcam y botones con funciones Javascript asociadas  que puede capturar y enviar una imagen a un servidor en modo POST.

¿Qué debemos hacer?
  1. Descargar la ultima versión de Jpegcam y agrégalo a tu carpeta de statics en tu proyecto Django, esta consta de archivos que son: shutter.mp3, webcam.js, webcam.swf
  2. Editamos el archivo webcam.js y buscamos para configurar los path de swf_url y shutter_url. En mi caso:
              swf_url: '/static/jpegcam/webcam.swf'
             shutter_url: '/static/jpegcam/shutter.mp3'
          Y mas abajo en el archivo, aproximadamente en la linea 166, agregar el path:
             this.shutter_url = url ? url : '/static/jpegcam/shutter.mp3';
Ahora nos vamos a Django, quiero manifestar que esta guía esta hecha para personas que han programado con Django y tienen conocimientos básicos del framework.

Primero creamos nuestro modelo de datos, donde vamos a almacenar los datos de la persona a registrar y su fotografía.
models.py
from django.db import models
import os
def get_image_name(instance, filename):
f, ext = os.path.splitext(filename)
archivo = '%s%s' % (instance.cedula, ext)
return os.path.join('webcamimages', archivo) 
class Persona(models.Model):
"""docstring for Personal"""
cedula = models.CharField(max_length=10)
nombres = models.CharField(max_length=60)
apellidos = models.CharField(max_length=60)
foto = models.ImageField(upload_to=get_image_name, blank=True, null=True) 
def __unicode__(self):
return self.cedula 
@models.permalink
def get_absolute_url(self):
return ('persona', [str(self.id)]) 
def _get_full_name(self):
"Retorna los nombres completos de Persona"
return '%s %s' % (self.nombres, self.apellidos) 
full_name = property(_get_full_name)
Les explico un poco el modelo, primero tenemos una función llamada get_image_name, esta función nos sirve para llamar los archivos que subamos por la opción file del formulario, siempre tendrán el nombre del campo cedula con su extensión, si mi cédula es 12345 y estoy cargando el archivo foto.jpg, esta función lo renombrada y lo guardara como 12345.jpg en la carpeta webcamimages dentro de media.
foto = models.ImageField(upload_to=get_image_name, blank=True, null=True) 
Ahora nos vamos a nuestro url.py, donde tenemos estas dos entradas:
url(regex=r'^persona/$',
     view= PersonaCreateView.as_view(),
         name='add_persona'
    ),
url(regex=r'^save_image/(?P<cedula>\d+)/$',
     view=SaveImage.as_view(),
      name='salvar_imagen'
),

La que nos interesa en este momento es la de save_image, ya que es la url que usaremos para tomar la fotografía, la otra es para que el formulario guarde la información dada.

Ahora crearemos nuestro views.py
from django.views.generic import TemplateView, CreateView, DetailView, ListView
from django.views.decorators.csrf import csrf_exempt
from django.http import HttpResponse
from django.conf import settings
from .models import Persona

class SaveImage(TemplateView): 
@csrf_exempt
def dispatch(self, *args, **kwargs):
self.filename = self.kwargs['cedula']+'.jpg'
return super(SaveImage, self).dispatch(*args, **kwargs) 
def post(self, request, *args, **kwargs): # save it somewhere
f = open(settings.MEDIA_ROOT + '/webcamimages/'+ self.filename, 'wb')
f.write(request.body)
f.close()
# return the URL
return HttpResponse("/media/webcamimages/" + self.filename) 
def get(self, request, *args, **kwargs):
return HttpResponse('No esta pasando el POST')

class PersonaCreateView(CreateView):
model = Persona
template_name = 'home/add_persona.html' 
def form_valid(self, form):
form.instance.foto = 'webcamimages/'+ form.instance.cedula + ".jpg"
return super(PersonaCreateView, self).form_valid(form)

Como ven, tenemos dos clases, la primera SaveImage, que es la que nos toma la instantánea y la guarda en la carpeta webcamimages con la cédula de la persona, la otra es la que guarda en base de datos y toma la dirección donde esta guardada la imagen y la agrega en el campo foto.

Ahora hacemos el html, llamado en nuestro caso add_persona.html
{% extends "base.html" %}
{% block extra_css %}
<!-- Primero, incluir la libreria de JpegCam -->
<script type="text/javascript" src="{{ STATIC_URL }}jpegcam/webcam.js"></script>
{% endblock extra_css %}
{% block contenido %}
<h1>Registrar Persona</h1>
<form class="span10" action="" method="POST" enctype="multipart/form-data">
{% csrf_token %}
<div class="row well">
<div class="span6">
<div class="control-group">
<label for="cedula" class="control-label">
Cedula:
</label>
<div class="controls">
<input name="cedula" type="text" value="" id="cedula">
<span class="help-inline">  Escriba su Cedula de Identidad</span>
</div>
</div>
<div class="control-group">
<label for="nombres" class="control-label">
Nombres:
</label>
<div class="controls">
<input name="nombres" type="text" value="" id="nombres">
</div>
</div>
<div class="control-group">
<label for="apellidos" class="control-label">
Apellidos:
</label>
<div class="controls">
<input name="apellidos" type="text" value="" id="apellidos">
</div>
</div>
<div class="control-group">
<label for="foto" class="control-label">
Foto:
</label>
<div class="controls">
<input name="foto" type="file" value="" id="foto">
<a href="#takephoto" role="button" data-toggle="modal" class="btn btn-warning">Tomar Foto</a>
</div>
</div>
</div>
<div class="span3" id="fotoview">
</div>
</div>
<button type="submit" class="btn btn-primary pull-right">Guardar</button>
</form>
<!-- Advanced Modal -->
<div id="takephoto" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
   <h3 id="myModalLabel">Camara</h3>
</div>
<div class="modal-body">
<!-- Configure a few settings -->
<script language="JavaScript">
document.write( webcam.get_html(320, 240) );
</script>
</div>
<div class="modal-footer">
<button class="btn" data-dismiss="modal" aria-hidden="true">Cerrar</button>
<button class="btn btn-primary" onClick="take_snapshot()" >Fotografíar</button>
</div>
</div>
{% endblock contenido %}

Lo primero es cargar la librería jpegcam.js, luego creamos nuestro formulario, aquí estoy usando bootstrap para ayudarme con los estilos, utilizo una ventana modal para activar la cámara y tomar la fotografía. Aquí algunos captura de pantalla de la aplicación final:



Y listo, quiero manifestar que hay formas de utilizar la cámara sin usar flash, el cual esta muy cuestionado por el tema de seguridad, mas esto les puede servir en un entorno empresarial, esta aplicación la pueden descargar desde github es este enlace, Espero sus recomendaciones y mejoras.

Saludos



martes, 25 de diciembre de 2012

Actualizando el Samsung Galaxy Nexus a Jelly Bean 4.2.1 desde Linux

Hola, aquí estoy con un nuevo tema, el cual surgió de la necesidad de actualizar mi teléfono Samsung Galaxy Nexus GT-i9250, cansado de esperar la actualización automatica por parte de Google, así que me puse a curiosear un poco por la red y conseguí que se podía hacer, pero mis exigencias eran un poco mas allá de lo que normalmente conseguía, aplicaciones hechas solo en Windows. Quería que funcionaran en linux y logre conseguir a Universal Nexus Linux Toolkit v2.0, que es un programa basado en script bash que ofrece una manera fácil de hacer todo lo que necesita hacer antes de flashear una ROM personalizada en el dispositivo Nexus.

Eso es lo que yo necesitaba y me arriesgue a usarlo, aquí les voy a contar lo sencillo que es, sin complicaciones. Eso si, te recomiendo que hagas tu respaldo, ya que este procedimiento te deja el teléfono como viene de fabrica.

Este programa sirve para los siguientes equipos:
  1. Nexus 4 [mako]
  2. Nexus 10 [manta]
  3. Nexus 7 (WiFi) [grouper]
  4. Galaxy Nexus (GSM) [maguro]
  5. Galaxy Nexus (Verizon) [toro]
  6. Galaxy Nexus (Sprint) [toroplus]
  7. Nexus S (worldwide version, i9020t and i9023) [crespo]
  8. Nexus S (850MHz version, i9020a) [crespo]
  9. Nexus S (Korea version, m200) [crespo]
  10. Nexus S 4G (d720) [crespo4g]

En mi caso, por mi modelo voy a usar la numero 4, Galaxy Nexus (GSM) [maguro]
Con esta herramienta usted será capaz de:
  • Unlock the bootloader. (Desbloquear el gestor de arranque)
  • Flash CWM recovery (Standard or Touch).
  • Root the phone. (poner en root el telefono)
  • Lock the bootloader. (Bloquear el gestor de arranque)
  • Flash Google Factory Image. (Instalar Imagen de Fabrica de Google)

Empecemos:

Como les dije lo primero es estar seguro que tienes tu respaldo al día de tu teléfono asociado con tu cuenta de gmail, es muy sencillo solo entra en la configuración de tu teléfono en la opción copia de seguridad y restablecer y asegura que tengas tildado la opción de "Hacer una copia de seguridad", que tu cuenta de gmail sea la correcta y la opción de "Restaurar automáticamente". Esto te asegura que al asociar tu teléfono a tu cuenta de gmail, el bajara todas tus aplicaciones y contactos que tenias en la versión anterior. esto también es útil cuando cambias de teléfono, por supuesto debe ser otro android.


¿Que necesitamos?

Bien, primero quiero aclarar que yo uso Ubuntu, por lo tanto no lo he probado en otra distribución, pero al ser un shell script no creo que tengan problemas, cualquier cosa revisen la pagina del desarrollador.

Nota:  Si estas corriendo linux en 64 bits, debes instalar las librerías de 32 bits 

1.- bajar el shell script desde aqui
2.- Extrae el archivo .tgz donde tu quieras, te recomiendo que sea dentro de tu carpeta home, en mi caso     
            /home/fquivera
3.- Abre un terminal y escribe lo siguiente:
Primero nos dirigimos a la carpeta donde esta el shell script, en mi caso:
            cd /home/fquivera/unlt
Hay que hacer una corrección en los enlaces dentro del shell script, ya que Google, borro las imágenes anteriores de la versión 4.2 por errores,  para esto editamos el archivo unlt.sh.
Podemos utilizar cualquier editor, en la linea numero 156 y 157, cambiar estas lineas por:
FACTORY_MAGURO="https://dl.google.com/dl/android/aosp/takju-jop40d-factory-e4d13f14.tgz"
MD5_MAGURO="351926836d314848ed4292bbc499ff36"
Cualquier cosa puedes revisar estos enlaces en la pagina de desarrolladores de Google aqui.
4.- En cuanto tu teléfono debes colocarlo en modo USB Depuración, Para activar la depuración USB en el teléfono: desde configuración -> opciones de desarrollo, marcamos la casilla depuración USB. Aqui te doy un enlace de un video de como hacerlo.
5.- Conectamos el teléfono via USB. 
6.- Ahora ejecutamos el shell script
      sudo bash ./unlt.sh 
      se utiliza sudo, porque debe ser utilizado con privilegios de administrador


7.- Escojamos la opción de nuestro teléfono (En mi caso la opción 4):


8.- Ahora nos pedirá si queremos hacerlo en Automático (Recomendado) o Manual.


9.- Ahora nos muestra la pantalla de las acciones que podemos hacer en nuestro dispositivo, en nuestro caso vamos ir por la opción 5  Flash Google Factory Image


10.- Ahora nos pide que tengamos nuestro teléfono encendido y conectado en modo USB Depuración y se procede a empezar el proceso


11.-  Aquí ira a Google developers a descargar la imagen, un error que puede ocurrir es que no tengan instalado en su linux el wget, que es el comando que utiliza para ello. en Ubuntu, lo instalas con:
    sudo apt-get install wget

Luego de descargar la imagen, comienza a cargar la imagen al Nexus, va parpadear varias veces su teléfono y ustedes podrán ver por el terminal del PC, lo que esta pasando. Al terminar reiniciara el teléfono y lo dejara tal como viene de fabrica, para que comiences a configurar con tu cuenta y baje automáticamente tus aplicaciones y contactos.

Como conclusión les comento que mi teléfono funciona excelente con Jelly Bean 4.2.1 y actualizo todas mis aplicaciones.



Esta no es la única forma de actualizar tu Galaxy Nexus  hay varias que puedes ver en Youtube o en Google, espero que este post les ayude y no olviden dejar sus comentarios al respecto. Saludos

Referencias:

miércoles, 10 de octubre de 2012

Creando Aplicaciones Web con Django 1.4 (2da Parte)

En el articulo anterior hablamos de como arrancar un proyecto en Django, en esta oportunidad aprenderemos un tema importante como es la configuración del proyecto. podemos decir primeramente que no hay una manera definitiva de hacerla, ya que la flexibilidad de Django nos permite que cada quien la realice a sus gusto.

Django por ser un framework de Python, utiliza este lenguaje para guardar sus configuraciones y aprovecha la manera de trabajar del lenguaje para hacer archivos de configuración fáciles de leer, extender y utilizar dentro de nuestros proyectos. Por eso es que quizás veremos en algunos proyectos que la configuración esta en varios archivos Python. En nuestro caso solo hablaremos y trabajaremos con el archivo settings.py.

Empecemos:

Editamos nuestro archivo settings.py con nuestro editor preferido, en mi caso yo uso vim, pero también lo puedes hacerlo con gedit, geany o nano (que es un clon del antiguo Wordstar, para algunos nostálgicos).

Primeramente importamos os, este módulo provee docenas de funciones para interactuar con el sistema operativo, en nuestro caso lo usaremos para conocer la ruta de nuestro proyecto.

# -*- coding: UTF-8 -*-
# Django settings for recetas project.

import os

#Definimos la ruta del proyecto
RUTA_PROYECTO = os.path.dirname(os.path.realpath(__file__))

También le damos la codificación UTF-8 a nuestro archivo de configuración para evitar los errores de caracteres en nuestro idioma.

Django por defecto trae la opción DEBUG=True, para que mientras estemos en desarrollo, podamos ver en detalle los errores de la aplicación, en le caso que tengamos la opción de DEBUG=False, normalmente en producción, las notificaciones de error de código son enviadas vía correo electrónico a los administradores, junto con los detalles completos del error. Para poner los datos de los administradores, debemos agregar en forma de tupla, en mi caso lo dejaré así:

 ADMINS = (
     ('Francisco Quivera', 'fquivera@gmail.com'),
)

Una vez hecho esto vamos a definir con que manejador de base de datos trabajara nuestro proyecto. Quiero aclarar que aunque es posible usar Django sin una base de datos, Django incluye un mapeador objeto-relacional (ORM), en el que es posible describir la estructura de la base de datos usando Python. Esto lo veremos en mas detalle cuando veamos los modelos, aquí solo le diremos a Django con que manejador de base de datos vamos a trabajar. Django soporta de manera predeterminada la conexión con Postgresql, MySql, Sqlite3 y Oracle. En nuestro proyecto usaremos Sqlite3, por su facilidad de uso, ya que viene con Python desde la versión 2.5.

Busquemos la siguiente sección del archivo y modificamos:

DATABASES = {
    'default': {
      'ENGINE': 'django.db.backends.sqlite3', #Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': os.path.join(RUTA_PROYECTO,'db/recetas.db'), # Or path to database file if using sqlite3.
        'USER': '',                      # Not used with sqlite3.
        'PASSWORD': '',              # Not used with sqlite3.
        'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
        'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
    }
}

Estoy resaltando lo que vamos a agregar, en el caso de utilizar MySql o Postgres, deben instalar previamente los módulos Python para la conexión con estas bases de datos, en Ubuntu se hace con:

MySql:
 
sudo install python-mysqldb

Postgres:

sudo apt-get install python-psycopg2

Configurar la zona horaria, Django permite configurar la zona horaria del proyecto, esto lo hacemos en la siguiente sección, en mi caso agregue la que me corresponde, pueden buscar en la red cual es la que aplica para su caso:

TIME_ZONE = 'America/Caracas'

Django también permite configurar el idioma que usará de manera predeterminada para su funcionamiento, esto es muy útil ya que el administrador de Django, utilizara el idioma definido aquí, para configurar esto debemos cambiar lo siguiente:

LANGUAGE_CODE = 'es-VE'

Django requiere rutas de archivos para cargar archivos estáticos y definir donde estarán nuestras Plantillas o Templates, para hacer esto de manera dinámica, usamos las bondades que nos ofrece Python. Como ya definimos la variable RUTA_PROYECTO, que no es mas que la ruta del directorio donde se encuentra dicho archivo, a partir de éste armaremos la ruta de los archivos estáticos.

Para esto primero debemos crear las carpetas donde vamos a tener dichos archivos, como ya estamos ubicados en home/fquivera/recetas/recetas, hacemos lo siguiente:

mkdir static media plantillas db

luego nos cambiamos a static para crear otras carpetas

cd static
mkdir js img css fonts

Nos deba quedar nuestro árbol de directorio de la siguiente manera:

└── recetas
    ├── manage.py
    └── recetas
        ├── __init__.py
        ├── db
        ├── media       
        ├── plantillas
        ├── settings.py
        ├── static
        │   ├── css
        │   ├── fonts
        │   ├── img
        │   └── js
        ├── urls.py
        └── wsgi.py

¿Para que son esas carpetas que acabamos de crear?

Bien, la carpeta static la utilizamos para ubicar los archivos de estilos css, dentro de la carpeta css, los javascript que podamos utilizar dentro de la carpeta js, las imágenes de nuestro proyecto, como logos, backgrounds, entre otros en la carpeta img y por ultimo si requerimos alguna fuente de letra, la ubicamos en la carpeta fonts
Por otro lado esta la carpeta media, esta carpeta la usamos para almacenar las imágenes, videos, sonidos que utilizamos en nuestros datos, osea, multimedia asociada en nuestra base de datos.
Y por ultimo la carpeta plantillas que allí estarán nuestras plantillas html de nuestro proyecto. La carpeta db es para el archivo de base de datos Sqlite3.

Ahora nos toca decirle a Django a través del archivo settings.py donde están ubicados esos archivos, para ello volvemos a editarlo, buscamos y cambiamos lo siguiente:

Esta variable le dirá a Django donde esta ubicada la carpeta media

MEDIA_ROOT = os.path.join(RUTA_PROYECTO,'media')

La siguiente es la ubicación vía URL, nos permitirá ubicarla mediante http://miproyecto/media

MEDIA_URL = '/media/'

Igualmente la URL para los archivos estáticos

STATIC_URL = '/static/'

La ubicación de los archivos estáticos:

STATICFILES_DIRS = (
    os.path.join(RUTA_PROYECTO,'static'),
)

Por ultimo, la ubicación de mis plantillas

TEMPLATE_DIRS = (
    os.path.join(RUTA_PROYECTO,'plantillas'),
)

Los proyectos en Django trabajan con aplicaciones, algunas ya vienen configuradas de manera predeterminada. Primeramente vamos a utilizar la aplicación de administración y su documentación, estas ya vienen construidas. Para habilitar estas aplicaciones debemos buscar la sección de INSTALLED_APPS que se encuentra casi al final del archivo settings.py y quitarle la marca de comentarios a 'django.contrib.admin' y 'django.contrib.admindocs'. Nos debe quedar de la siguiente manera:

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.flatpages',
    'django.contrib.admin',
    'django.contrib.admindocs',
)

Ahora salvamos nuestro archivo settings.py, regresamos a la carpeta principal y ejecutamos el siguiente comando:

python manage.py syncdb

Este comando nos crea la base de datos del proyecto, hasta ahora solo va generar las tablas necesarias por el administrador de Django.

Creating tables ...
Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table auth_user_user_permissions
Creating table auth_user_groups
Creating table auth_user
Creating table django_content_type
Creating table django_session
Creating table django_site
Creating table django_admin_log

You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no):
 
Aquí nos pide si queremos crear el superusuario para el administrador, le decimos que si, y nos pide los datos del usuario que sera el administrador

Would you like to create one now? (yes/no): yes
Username (leave blank to use 'fquivera'):
E-mail address: fquivera@gmail.com
Password:
Password (again):
Superuser created successfully.
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)

Ahora para poder ver los cambios que hicimos y navegar por la interfaz administrativa de Django, aún falta modificar un archivo llamado urls.py. Este archivo esta en la misma carpeta donde esta el archivo settings.py. Modifiquemos este archivo:

vim urls.py 

from django.conf.urls import patterns, include, url

# Uncomment the next two lines to enable the admin:
# from django.contrib import admin
# admin.autodiscover()

urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'recetas.views.home', name='home'),
    # url(r'^recetas/', include('recetas.foo.urls')),

  #Uncomment the admin/doc line below to enable admin documentation:
    # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),

    # Uncomment the next line to enable the admin:
    # url(r'^admin/', include(admin.site.urls)),
)

Quitemos el comentario a algunas cosas y nos queda el archivo de la siguiente manera:

from django.conf.urls import patterns, include, url
from django.contrib import admin

admin.autodiscover()

urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'recetas.views.home', name='home'),
    # url(r'^recetas/', include('recetas.foo.urls')),


    url(r'^admin/doc/', include('django.contrib.admindocs.urls')),

    url(r'^admin/', include(admin.site.urls)),
)

he resaltado lo que he cambiado, además se han borrado las lineas de comentario, bien ahora si probamos lo que hemos hecho hasta ahora

$ python manage.py runserver
Validating models...

0 errors found
Django version 1.4.1, using settings 'recetas.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

Y probamos en nuestro navegador http://127.0.0.1:8000

veremos lo siguiente:


Upssss, que paso aquí, como ya modificamos el archivo urls.py, Django, ve cuales son las URLs validas para el proyecto y estas son /admin y /admin/doc, ya que no hemos colocado la url raíz. corregimos la url en nuestro navegador de la siguiente manera:

http://127.0.0.1:8000/admin


Ahora Django nos pide el usuario y contraseña, para ingresar al administrador, lo hacemos y tenemos la siguiente pantalla:


Hasta aquí esta segunda parte, cualquier duda, escriba en los comentarios y así lo compartimos con todos. Hasta la próxima

domingo, 23 de septiembre de 2012

Creando Aplicaciones Web con Django 1.4


Después de mucho tiempo de estar viendo tutoriales en internet, logré hacer una aplicación completamente funcional con el framework de python Django.  Es importante aclarar  que es indispensable que usted tenga conocimientos básicos de python; para continuar, les recomiendo el libro llamado inmersión en python. el cual puedes descargar de la red.

En este tutorial voy a crear una aplicación que tenga integración con base de datos, autenticación, reportes, JQuery, Css y alguna otra cosa que se nos ocurra.

En esta oportunidad voy a realizar una aplicación que mi esposa me había pedido hace mucho tiempo, para guardar sus recetas de cocina, hay varias como estas en la red, solo que aquí nos iremos un poco mas alla de Django y le colocaremos los juguetes adicionales como JQuery y CSS.

Empecemos:

Este tutorial esta basado en la plataforma Linux, en la distribución que mas le guste, yo utilizo normalmente Ubuntu, actualmente en la versión 12.04. En el caso de las personas que usan Windows, hay muchos manuales en la red de como hacerlo, para ello les invito a ver un excelente vídeo tutorial de Alex Dzul en este enlace.

En Ubuntu como en todas las distribuciones linux, ya viene instalado el python, por lo que no necesita instalarlo, entonces procedemos a instalar Django, el cual esta disponible en código abierto bajo la licencia BSD. Se requiere la versión de Python 2.5 o superior, es importante saber que no depende de otras bibliotecas de Python. Y hay varias maneras de conseguirlo e instalarlo:

1. con los repositorios que trae sus sistema operativo:

$ sudo apt-get install python-django

2. Con  easy_install o pip, estos son instaladores de paquetes python, en cualquier sistema operativo, solo hay que tener previamente instalado alguno de los dos paquetes y proceder:

Para utizar easy_install, este debe instalarse previamente en Ubuntu con:

$ sudo apt-get install python-setuptools

Luego procedemos a instalar Django

$ sudo easy_install django

pip es una herramienta para instalar y administrar paquetes de Python, como las que se encuentran en el índice de paquetes de Python. Es un reemplazo para easy_install.

$ sudo apt-get install python-pip

Para instalar django con pip solo hay que tipear:

$ sudo pip install Django 

3. Bajarlo directamente de la página de django http://www.djangoproject.com, esta es una de las mejores opciones porque estarás bajando la última versión o release de django. Descargamos este comprimido, normalmente se hace en Descargas y luego lo descomprimimos en nuestra carpeta personal

$ tar xzvf Django-1.4.1.tar.gz
$ cd Django-1.4.1

Luego dentro de la carpeta ejecutamos el setup.py para instalarlo en nuestro sistema operativo.

$ sudo python setup.py install

Una vez que termine probamos la instalación en python

fquivera@fquivera-VGN-CR490E:~$ python
Python 2.7.3 (default, Aug  1 2012, 05:16:07) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import django
>>> 

Si no produce ningún error esta correctamente instalado, esta prueba es efectiva para cualquiera de las formas que escogió para instalar.

Muy bien, ya que tenemos instalado Django, vamos a proceder a crear nuestro primer proyecto, para ello nos ubicamos en nuestra carpeta personal y creamos la carpeta donde vamos a realizar nuestro proyecto.

$ cd
$ mkdir django
$ cd django

Ahora vamos a crear nuestro primer proyecto que llamaremos recetas con el siguiente comando:

$ django-admin.py startproject recetas

Este nos creará una carpeta llamada recetas, entramos en ella y tenemos un archivo y una carpeta

$ cd recetas

recetas
├── manage.py
└── recetas
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

Expliquemos cada uno de estos archivos:

La carpeta superior recetas es sólo un contenedor para su proyecto. Su nombre no le importa a Django, usted le puede cambiar el nombre a cualquier otro que le guste.

manage.py: Una utilidad de línea de comandos que te permite interactuar de distintas formas con este proyecto Django. Utilizaremos muchas veces este programa utilitario a medida que avancemos en nuestro proyecto.

La carpeta interna recetas es un paquete real Python para el proyecto. Su nombre es el nombre del paquete Python que tendrá que utilizar para importar cualquier cosa en su interior (por ejemplo, la importación recetas.settings).

recetas / __init__.py: Un archivo vacío que le dice a Python que esta carpeta debe considerarse como un paquete Python. (Más información acerca de los paquetes en la documentación oficial de Python si usted es un principiante de Python.)

recetas / settings.py: Ajustes  y configuración para este proyecto Django. Aqui haremos todas las configuración del proyecto Django y  todo acerca de las opciones de trabajo.

recetas / urls.py: Las declaraciones URL para el proyecto Django, es una "tabla de contenidos" de tu sitio Django. Puedes conocer más acerca de las URL en el despachador de URL.

recetas / wsgi.py: Un punto de entrada para WSGI compatibles con servidores web para hospedar su proyecto. Veremos la manera de publicar su proyecto en un servidor mas adelante.

El servidor de desarrollo

Vamos a verificar que todo va bien. Revise que este en directorio superior de recetas, y ejecute el comando

$ python manage.py runserver

Verá la siguiente salida en su terminal:

Validating models...

0 errors found
Django version 1.4.1, using settings 'recetas.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

Ahora vaya a su navegador favorito y escriba la dirección http://127.0.0.1:8000 y le aparcera esta pagina:

Hasta aquí esta primera parte, cualquier duda, escriba en los comentarios y así lo compartimos con todos. Hasta la proxima

Segunda Parte

jueves, 23 de junio de 2011

Hidrobolivar una empresa de Servicio 100 % Software libre

Hidrobolívar, C.A. es la empresa prestadora del servicio de agua potable y saneamiento ambiental del Estado Bolívar en la República Bolivariana de Venezuela. Sus accionistas son la Gobernación del Estado Bolívar y sus once Alcaldías, cuya misión es "Proveer el servicio de agua potable y saneamiento en  condiciones de óptima calidad, mediante un modelo de gestión efectivo y sustentable, asegurando la satisfacción de nuestros clientes y el desarrollo de una nueva cultura del agua fundamentada en la valoración del recurso hídrico"

Hidrobolívar fue fundada el 26 de Marzo del 2005 y ya en Venezuela existía un marco legal que guiaba a las empresas publicas a la modernización, tal es el caso del artículo 110 de nuestra Constitución Nacional, donde se reconoce como de interés público, la ciencia, la tecnología, el conocimiento, la innovación y los servicios de información con el objeto de lograr el desarrollo económico, social y político del país.

A partir del 28 de Diciembre del 2004, se oficializo el uso de software libre en la Administración Pública Nacional con el Decreto con Fuerza de Ley No. 3.390. Por lo tanto Hidrobolívar debía seguir estos lineamientos desde su fundación, ser una empresa innovadora y con sus sistemas de información de acuerdo a las necesidades de sus clientes y la comunidad. Por lo que nació Libre.

Ahora bien, ¿Por qué se dice una empresa cien por ciento libre?, es libre por que los sistemas que se utilizan son de arquitectura abierta y respecto al software propietario que se utiliza hay la libertad para cambiarlo, ya que estamos en constante evaluación de los mismos. No hay matrimonios obligados, ya que el software medular de la empresa es desarrollado por ella misma cumpliendo con las cuatro libertades.

En cuanto al software utilizado tenemos:

Sistemas Operativos: Centos en Servidores, Fedora, Ubuntu en estaciones
Sistema de Directorio: LDAP, IPA Server, Proyecto 389
Sistema de Autenticación: sssd, Kerberos
Sistema de Archivos: Samba, NFS
Servicio de Proxy: Squid
Correo Electrónico: Posfix en Servidor, Evolution y Mozilla Thunderbird en Clientes
Trabajo en Grupo: SOGO, DocManager
Base de Datos: PostgresSQL, MySQL
Sistema de Información Geográfico: Mapserver, GvSig, PostGis
Lenguajes de Programación: PHP, Javascript, Ajax, python
Central Telefónica: Asterisk, Elastix
Ofimática: OpenOffice, LibreOffice
Herramientas Cad: Bricscad
Herramientas de Diagramas: Dia, Scribus
Herramientas Gráficas: Gimp, Inkscape
Sistema Administrativo: Merú Administrativo
Sistema Comercial: Merú Comercial
Sistema Recursos Humanos: Merú RRHH
Sistema de Operaciones: Merú Operaciones
HelpDesk: Merú Desk basado en GLPI
Herramientas de Administración centralizada de estaciones de trabajo: Puppet, Servidor de instalación desasistida y masiva Cobbler, Mirrors o Espejos de Distribuciones, control de inventario de equipos de computación, reproducción y perifericos con el OCS.
Sistema de Moritoreo de Red: Nagios+MySQL+Nagvis

Tal como comente en un mi articulo anterior La Planificación, elemento esencial en la implantación del Software Libre, Merú es nuestro ERP o sistema de gestión de recursos empresariales, es un software hecho en Hidrobolívar para hidrológicas.

También podrán apreciar que hay software que no es libre, mas tenemos la libertad de escoger el software a la medida de nuestras necesidades, ejemplo: la herramienta CAD, ya que el producto con que acostumbraron a trabajar a nuestros ingenieros tiene un valor económico cuatro veces mayor, y la alternativa que utilizamos hace lo mismo, y me atrevo a decir que tiene muchas mejoras y complementos con respecto al otro.

Algunos se preguntaran ¿Por qué Centos como Sistema Operativo para Servidores?, quizás porque es el que mas se ha adaptado a nuestros servicios y lo consideramos muy robusto y confiable, lo estamos utilizando desde que iniciamos el primer servidor. En cuanto a las estaciones, utilizamos Fedora y Ubuntu por que nos gustaron estas distribuciones de Linux, pero ya nos estamos preparando para cumplir la disposición publicada en Gaceta Oficial No. 39.633 donde los organismos y entes de la Administración Pública Nacional de la República Bolivariana de Venezuela deberán utilizar Canaima GNU/Linux como sistema operativo en sus estaciones de trabajo, cambio que no sera traumático para los usuarios. Esas son algunas de las ventajas que brinda la libertad del Software libre.

Beneficios que ha traído el software libre a Hidrobolívar:

Una sola plataforma de comunicaciones
  • Voz y data en el mismo canal de comunicaciones
Integración de servicios de voz y datos
  • Servicio telefónico de notificación de deuda
  • Saldo en línea (vía web y telefónico)
  • Autogestionado de Salud Telefónico
  • Notificación de deuda vía correo electrónico
Indicadores de Gestión para la toma de decisiones
  • La alta gerencia tiene acceso a indicadores de gestión precisos y en línea directa de los sistemas administrativo, comercial y recursos humanos.
Gasto convertido en inversión
  • El dinero que se utilizaría para pago de licencias se utiliza para entrenamiento de personal
  • Ahorro anual aproximado de  $ 430.860,74  unos Bs. 1.851.944,21 (4,30x$)
Sistemas Adaptados a las necesidades del cliente
  • Al contar con un sistema propio, es totalmente factible la integración con distintas plataformas para ofrecer alternativas de atención a los clientes, tales como Bancos, Farmacias, Supermercados, entre otros, a través de un portal de Web Services.
Por esto y muchas cosas mas, podemos decir que Hidrobolívar es una empresa cien por ciento libre, la inversión realizada en tecnología esta allí, no en otro país, contamos con asesoramiento de empresas y cooperativas nacionales y locales  que nos ayudan a mantener la plataforma, ya que somos una empresa de servicio de saneamiento y agua potable, que ha demostrado que sí se puede lograr una empresa con la libertad para escoger sus herramientas de gestión sin necesidad de adaptarse a modelos importados que traen otras realidades que no son las nuestras, y esto solo se logra con el software libre.

sábado, 18 de junio de 2011

Software Privativo, Libre, Pirata ¿Cuál opción escoger?

Cuando conocí a Ana, mi esposa, me resultaba tan curioso observar como una persona se encontraba tan inmersa en el mundo del "Windows", y tan directamente condicionada a asociar equipos de computación con "Microsoft Office". Pasaba días transcribiendo sus trabajos en el usual "Word", así como pasaba horas enteras diseñando sus presentaciones en el clásico "Power Point". Para ella, automáticamente al encender su computadora, era casi instantáneo visualizar antes que apareciera, aquella banderita de colores que le indicaba  que su sistema operativo era una licencia de Windows; y de este modo por mucho tiempo, asumió que toda computadora era así, que el mundo de la informática pertenecía exclusivamente a Microsoft y su creador se dedicaba no solo a fabricar computadoras sino a colocar lo que dentro de ella venia, sin pensar siquiera la posibilidad remota de la existencia del uno sin el otro y viceversa.

Creo que esta pequeña anécdota no es extraña para nadie, al punto que inclusive hoy día forma parte de la realidad de muchas personas, de la cual ya ni ella ni yo somos parte, afortunadamente.

Es por ello, que me parece conveniente, traer hoy día esta reflexión, y expandir un poco el horizonte de quienes aún navegan en el exclusivo mar de las licencias privadas, bien porque la adquirieron de modo legal o sencillamente porque se encuentran frente a una reproducción ilegal de la misma, mejor conocida como software pirata.

Empezaremos primeramente definiendo que es software legal: Es aquel que se utiliza con el consentimiento de su creador o dueño, ya sea por medio de una licencia o sin ella, y puede adquirirse pagando dicha licencia o de forma gratuita.

Por otro lado, encontramos el software libre, cuya traducción del inglés "free software" ha generado una ambigüedad que ha hecho pensar que todo es gratis, y sin embargo no es obligatorio que sea así, por lo tanto no hay que asociar que todo software libre es gratis (denominado usualmente freeware), ya que conservando su carácter de libre, puede ser distribuido comercialmente (software comercial).

Análogamente, el "software gratis"  incluye en ocasiones el código fuente; no obstante, este tipo de software no es libre en el mismo sentido que el software libre, a menos que se garanticen los derechos de modificación y redistribución de dichas versiones modificadas del programa. Para ser mas precisos y ya que se tiende a confundir, la realidad es la denominación del software que respeta la libertad de los usuarios sobre su producto adquirido, y por tanto, una vez obtenido puede ser usado, copiado, estudiado, modificado y redistribuido libremente.

También existe el software de dominio público, que no debe confundirse tampoco con el software libre, ya que este tipo de software no requiere licencia, pues sus derechos de explotación son para toda la humanidad, pertenece a todos por igual y cualquiera puede hacer uso de el, siempre con fines legales y refiriéndose al autor original, ya que este lo ha donado a la humanidad o puede ser el caso que los derechos de autor han expirado, tras un plazo contado desde la muerte de su creador, que generalmente son unos 70 años. Si un autor condiciona su uso bajo una licencia, por muy débil que sea, ya no es un software de dominio público.

El software propietario llamado también privativo, de código cerrado o software no libre, es cualquier programa informático en el que el usuario tiene limitaciones para usarlo, modificarlo o redistribuirlo (esto último con o sin modificaciones), tal es el caso del conocido Windows.

La persona natural o jurídica al poseer los derechos de autor sobre un software, tiene la posibilidad de controlar y restringir los derechos del usuario sobre su programa, lo que en el software propietario implica por lo general que el usuario sólo tendrá derecho a ejecutar el software bajo ciertas condiciones, comúnmente fijadas por el proveedor, que signifique la restricción de una o varias de las cuatro libertades.

Ahora bien, que usar  ¿libre, propietario o pirata?, indudablemente que con la adquisición de un  software pirata la empresa corre el riesgo de ser sancionada en caso de realizarse los debidos controles,  por lo tanto esta opción debe ser descartada. Pero esto nos lleva mucho mas allá,  nos lleva precisamente al problema cultural -no técnico-, y es que nos enseñaron -y lo peor-, nos acostumbraron  a usar una herramienta que la consigues en cualquier esquina  -ilegalmente por supuesto- y cuando vamos a las empresas, éstas tienen que pagar una licencia, porque las personas jurídicas son mas fáciles de fiscalizar;  al respecto hay un excelente articulo escrito por @w3asel cuyo enlace les dejo aquí, donde profundiza muy acertadamente este problema.

En Venezuela existe la Ley Especial contra los delitos informáticos, publicada en la Gaceta Oficial numero 37.313 el 30 de Octubre del 2001,  donde se castiga el acceso indebido a un sistema, penado con prisión de uno a cinco años y multa de 10 a 50 unidades tributarias (UT),  así como la apropiación indebida de propiedad intelectual mediante la reproducción, divulgación, modificación o copia de un software, penado con prisión de uno a cinco años y multa de 100 a 500 UT: sin embargo a pensar de contar con la legislación que tipifica el delito y sanciona la acción, su efectiva aplicación aún no es la mas idónea.

Aún contando con el contexto anterior, y haciendo a un lado la existencia del software pirata, entonces, ¿Porque las empresas no utilizan el software libre?, ¿Por soporte? no lo creo, cada día hay mas empresas que dan soporte al software libre, y si es por eso, podemos hablar de un sistema operativo propietario como lo es el Windows XP que no tiene soporte desde hace mucho tiempo y aun así lo siguen usando. Usar software libre facilita las condiciones para la creación de nuevo software, adaptado a las necesidades que se tengan y podamos brindar mejor calidad a nuestros clientes ya que es conocimiento, y ésta es la base de la economía del futuro. Los argumentos para la no utilización del software libre se han acabado: primero, existe gran cantidad de software de calidad que hace lo mismo que el propietario y solo esta al alcance de un click, así como también conseguirá algunos con un costo muchísimo menor que el que nos acostumbraron a utilizar.  La herramienta está al alcance de sus manos, solo atrévase.

lunes, 9 de mayo de 2011

La Planificación, elemento esencial en la implantación del Software Libre

La planificación es un paso crítico en todo proyecto, que debe hacerse bien para evitar problemas futuros. El definir desde el principio cómo serán las bases del proyecto y estar soportadas por la inteligencia del negocio, nos evitara desperdiciar recursos y materiales. La planificación es un elemento esencial que muchos gerentes parecen no comprender y no le dan la debida importancia. En este articulo trataremos el tema desde la perspectiva de una empresa basada en software libre.

Hidrobolívar, C.A. es la empresa prestadora del servicio de agua potable y saneamiento ambiental del Estado Bolívar en la República Bolivariana de Venezuela. Sus accionistas son la Gobernación del Estado Bolívar y sus once Alcaldías, cuya misión es "Proveer el servicio de agua potable y saneamiento en  condiciones de óptima calidad, mediante un modelo de gestión efectivo y sustentable, asegurando la satisfacción de nuestros clientes y el desarrollo de una nueva cultura del agua fundamentada en la valoración del recurso hídrico"

Hidrobolívar fue fundada el 26 de Marzo del 2005 y ya en Venezuela existía un marco legal que guiaba a las empresas publicas a la modernización, tal es el caso del artículo 110 de Nuestra Constitución Nacional, donde se reconoce como de interés publico, la ciencia, la tecnología, el conocimiento, la innovación y los servicios de información con el objeto de lograr el desarrollo económico, social y político del país.

Y a partir del 28 de Diciembre del 2004, se oficializo el uso de software libre en la Administración Publica Nacional con el Decreto con Fuerza de Ley No. 3.390. Por lo tanto Hidrobolívar debía seguir estos lineamientos desde su fundación, ser una empresa innovadora y con sus sistemas de información de acuerdo a las necesidades de sus clientes y la comunidad. Por lo que nació Libre.

El Software Libre y el Conocimiento, nos lanzan un reto para la innovación, donde tenemos disponibles los elementos necesarios para la construcción de un modelo de desarrollo libre e independiente, sin otro límite que la propia creatividad y la capacidad de innovación de cada uno, contribuyendo a ampliar la libertad e igualdad de oportunidades de progreso. Este reto nos lleva a:
  1. Repensar la gestión de las tecnologías de información
  2. Crear nuevos modelos
  3. Mejorar las relaciones con nuestros clientes
  4. Independencia con los proveedores de Software
  5. La Modernización del estado
El principal objetivo es lograr obtener el control de nuestro negocio, por supuesto, esto no es tarea fácil, ya que es un trabajo constante y de mucha resistencia, quizás de muchos años, donde se necesita la misma determinación con que valoramos nuestra libertad y la protegemos a cualquier costo. Estas premisas nos hizo crear una estrategia tecnológica basada en los procesos del negocio, que no es mas que nuestra misión y visión como empresa, el porque existimos; la estrategia de tecnología, que se basa principalmente en el decreto 3.390 y las tecnologías de información existentes en el mercado enmarcadas dentro de este decreto (ver Figura)

Estrategia Tecnológica de Hidrobolivar, C.A.
La unión de estos tres elementos nos proporcionan servicios de tecnología e infraestructura que al final van al servicio del cliente, a quien nos debemos. Con estas premisas, Hidrobolívar planifico primeramente su infraestructura tecnológica, que se convirtió en la base de sus sistemas de información y poder tener la interrelación de cada uno de los sistemas y así evitar las islas de información, basado primeramente en un sistema integral donde todos los procesos de la empresa convergen, este macro sistema lo llamamos merú.

Arquitectura Tecnológica de Hidrobolivar, C.A.
Merú -cuyo significado en el idioma pemón es salto de agua o cascada-, es un nombre escogido para nuestro sistema, primero porque nos identifica nuestra razón de ser, la potabilización del agua y su saneamiento y segundo que es autóctono de nuestra región, el estado Bolívar.

Ahora, Merú es nuestro sistema de planificación de recursos empresariales o ERP, es un sistema de información gerencial  que integra y maneja los procesos asociados con las operaciones del servicio de potabilización  y saneamiento del agua.

Como podemos apreciar en la figura, tenemos los diferentes módulos de merú, con una clara interrelación entre ellos, ya que la información se comparte y evita la multiplicidad del dato, brindando una calidad del mismo, para luego ser convertido en información e indicadores de gestión que proporcionara a la alta gerencia herramientas para la toma de decisiones.

Para finalizar, debo decir que para implantar cualquier sistema de información gerencial, es importante tener claro el proceso del negocio, las metas y objetivos del mismo; y de allí alinear las tecnologías de información para lograr una sinergia efectiva entre ambas estrategias, lo cual es un principio fundamental dentro de la empresa. La planificación nos permite lograr la claridad de metas y objetivos, y está indicada como un factor clave de éxito para la implantación de sistemas ERP. Es trasladar la visión de la compañía y la estrategia que resulta de esta visión en prioridades concretas, y decidir exactamente cómo la implantación de un sistema de información gerencial como merú puede ayudar a la empresa a lograr sus objetivos.