26 abr. 2015

Darle estilo material design a Django (parte 1, el admin)

Continuando con los artículos sobr Django.

En este caso se tocará el tema de usar en el admin y formularios un estilo llamado Material Design (desarrollado por Google para Android), la idea es que nuestro backend tenga ese estilo. Para ello se tiene una aplicación de Django llamada Django-material .

La documentación de django-material la pueden ver en el siguiente enlace.

Instalación:
Para instalar django-material se ejecuta el comando pip:
pip install django-material

Se crea el proyecto prueba:
django-admin startproject prueba

Se tiene los siguientes directorios y archivos:


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




En settings.py se agrega las aplicaciones :
  • material
  • material.admin

Al final se tiene lo siguiente en la sección de aplicaciones:


# Application definition

INSTALLED_APPS = (
    'material',
    'material.admin',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
)

Nota: material.admin debe estar antes que admin.

Se ejecuta manage.py migrate:
ecrespo@grievous:~/django/prueba$ ./manage.py migrate Operations to perform: Synchronize unmigrated apps: staticfiles, material, messages, material_admin Apply all migrations: admin, contenttypes, auth, sessions Synchronizing apps without migrations: Creating tables... Running deferred SQL... Installing custom SQL... Running migrations: Rendering model states... DONE Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying contenttypes.0002_remove_content_type_name... OK Applying auth.0002_alter_permission_name_max_length... OK Applying auth.0003_alter_user_email_max_length... OK Applying auth.0004_alter_user_username_opts... OK Applying auth.0005_alter_user_last_login_null... OK Applying auth.0006_require_contenttypes_0002... OK Applying sessions.0001_initial... OK

Se crea el usuario administrador del proyecto:
./manage.py createsuperuser Username (leave blank to use 'ecrespo'): ernesto Email address: ecrespo@ Password: Password (again): Superuser created successfully.

Se ejecuta el servidor web de django:

ecrespo@grievous:~/django/prueba$ ./manage.py runserver 
Performing system checks...

System check identified no issues (0 silenced).
April 26, 2015 - 16:22:53
Django version 1.8, using settings 'prueba.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

Se muestra la imagen del inicio de sesión del admin de Django:



Se muestra la imagen del admin luego de iniciar sesión:

La siguiente imagen muestra la sección de usuarios del admin de Django:



En siguiente artículo se explicará como darle el estilo material design a los formularios de una aplicación. 


7 abr. 2015

API rest Full para Python con Eve (parte 1).

Eve es un framework API rest diseñado "para humanos", en enlace para ver el proyecto es el siguiente.

Soporta mongodb y backends de SQL. Sus características las pueden revisar acá.

Este artículo se basa en el quickstart de la aplicación.

Para instalar a Eve se usa el comando pip o easy_install:

#pip install Eve

ó
#easy_install Eve

Luego se creará un archivo con nombre run.py. Su código es el siguiente:
#Se importa eve de Eve
from eve import Eve

#Se crea la instancia de Eve
app = Eve()

#Se ejecuta run.
if __name__ == '__main__':
        app.run()


Ahora se crea un archivo settings.py con el siguiente contenido:
DOMAIN = {'persona': {}}

Los dos archivos deben estar guardados en el mismo directorio.

Ahora se ejecuta run.py:
ernesto@grievous:~/bin/apirest$ python run.py
 * Running on http://127.0.0.1:5000/

Ahora se consulta el API con curl:
ernesto@grievous:~$ curl -i http://127.0.0.1:5000
HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 64
Server: Eve/0.5.3 Werkzeug/0.9.6 Python/2.7.8
Date: Wed, 08 Apr 2015 00:09:14 GMT

{"_links": {"child": [{"href": "persona", "title": "persona"}]}}


Ahora se consulta a persona:
ernesto@grievous:~$ curl http://127.0.0.1:5000/persona
{"_items": [], "_links": {"self": {"href": "persona", "title": "persona"}, "parent": {"href": "/", "title": "home"}}, "_meta": {"max_results": 25, "total": 0, "page": 1}}

Lo que muestra la ejecución de run.py es lo siguiente:
ernesto@grievous:~/bin/apirest$ python run.py 
 * Running on http://127.0.0.1:5000/
127.0.0.1 - - [07/Apr/2015 19:39:14] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [07/Apr/2015 19:41:35] "GET /persona HTTP/1.1" 200 -

Se muestra las 2 peticiones en el log.

En próximo artículo se explicará el uso de Eve con mongodb.



22 mar. 2015

Geometría Analítica con Sympy (triángulos).

A continuación se tiene los artículos sobre sympy tratados anteriorente:


En este artículo se explicará las instrucciones de geometría analítica para el caso del triángulo.

A continuación el código del script:

#!/usr/bin/env python

from sympy.geometry import *


#Creacion de 4 puntos
P1 = Point(0, 0)
P2 = Point(3, 4)
P3 = Point(2, -1)
P4 = Point(-1, 5)

T = Triangle(P1, P2, P3) ; #Se crea el triangulo con los puntos p1,p2 y p3

print (T.area); #Se calcula el area del triangulo

print (T.angles); #Angulos del triangulo

print (T.sides);#Lados del triangulo

print (T.perimeter);#Perimetro

print (T.is_right())  ; #triangulo recto?

print (T.is_equilateral());#triangulo equilatero?

print (T.is_isosceles());#triangulo isosceles?

print (T.is_scalene());#triangulo escaleno?

print (T.altitudes);#Altitudes

print (T.orthocenter) ;#Intercepcion de las altitudes

print (T.bisectors()) ;#bisector

print (T.incenter) ;#en centro

print (T.incircle); #en circulo

print (T.inradius); #en radio

print (T.medians); #medianas

print (T.centroid);#intercepcion de las medianas

print (T.circumcenter); #intercepcion de bisectores perpendiculares

print (T.circumcircle)

print (T.circumradius)

print (T.medial)

C1 = Circle(P1, 3);#se crea un circulo con centro en P1 y radio 3.

print (T.intersection(C1));#intercepcion del triangulo con el circulo c1

print (T.distance(T.circumcenter)); #minima distancia desde un punto a otro de un segmento

print (T.is_similar(Triangle(P1, P2, P4)));# si dos triangulos son similares?




A continuación se muestra la salida del script:

-11/2
{Point(2, -1): acos(3*sqrt(130)/130), Point(0, 0): acos(2*sqrt(5)/25), Point(3, 4): acos(23*sqrt(26)/130)}
[Segment(Point(0, 0), Point(3, 4)), Segment(Point(2, -1), Point(3, 4)), Segment(Point(0, 0), Point(2, -1))]
sqrt(5) + 5 + sqrt(26)
False
False
False
True
{Point(2, -1): Segment(Point(6/25, 8/25), Point(2, -1)), Point(0, 0): Segment(Point(0, 0), Point(55/26, -11/26)), Point(3, 4): Segment(Point(4/5, -2/5), Point(3, 4))}
Point(10/11, -2/11)
{Point(2, -1): Segment(Point(3*sqrt(5)/(sqrt(5) + sqrt(26)), 4*sqrt(5)/(sqrt(5) + sqrt(26))), Point(2, -1)), Point(0, 0): Segment(Point(0, 0), Point(sqrt(5)/4 + 7/4, -9/4 + 5*sqrt(5)/4)), Point(3, 4): Segment(Point(-50 + 10*sqrt(26), -5*sqrt(26) + 25), Point(3, 4))}
Point((3*sqrt(5) + 10)/(sqrt(5) + 5 + sqrt(26)), (-5 + 4*sqrt(5))/(sqrt(5) + 5 + sqrt(26)))
Circle(Point((3*sqrt(5) + 10)/(sqrt(5) + 5 + sqrt(26)), (-5 + 4*sqrt(5))/(sqrt(5) + 5 + sqrt(26))), -11/(sqrt(5) + 5 + sqrt(26)))
-11/(sqrt(5) + 5 + sqrt(26))
{Point(2, -1): Segment(Point(3/2, 2), Point(2, -1)), Point(0, 0): Segment(Point(0, 0), Point(5/2, 3/2)), Point(3, 4): Segment(Point(1, -1/2), Point(3, 4))}
Point(5/3, 1)
Point(45/22, 35/22)
Circle(Point(45/22, 35/22), 5*sqrt(130)/22)
5*sqrt(130)/22
Triangle(Point(3/2, 2), Point(5/2, 3/2), Point(1, -1/2))
[Point(9/5, 12/5), Point(sqrt(113)/26 + 55/26, -11/26 + 5*sqrt(113)/26)]
sqrt(26)/11
False

El código del script anterior lo pueden ver en el siguiente enlace en bitbucket.org.

También se puede usar notebook (ipython notebook), el archivo que se utilizó se puede descargar en el enlace.

A continuación se muestra una figura de la ejecución del notebook:




2 mar. 2015

Geometría Analítica con Sympy (circulos)

A continuación se tiene los artículos sobre sympy tratados anteriorente:


En este artículo se explicará las instrucciones de geometría analítica para el caso del circulo.

A continuación el código del script:
#!/usr/bin/env python
from sympy.geometry import *; #Se importa geometry de sympy
#SE crean los puntos P1,P2,P3 y P4
P1 = Point(0, 0)
P2 = Point(3, 4)
P3 = Point(2, -1)
P4 = Point(-1, 5)
L1 = Line(P1, P2); #linea 1 a partir de los puntos 1 y 2
L2 = L1.perpendicular_line(P3);#linea 2 perpendicular a la linea 1 y contenga al punto 3.
C1 = Circle(P1, 3);#se crea un circulo con centro en P1 y radio 3.
C2 = Circle(P2, P3, P4); #Se crea un circulo que contenta los puntos P1,P2 y P3
print (C2.area); #Area del circulo 2
print (C1.area);#Area del circulo 1
print (C2.radius); #Radio del circulo 2
print (C2.equation());#Ecuacion del circulo 2
print (C2.center);#Centro del circulo 2
print (C2.circumference);#Circunferencia del circulo 2
print (C2.intersection(C1)); #Intercepcion entre el circulo 2 y circulo 1
S1 = Segment(P1, P2);#segmento 1 a partir de los puntos 1 y 2
print (C2.intersection(S1));#Intercepcion entre el circulo 2 y el segmento 1
print (C2.is_tangent(L2));#La recta 2 es tangente al circulo 2?
print (C1.tangent_lines(P4)); #Cuales son las rectas tangentes  al circulo 1 con el punto 4



El resultado de la ejecución del script es el siguiente: 
1105*pi/98
9*pi
sqrt(2210)/14
(x - 5/14)**2 + (y - 27/14)**2 - 1105/98
Point(5/14, 27/14)
sqrt(2210)*pi/7
[Point(55/754 + 27*sqrt(6665)/754, -5*sqrt(6665)/754 + 297/754), Point(-27*sqrt(6665)/754 + 55/754, 297/754 + 5*sqrt(6665)/754)]
[Point(3, 4)]
False
[Line(Point(-1, 5), Point(-9/26 + 15*sqrt(17)/26, 3*sqrt(17)/26 + 45/26)), Line(Point(-1, 5), Point(-15*sqrt(17)/26 - 9/26, -3*sqrt(17)/26 + 45/26))]


A continuación se muestra una imagen del proceso de ejecución de ipython notebook:







23 feb. 2015

Geometría Analítica con Sympy (rectas)

Continuando con el manejo de geometría analítica de Sympy ahora se explicará el manejo de rectas.

Un resumen de los artículos anteriores: 

En el siguiente enlace encontrarán el archivo notebook del código que se explicará a continuación.

A continuación se muestra el código del script de manejo de rectas.

#!/usr/bin/env python

from sympy.geometry import *



#Creacion de 4 puntos

P1 = Point(0, 0)

P2 = Point(3, 4)

P3 = Point(2, -1)

P4 = Point(-1, 5)



#Creacion de 2 segmentos

S1 = Segment(P1, P2);#segmento 1 a partir de los puntos 1 y 2

S2 = Segment(P3, P4);#Segmento 2 a partir de los puntos 3 y 4



#Se crea 2 rectas

#A partir de los puntos 1 y 2

L1 = Line(P1, P2)

#Se crea la recta 2 que ser perpendicular a la recta 1 y contenga al punto 3

L2 = L1.perpendicular_line(P3)





#Manejo de rectas



print L2.arbitrary_point();#Punto arbitrario de la recta 2 (ecuacion parametrica)

print L2.equation() ;#ecuacion de la recta 2

print L2.contains(P4);#Linea 2 contiene al punto 4?

print L2.distance(P4);#distancia del punto 4 a la recta 2?

print L1.is_parallel(S2);#La recta 1 es paralela al segmento 2?

A continuación el resultado de la ejecución del script:

Point(4*t + 2, -3*t - 1)

3*x + 4*y - 2

False

3

False


A continuación se muestra una imagen de la ejecución del notebook para este artículo:

21 feb. 2015

Geometría Analítica con Sympy (Segmentos)

En los artículos anteriores se trataron los temas de como resolver límites, derivadasintegrales y resolución de sistemas de ecuaciones lineales, ahora se explicará el uso de Sympy en geometría analítica.

Los artículos sobre geometría analítica se basan en un artículo en inglés Computational Geomtry in Python.

En este artículo se explicará el manejo de segmentos.

Se inicia ipython notebook (si desea usar el archivo de este artículo lo puede descargar desde el siguiente enlace).


A continuación se muestra el código del script:

#!/usr/bin/env python



from sympy.geometry import *



#Definicion de puntos

P1 = Point(0, 0)

P2 = Point(3, 4)

P3 = Point(2, -1)

P4 = Point(-1, 5)



#Definicion de segmentos

S1 = Segment(P1, P2)

S2 = Segment(P3, P4)



print Point.is_collinear(P1, P2, P3); #Los puntos son colineales?



print S1.length ; #longitud del segmento 1



print S2.midpoint ;#punto medio del segmento 2



print S1.slope; #Slope del segmento 1



print S1.intersection(S2) ; #Intercepcion entre el Segmento 1 y 2



print Segment.angle_between(S1, S2);#Angulo entre el segmento 1 y 2



print S1.contains(P3);#El segmento  1 contiene a P3?



El resultado de ejecutar el script se muestra a continuación:
False

5

Point(1/2, 2)

4/3

[Point(9/10, 6/5)]

acos(-sqrt(5)/5)

False

La siguiente imagen muestra la ejecución del notebook:


Resolución de sistemas de ecuaciones con Sympy

Hasta ahora se tienen los siguientes artículos sobre el uso de la librería Sympy:
En este caso se explicará el uso de la librería Sympy en la resolución de sistemas de ecuaciones, se utilizará el ejemplo de un artículo anterior (Resolución de sistemas de ecuaciones lineales por descomposición QR usando Numpy).

Se inicia ipython notebook (si desean usar el archivo lo pueden bajar del siguiente enlace): 

A continuación se muestra el código del script:

#!/usr/bin/env python
#Se importa sympy
from sympy import *
#Se define las variables simbolicas x,y,z
x = Symbol('x')
y = Symbol('y')
z= Symbol('z')
#Resolver el sistema de ecuaciones
#3x+9y-10z  =   24
#x-6y+4z      =   -4
#10x-2y+8z  =  20
resultado =solve([3*x+9*y-10*z-24,x-6*y+4*z+4,10*x-2*y+8*z-20],[x,y,z])
print resultado


Al ejecutar el script se obtiene lo siguiente:
{x: 308/103, z: -117/103, y: 42/103}

Se nota que el resultado obtenido es el mismo del artículo ya mencionado.


La imagen de la utilización de notebook se muestra a continuación:

AddThis