PROGRAMACIN GIL DE APLICACIONES WE CON D!
ANGO
#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