lunes, 15 de septiembre de 2014

De Nano a Emacs, cambiando una resortera por una piedra filosofal.




Hace un tiempo ya que publique un articulo para empezar a usar Vim, en esta entrada y gracias a Jonathan Sandoval puedo tomar un articulo de su blog y adaptarlo para así traer ante ustedes una nueva herramienta, Emacs.

¿Qué es Emacs?
La GNU define a emacs como el editor extensible y [altamente] personalizable. Esta descripción podría perfectamente aplicarse a muchos otros editores si es que no se conoce de emacs, o nunca se ha trabajado en él.
Comenzaré por mencionar que Emacs fue desarrollador por Richard Stallman, un desarrollador de C y de Lisp, que llegó a ser usuario de máquinas Lisp, y emacs, en esencia, es una máquina virtual de Lisp enfocada a la implementación de un potente editor. Emacs es, por tanto, extensible en Emacs Lisp. La naturaleza altamente dinámica de [Emacs] Lisp, le permite modificar (y por tanto, personalizar) virtualmente cualquier parte Lisp. Esto lo diferencia de otros editores que, a pesar de poderse extender a través de otros lenguajes de programación, lo permiten de una manera muy limitada a lo que puede llegar a permitir emacs.
Si en su tutorial de Vim, Oscar llama a este editor un “cañón de neutrones” (lo que sea que esto quiera decir), Emacs vendría a ser algo así como la “piedra filosofal” de los editores de texto (manteniendo la proporción de las metáforas ;)).

Funcionalidades
Veamos entonces, qué se puede realizar con GNU Emacs:


  • Corrector ortográfico (hace uso del que venga instalado en el sistema, aspell o hunspell por ejemplo).
  • Autocompletado de texto.
  • Múltiples archivos pueden ser visibles al tiempo, dividiendo el marco de trabajo.
  • Resaltado de sintaxis, dependiendo del lenguaje de programación que se utilice. 
  • Deshacer, “rehacer” (para emacs, rehacer es una forma de “deshacer”. Esto es bastante poderoso, aunque sea diferente a los demás editores).
  • Emacs soporta una cantidad impresionante de lenguajes de programación y modos de resaltado. 
  • En su administrador de paquetes (SI, emacs tiene un administrador de paquetes al más puro estilo de apt-get o yum) es posible encontrar sintaxis tan exóticas como las de los archivos de configuración de Asterisk.
  • Extensible en Emacs Lisp. (Hay proyectos como Pymacs que permiten que emacs pueda ser extensible en Python).
  • Completado de comandos, palabras y uris de archivos. (Es posible instalar complementes como Ido y Helm, los cuales pueden funcionar juntos, que a su vez expanden enormemente las capacidades de autocompletado y búsqueda de emacs).
  • Compresión y descompresión de ficheros a la hora de ser editados. Puede también trabajar con ficheros cifrados a través de gpg. Soporte para múltiples codificaciones de ficheros, y conversión entre los mismos.
  • Historial de comandos ejecutados recientemente. 
  • Igualmente, es posible instalar extensiones que facilitan que recuerdan los comandos más utilizados. Grabación y reproducción de macros. (Las ediciones de código más complejas se pueden realizar en emacs lisp). 
  • Guardado de la configuración entre sesiones. 
  • Plegado (folding) de bloques de código. 
  • Interfaz gráfica opcional (e innecesaria y poco recomendada). 
  • Probablemente es el editor más configurable y personalizable que hay (alguien me indica uno más personalizable?.
  • Es capaz de emular a Vim con Evil, pero con la potencia de seguir en Emacs :).
  • Compilación y depuración desde el mismo editor. 
En esta lista traté de listar lo mismo que en el artículo de Vim fue listado. Ahora haré un breve repaso de características de Emacs que son únicamente fáciles gracias a su diseño altamente extensible: 
  • Cliente de correo electrónico (rmail, gnus).
  • Lector de noticias. Cliente de IRC (ERC). 
  • Organizador personal (org-mode). Esta es probablemente una de las extensiones más impresionantes que tiene emacs, y por las que muchos usuarios deciden iniciar la carrera de aprendizaje de este editor. Yo lo uso como mi agenda personal, administrador de proyectos, y ofrece, por ahí derecho, la posibilidad de editar textos complejos que pueden ser exportados a formatos como HTML, LaTeX (y por tanto, a PDF), texto, plano, entre otros. Con org-mode es posible realizar programación literata e investigación reproducible. 
  • Interfaces a las aplicaciones de control de revisiones con VC (subversion, git, bazaar, mercurial, etc.). 
  • Administrador de procesos (Proced). 
  • Administrador de archivos (Dired). Este modo es especialmente interesante para realizar ciertas operaciones con archivos. 
  • Administrador de paquetes (package.el).


Utilizando emacs

Dado que esta es una [no tan] corta introducción, solo indicaré el uso básico de emacs. A diferencia de Vim, que hace uso de distintos modos para trabajar, emacs utiliza complejas combinaciones de teclas con Control, Alt, y otras (yo por ejemplo tengo configurada la tecla Win). La convención es que C-x quiere decir control junto con x, y C-x a quiere decir, primero Control-x, y posteriormente solo la tecla a. Igualmente, Alt se denota con M- por lo que M-x quiere decir, Alt junto con la tecla x (M quiere decir Meta, y se refiere a una tecla que tenían viejos teclados). Para abrir emacs basta con ejecutar lo siguiente en la linea de comandos:
emacs
Una vez en el editor, pueden presionar C-x C-f para abrir o crear un nuevo archivo. Una vez realicen cambios, pueden presionar C-x C-s para guardar los cambios. Ahora, para salirse de emacs basta con que presionen C-x C-c .

Otros comandos

  • C-SPC (Control + la barra espaciadora). Inicia la selección de texto.
  • C-w : Cortar.
  • M-w : Copiar.
  • C-y : Pegar.
  • C-a : Va al principio de la linea.
  • C-k : Corta desde la ubicación del cursor hasta el final de la linea.
  • M-7 C-k : Corta siete veces la linea.
  • C-u 5 0 C-y : Pega cincuenta veces lo recientemente copiado.
  • TAB: Tabula la linea actual.
  • C-_ : Deshacer.
  • C-x o : Cambia a la siguiente ventana.
Espero que aprendan mucho de este articulo y si quieren profundizar en Emacs pueden ir directamente a el articulo de donde se extrajo la información.


Si te gusto el post
compartelo... :D

miércoles, 13 de agosto de 2014

Tutorial de Backbone.js (III)

En las entradas anteriores hablamos sobre las Vistas en Backbone.js y la interacción con el usuario, y en el primer post de esta serie hablamos sobre la capa de datos de Backbone.js, en esta oportunidad veremos como usar los enrutadores de Backbone.js en una aplicación para hacer el proceso de navegación.

Navegando en el portal
Una de las cosas que hacen de la web de hoy en día algo tan especial es la facilidad de encontrar mucha información agolpada en un solo lugar pero organizada de una manera jerárquica y lógica, justamente este es el caso en que los enrutadores de backbone brillan, pero para entenderlo veamos primero que es un enrutador.
Un enrutador (Router) es una herramienta que permite manejar los hashtags (#) de las URLs de la aplicación como disparadores de eventos. A continuación veamos un ejemplo:
<script>
    var AppRouter = Backbone.Router.extend({
        routes: {
            "posts/:id": "getPost",
            "search/*search": "searchBook"
        }
    });
    var app_router = new AppRouter;
    app_router.on('route:getPost', function (id) {
        alert( "Obtener el número de post " + id );
    });
    app_router.on('route:searchBook', function (search) {
        alert( search );
    });
    Backbone.history.start();
</script>



Como vemos en el ejemplo se define la clase AppRouter, que hereda de la clase Router de Backbone y luego ésta se instancia, despues se utiliza el método on de la variable creada para definir que acciones ejecuta en que momento. El proceso de ruteo dinamico que realiza Backbone.js inicia cuando se invoca la accion start del objeto history de backbone en la linea 15.

Otra de las cosas que hacen interesantes los procesos de ruteo en Backbone.js es que cuando se definen las rutas se pueden extraer datos de las mismas que son pasados al callback como parametros, un ejemplo de esto es la ruta "posts/:id", la cual llama la funcion getPost con un parametro que sera extraido de la URL.

Otra de las herramientas es el uso de splats, que son expresiones que permiten tomar de un segmento de la URL y enviarlo como parametro al callback, un ejemplo de esto es la ruta "search/*search", que puede ser aplicado a la ruta "http://www.miserver.co/search/el-nombre-de-la-rosa", el cual invocara la función searchBook y enviara el parametro "el-nombre-de-la-rosa".

Teniendo en cuenta lo anterior podemos concluir que con la herramienta Router de Backbone.js es posible traer mucha información del servidor y mostrarla solo cuando sea necesario sintener que realizar más peticiones al servidor o haciendolas unicamente cuando se ejecuta un evento especifico, además de poder interactuar con datos extraidos de la URL.

Espero que les haya gustado el post.

Por favor
Comparte este post. 
:D

lunes, 4 de agosto de 2014

Tutorial de NodeJS I, llevando la potencia de V8 al servidor


Es verdad que hace algún tiempo Brendan Eich tuvo como labor crear un lenguaje que enriqueciera los navegadores y éste uso una poca de sus poderes magicos y entrego al mundo Javascript, tiempo después Google entrego al mundo de la mano de Lars Bak V8, una de las mejores maquinas virtuales que interpretan Javascript, y luego Ryan Dahl , un muchacho inquieto decidió portar V8 para que funcionara independientemente, y esto fue llamado Node.js.


Node.js es un entorno de programación para servidor basado en el lenguaje de programación Javascript, con I/O de datos en una arquitectura orientada a eventos y basado en el motor Javascript V8. Fue creado con el enfoque de ser útil en la creación de programas de red altamente escalables, como por ejemplo, servidores web.

Instalando NodeJS

El la pagina oficial del proyecto pueden descargar el instalador, para Windows y Mac es muy sencillo, solo basta bajar el instalador y ejecutarlo como se hace comúnmente en cada plataforma, para sistemas linux por otro lado es necesario descargar el código fuente, para instalarlo en distribuciones debian o basadas en debian debemos:

1. Descargar los fuentes
wget -c http://nodejs.org/dist/v0.10.30/node-v0.10.30.tar.gz
2. Instalar dependencias
apt-get install GCC make libssl-dev
3. descomprimir el paquete
tar -zxf node-v0.10.30.tar.gz
4. Entrar a la carpeta
cd node-v0.10.30
5. configurar
./configure
6. compilar (y tomar una buena tasa de café por que se toma su tiempo)
make
7. Instalar
sudo make install
Muy bien, esto deberia instalar nodejs y otra herramienta fabulosa llamada npm, la cual permite gestionar paquetes de nodejs y manejar dependencias, entonces para probar que se instalo correctamente ejecutamos:
node --version
npm --version
de esta manera tendremos las versiones de nodejs y npm respectiva mente.
Espero que esta primera parte sea util para ustedes.


Por favor
Comparte este post. 
:D

jueves, 3 de abril de 2014

SQLiteDbManager, una herramienta para SQLite3 en IOS


Desde hace un tiempo he estado trabajando en una librería para manejo de SQLite3 en IOS, ésta herramienta permite hacer operaciones con bases de datos de manera secuencial y no bloqueante para poder hacer consultas de la manera más simple, esta se llama SQLiteDBManager, pueden encontrarla en Github y esta disponible para la comunidad, está abierta a sugerencias y cambios pueden hacer un fork y mejorarla.

Espero que les sea de utilidad.

Por favor
Comparte este post.
:D

viernes, 21 de marzo de 2014

Tutorial de Backbone.js (II)


Backbone.js es una herramienta que permite separar el trabajo con datos, el trabajo de la capa visual y las acciones de navegación, lo cual hace de ésta una herramienta muy versátil a la hora de trabajar proyectos muy grandes. En la entrada anterior escribí acerca de la potencia de esta herramienta con respecto al manejo que le da a la capa de datos, en esta oportunidad veremos la manera en que se gestiona la interacción con el usuario mediante sus vistas.

Interacción con el usuario
Cuando hablamos de interacción con el usuario hacemos referencia explícita a a las vistas (Views) y a los Enrutadores (routers), en esta ocasión sólo hablaremos de las vistas. Las vistas en Backbone.js son elementos muy importantes puesto que son los encargados de presentar la información que llega del backend del servidor y permitir que los usuarios interactúen con ésta. Para esta labor se extiende la clase Backbone.View, veamos un ejemplo.

var ViewLibro = Backbone.View.extend({
    events:{
        "click a#delete" : "eliminar",
    },
    initialize : function () {
        this.template = _.template(
                 $('#templatelibro').html()
                 );
    },
    render : function() {
        var data = this.model.toJSON();
        var html = this.template(data);
        this.$el.append( html );
    },
    eliminar: function(e) {
        this.model.url = this.model.url+this.model.id;
        this.model.destroy();
        var libro = $(e.currentTarget).parent().parent();
        libro.remove();
        e.stopPropagation();
    }
});

Además hacemos unos pequeños cambios a la función listarLibros
function listarLibros () {
    $(".datos").html("")
    var coleccion_libros = new Libros();
    coleccion_libros.on("add", function(model){
        console.log("Agregado", model.toJSON());
        var vl = new ViewLibro({el:$("ul.datos"),model:model});
        vl.render();
    });
    var xhr = coleccion_libros.fetch()
    xhr.done(function () {
        console.log('Libros descargados...');
        var llibros = coleccion_libros.filter(function (model) {
            var libro = model.toJSON();
            return libro.nombre === "El Principito";
        });
        if(llibros.length==0){
            var libroNuevo = new Libro({
                "nombre":"El Principito",
                "editorial":"Panamericana",
                "genero":"Infantil",
                "autor":"1"
            });
            libroNuevo.save();
            libroNuevo.attributes.id = 1;
            coleccion_libros.add(libroNuevo);
        }
        console.log("0k");
    });

}

Y finalmente agregamos el template respectivo
<script type="text/template" id="templatelibro">
    <div id="libro-<%= id %>" class="libro">
        <strong>Nombre:</strong> <%= nombre %> <br/>
        <strong>Editorial:</strong> <%= editorial %><br/>
        <strong>Genero:</strong> <%= genero %><br/><br/>
        <div class="actions">
            <a href="#" id="delete">Eliminar Libro</a>
        </div>
    </div>
</script>
Muy bien, pero ¿Qué hace todo esto? Primero construimos la vista, para esto hacemos una clase que hereda de Backbone.View, esta tiene una serie de elementos que hacen posible toda la "magia" que hace internamente, el primero es el objeto events, el cual almacena el tipo de evento (por ejemplo click) y sobre que elemento del DOM se aplica, para esto usamos "." (punto) para especificar clases y y "#" para especificar los identificadores. Asociado a esto se encuentra el nombre del método que se ejecutará cuando el evento sea llevado a cabo.
Luego encontramos el método initialize, que inicializa la vista, adentro de este creamos el template de la vista, debemos tener en cuenta que el carácter "_" hace referencia a la librería Underscore.js, también creada por Jeremy Ashkenas, creador de Backbone.js, la cual tiene una serie de herramientas muy útiles y una de estas es un sistema de templates. Cabe aclarar que no es obligatorio usar el sistema de templates de underscore, su puede usar el que se desee (swig, mustache, etc).
Después encontramos el método render, que toma los datos del modelo y los renderiza con el template creado en el método initialize para finalmente mostrarlo al usuario en el lugar de destino, referido por la variable de clase $el.
Como último elemento de la vista encontramos el método eliminar, que actualiza la url del modelo, llama el método eliminar y retira el HTML asociado al modelo del DOM.

Dentro de la función listar libros encontramos que ya no creamos el código HTML necesario para incrustar en el DOM, en cambio creamos una instancia de la vista y la renderizamos y al crear en nuevo libro especificamos como atributo el id de ese nuevo objeto.

Finalmente esta el código del template asociado a la vista, notese que éste se guarda en un tag script de tipo text/template y tiene un identificador para poder recuperarlo con Javascript.

jueves, 20 de marzo de 2014

Tutorial de QtCreator


Hace algunos años hice un tutorial de QtCreator, espero que les guste.


Por favor comparte este articulo. 
:D

jueves, 13 de marzo de 2014

Tutorial de Backbone.js (I)


Hoy en día hay una nueva tendencia a la hora de hacer sitios web,  ésta es usar el patrón MVC en los clientes para lograr una mejor experiencia, es por esto que se han creado frameworks como Backbone.js o Angular.js, los cuales permiten usar MVC en el cliente y permiten sacarle todo el jugo a JavaScript. Una vez dicho esto entremos en materia.

¿Qué es Backbone.js?
Backbone.js es un framework que permite al desarrollador estructurar su aplicación, delegando ciertas labores a elementos específicos con el fin de hacer aplicaciones escalables, robustas y que brinden al usuario una gran experiencia de uso.

Entendiendo Backbone
Antes habíamos hablado de una serie de elementos que estructuran una aplicación, éstos elementos son los modelos (Models) y colecciones (Collections), que manejan la capa de datos, vistas (Views) para gestionar el contenido que interactúa con los usuarios y enrutadores (Routers) que permiten realizar los procesos de navegación en la aplicación. Una de las cosas más interesantes de este framework es que en la mayoría de los objetos se pueden definir una serie de eventos que permiten responder a las acciones del usuario. Otro punto a favor es que la capa de datos puede conectarse con varios tipos de fuentes de datos como REST, local storage y otros más.

Capa de Datos
Como ya mencione antes la capa de datos esta compuesta por modelos (Model) y colecciones (Collection), es necesario entender que un modelo es un elemento asociado a una fuente específica de datos y que un una instancia de un modelo es una unidad de datos, es decir, lo equivalente a un registro en una base de datos. En comparación una colección es es un elemento asociado a una fuente específica de datos y a un modelo específico y una instancia de una colección es un grupo de instancias de un modelo.
Tanto los modelos como las colecciones pueden responder a eventos como un nuevo dato agregado, el cambio de un dato existente y más, respondiendo a estos eventos con acciones asignadas por el programador.
Veamos un ejemplo:
// Ejemplo de modelos y colecciones
var Libro = Backbone.Model.extend({
    url : '/api/libros/',
    initialize: function(){
       // TODO: acciones de inicialización del modelo
    }
});

var Libros = Backbone.Collection.extend({
    model: Libro,
    url: '/api/libros/',
    initialize: function(){
       // TODO: acciones de inicialización del colección
    }
});


Como vemos en el código anterior se definen un modelo y una colección, los cuales tienen como fuente común de datos una api REST que provee los datos. Además la colección tiene asociado un modelo.
Sin embargo el código anterior no permitirá usar ningún dato hasta que se descarguen de manera explicita. Ahora miremos cómo usar modelos y colecciones:
// Ejemplo de modelos y colecciones, como cargar datos del servidor

    function listarLibros () {
        $("ul.datos").html("")
        var coleccion_libros = new Libros();
        coleccion_libros.on("add", function(model){
            console.log("Agregado", model.toJSON());
            $(".datos").append("<li>"+
                JSON.stringify(model.toJSON())+
                "</li>"
                );
        });
        var xhr = coleccion_libros.fetch()
        xhr.done(function () {
            console.log('Libros descargados...');
            var llibros = coleccion_libros.filter(function (model) {
                var libro = model.toJSON();
                return libro.nombre === "El Principito";
            });
            if(llibros.length==0){
                var libroNuevo = new Libro({
                    "nombre":"El Principito",
                    "editorial":"Panamericana",
                    "genero":"Infantil",
                    "autor":"1"
                });
                libroNuevo.save();
                coleccion_libros.add(libroNuevo);
            }
            console.log("0k");
        });

    }


En el último ejemplo vemos una función en la cual se cargan los datos desde el servidor con la instrucción fetch y se agregan a una lista (ul.datos) y si no hay ningún libro con nombre "El Principito" este se agrega.
Como vemos en el ejemplo se crea un objeto de tipo colección (coleccion_libros) y éste gestiona la carga de datos del servidor, además se pueden hacer bindings entre eventos y funciones, de esta manera se muestran los datos en la pagina web dentro de una lista cada vez que se agrega un nuevo elemento a la colección.

Pueden encontrar el código de ejemplo en Github. espero que les sea de ayuda.

Por favor comparte éste post... 
:D

miércoles, 19 de febrero de 2014

Tutorial ¿Cómo compilar Python3 en Linux Debian?


Muchos ya lo han dicho, hay que dejar de lado Python2.X y aunque aun falta para ello he aquí un tutorial para compilar en nuestra maquina linux (debian para ser exactos) Python3.3.

Instalación de dependencias
Como super usuario (root) ejecutamos la siguiente instrucción en la linea de comandos:
apt-get install make build-essential  zlib1g-dev  libbz2-dev  libncurses5-dev  libreadline6-dev  libsqlite3-dev  libssl-dev  libgdbm-dev liblzma-dev tk8.5-dev

Descarga y compilación
Ahora bien, debemos descargar el código fuente y compilarlo, para ello ejecutamos las siguientes instrucciones:
wget -c http://python.org/ftp/python/3.3.4/Python-3.3.4.tgz
tar -zxf Python-3.3.4.tgz
cd Python-3.3.4
# Proceso de compilación
# primero se configuran los makefile para el sistema
./configure
# inicia compilación
make
# se hacen pruebas para saber que todo salió bien, 
# es recomendable pero no obligatorio.
make test
# instalación de los binarios en el sistema
make install

Finalmente solo queda probarlo ejecutando python3.3.

Espero que les haya gustado.

Si te gusto el post
compartelo... :D

martes, 4 de febrero de 2014

Django y las class based views


Cuando se trabaja en django resulta claro que hay muchas labores que son mas y mas fáciles, pero manejar la lógica de una petición mediante una función puede ser perjudicial a la hora de manejar muchas vistas. Es por eso que en este post vamos a ver cómo usar class bases views, una forma mas ordenada de encapsular la lógica.

¿Qué son?
Class-Based-Views (CBV en adelante) es una forma alternativa para crear vistas en django, no pretende reemplazar  las Function-Based-Views (FBV en adelante) , pero si tienen como objetivo permitir al desarrollador:
  • Organización del código relacionado con metodos HTTP específicos (GET, POST, PUT, etc) y que el router pueda acceder a estos sin tener que usar condicionales específicas.
  • Técnicas orientadas a objetos (Como los Mixins) para solucionar ciertos problemas.
¿Por qué usarlas?
La pregunta clave es ¿por qué? y ante esto hay varias cosas que la respaldan:

  • Orden.
  • Estética del Código.
  • Reciclaje del Código.
  • Uso de herramientas de OOP.
  • Simpleza.
  • Estructura bien definida (definición de acciones para cada protocolo, definición de respuestas para casos de éxito y falla con métodos como get_success_url).
¿Cómo funcionan?
Para entender mejor ciertos aspectos de cómo funcionan las CBV debemos ver un poco de FBV

# views.py
from django.shortcuts import render

def index(request):
    if request.method == 'GET':
        # TODO: GET ACTIONS
        return render(request,"template_get.html")
    elif request.method == 'POST':
        # TODO: POST ACTIONS
        return render(request,"template_POST.html")
    elif request.method == 'PUT':
        # TODO: PUT ACTIONS
        return render(request,"template_put.html")
    elif request.method == 'DELETE':
        # TODO: DELETE ACTIONS
        return render(request,"template_del.html")

# end views.py
# ----------------------
# urls.py

from django.conf.urls import patterns

urlpatterns = patterns('',
    (r'^$', "myapp.views.index"),
)
# end urls.py

Como vemos en el código anterior en una sola función la lógica de múltiples ti pos de respuestas, y esto no es adecuado porque restara mantenibilidad y escalabilidad a nuestra aplicación, para evitar eso están las CBV, veamos a continuación cómo sería esto:
# views.py
from django.views.generic.base import View
from django.shortcuts import render

class IndexView(View):

    def get(self, request):
        # TODO: GET ACTIONS
        return render(request,"template_get.html")

    def post(self, request):
        # TODO: POST ACTIONS
        return render(request,"template_POST.html")

    def put(self, request):
        # TODO: PUT ACTIONS
        return render(request,"template_put.html")

    def delete(self, request):
        # TODO: DELETE ACTIONS
        return render(request,"template_del.html")

# end views.py
# ----------------------
# urls.py

from django.conf.urls import patterns
from myapp.views import IndexView

urlpatterns = patterns('',
    (r'^$', IndexView.as_view()),
)

# end urls.py

Como vemos en el código anterior la legibilidad del código mejoraría en caso de que existiesen muchas líneas de código por cada método, además de que ya sería posible usar ciertas técnicas de programación orientada a objetos como los mixins.

Espero que les sea de utilidad.

Si te gusto el post 
compartelo... :D

miércoles, 29 de enero de 2014

Haciendo una API REST en 20 minutos con Python y Django


Hace poco vi en uno de los blogs que leo un muy interesante artículo acerca de cómo hacer una API REST en una hora, pero ¿Por qué no hacer una en 15 minutos? Para esto vamos a usar python, dajngo y dajngo-rest-framework.

Instalando los componentes
En un artículo pasado habíamos hablado de virtualenv y pip, en este caso usaremos virtualenvwrapper para crear un nuevo entorno y pip para instalar lo necesario:

mkvirtualenv entorno_rest --no-site-packages
workon entorno_rest
pip install django djangorestframework
django-admin.py startproject test_rest
cd test_rest
django-admin.py startapp apprest

Hora de codificar
Primero que todo es necesario configurar las preferencias del proyecto, es decir, editar el archivo settings dentro de la carpeta test_rest
En éste archivo es necesario incluir en las aplicaciones instaladas nuestra aplicación rest y el framework así:

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'apprest',
)
Además de esto si quieren que la aplicación solicite usuario y contraseña (mediante Basic Auth) agregamos al archivo:

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.BasicAuthentication',
    ),
}

Muy bien, luego creamos los modelos de nuestra aplicación, para ello editamos el archivo models.py de la carpeta apprest y definimos lo necesario, yo solo voy a definir dos modelos, pero podrían ser cuantos quisieran:
class Autor(models.Model):
    nombre = models.TextField(max_length=100)
    apellido = models.TextField(max_length=100)
    
class Libro(models.Model):
    nombre = models.TextField(max_length=100)
    editorial = models.TextField(max_length=100)
    genero = models.TextField(max_length=100)
    autor = models.ForeignKey(Autor)

Ahora bien, es necesario crear 3 elementos auxiliares,  serializadores, que convierten los datos recuperados de la base de datos en json, viewsets, que son los elementos que de acuerdo al tipo de petición renderizan los datos y un router, el cual se encarga de indicar al proyecto django cuáles son las URLs de nuestra API. El serializer se creará en un nuevo archivo que está destinado para todos los serializers, estará dentro de apprest y se llamará serializers.py, veamos:

from rest_framework import serializers
from .models import Libro, Autor

class LibroSerializer(serializers.ModelSerializer):
    class Meta:
        model = Libro
        fields = ('id', 'nombre', 'editorial', 'genero', 'autor',)

class AutorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Autor
        fields = ('id', 'nombre', 'apellido',)

Ahora es necesario definir los viewsets, esto se hace en un archivo llamado viewsets.py, que esta ubicado en apprest. A continuación su contenido:

from .models import Libro, Autor
from .serializers import LibroSerializer, AutorSerializer
from rest_framework import viewsets

class LibroViewSet(viewsets.ModelViewSet):
 
    serializer_class = LibroSerializer
    queryset = Libro.objects.all()

class AutorViewSet(viewsets.ModelViewSet):
 
    serializer_class = AutorSerializer
    queryset = Autor.objects.all()
    
Finalmente es necesario crear el router y enlazarlo a nuestro proyecto, en esta oportunidad lo haremos directamente en el archivo urls.py del proyecto, ubicado en test_rest, en este definiremos un router, el cual tendrá referencias a los elementos creados anteriormente. Esto se hará así:

from apprest.viewsets import LibroViewSet, AutorViewSet
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register(r'libros', LibroViewSet)
router.register(r'autores', AutorViewSet)
   
y en la tupla urlpatterns agregamos:
    ...
    url(r'^', include(router.urls)),
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
    ...
para obtener finalmente algo así:
from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()

from apprest.viewsets import LibroViewSet, AutorViewSet
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register(r'libros', LibroViewSet)
router.register(r'autores', AutorViewSet)

urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'test_rest.views.home', name='home'),
    # url(r'^blog/', include('blog.urls')),
    url(r'^', include(router.urls)),
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),

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

para obtener finalmente:
Pueden encontrar el código fuente en github, espero que les sirva de ayuda.

Si te gusto el post
compartelo... :D

domingo, 26 de enero de 2014

De Nano a Vim, cambiando la resortera por un cañón de neutrones

Hoy en día uno de los grandes problemas en el momento de utilizar un servidor es tener que usar una consola para hacer ciertas labores, éstas labores son más tediosas que complicadas y una de las mayores habilidades de un administrador de servidores es poder crear él mismo herramientas para automatizar aquellas labores que no le gusta hacer. Desafortunadamente, y por lo general un administrador debe hacer sus labores "al vuelo", es decir, directamente en el servidor. En general cuando alguien se está iniciando en el mundo de los servidores usa nano como editor de texto por su simpleza, puesto que es muy fácil de usar. Pero ésta búsqueda de comodidad causa que sean dejadas de lado herramientas como Emacs o Vim, aun cuando éstas últimas son mucho más potentes y robustas. Por eso es que en éste artículo voy a hablar de Vim, un poderoso editor de texto ideal para éstas labores.

Algo de historia
Vim (Vi Improved) es un editor de texto creado por Bram Moolenaar y cuya primera versión se presentó en 1991. Está basado en Vi (el clásico editor de Bill Joy creado en 1976), y al igual que Vi, Vim es un editor de texto orientado a modos, de esta manera separa por así decirlo en diferentes "secciones" sus funcionalidades, pero comparado con Vi es mucho más fácil de usar.

Funcionalidades
Las siguientes características están o pueden estar activadas en Vim:
  • Corrector ortográfico integrado
  • Autocompletado de texto
  • Navegación por pestañas
  • Ventanas múltiples, que dividen el área de edición horizontal o verticalmente.
  • Resaltado de sintaxis dependiente del lenguaje de programación o de etiquetas utilizado
  • Órdenes deshacer y rehacer
  • Comprensión de más de 200 sintaxis diferentes
  • Lenguaje de scripting para programar extensiones
  • Completado de órdenes, palabras y nombres de ficheros
  • Compresión y descompresión de ficheros, que posibilita editar ficheros comprimidos
  • Reconocimiento de formatos de fichero y conversión entre los mismos.
  • Historial de órdenes ejecutadas
  • Grabación y reproducción de macros
  • Guardado de la configuración entre sesiones
  • Plegado automático y manual de código
  • Interfaz gráfica opcional
  • Altamente configurable y personalizable
  • Casi 100% compatible con vi, pero sin muchos de sus defectos
Entendiendo los modos
Como mencioné anteriormente Vim esta basado en modos. Ésta precisamente es la característica que provoca que la curva de aprendizaje de Vim sea tan inclinada, Vim posee 3 modos básicos:
  • Modo Comando: Es el modo por defecto y sirve precisamente para introducir comandos (instrucciones basadas en combinaciones de teclas ). Para regresar a este modo se oprime la tecla escape (ESC) hasta que en la parte inferior izquierda de la consola solo se vea la ruta del archivo o que no se vea nada.
    Los comandos son sucesiones de teclas oprimidas, tal vez el comando más importante es el que se activa cuando se escribe el caracter (:), el cual da inicio a comandos como guardar y salir.
  • Modo Inserción: Es el modo mediante el cual podemos crear nuevo texto en un archivo. Para pasar a modo de inserción se oprime la tecla (i) mientras se está en modo de comandos, se sabe que se está en modo inserción por que en la parte inferior izquierda aparece como indicador el banner "-- INSERTAR --".

  • Modo Visual: Es el modo mediante el cual se seleccionan varios caracteres del contenido del documento para que los mismos sean copiados, movidos o modificados. Para pasar a modo visual se oprime la tecla (v) mientras se está en modo de comandos, se sabe que se está en modo visual por que en la parte inferior izquierda aparece como indicador el banner "-- VISUAL --".

¿Cómo lo uso?
para iniciar el programa basta con escribir su nombre en la línea de comandos de esta manera:
vim
y para editar un archivo (para este caso miarchivo.py) usamos:
vim miarchivo.py

El gran misterio (Cómo Salir de Vim)
la primer experiencia con Vim es traumática porque cuando alguien no es consciente de los modos no puede acceder al modo de inserción, que es el que permite modificar el contenido de un archivo, y el usuario intenta salir pero generalmente no sabe cuál es el comando para salir. Para terminar la aplicación debemos:
pasar a modo de comandos oprimiendo la tecla escape (ESC)
escribir :q
oprimir ENTER


¿Cómo Guardar modificaciones?
esta acción también se ejecuta mediante el modo de comandos, el comando (:) y w, así:
pasar a modo de comandos oprimiendo la tecla escape (ESC)
escribir :w
oprimir ENTER

Otros comandos
A continuación un breve listado de ordenes que se ejecutan en el modo de comandos y que pueden ser muy útiles:
NOTA: lo que hay antes de →es el comando, lo que hay después es la explicación.

  • yy     →  copia la línea actual y lo almacena en el buffer.
  • dd     →  corta la línea actual y lo almacena en el buffer.
  • Xyy  →  copia X cantidad de líneas y las almacena en el buffer, por ejempo:
    • 10yy  →  copia 10 líneas incluyendo la línea actual y las almacena en el buffer.
  • Xdd  →  corta X cantidad de líneas y las almacena en el buffer, por ejempo:
    • 10dd  →  corta 10 líneas incluyendo la línea actual y las almacena en el buffer.
  • p       →  pega el contenido del buffer.
  • >>    →  Tabula la línea actual.
  • <<    →  Lo contrario de la anterior.
  • X>> →  Tabula X cantidad de líneas, incluyendo la línea actual.
    • 10>>  → Tabula 10 líneas, incluyendo la actual.
  • X<< →  Lo contrario de la anterior.
  • U      → Deshace la última acción (como Ctrl+Z)
  • Ctrl+R  → Rehace la última acción
  • :split /ruta/de/archivo   →   Crea una subventana y ahí abre el archivo especificado para editarlo.
  • Ctrl+W+↓   →   Pasa a la subventana de abajo.
  • Ctrl+W+↑   →   Pasa a la subventana de arriba.

  • :tabnew /ruta/de/archivo   →  Crea una pestaña y ahí abre el archivo especificado para editarlo.
  • gt   →   Pasa a la pestaña siguiente.
  • gT   →   Pasa a la pestaña anterior.
  • Xgt   →   Pasa a la pestaña en la posición X.
  • :syntax on   →   Activa los colores (resaltado de sintaxis) de acuerdo al lenguaje de programación del archivo.
  • :syntax off   →   Desactiva los colores (resaltado de sintaxis) de acuerdo al lenguaje de programación del archivo.



Autocompletado
Vim permite usar autocompletado, por defecto el solo autocompleta con las palabras que ya existen en nuestro documento pero con plugins puede autocompletar palabras reservadas de múltiples lenguajes de programación. funciona en modo de inserción y se activa por defecto con la combinación de teclas Ctrl+N.

Espero que les sirva de ayuda.

Si te gusto el post
compartelo... :D