SlideShare une entreprise Scribd logo
1  sur  64
Télécharger pour lire hors ligne
Lecciones aprendidas
creando una red social
Roberto Luis Bisbé
roberto.luis@frontiersin.org
@rlbisbe
¿Qué es esta charla?
Lo que
queremos
hacer
Lo que
hacemos
ahora
¿Por qué una red social para científicos?
Presencia
ConocimientoColaboración
Divulgación
¿Cómo?
Usuarios Pruebas Entornos Código Herramientas Docs
¿Bonito o accesible?
Fuente: http://thenextweb.com/insider/2014/05/01/ie11-market-share-passes-ie10-ie9-combined-chrome-cements-lead-firefox/
¿Bonito o accesible?
Chrome
41%
Firefox
24%
Safari
17%
IE 9+
12%
< IE 8
2%
Otros
4%
¿Bonito o accesible?
HTML5
CSS3Javascript
El uso que le dan los usuarios
Métricas
TestingOptimización
Métricas
• Google analytics
• Uso de la página
• Llamadas a APIs
• Profiling de consultas
• New Relic
• Redis
• Nagios
Optimización
• Minificación de CSS y Javascript
• Minificación de HTML
• Imágenes en Base64 en Javascript
• Sprites
• CDN
• Local storage
A/BTesting
Fuente: http://www.astekweb.com/the-web/what-is-ab-testing/
Tests
Unitarios
JS: Componentes +Viewmodels Backend
Integración
JS +Vistas APITests
Aceptación
Selenium Pruebas manuales
Selenium es lento
Imagen: http://content.time.com/time/specials/packages/article/0,28804,1991915_1991909_1991755,00.html
Selenium es LENTO
Imagen: http://content.time.com/time/specials/packages/article/0,28804,1991915_1991909_1991755,00.html
Selenium es LENTO
Imagen: http://content.time.com/time/specials/packages/article/0,28804,1991915_1991909_1991755,00.html
Selenium es LENTO…
y caro
Imagen: http://content.time.com/time/specials/packages/article/0,28804,1991915_1991909_1991755,00.html
Selenium es LENTO…
y caro
Imagen: http://content.time.com/time/specials/packages/article/0,28804,1991915_1991909_1991755,00.html
• Basado en navegador
• Mal necesario
• Solamente casos completos
Integración y unitarios
Imagen: http://www.ceviu.com.br/blog/info/artigos/teste-de-sistema-system-integration-test/
QUnit
QUnit.test( "hello test", function( assert ) {
assert.ok( 1 == "1", "Passed!" );
});
Sinon
Fake
Server
SpiesStubs
Mocks
Sinon - fakeserver
function getFollowers(listId, callback) {
jQuery.ajax({
url: "/user/" + userId + "/followers",
success: function (data) {
callback(null, data);
}
});
}
it("passes", function () {
var server = sinon.fakeServer.create();
server.respondWith(200, { "Content-Type": "application/json" },
JSON.stringify([{ id: 23, name: "foo"}]));
getTodos(42);
server.respond();
server.restore();
});
Sinon - fakeserver
function getFollowers(listId, callback) {
jQuery.ajax({
url: "/user/" + userId + "/followers",
success: function (data) {
callback(null, data);
}
});
}
it("passes", function () {
var server = sinon.fakeServer.create();
server.respondWith(200, { "Content-Type": "application/json" },
JSON.stringify([{ id: 23, name: "foo"}]));
getTodos(42);
server.respond();
server.restore();
});
Chutzpah
• Test Runner Javascript paraVisual Studio
• Compatible conTFS
• Open Source
Carga - JMeter
• Escenarios específicos
• Múltiples usuarios
concurrentes
• Detectar picos
¿Dónde hacemos los test?
Entornos
Live
Test
QA
Integración
Dev
Casos de prueba
• No buscar perfección
• Significativos
• Extremos
• De datos reales, mucho mejor
El código
MVVM
Model
ViewmodelView
Arquitectura
Page
Modal
Dialog
Modal
Dialog
Brick
ViewModel
Communication
Services
Modal
Dialog
Knockout
Template
Navigation
Knockout.js
• Ligero
• Fácil de aprender
• Usa jQuery
Knockout.js
var myViewModel = {
personName: ko.observable('Bob'),
personAge: ko.observable(123)
};
The name is <span data-bind="text: personName"></span>
ko.applyBindings(myViewModel);
Knockout.js
var myViewModel = {
personName: ko.observable('Bob'),
personAge: ko.observable(123)
};
The name is <span data-bind="text: personName"></span>
ko.applyBindings(myViewModel);
Knockout.js
var myViewModel = {
personName: ko.observable('Bob'),
personAge: ko.observable(123)
};
The name is <span data-bind="text: personName"></span>
ko.applyBindings(myViewModel);
Knockout.js
var myViewModel = {
personName: ko.observable('Bob'),
personAge: ko.observable(123)
};
The name is <span data-bind="text: personName"></span>
ko.applyBindings(myViewModel);
Knockout.js - Observable Arrays
<ul data-bind="foreach: users">
<li data-bind="text: name">
</li>
</ul>
self.users = ko.observableArray([
{name: "Carlos"},
{name: "Ivan"},
{name: "Maria"},
{name: "Quique"},
]);
Knockout.js - Observable Arrays
<ul data-bind="foreach: users">
<li data-bind="text: name">
</li>
</ul>
self.users = ko.observableArray([
{name: "Carlos"},
{name: "Ivan"},
{name: "Maria"},
{name: "Quique"},
]);
Knockout.js - Observable Arrays
<ul data-bind="foreach: users">
<li data-bind="text: name">
</li>
</ul>
self.users = ko.observableArray([
{name: "Carlos"},
{name: "Ivan"},
{name: "Maria"},
{name: "Quique"},
]);
Knockout.js -Templates
<div data-bind="template: { name: 'person-template', data: seller }"></div>
<script type="text/html" id="person-template">
<h3 data-bind="text: name"></h3>
<p>Credits: <span data-bind="text: credits"></span></p>
</script>
Knockout.js -Templates
<div data-bind="template: { name: 'person-template', data: seller }"></div>
<script type="text/html" id="person-template">
<h3 data-bind="text: name"></h3>
<p>Credits: <span data-bind="text: credits"></span></p>
</script>
Knockout.js -Templates
<div data-bind="template: { name: 'person-template', data: seller }"></div>
<script type="text/html" id="person-template">
<h3 data-bind="text: name"></h3>
<p>Credits: <span data-bind="text: credits"></span></p>
</script>
Knockout.js – Animaciones
<ul data-bind="foreach: {data: users, afterAdd: fadeIn}">
<li data-bind="text: name">
</li>
</ul>
self.fadeIn: function(element, index, data) {
$(element).filter("li")
.animate({ backgroundColor: 'yellow' }, 200)
.animate({ backgroundColor: 'white' }, 800);
};
Knockout.js – Animaciones
<ul data-bind="foreach: {data: users, afterAdd: fadeIn}">
<li data-bind="text: name">
</li>
</ul>
self.fadeIn: function(element, index, data) {
$(element).filter("li")
.animate({ backgroundColor: 'yellow' }, 200)
.animate({ backgroundColor: 'white' }, 800);
};
Knockout.js – Animaciones
<ul data-bind="foreach: {data: users, afterAdd: fadeIn}">
<li data-bind="text: name">
</li>
</ul>
self.fadeIn: function(element, index, data) {
$(element).filter("li")
.animate({ backgroundColor: 'yellow' }, 200)
.animate({ backgroundColor: 'white' }, 800);
};
Knockout.js – Animaciones
<ul data-bind="foreach: {data: users, afterAdd: fadeIn}">
<li data-bind="text: name">
</li>
</ul>
self.fadeIn: function(element, index, data) {
$(element).filter("li")
.animate({ backgroundColor: 'yellow' }, 200)
.animate({ backgroundColor: 'white' }, 800);
};
Un apunte sobre las animaciones
Un apunte sobre las animaciones
• Cuestan tiempo
• Penalizan el rendimiento
• Para tests: jQuery.fx.off
Sammy
Sammy('#main', function() {
this.get('#/path', function() {
this.$element().html('A new route!');
});
}).run();
Sammy
Sammy('#main', function() {
this.get('#/path', function() {
this.$element().html('A new route!');
});
}).run();
¿Y si Javascript está deshabilitado?
¿Y si Javascript está deshabilitado?
• Header estático con información principal
• Advertencia de uso de Javascript
Herramientas
Herramientas
JIRA
Panel
Kanban
Visual
Studio
Chrome
tools
TFS +
Chutzpah
Documentación
Imagen: http://sharpen.engr.colostate.edu/mediawiki/index.php/CHOMP:_Documentation
Swagger
• Documentación a partir de comentarios
• Especificación basada en JSON
• Multilenguaje y multiplataforma
• Extensible y personalizable
Swagger
{
"apiVersion": "1.0.0",
"swaggerVersion": "1.2",
"basePath": "http://petstore.swagger.wordnik.com/api",
"resourcePath": "/store",
"produces": [
"application/json"
],
"apis": [
],
"models": {
}
}
Swagger - APIs
"method": "GET",
"summary": "Get by user name",
"type": "User",
"parameters": [
{
"name": "username",
"description": "The name.",
"required": true,
"type": "string",
"paramType": "path",
"allowMultiple": false
}
]
"responseMessages": [
{
"code": 400,
"message": "Invalid username supplied"
},
{
"code": 404,
"message": "User not found"
}
]
Swagger - Modelos
"User": {
"id": "User",
"properties": {
"id": {
"type": "integer",
"format": "int64"
},
"username": {
"type": "string"
}
"userStatus": {
"type": "integer",
"format": "int32",
"description": "User Status",
"enum": [
"1-registered",
"2-active",
"3-closed"
]
}
Conclusiones
• Toda una experiencia
• Muchas tecnologías y frameworks
• Pruebas, pruebas, pruebas
• Algo se te va a colar
• Rendimiento
frontiers is hiring
• Buscamos desarrolladores full-stack
• Retos interesantes
• .NET y Javascript
• Bolis de colores
• Gente maja
• Café gratis
¿Preguntas?
Gracias!
roberto.luis@frontiersin.org
@rlbisbe

Contenu connexe

Tendances

Introducción al framework Symfony
Introducción al framework SymfonyIntroducción al framework Symfony
Introducción al framework SymfonyAlejandro Hernández
 
Javascript vuela en primera clase con Firefox OS
Javascript vuela en primera clase con Firefox OSJavascript vuela en primera clase con Firefox OS
Javascript vuela en primera clase con Firefox OSRoberto Luis Bisbé
 
Desarrollo de Aplicaciones con Node.js | INTERSYS UNPRG | 2012
Desarrollo de Aplicaciones con Node.js | INTERSYS UNPRG | 2012Desarrollo de Aplicaciones con Node.js | INTERSYS UNPRG | 2012
Desarrollo de Aplicaciones con Node.js | INTERSYS UNPRG | 2012Pilmee Gates
 
Grails, opción real y escalable para sitios web de alta carga
Grails, opción real y escalable para sitios web de alta cargaGrails, opción real y escalable para sitios web de alta carga
Grails, opción real y escalable para sitios web de alta cargaDomingo Suarez Torres
 
NodeJS
NodeJSNodeJS
NodeJSIBM
 
Aplicaciones Web SPA con WebAPI y TypeScript
Aplicaciones Web SPA con WebAPI y TypeScriptAplicaciones Web SPA con WebAPI y TypeScript
Aplicaciones Web SPA con WebAPI y TypeScriptLuis Guerrero
 
Web Service and PHP, REST and SOAP
Web Service and PHP, REST and SOAPWeb Service and PHP, REST and SOAP
Web Service and PHP, REST and SOAPElwin Huaman
 
HTML5 en Acción
HTML5 en AcciónHTML5 en Acción
HTML5 en Accióndrarock
 

Tendances (16)

APIs REST
APIs RESTAPIs REST
APIs REST
 
Introducción al framework Symfony
Introducción al framework SymfonyIntroducción al framework Symfony
Introducción al framework Symfony
 
ASP.NET MVC Workshop Día 3
ASP.NET MVC Workshop Día 3ASP.NET MVC Workshop Día 3
ASP.NET MVC Workshop Día 3
 
Javascript vuela en primera clase con Firefox OS
Javascript vuela en primera clase con Firefox OSJavascript vuela en primera clase con Firefox OS
Javascript vuela en primera clase con Firefox OS
 
Desarrollo de Aplicaciones con Node.js | INTERSYS UNPRG | 2012
Desarrollo de Aplicaciones con Node.js | INTERSYS UNPRG | 2012Desarrollo de Aplicaciones con Node.js | INTERSYS UNPRG | 2012
Desarrollo de Aplicaciones con Node.js | INTERSYS UNPRG | 2012
 
HTML5 Web Workers
HTML5 Web WorkersHTML5 Web Workers
HTML5 Web Workers
 
ASP.NET MVC Core
ASP.NET MVC CoreASP.NET MVC Core
ASP.NET MVC Core
 
Grails, opción real y escalable para sitios web de alta carga
Grails, opción real y escalable para sitios web de alta cargaGrails, opción real y escalable para sitios web de alta carga
Grails, opción real y escalable para sitios web de alta carga
 
NodeJS
NodeJSNodeJS
NodeJS
 
Aplicaciones Web SPA con WebAPI y TypeScript
Aplicaciones Web SPA con WebAPI y TypeScriptAplicaciones Web SPA con WebAPI y TypeScript
Aplicaciones Web SPA con WebAPI y TypeScript
 
Frameworks y administracion de contenidos
Frameworks y administracion de contenidosFrameworks y administracion de contenidos
Frameworks y administracion de contenidos
 
Web Service and PHP, REST and SOAP
Web Service and PHP, REST and SOAPWeb Service and PHP, REST and SOAP
Web Service and PHP, REST and SOAP
 
PHP en el 2015
PHP en el 2015PHP en el 2015
PHP en el 2015
 
HTML5 en Acción
HTML5 en AcciónHTML5 en Acción
HTML5 en Acción
 
Introducción a HTML5
Introducción a HTML5Introducción a HTML5
Introducción a HTML5
 
HTML5-Aplicaciones web
HTML5-Aplicaciones webHTML5-Aplicaciones web
HTML5-Aplicaciones web
 

En vedette

Tres tecnologías Microsoft que no se dan en la carrera
Tres tecnologías Microsoft que no se dan en la carreraTres tecnologías Microsoft que no se dan en la carrera
Tres tecnologías Microsoft que no se dan en la carreraRoberto Luis Bisbé
 
Windows 8 Universidad de Valencia
Windows 8 Universidad de ValenciaWindows 8 Universidad de Valencia
Windows 8 Universidad de ValenciaRoberto Luis Bisbé
 
Comunicando nuestras apps con el mundo exterior
Comunicando nuestras apps con el mundo exteriorComunicando nuestras apps con el mundo exterior
Comunicando nuestras apps con el mundo exteriorRoberto Luis Bisbé
 
Windows 8 y Metro para desarrolladores .NET
Windows 8 y Metro para desarrolladores .NETWindows 8 y Metro para desarrolladores .NET
Windows 8 y Metro para desarrolladores .NETRoberto Luis Bisbé
 
Creando aplicaciones móviles con Windows 8 y Windows Phone 8
Creando aplicaciones móviles con Windows 8 y Windows Phone 8Creando aplicaciones móviles con Windows 8 y Windows Phone 8
Creando aplicaciones móviles con Windows 8 y Windows Phone 8Roberto Luis Bisbé
 
DotNetSpain2015: Extendiendo Visual Studio Online a través de su API
DotNetSpain2015: Extendiendo Visual Studio Online a través de su APIDotNetSpain2015: Extendiendo Visual Studio Online a través de su API
DotNetSpain2015: Extendiendo Visual Studio Online a través de su APIRoberto Luis Bisbé
 
Using Azure Search to build Office 365 search driven solutions
Using Azure Search to build Office 365 search driven solutionsUsing Azure Search to build Office 365 search driven solutions
Using Azure Search to build Office 365 search driven solutionsJose Carlos Rodriguez Aviles
 

En vedette (8)

Tres tecnologías Microsoft que no se dan en la carrera
Tres tecnologías Microsoft que no se dan en la carreraTres tecnologías Microsoft que no se dan en la carrera
Tres tecnologías Microsoft que no se dan en la carrera
 
Windows 8 Universidad de Valencia
Windows 8 Universidad de ValenciaWindows 8 Universidad de Valencia
Windows 8 Universidad de Valencia
 
Comunicando nuestras apps con el mundo exterior
Comunicando nuestras apps con el mundo exteriorComunicando nuestras apps con el mundo exterior
Comunicando nuestras apps con el mundo exterior
 
Windows 8 y Metro para desarrolladores .NET
Windows 8 y Metro para desarrolladores .NETWindows 8 y Metro para desarrolladores .NET
Windows 8 y Metro para desarrolladores .NET
 
Windows phonesessions
Windows phonesessionsWindows phonesessions
Windows phonesessions
 
Creando aplicaciones móviles con Windows 8 y Windows Phone 8
Creando aplicaciones móviles con Windows 8 y Windows Phone 8Creando aplicaciones móviles con Windows 8 y Windows Phone 8
Creando aplicaciones móviles con Windows 8 y Windows Phone 8
 
DotNetSpain2015: Extendiendo Visual Studio Online a través de su API
DotNetSpain2015: Extendiendo Visual Studio Online a través de su APIDotNetSpain2015: Extendiendo Visual Studio Online a través de su API
DotNetSpain2015: Extendiendo Visual Studio Online a través de su API
 
Using Azure Search to build Office 365 search driven solutions
Using Azure Search to build Office 365 search driven solutionsUsing Azure Search to build Office 365 search driven solutions
Using Azure Search to build Office 365 search driven solutions
 

Similaire à Lecciones aprendidas creando una red social

Webinar interlat apps_2012_carlos_a-perez_españa
Webinar interlat apps_2012_carlos_a-perez_españaWebinar interlat apps_2012_carlos_a-perez_españa
Webinar interlat apps_2012_carlos_a-perez_españaJerilee Dueñas Rengifo
 
Webinar interlat apps_2012_carlos_a-perez_españa
Webinar interlat apps_2012_carlos_a-perez_españaWebinar interlat apps_2012_carlos_a-perez_españa
Webinar interlat apps_2012_carlos_a-perez_españaCommunity Managers Latam
 
APPS Aplicaciones móviles: Construyendo y publicando nuestro primera APPS mul...
APPS Aplicaciones móviles: Construyendo y publicando nuestro primera APPS mul...APPS Aplicaciones móviles: Construyendo y publicando nuestro primera APPS mul...
APPS Aplicaciones móviles: Construyendo y publicando nuestro primera APPS mul...Interlat
 
Seminario html5
Seminario html5Seminario html5
Seminario html5UDECI
 
[Shared] ML Bootcamp - GDG Barcelona - Semana 4.pptx
[Shared] ML Bootcamp - GDG Barcelona - Semana 4.pptx[Shared] ML Bootcamp - GDG Barcelona - Semana 4.pptx
[Shared] ML Bootcamp - GDG Barcelona - Semana 4.pptxGabriela Soto
 
Entendiendo Yii - Flisol 2016
Entendiendo Yii - Flisol 2016Entendiendo Yii - Flisol 2016
Entendiendo Yii - Flisol 2016Plattinux
 
HTML 5 & WebGL (Spanish Version)
HTML 5 & WebGL (Spanish Version)HTML 5 & WebGL (Spanish Version)
HTML 5 & WebGL (Spanish Version)Iran Reyes Fleitas
 
Javascript en proyectos reales: jQuery
Javascript en proyectos reales: jQueryJavascript en proyectos reales: jQuery
Javascript en proyectos reales: jQueryDavid Arango
 
Cobertura de código con test funcionales para superhéroes
Cobertura de código con test funcionales para superhéroesCobertura de código con test funcionales para superhéroes
Cobertura de código con test funcionales para superhéroesatSistemas
 
Primeros pasos Symfony PHPVigo
Primeros pasos Symfony PHPVigoPrimeros pasos Symfony PHPVigo
Primeros pasos Symfony PHPVigoPHP Vigo
 

Similaire à Lecciones aprendidas creando una red social (20)

Webinar interlat apps_2012_carlos_a-perez_españa
Webinar interlat apps_2012_carlos_a-perez_españaWebinar interlat apps_2012_carlos_a-perez_españa
Webinar interlat apps_2012_carlos_a-perez_españa
 
Webinar interlat apps_2012_carlos_a-perez_españa
Webinar interlat apps_2012_carlos_a-perez_españaWebinar interlat apps_2012_carlos_a-perez_españa
Webinar interlat apps_2012_carlos_a-perez_españa
 
APPS Aplicaciones móviles: Construyendo y publicando nuestro primera APPS mul...
APPS Aplicaciones móviles: Construyendo y publicando nuestro primera APPS mul...APPS Aplicaciones móviles: Construyendo y publicando nuestro primera APPS mul...
APPS Aplicaciones móviles: Construyendo y publicando nuestro primera APPS mul...
 
El Nuevo Internet Explorer 9
El Nuevo Internet Explorer 9El Nuevo Internet Explorer 9
El Nuevo Internet Explorer 9
 
Seminario html5
Seminario html5Seminario html5
Seminario html5
 
[Shared] ML Bootcamp - GDG Barcelona - Semana 4.pptx
[Shared] ML Bootcamp - GDG Barcelona - Semana 4.pptx[Shared] ML Bootcamp - GDG Barcelona - Semana 4.pptx
[Shared] ML Bootcamp - GDG Barcelona - Semana 4.pptx
 
[Code Camp 2009] Desarrollando sitios web escalables con ASP.NET MVC (Rodolfo...
[Code Camp 2009] Desarrollando sitios web escalables con ASP.NET MVC (Rodolfo...[Code Camp 2009] Desarrollando sitios web escalables con ASP.NET MVC (Rodolfo...
[Code Camp 2009] Desarrollando sitios web escalables con ASP.NET MVC (Rodolfo...
 
(25.03) RUN 09 - Sesiones Desarrollo - SI 2.0
(25.03) RUN 09 - Sesiones Desarrollo - SI 2.0(25.03) RUN 09 - Sesiones Desarrollo - SI 2.0
(25.03) RUN 09 - Sesiones Desarrollo - SI 2.0
 
Entendiendo Yii - Flisol 2016
Entendiendo Yii - Flisol 2016Entendiendo Yii - Flisol 2016
Entendiendo Yii - Flisol 2016
 
Web2 Quiensomos
Web2 QuiensomosWeb2 Quiensomos
Web2 Quiensomos
 
HTML5 + Asp.NET
HTML5 + Asp.NETHTML5 + Asp.NET
HTML5 + Asp.NET
 
ASP.NET MVC
ASP.NET MVCASP.NET MVC
ASP.NET MVC
 
Curso de HTML5
Curso de HTML5Curso de HTML5
Curso de HTML5
 
S8-DAW-2022S1.pptx
S8-DAW-2022S1.pptxS8-DAW-2022S1.pptx
S8-DAW-2022S1.pptx
 
HTML 5 & WebGL (Spanish Version)
HTML 5 & WebGL (Spanish Version)HTML 5 & WebGL (Spanish Version)
HTML 5 & WebGL (Spanish Version)
 
Cursos web
Cursos webCursos web
Cursos web
 
Javascript en proyectos reales: jQuery
Javascript en proyectos reales: jQueryJavascript en proyectos reales: jQuery
Javascript en proyectos reales: jQuery
 
(30/04) TECHnight MSDN - Desarrollo de aplicaciones Silverlight y novedades e...
(30/04) TECHnight MSDN - Desarrollo de aplicaciones Silverlight y novedades e...(30/04) TECHnight MSDN - Desarrollo de aplicaciones Silverlight y novedades e...
(30/04) TECHnight MSDN - Desarrollo de aplicaciones Silverlight y novedades e...
 
Cobertura de código con test funcionales para superhéroes
Cobertura de código con test funcionales para superhéroesCobertura de código con test funcionales para superhéroes
Cobertura de código con test funcionales para superhéroes
 
Primeros pasos Symfony PHPVigo
Primeros pasos Symfony PHPVigoPrimeros pasos Symfony PHPVigo
Primeros pasos Symfony PHPVigo
 

Plus de Roberto Luis Bisbé

Plus de Roberto Luis Bisbé (8)

Scala desde c# y JavaScript
Scala desde c# y JavaScriptScala desde c# y JavaScript
Scala desde c# y JavaScript
 
Desarrollo de aplicaciones para Windows 8 y Windows Phone
Desarrollo de aplicaciones para Windows 8 y Windows PhoneDesarrollo de aplicaciones para Windows 8 y Windows Phone
Desarrollo de aplicaciones para Windows 8 y Windows Phone
 
Desarrollo Metro con Windows 8 UPM
Desarrollo Metro con Windows 8 UPMDesarrollo Metro con Windows 8 UPM
Desarrollo Metro con Windows 8 UPM
 
Aplicaciones Metro para Windows 8
Aplicaciones Metro para Windows 8Aplicaciones Metro para Windows 8
Aplicaciones Metro para Windows 8
 
Hardcore PHP
Hardcore PHPHardcore PHP
Hardcore PHP
 
El patrón MVC
El patrón MVCEl patrón MVC
El patrón MVC
 
Social Media
Social MediaSocial Media
Social Media
 
Fundamentos de sitios web accesibles
Fundamentos de sitios web accesiblesFundamentos de sitios web accesibles
Fundamentos de sitios web accesibles
 

Lecciones aprendidas creando una red social