Sie sind auf Seite 1von 63

PROGRAMACIN GIL DE APLICACIONES WE CON D!

ANGO

Manuel Saelices msaelices@yaco.es

#n$ice $e con%eni$os
1. ". 4. 5. 9. :. ;. =.

In%&o$ucci'n a me%o$olo()as *(iles +,u- .e$i& a un /&ame0o&1 0e23 +Es !"EE *(il3 Py%6on7 e8em.lo $e len(ua(e *(il In%&o$ucci'n a D8an(o Demo7 $esa&&ollo en D8an(o D8an(o 2y e<am.le Re/le<iones /inales

"

#n$ice $e con%eni$os
1. ". 4. 5. 9. :. ;. =.

Introduccin a metodologas giles +,u- .e$i& a un /&ame0o&1 0e23 +Es !"EE *(il3 Py%6on7 e8em.lo $e len(ua(e *(il In%&o$ucci'n a D8an(o Demo7 $esa&&ollo en D8an(o D8an(o 2y e<am.le Re/le<iones /inales

In%&o$ucci'n me%o$olo()as *(iles

Me%o$olo()as %&a$icionales

>acen -n/asis en la .lani/icaci'n E%a.as $e/ini$as


An*lisis $e &e?uisi%os Es.eci/icaci'n y $ise@o $el sis%ema Im.lemen%aci'n P&ue2as Documen%aci'n Es una me%o$olo()a .esa$a No &es.on$e 2ien an%e el cam2io
5

P&inci.al .&o2lemaA

In%&o$ucci'n me%o$olo()as *(iles

P&o2lemas en $esa&&ollo so/%0a&e

El clien%e

no sa2e $e %ecnolo()a no sa2e lo ?ue ?uie&e7 si no lo Be an%es .&e/ie&e al(o /uncional ?ue lee& un $ise@o

Es $i/)cil %ene& %o$os los ca2os a%a$os La %ecnolo()a cam2ia &*.i$o Siem.&e su&(en .&o2lemas

In%&o$ucci'n me%o$olo()as *(iles

ASERCOA TODO DESARROLLO SOFTWARE ES MUY SUSCEPTIBLE AL CAMBIO DE REQUISITOS

In%&o$ucci'n me%o$olo()as *(iles

Me%o$olo()as *(iles

Se en/&en%an a las me%o$olo()as %&a$icionales Dn/asis en la a$a.%a2ili$a$ $el .&oceso A(iliEan los .&ocesos $e $esa&&ollo Da .o& 6ec6o ?ue los &e?uisi%os cam2ia&*n In%en%aA

P&eBe& el cam2io lo an%es .osi2leA en%&e(a cons%an%e Res.on$e& al cam2io $e /o&ma &*.i$a
;

#n$ice $e con%eni$os
1. 2. 4. 5. 9. :. ;. =.

In%&o$ucci'n a me%o$olo()as *(iles Qu pedir a un framework web? +Es !"EE *(il3 Py%6on7 e8em.lo $e len(ua(e *(il In%&o$ucci'n a D8an(o Demo7 $esa&&ollo en D8an(o D8an(o 2y e<am.le Re/le<iones /inales

+,u- .e$i& a un /&ame0o&1 0e23

GLa 2elleEa con$uce a la /elici$a$7 y la /elici$a$ con$uce a la .&o$uc%iBi$a$H


DaBi$ >einemeie& >anson7 c&ea$o& $e Ru2y on Rails

+,u- .e$i& a un /&ame0o&1 0e23

El .&oceso en un /&ame0o&1 0e2 $e2e se&

(il

R*.i$o $e $esa&&olla& R*.i$o ciclo $e $esa&&ollo Jle<i2le Jacili%a& el $es.lie(ue C'$i(o le(i2le7 man%eni2le y 2ello ConBenci'n so2&e con/i(u&aci'n DiBe&%i$o KLM
1I

Sim.le

+,u- .e$i& a un /&ame0o&1 0e23

+C'mo se& *(il3

Au%oma%iEa&Nelimina& %a&eas &e.e%i%iBas


DRO PDonQ% Re.ea% Oou&sel/M En ins%alaci'n y $es.lie(ue En $esa&&ollo


sis%ema $e .e&misos y usua&ios cons%&ucci'nNBali$aci'n $e /o&mula&ios c&eaci'n $el mo$elo $e $a%os c&eaci'n $e $a%os $e .&ue2a

R*.i$o ciclo $e $esa&&ollo


Elimina& necesi$a$ $e &einicios Sis%ema $e &eca&(a $e li2&e&)as


11

+,u- .e$i& a un /&ame0o&1 0e23

+C'mo se& *(il3

R%iliEa& un ORM PO28ec% Rela%ional Ma..e&M

A2s%&ae $e la 2ase $e $a%osA


Jle<i2ili$a$ an%e el cam2io $e &e?uisi%os Reu%iliEaci'n .a&a o%&os .&oyec%os

La m*?uina c&ea el S,L El c'$i(o &esul%a m*s le(i2le Aumen%a la se(u&i$a$ $e %u sis%ema

No 6ay inyecci'n S,L Menos /allos en .&o(&amaci'n

1"

+,u- .e$i& a un /&ame0o&1 0e23

Sin ORM
cursor.execute(SELECT * FROM personas \ WHERE edad= + 20) for row in cursor.fetchall(): id = row[0] edad = row[1] cursor.execute(UPDATE personas WHERE id=%s \ SET edad=%d % (id, edad+1))

Con ORM
for p in Personas.listado(edad=20): # ejecuta SELECT p.edad = p.edad + 1 p.nombre = Juan p.update() # ejecuta UPDATE
14

+,u- .e$i& a un /&ame0o&1 0e23

+C'mo se& *(il3

Ins%alaci'n y $es.lie(ue

Sc&i.%s $e au%oma%iEaci'n .a&a %o$o C&eaci'n au%om*%ica $el es?uema $e $a%os C&eaci'n au%om*%ica $e $a%os $e .&ue2a Ces%s uni%a&ios7 $e ca&(a y /uncionales Ce ?ui%a el mie$o aA

In%e(&aci'n $e sis%ema $e %es%eo


Re/ac%o&iEa& el c'$i(o Inclui& nueBas /uncionali$a$es

Recue&$aA buscamos adaptabilidad


15

+,u- .e$i& a un /&ame0o&1 0e23

+C'mo se& sim.le3

Len(ua8e $e .&o(&amaci'n sim.le


sim.le S le(i2le T c'$i(o man%eni2le el c'$i(o es le)$o muc6o m*s ?ue esc&i%o o&ien%e a /o&ma& sis%emas sim.les &esul%e /*cilmen%e man%eni2le no ?uie&o con/i(u&a& 1I /ic6e&os UML $e2e conBeni&se la no&ma comVn s'lo con/i(u&a& la e<ce.ci'n a la no&ma
19

J&ame0o&1 ?ue

ConBenci'n so2&e con/i(u&aci'n


+,u- .e$i& a un /&ame0o&1 0e23

+C'mo se& sim.le3

So2&e 6e&&amien%as y 0iEa&$s


Ce (ene&an .a&%e $el c'$i(o Ce con/i(u&an los /ic6e&os UMLs Los 0iEa&$s ! son la e<cusa RECRERDAA "l cdigo es ledo ms #ue escrito

Co$o muy 2ien7 .e&oA


La base debe ser simple.

1:

+,u- .e$i& a un /&ame0o&1 0e23

Po& Vl%imo

J*cilmen%e in%e(&a2le con Go%&osH E/icien%e y escala2le Me8o& e<.l)ci%o ?ue im.l)ci%o

MinimiEa& la ma(ia Da%osNL'(icaNP&esen%aci'n No o2li(a&%e a un IDE conc&e%o Pe&mi%i& sis%ema $e con%&ol $e Be&siones
1;

Se.a&a& ca.as

Pe&mi%i& las 2uenas me%o$olo()as


#n$ice $e con%eni$os
1. ". $. 5. 9. :. ;. =.

In%&o$ucci'n a me%o$olo()as *(iles +,u- .e$i& a un /&ame0o&1 0e23 "s %2"" gil? Py%6on7 e8em.lo $e len(ua(e *(il In%&o$ucci'n a D8an(o Demo7 $esa&&ollo en D8an(o D8an(o 2y e<am.le Re/le<iones /inales

1=

+Es !"EE *(il3

Res.ues%aA NO

API Com.le8a Len(ua8e com.ila$o y GBe&2osoH Con/i(u&aci'n com.le8a


Muc6os /ic6e&os UMLs E&&o&es $e com.ilaci'n $e%ec%a$os en e8ecuci'n Com.ila& %o$o Gene&a& .0a& Muc6as Beces7 &einicia& Comca%
1F

Len%o ciclo $e $esa&&ollo


+Es !"EE *(il3

Mecanismos a(iliEaci'n !"EE

IDEs $e $esa&&ollo

Com.le%an el c'$i(o Pse%%e&s7 (e%%e&s7 e%c.M Man%ienen UML sinc&oniEa$os Jacili%an el $es.lie(ue Cienen 0iEa&$s7 .lu(ins7 6e&&amien%as

Gene&an c'$i(o Dise@a$o&es (&*/icos

E8em.losA MyEcli.se7 !DeBelo.e&7 e%c.

Si(ue 6a2ien$o un .&o2lemaA

La base debe ser gil


"I

#n$ice $e con%eni$os
1. ". 4. &. 9. :. ;. =.

In%&o$ucci'n a me%o$olo()as *(iles +,u- .e$i& a un /&ame0o&1 0e23 +Es !"EE *(il3 '(t)on* e+emplo de lenguage gil In%&o$ucci'n a D8an(o Demo7 $esa&&ollo en D8an(o D8an(o 2y e<am.le Re/le<iones /inales

"1

Py%6on7 e8em.lo $e len(ua8e *(il

Len(ua8e Py%6on

In%e&.&e%a$o J*cil $e a.&en$e& In$en%a$o

def load_comics(path): comics = {} file = open(path) for line in file.read(): url, name = line.split(':') comics[url] = name.strip() return comics
""

Py%6on7 e8em.lo $e len(ua8e *(il

Py%6on Bs !aBa

Py%6on al(o m*s len%o APIs simila&es Py%6on m*s .&o$uc%iBo


Ci.a$o $in*mico P$uc1 %y.in(M S6ell in%e&ac%iBa C'$i(o m*s lim.io


Menos GBe&2osoH Esc&i2es menos !aBa innecesa&iamen%e com.le8oA Walli8aJac%o&y

http://www.abelgonzalez.com/entornosabiertos/no-olvides-el-vajillafactory_p154.html

"4

Py%6on7 e8em.lo $e len(ua8e *(il

Py%6on Bs !aBa Pe8em.losM

G>ola mun$oH

!aBa

public class HolaMundo { public static void main (String[] args) { System.out.println("Hola mundo"); } }

Py%6on

print Hola mundo

"5

Py%6on7 e8em.lo $e len(ua8e *(il

Py%6on Bs !aBa Pe8em.losM

Lee& $e un /ic6e&o

!aBa

import java.io.*; BufferedReader fichero = new BufferedReader( new FileReader(entrada.txt)); while((linea=fichero.readLine())!=null) System.out.println(linea);

Py%6on

fichero = open('entrada.txt') for linea in fichero: print linea


"9

#n$ice $e con%eni$os
1. ". 4. 5. ,. :. ;. =.

In%&o$ucci'n a me%o$olo()as *(iles +,u- .e$i& a un /&ame0o&1 0e23 +Es !"EE *(il3 Py%6on7 e8em.lo $e len(ua(e *(il Introduccin a -+ango Demo7 $esa&&ollo en D8an(o D8an(o 2y e<am.le Re/le<iones /inales

":

In%&o$ucci'n a D8an(o

Ca&ac%e&)s%icas 2*sicas

Len(ua8e Py%6on Desa&&ollo muy &*.i$o Simila& Ru2y on Rails usca el .e&/eccionismo Pa%&'n MWC Am.lia comuni$a$ >e&manos mayo&es como Goo(le

"+emploA Google App E gi e s'lo so.o&%a .y%6on e in%e(&a D8an(o .o& $e/ec%o.
";

In%&o$ucci'n a D8an(o

Dise@o .e&/eccionis%a

C'$i(o muy le(i2le E<?uisi%a me%o$olo()a $esa&&ollo Pe&/ec%a $ocumen%aci'n ORM Dise@a$o& RRLs Wis%as PXcon%&ola$o&esM Plan%illas
"=

Com.onen%es /un$amen%ales

In%&o$ucci'n a D8an(o

O%&os com.onen%es o!"#o$#"%e#bo&


In%e&/aE a$minis%&aci'n au%om*%ica Sis%ema $e /o&mula&ios Sis%ema $e au%en%icaci'nNau%o&iEaci'n In%e&nacionaliEaci'n Sis%ema $e cac6J&ame0o&1 $e sin$icaci'n J&ame0o&1 %es%in( uni%a&io y /uncional Se&ialiEa$o& UML y !SON Sis%ema GIS ... "F

In%&o$ucci'n a D8an(o

A.licaciones 0e2 &eu%iliEa2les


Ca((in( Wi1i Jo&os CMS lo( ... 6%%.ANN000.$8an(o.lu(a2les.comN 6%%.ANNco$e.(oo(le.comN


4I

M*s en

In%&o$ucci'n a D8an(o

Recu&sos 2*sicos

Documen%aci'n o/icial

6%%.ANN$ocs.$8an(o.&o8ec%.comN 6%%.ANNco$e.$8an(o.&o8ec%s.comN 6%%.ANN000.$8an(osi%es.o&(N

Wi1i7 SWN7 Cic1e%s7 e%c.

Al(unos si%ios 0e2 en D8an(o

41

In%&o$ucci'n a D8an(o

Mo$elo $e $a%os

Rsa un ORM .&o.io Sim.le y .o$e&oso E8em.lo $e $e/inici'n

class Equipo(models.Model): nombre = models.CharField(max_length=100) class Jugador(models.Model): nombre = models.CharField(max_length=100) equipo = models.ForeignKey(Equipo)

4"

In%&o$ucci'n a D8an(o

Mo$elo $e $a%os

E8em.lo $e uso

>>> madrid = Equipo(nombre='Real Madrid') >>> madrid.save() # ejecuta INSERT >>> jug = Jugador(nombre='Raul', equipo=madrid) >>> jug.save() # ejecuta INSERT >>> jug.equipo.nombre 'Real Madrid' >>> jug2 = Jugador(nombre='Casillas', equipo=madrid) >>> jug2.save() >>> for j in Jugador.objects.all(): # efectua SELECT ... print j.nombre Raul Casillas
44

In%&o$ucci'n a D8an(o

ORM D8an(o Bs. >i2e&na%e


>i2e&na%eA ORM $e !aBa m*s usa$o >i2e&na%e m*s /le<i2le


Pe&mi%e $e/ini& %us .&o.ios ma..in(s Aumen%a com.le8i$a$ ,uie&e cu2&i& 1IIY $e casu)s%ica C'$i(o m*s le(i2le y man%eni2le Desa&&ollo muc6o m*s &*.i$o ,uie&e cu2&i& FFY casu)s%ica.

D8an(o ORM m*s sim.le


Pa&a %o$o lo $em*s7 S,L.


45

In%&o$ucci'n a D8an(o

ORM D8an(o Bs. >i2e&na%e

E8em.lo $e/inici'n >i2e&na%e


privateLongid;

publicclassEquipo{

privateStringnombre; publicLonggetId(){ returnid;} publicvoidsetId(id){ this.id=id;} publicStringgetNombre(){ returnnombre; } publicvoidsetNombre(String nombre){ this.nombre=nombre; } }
49

In%&o$ucci'n a D8an(o

D8an(o ORM Bs. >i2e&na%e

E8em.lo $e/inici'n >i2e&na%e

<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" http://hibernate.sourceforge.net/hibernate-mapping2.0.dtd"> <hibernate-mapping> <class name="com.example.model.Equipo" table="equipos"> <id name="id" column="id"> <generator class="native"/></id> <property name="nombre" column="nombre"/> </class> </hibernate-mapping>
4:

In%&o$ucci'n a D8an(o

... Configuration cfg = new Configuration(); cfg.addResource("Project.hbm.xml"); cfg.setProperties(System.getProperties()); SessionFactory sf = cfg.buildSessionFactory(); Session s = sf.openSession(); Transaction tx = s.beginTransaction(); Equipo equipo = new Equipo(); equipo.setNombre("Real Madrid"); s.save(project); tx.commit(); s.close();
4;

D8an(o ORM Bs. >i2e&na%e

E8em.lo uso >i2e&na%e

In%&o$ucci'n a D8an(o

Dise@o $e RRLs

No se ?uie&en RRLs 6o&&i2les


/oo.esN2a&NsZBie0Nin/&as%&uc%u&eNI7"9597CC P1:;4:5"=9I==7II.6%ml /oo.esNno%icias..6.3anyoT"II:

In$e.en$encia en%&e RRLs y l'(ica $e a.licaci'n Se ?uie&e a&?ui%ec%u&a RESC


/oo.esNno%iciasN"II=N /oo.esNno%iciasNc&ea&N /oo.esNno%iciasNcon/Los0cN2o&&a&N


4=

In%&o$ucci'n a D8an(o

Dise@o $e RRLs

Se im.lemen%an con e<.&esiones &e(ula&es >ay un ma..ea$o& $e RRLs P&o.o&ciona se(u&i$a$ EnlaEan con las Bis%as Pcon%&ola$o&M

E8em.loA

from news.views import caso_especial_03, lista_anual urlpatterns = patterns('', ('^noticias/2003/$', caso_especial_03), ('^noticias/(\d{4})/$', lista_anual), )
4F

In%&o$ucci'n a D8an(o

Wis%as

RealiEan la l'(ica $e la a.licaci'n Es .a&eci$o al con%&ola$o& MWC Suele &en$e&iEa& una .lan%illa E8em.loA

from news.models import Noticia def lista_anual(request, anyo): noticias = Noticia.objects.filter(anyo=anyo) return render_to_response('noticias.html', {'noticias': noticias})
5I

In%&o$ucci'n a D8an(o

Plan%illas

Jiloso/)a

No inclui& l'(ica en .lan%illas No usa& UML Pno s'lo .ensa$o .a&a >CMLM Jacili%a& la sin%a<is .a&a el $ise@a$o& Muy le(i2le So.o&%a 6e&encia $e .lan%illas E<%ensi2le

Len(ua8e .&o.io

51

In%&o$ucci'n a D8an(o

Plan%illas

E8em.loA

{% extends "base.html" %} {% block contenido %} <ul> {% for n in noticias %} <li> <a href="/noticias/{{ n.id }}/"> {{ n.titulo|upper }} </a> </li> {% endfor %} </ul> {% endblock %}
5"

In%&o$ucci'n a D8an(o

Jo&mula&ios

Li2&e&)a inclui$a en D8an(o Dos %i.os


$8an(o./o&ms.Jo&m7 caso (ene&al $8an(o./o&ms.Mo$elJo&m7 so2&e mo$elos Jo&mula&ios Cam.os Wi$(e%s

Com.onen%es

54

In%&o$ucci'n a D8an(o

Jo&mula&ios

E8em.los sim.lesA

Jo&mula&io no asocia$o a mo$elo


from django import forms class ontacto!orm"forms.!orm#: nombre $ models. har!ield"# email $ models.%mail!ield"#

Jo&mula&io asocia$o a mo$elo


from django import forms from e&'ipo.models import %&'ipo class %&'ipo!orm"forms.(odel!orm#: class (eta: model $ %&'ipo
55

In%&o$ucci'n a D8an(o

Jo&mula&ios

Rso en consolaA

>>> from equipos.forms import EquipoForm >>> form = EquipoForm() >>> print form <tr><th><label for="id_nombre">Nombre:</label></th><td><input id="id_nombre" type="text" name="nombre" maxlength="100" /></td></tr> >>> print form.as_p() <p><label for="id_nombre">Nombre:</label> <input id="id_nombre" type="text" name="nombre" maxlength="100" /></p> ... (cont.)
59

In%&o$ucci'n a D8an(o
>>> from equipos.models import Equipo >>> equipo = Equipo.objects.get(nombre='Real Madrid') >>> form = EquipoForm(instance=equipo) >>> print form.as_p() <p><label for="id_nombre">Nombre:</label> <input id="id_nombre" type="text" name="nombre" value="Real Madrid" maxlength="100" /></p> >>> datos_peticion_post = {'nombre': 'Barcelona'} >>> form = EquipoForm(datos_peticion_post) >>> nuevo_equipo = form.save() # ejecuta sql INSERT >>> datos_incorrectos = {'nombre': ''} >>> form = EquipoForm(datos_peticion_post) >>> form.is_valid() False >>> form.errors() {'nombre': [u'This field is required.']}
5:

In%&o$ucci'n a D8an(o

Jo&mula&ios

En Bis%a D8an(oA

from equipos.forms import EquipoForm def crea_equipo(request): if request.method == 'POST': # peticion POST con formulario relleno form = EquipoForm(request.POST) if form.is_valid(): return HttpResponseRedirect('/gracias/') else: # formulario sin rellenar form = EquipoForm() return render_to_response('crea_equipo.html', {'form': form })
5;

In%&o$ucci'n a D8an(o

Jo&mula&ios

En .lan%illaA

{% extends "base.html" %} {% block contenido %} <form action="." method="POST"> {{ form.as_p }} <input type="submit" value="Guardar equipo" /> </form> {% endblock %}

5=

In%&o$ucci'n a D8an(o

Jo&mula&ios

E8em.lo m*s com.le8o

from django import forms from django.forms.widgets import Textarea class ContactoForm(forms.Form): asunto = models.CharField() email = models.EmailField() edad = models.IntegerField(min_value=0) cuerpo = models.CharField(required=False, widget=Textarea())

5F

In%&o$ucci'n a D8an(o

O%&os com.onen%es

Mi$$le0a&es

>oo1s si%ua$os en%&e %u 0e2 y el naBe(a$o& E8em.los

Cam2io $e i$ioma se(Vn len(ua8e naBe(a$o& O/uscaci'n $e %o$a ocu&&encia $e emails http://docs.djangoproject.com/en/dev/topics/http/middleware/

Cac6

Cac6- en Ba&ios niBeles Wa&ios 2ac1en$sA

memcac6e$7 locmem7 $27 sis%ema $e /ic6e&os 6%%.ANN$ocs.$8an(o.&o8ec%.comNenN$eBN%o.icsNcac6eN


9I

In%&o$ucci'n a D8an(o

O%&os com.onen%es

Au%en%icaci'nNau%o&iEaci'n

Con%ieneA

Rsua&ios7 (&u.os y .e&misos Con%&ola$o&es $e acceso ... 6%%.ANN$ocs.$8an(o.&o8ec%.comNenN$eBN%o.icsNau%6N

I1=N

Li2&e&)a .a&a au%oma%iEa&

Cam2io $e i$ioma Re(ene&aci'n $e ca%*lo(os ... 6%%.ANN$ocs.$8an(o.&o8ec%.comNenN$eBN%o.icsNi1=nN


91

In%&o$ucci'n a D8an(o

O%&os com.onen%es

Se&ialiEaci'n

Ce .e&mi%e (ua&$a& los $a%os a UML

In$e.en$encia $e D Pe&mi%e %es%eo en local Si&Be $e co.ia $e se(u&i$a$ 6%%.ANN$ocs.$8an(o.&o8ec%.comNenN$eBN%o.icsNse&ialiEa%ionN

Sis%ema $e %es%eo

D8an(o %iene miles $e %es%s Cu a.licaci'n .ue$e usa& mismo sis%ema

6%%.ANN$ocs.$8an(o.&o8ec%.comNenN$eBN%o.icsN%es%in(N
9"

In%&o$ucci'n a D8an(o

AVn m*s com.onen%es

Sesiones Se@ales In%e&/aE $e a$minis%&aci'n Sin$icaci'n RSSNA%om Wis%as (en-&icas


94

6%%.ANN$ocs.$8an(o.&o8ec%.comNenN$eBN%o.icsN6%%.NsessionsN

6%%.ANN$ocs.$8an(o.&o8ec%.comNenN$eBN%o.icsNsi(nalsN

6%%.ANN$ocs.$8an(o.&o8ec%.comNenN$eBN&e/Ncon%&i2Na$minN

http://docs.djangoproject.com/en/dev/ref/contrib/syndication/

6%%.ANN$ocs.$8an(o.&o8ec%.comNenN$eBN&e/N(ene&icLBie0sN

#n$ice $e con%eni$os
1. ". 4. 5. 9. .. ;. =.

In%&o$ucci'n a me%o$olo()as *(iles +,u- .e$i& a un /&ame0o&1 0e23 +Es !"EE *(il3 Py%6on7 e8em.lo $e len(ua(e *(il In%&o$ucci'n a D8an(o -emo* desarrollo en -+ango D8an(o 2y e<am.le Re/le<iones /inales

95

Demo $e $esa&&ollo en D8an(o

DEMO

99

#n$ice $e con%eni$os
1. ". 4. 5. 9. :. /. =.

In%&o$ucci'n a me%o$olo()as *(iles +,u- .e$i& a un /&ame0o&1 0e23 +Es !"EE *(il3 Py%6on7 e8em.lo $e len(ua(e *(il In%&o$ucci'n a D8an(o Demo7 $esa&&ollo en D8an(o -+ango b( e0ample Re/le<iones /inales

9:

D8an(o 2y e<am.le

E8em.lo a analiEa&A We2 $e Oaco


6%%.ANN000.yaco.esN Desa&&olla$a 1IIY en D8an(o Juncionali$a$es a mos%&a&


Im.lemen%aci'n (ene&al A(&e(aci'n RSS E$i%o& inline Mi$$le0a&e Cac6C'$i(o D8an(o &esul%an%e Resul%a$o /inal

An*lisis

9;

D8an(o 2y e<am.le

P*(ina inicial
6%%.ANN000.yaco.esN

9=

D8an(o 2y e<am.le

Wi$a en Oaco
6%%.ANN000.yaco.esNnoso%&osNBi$aZenZyacoN

9F

D8an(o 2y e<am.le

Comuni$a$
6%%.ANN000.yaco.esNcommuni%yNac%uali$a$N

:I

#n$ice $e con%eni$os
1. ". 4. 5. 9. :. ;. 1.

In%&o$ucci'n a me%o$olo()as *(iles +,u- .e$i& a un /&ame0o&1 0e23 +Es !"EE *(il3 Py%6on7 e8em.lo $e len(ua(e *(il In%&o$ucci'n a D8an(o Demo7 $esa&&ollo en D8an(o D8an(o 2y e<am.le 2efle0iones finales

:1

Re/le<iones /inales

Re/le<iones /inales

+Es necesa&io &e.lan%ea&se el .&oceso $e $esa&&ollo $e a.licaciones 0e23 +!"EE es siem.&e una 2uena elecci'n .a&a el $esa&&ollo 0e23 +Son los en%o&nos come&ciales &ealmen%e %an .&o$uc%iBos como .&ome%en sus /a2&ican%es3 +Al(Vn $)a Be&emos el l)mi%e $e .osi2ili$a$es ?ue %&ae D8an(o3
:"

+Du$as3 +Su(e&encias3

G&acias .o& la a%enci'n[

:4

Das könnte Ihnen auch gefallen