17 años en Internet

27 noviembre 2014

Sistema de gestión de tareas realizado en Django

    Buenas, os dejo un vídeo comentario y la guía de instalación de una de mis primeras aplicaciones escritas en Django. Espero que os guste.


Requisitos previos que no comentaré:
  1. Descarga e instalación de Django (pip install Django==1.7.1).
  2. Creación de un despliegue (django-admin.py startproject testing).
  3. Crear usuarios de administración (python manage.py createsuperuser)
  4. Arrancar un despliegue (python manage.py runserver 0.0.0.0:8000)
Guía de instalación:
1.- Descarga de la aplicación.
todo_list.tgz [ Enlace ]
2.- Creación del proyecto en un despliegue:
python manage.py startapp todo_list
3.- Machacar el contenido del tgz dentro del directorio todo_list del despliegue:
cd /tmp
tar xzvf todo_list.tgz
cd -
cp -pr /tmp/todo_list/* todo_list/
 4.- Añadir la url de la aplicación en el fichero url.py del despliegue:


5.- Añadir la aplicación todo_list dentro de la lista de aplicaciones instaladas del settings.py del despliegue:

6.- Añadir las definiciones de PROJECT_PATH, STATIC_ROOT, TEMPLATE_DIRS y STATICFILES_DIRS dentro del settings.py del despliegue:



7.- Sincronizar la lista de ficheros estáticos:
python manage.py collectstatic
(responder yes)
8.- Crear las tablas del proyecto en la base de datos del despliegue:
python manage.py makemigrations todo_list
python manage.py migrate
9.- Arrancar el despliegue y acceder por web:



13 noviembre 2014

Aprendiendo Python, día 3

Métodos y variables públicas, privadas y protegidas:

    Cuando definimos un objeto en Python por defecto todos sus atributos y métodos son públicos. Para refrescar un poco las lecciones anteriores, os mostraré un ejemplo de definición de clase y el uso de un par de instancias de ésta:
class footballer(): 
     # Attributes
name = None
average = 50 
# Constructor
def __init__(self, name, average):
this.name = name
this.average = average 
v_footballer_1 = footballer("Cristiano Ronaldo", 89)
v_footballer_2 = footballer("Messi", 90)
v_footballer_2 .name = "Paco Alcacer"

    En el ejemplo anterior hemos definido una clase footballer y hemos creado dos instancias: Cristiano Ronaldo y Messi. Acto seguido, aprovechando que name es un atributo público le hemos cambiado el nombre a Messi por "Paco Alcacer".

    No obstante, en Python podemos definir un método o atributo como protegido (sólo accesible por ella misma y sus clases hijas) si le ponemos delante el símbolo _. Además, si hacemos el mismo símbolo dos veces (__), estaremos definiendo el atributo o método como privado (sólo accesible por ella misma). Es decir, un atributo privado sólo puede ser modificado por la propia instancia de una clase y un método privado sólo puede ser ejecutado desde la la propia instancia.
class footballer(): 
# Attributes
_name = None
__average = 50 
# Constructor
def __init__(self, name, average):
this._name = name
this.__average = average
    En éste ejemplo el atributo name es protegido, pudiendo ser editable por clases que hereden de footballer, mientras que el atributo average sólo puede ser accesible o modificable dentro de la clase footballer.

class footballer(): 
# Attributes
__name = None
__average = 50 
# Constructor
def __init__(self, name, average): this.__name = name
this.__average = average 
def _is_footballer(self):
return "yes" 
def _is_coach(self):
return "no" 
def __age():
return 18
def change_name(self, name):
this.__name = name 
    En cambio, en este segundo ejemplo name y average pasan a ser privados, pudiendo ser accesibles sólo para un objeto de footballer. Por otro lado, si definidos un objeto que herede de una clase de footballer, podemos hacer uso de los métodos _is_footballer o _is_coach. Por último, hemos definido un método público que nos permite cambiar el valor del atributo privado name.

Threads

    Al igual que otros lenguajes de programación, Python permite el uso de hilos de ejecución para poder ejecutarlos de forma concurrente. El uso de hilos de forma concurrente es preferible al de manejar varios procesos a la vez porque agiliza los tiempos de cambio de contexto en el procesador.

    La mejor forma de explicar el buen uso de los hilos es llevarlo al campo de los videojuegos: Podemos tener un hilo de música de fondo, un hilo de efectos sonoros, un hilo que lee de teclado (o gamepad), un hilo que dibuja los gráficos en pantalla y un hilo de ejecución que analiza la consistencia del juego o la inteligencia artificial de la máquina. Todas esas acciones trabajan aparentemente de forma simultánea en tiempo real y las acciones que se transmiten en una puede afectar al resto: Matamos un enemigo, se reproduce un grito de dolor; Nos movemos, se actualizan los gráficos; Llegamos a una sección crítica, la música cambia a un ritmo rápido, etcétera...

    Volviendo al principio, podemos definir hilos en Python. Para ello debemos de importar el paquete threading y definir una clase que herede de threading.Thread. En el constructor de la clase llamaremos a su vez al constructor padre con threading.Thread.__init__(self) y además habrá que definir un método público "run" donde pondremos el código a ejecutar. Por último, muy importante, la instancia del hilo debe invocarse ejecutando el método público start. Es decir, cuando invocamos el método start, realmente ejecutamos el método run que hemos definido.

    Ejemplo, hilo que cuenta del 0 al 10 en un hilo:
import threading 
class thread_test(threading.Thread):
        __stop = False
        __counter = 0  
        def __init__(self):
                threading.Thread.__init__(self)
                self.__stop = False
                self.__counter = 0  
        def run(self):
                while self.__stop == False:
                        self.__counter = self.__counter + 1
                        print "%d" % self.__counter
                        if self.__counter == 10:
                                self.__stop = True 
thread_test().start()
La ejecución resultante es la siguiente:
python thread_test.py
1
2
3
4
5
6
7
8
9
10
    Ahora bien, si entendemos de concurrencia, podemos ejecutar varios hilos en paralelo para realizar varias cuentas al mismo tiempo:

import threading
class thread_test(threading.Thread):
        __stop = False
        __counter = 0
        def __init__(self):
                threading.Thread.__init__(self)
                self.__stop = False
                self.__counter = 0
        def run(self):
                while self.__stop == False:
                        self.__counter = self.__counter + 1
                        print "%d" % self.__counter
                        if self.__counter == 10:
                                self.__stop = True
thread_test().start()
thread_test().start()
thread_test().start()
thread_test().start() 
    Y aquí el resultado:
 sebas@macbookUbuntu:~/Descargas/tmp/python$ python thread_test.py
1
2
3
4
5
6
7
8
9
10
1
2
 131
2
3
4
4
5
62
3
7
4
85
6
9
7
10
8
9
10
5
6
7
8
9
10
    Como veis el resultado es más caótico, puesto que estamos realizando 4 cuentas de forma concurrente donde se entremezcla una única salida estándar, produciendo que un hilo escriba por pantalla mientras otro hilo lo está haciendo, mostrando por ejemplo, varios números sin retorno de carro en la misma línea o varias líneas sin números (varios retornos de carro seguidos).

    Este efecto se conoce como condición de carrera y puede afectar de forma drástica si el cambio de contexto entre hilos se produce modificando una variable o recurso global. Para evitar esto hay que definir mútex (o semáforos) en las zonas que definamos como críticas. No obstante, mi consejo es que uséis Python 3.X, puesto que dicha versión ya viene con sincronización de hilos de serie, sin necesidad de adaptar nada:
python3 thread_test.py
1
2
3
4
5
6
7
1
1
8
2
1
9
3
10
4
2
5
3
6
4
7
5
2
8
6
3
9
7
10
8
4
9
5
10
6
7
8
9
10
(Nota, para que este ejemplo funcione en Python 3, hay que cambiar la línea "print "%d" % self.__counter" por "print(self.__counter)").

08 noviembre 2014

Casta, no me contéis vuestra vida



Vaya, resulta que los del 15M resultaron ser algo más que 4 gatos.

    El Centro de Investigaciones Sociológicas sitúa en su último barómetro a Podemos como primer partido en estimación directa de voto, con un 17,6% de los encuestados, sacando 3,3 puntos de ventaja sobre el Partido Socialista (14,3%) y 5,9 puntos sobre el Partido Popular (11,7%). Luego el barómetro pasa por la cocina y traduce de ello que el Partido Popular ganaría las elecciones con el 27,5%, superando al Partido Socialista en 3,6 puntos (23,9%) y a Podemos en 5 puntos (22,5%).

    No me pondré a valorar como un organismo autónomo español que depende del Ministerio de la Presidencia y cuyo fin es el estudio científico de la sociedad española, considera lógico que el tercer partido en intención directa de voto con una diferencia de casi 6 puntos ganará las elecciones con casi 4 puntos de ventaja. No entraré a valorar la neutralidad o imparcialidad del trabajo realizado, puesto que si algo nos han enseñado las encuestas electorales es que siempre se han equivocado al llegar las elecciones. Señores, esto es un tsunami y no se puede parar.

    El partido de Pablo Iglesias apenas lleva 10 meses de vida y ya suena como tercera fuerza política y con total seguridad ha nacido para destruir el bipartidismo. Visto esto, las ratas empiezan a abandonar el barco mientras la orquesta toca al unísono la melodía de que Podemos es un partido populista. ¿Pedro Sánchez presidente del Gobierno? No creo, ha insultado tanto al verdadero partido de izquierdas que sólo gobernará bajo la sombra de Mariano Rajoy Brey y si llegan a ocupar ambos partidos el 51% de los diputados.

    Pedro Sánchez quiere hacer gala de regenerador democrático de su partido, pero por el camino se ha disparado al pie, se está desangrando y aún no se da cuenta que sufre gangrena y que tienen que amputarle la pierna y mientras los fármacos que toma le hacen despotricar contra todo ser pensante que no defienda sus mismos ideales, ya sea de derechas, de centro o de izquierda. Zapatero, el cual admiro, resulta que va a ser el memos malo de los sucedáneos socialistas: Rubalcaba hizo el primer jaque de su partido en el tablero y Sánchez se ha convertido en la lacra que conseguirá el mate a las primeras de cambio. No sé en qué pensastéis, queridos votantes de primarias del PSOE, al elegir a este sucedáneo de Hombres, Mujeres y Viceversa. Un tío que te cataloga como "no importante" debatir con partidos "populistas" porque "no entra en sus prioridades" mientras que llama por teléfono al programa Sálvame Deluxe para debatir sobre el sexo de los ángeles, pues no me parece el hombre más indicado para ser un presidente de mi nación.



    Y por otro lado tenemos al partido de "la gente de bien", esa que despotricó contra las subidas de impuestos de "Zetaparo", ese que prometía bajar el paro a cantidades pre-crisis, ese que prometió que lo primero sería el empleo, que recortaría en todos los gastos menos en Educación y Sanidad, que nunca tocaría las pensiones o que nunca financiaría bancos privados con dinero público. Los resultados están ahí, el presidente de Gobierno nos ha dado una lección de hipocresía nunca vista en nuestra democracia: Como no hay dinero porque las comunidades donde gobierna mi partido han falseado las cuentas, me veo obligado a incumplir el 100% de mi programa electoral, por consiguiente subiré los impuestos, abarataré el despido, congelaré el salario mínimo todos los años y recortaré en Sanidad y Cultura y pensiones... y si algún día debo de dar explicaciones: Pues monto una rueda de prensa en la que salgo en una televisión de plasma, leo un discurso y no admito preguntas.

   Eso sí, los populistas son los de Podemos, no los que han llegado al poder prometiendo todo lo contrario de lo que han hecho: "Por el pleno empleo" de Zapatero y "lo primero el empleo" de Rajoy. Tócate los cojones, los políticos cierran los brazos, dejan la tasa de paro a niveles alarmantes durante más de 6 años y todo el que no piense como ellos son "bolivarianos", "filoetarras" o "populistas". Eso sí que es quedarse a gusto, señores.

   Tócate los cojones, cuando llegó el 15M nos trataron de perroflautas lloricas y nos animaban a los jóvenes a fundar nuestro propio partido. De hecho, el vocero popular catalogaba el 15M de golpe de estado. Luego nos soltaron a los perros en la primavera valenciana y nos catalogaron de etarras por querer protestar pacíficamente rodeando un Congreso pagado con nuestro dinero. Nos han impuesto a un nuevo Rey e incluso los susodichos demócratas han dicho que hacer un referendo, no aprobado por el Presidente, es antidemocrático, vamos que votar cosas no valoradas previamente por "El Líder" es de golpistas. Y mientras cada Lunes tenemos un nuevo cargo público imputado: Contabilidades B, cuentas millonarias en Suiza, cajas de ahorros saqueadas con tarjetas "opacas" que acaban siendo rescatadas con dinero público (vamos, que saquean al ciudadano y al cliente del banco)... joder, si hasta la hermana del impuesto Rey no es trigo limpio. Quedaros con la jugada, que estos son los mismos que han tratado de nazis a la Plataforma de Afectados por las Hipotecas mientras arrollan a un agente de movilidad que quería multarles por haber estacionado en doble fila. Joder, si en mi Valencia habéis incluso estafado las subvenciones que iban destinadas a Organizaciones No Gubernamentales para el tercer mundo. Poneros un pin, campeones, que os lo habéis ganado.

   En definitiva tenemos que, los que se auto definen como salvadores de la nación, han arruinado las comunidades autónomas que han gobernado, han arruinado a su nación y para más inri se han hinchado los bolsillos con dinero de dudosa procedencia. Y no lo digo yo, cada pocos días sale un escándalo nuevo a la hora del desayuno. Señores, no me contéis vuestra puta vida. Que vuestra casta esté en el poder no hace que yo viva mejor. Yo no quiero pasar otros 7 años en una empresa con un contrato de obra y servicio vencido y encima estar agradecido a mi dueño (porque a este paso vas a tener que pagar tú por ser despedido) por tener un trabajo. Deberíais de aprender de una puta vez que, si hay protestas en la calle, lo mínimo que se puede hacer es escuchar la opinión de la gente y no decir que representáis a la "mayoría silenciosa" que no se manifiesta... y de paso aprended que si un Ministro o un líder político saca en los barómetros del C.I.S. una nota inferior al aprobado, es algo maaaaaaaaalo, que hay que correeeeeegir... pero claro, habéis hecho lo que os ha venido en gana y  aún no habéis descubierto que quien siembra vientos recoge tempestades. Habéis mordido la mano que os ha dado de comer y encima, pobres ilusos, seguís pensando que hoy cenaréis.

    Señores, en 1879 Pablo Iglesias fundó el Partido Socialista Obrero Español y en 2015, otro Pablo Iglesias (llamado así en honor al primero) va a herir de muerte a dicho partido. Pero él no lo ha matado, habéis sido vosotros, la susodicha casta, vuestra prepotencia, vuestro no saber estar. Podemos va a ganar las próximas elecciones, de eso no tengo duda, pero no por sus promesas electorales, si no porque da a entender un mensaje muy claro: La situación es inaguantable, es hora de pasar la escoba y barrer toda la basura que hay actualmente en el Congreso de los Imputados.




Crew Cuervos - LIVERTAD