diff --git a/dist/projects.json b/dist/projects.json index efca491aa..d633803cd 100644 --- a/dist/projects.json +++ b/dist/projects.json @@ -3,9 +3,9 @@ "slug": "hcd-intro", "repo": "Laboratoria/bootcamp", "path": "projects/00-hcd-intro", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:11.615Z", + "createdAt": "2023-05-17T20:35:44.390Z", "prefix": 0, "track": "ux", "learningObjectives": [ @@ -24,9 +24,9 @@ "slug": "trivia", "repo": "Laboratoria/bootcamp", "path": "projects/00-trivia", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:11.906Z", + "createdAt": "2023-05-17T20:35:45.355Z", "prefix": 0, "track": "web-dev", "learningObjectives": [ @@ -61,9 +61,9 @@ "slug": "card-validation", "repo": "Laboratoria/bootcamp", "path": "projects/01-card-validation", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:11.907Z", + "createdAt": "2023-05-17T20:35:45.831Z", "prefix": 1, "track": "web-dev", "learningObjectives": [ @@ -108,9 +108,9 @@ "slug": "cipher", "repo": "Laboratoria/bootcamp", "path": "projects/01-cipher", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:14.110Z", + "createdAt": "2023-05-17T20:35:59.250Z", "prefix": 1, "track": "web-dev", "learningObjectives": [ @@ -155,9 +155,9 @@ "slug": "design-and-usability", "repo": "Laboratoria/bootcamp", "path": "projects/01-design-and-usability", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:13.936Z", + "createdAt": "2023-05-17T20:35:59.011Z", "prefix": 1, "track": "ux", "learningObjectives": [ @@ -188,9 +188,9 @@ "slug": "design-detectives", "repo": "Laboratoria/bootcamp", "path": "projects/01-design-detectives", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:14.110Z", + "createdAt": "2023-05-17T20:35:58.467Z", "prefix": 1, "track": "ux", "learningObjectives": [ @@ -229,9 +229,9 @@ "slug": "data-lovers", "repo": "Laboratoria/bootcamp", "path": "projects/02-data-lovers", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:16.268Z", + "createdAt": "2023-05-17T20:36:09.362Z", "prefix": 2, "track": "web-dev", "learningObjectives": [ @@ -282,9 +282,9 @@ "slug": "emergency-room", "repo": "Laboratoria/bootcamp", "path": "projects/02-emergency-room", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:16.348Z", + "createdAt": "2023-05-17T20:36:08.981Z", "prefix": 2, "track": "web-dev", "learningObjectives": [ @@ -335,9 +335,9 @@ "slug": "memory-match", "repo": "Laboratoria/bootcamp", "path": "projects/02-memory-match", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:16.213Z", + "createdAt": "2023-05-17T20:36:09.342Z", "prefix": 2, "track": "web-dev", "learningObjectives": [ @@ -388,9 +388,9 @@ "slug": "movie-challenge", "repo": "Laboratoria/bootcamp", "path": "projects/02-movie-challenge", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:18.661Z", + "createdAt": "2023-05-17T20:36:18.418Z", "prefix": 2, "track": "web-dev", "learningObjectives": [ @@ -441,9 +441,9 @@ "slug": "small-businesses", "repo": "Laboratoria/bootcamp", "path": "projects/02-small-businesses", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:18.578Z", + "createdAt": "2023-05-17T20:36:17.496Z", "prefix": 2, "track": "ux", "learningObjectives": [ @@ -497,9 +497,9 @@ "slug": "uxploradora", "repo": "Laboratoria/bootcamp", "path": "projects/02-uxploradora", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:18.808Z", + "createdAt": "2023-05-17T20:36:17.446Z", "prefix": 2, "track": "ux", "learningObjectives": [ @@ -556,9 +556,9 @@ "slug": "industry-deep-dive", "repo": "Laboratoria/bootcamp", "path": "projects/03-industry-deep-dive", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:21.585Z", + "createdAt": "2023-05-17T20:36:24.540Z", "prefix": 3, "track": "ux", "learningObjectives": [ @@ -615,9 +615,9 @@ "slug": "social-network", "repo": "Laboratoria/bootcamp", "path": "projects/03-social-network", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:22.024Z", + "createdAt": "2023-05-17T20:36:25.131Z", "prefix": 3, "track": "web-dev", "learningObjectives": [ @@ -677,9 +677,9 @@ "slug": "ux-consultancy", "repo": "Laboratoria/bootcamp", "path": "projects/03-ux-consultancy", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:21.571Z", + "createdAt": "2023-05-17T20:36:24.826Z", "prefix": 3, "track": "ux", "learningObjectives": [ @@ -736,9 +736,9 @@ "slug": "burger-queen", "repo": "Laboratoria/bootcamp", "path": "projects/04-burger-queen", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:24.310Z", + "createdAt": "2023-05-17T20:36:35.623Z", "prefix": 4, "track": "web-dev", "learningObjectives": [ @@ -820,9 +820,9 @@ "slug": "burger-queen-api", "repo": "Laboratoria/bootcamp", "path": "projects/04-burger-queen-api", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:24.175Z", + "createdAt": "2023-05-17T20:36:35.478Z", "prefix": 4, "track": "web-dev", "learningObjectives": [ @@ -891,9 +891,9 @@ "slug": "burger-queen-api-client", "repo": "Laboratoria/bootcamp", "path": "projects/04-burger-queen-api-client", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:24.164Z", + "createdAt": "2023-05-17T20:36:36.055Z", "prefix": 4, "track": "web-dev", "learningObjectives": [ @@ -973,9 +973,9 @@ "slug": "md-links", "repo": "Laboratoria/bootcamp", "path": "projects/04-md-links", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:26.127Z", + "createdAt": "2023-05-17T20:36:46.215Z", "prefix": 4, "track": "web-dev", "learningObjectives": [ @@ -1026,9 +1026,9 @@ "slug": "notes", "repo": "Laboratoria/bootcamp", "path": "projects/04-notes", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:25.974Z", + "createdAt": "2023-05-17T20:36:45.562Z", "prefix": 4, "track": "web-dev", "learningObjectives": [ @@ -1100,9 +1100,9 @@ "slug": "chat-app", "repo": "Laboratoria/bootcamp", "path": "projects/05-chat-app", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:26.127Z", + "createdAt": "2023-05-17T20:36:46.076Z", "prefix": 5, "track": "web-dev", "learningObjectives": [ @@ -1173,9 +1173,9 @@ "slug": "fleet-management", "repo": "Laboratoria/bootcamp", "path": "projects/05-fleet-management", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:27.846Z", + "createdAt": "2023-05-17T20:36:54.248Z", "prefix": 5, "track": "web-dev", "learningObjectives": [ @@ -1231,13 +1231,91 @@ "cover": "https://user-images.githubusercontent.com/110297/136462570-852fcc55-e363-4262-a8f3-6bb65702e75a.jpg", "thumb": "data:image/png;base64,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" }, + { + "slug": "movie-challenge-fw", + "repo": "Laboratoria/bootcamp", + "path": "projects/05-movie-challenge-fw", + "version": "6.3.0", + "parserVersion": "5.0.0-alpha.4", + "createdAt": "2023-05-17T20:36:54.293Z", + "prefix": 5, + "track": "web-dev", + "learningObjectives": [ + "html/semantics", + "css/selectors", + "css/box-model", + "css/flexbox", + "browser/dom/selectors", + "browser/dom/events", + "browser/dom/manipulation", + "browser/fetch", + "js/data-types/primitive-vs-non-primitive", + "js/data-types/arrays", + "js/data-types/objects", + "js/variables", + "js/conditionals", + "js/loops", + "js/functions", + "js/testing/unit", + "js/modules/es-modules", + "js/linting", + "js/semantics", + "js/expression-vs-statement", + "scm/git/setup", + "scm/git/intro", + "scm/git/integration", + "scm/github/setup", + "scm/github/gh-pages", + "scm/github/collaboration", + "http/request-response", + "http/headers", + "http/body", + "http/verbs", + "http/status-codes", + "http/json", + "http/cors", + "angular/components-and-templates", + "angular/structural-directives", + "angular/input-output", + "angular/services", + "angular/routing", + "angular/observables", + "angular/http-client", + "angular/styles", + "react/jsx", + "react/components", + "react/events", + "react/lists-and-keys", + "react/conditional-rendering", + "react/lifting-up-state", + "react/hooks", + "react/css-modules", + "react/routing", + "user-centricity/centricity", + "product-design/interactivity", + "product-design/visual-design", + "research/test" + ], + "intl": { + "es": { + "title": "Movie Challenge con Framework", + "summary": "

La idea de este proyecto es que, usando una API con información de películas,\npuedas idear, planear, organizar y desarrollar una aplicación web que aproveche\nestos datos y tenga una propuesta de valor atractiva para lxs usuarixs.

" + }, + "pt": { + "title": "Desafio de Filmes com Framework", + "summary": "

A ideia deste projeto é que, usando uma API com informações de filmes, você\npossa planejar, organizar e desenvolver uma aplicação web que utilize esses\ndados e tenha uma proposta de valor atraente para lxs usuárixs.

" + } + }, + "cover": "https://live.staticflickr.com/117/257368762_38bf6fcf9f_h.jpg", + "thumb": "data:image/png;base64,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" + }, { "slug": "open-project", "repo": "Laboratoria/bootcamp", "path": "projects/05-open-project", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:27.746Z", + "createdAt": "2023-05-17T20:36:53.998Z", "prefix": 5, "track": "web-dev", "intl": { @@ -1253,9 +1331,9 @@ "slug": "roman-numerals", "repo": "Laboratoria/bootcamp", "path": "projects/05-roman-numerals", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:27.840Z", + "createdAt": "2023-05-17T20:37:00.407Z", "prefix": 5, "track": "web-dev", "learningObjectives": [ @@ -1296,9 +1374,9 @@ "slug": "roman-numerals-slack", "repo": "Laboratoria/bootcamp", "path": "projects/05-roman-numerals-slack", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:29.642Z", + "createdAt": "2023-05-17T20:37:00.715Z", "prefix": 5, "track": "web-dev", "learningObjectives": [ @@ -1340,9 +1418,9 @@ "slug": "social-network-fw", "repo": "Laboratoria/bootcamp", "path": "projects/05-social-network-fw", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:29.635Z", + "createdAt": "2023-05-17T20:37:00.404Z", "prefix": 5, "track": "web-dev", "learningObjectives": [ @@ -1422,9 +1500,9 @@ "slug": "wordpress-plugin", "repo": "Laboratoria/bootcamp", "path": "projects/05-wordpress-plugin", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:29.744Z", + "createdAt": "2023-05-17T20:37:07.365Z", "prefix": 5, "track": "web-dev", "learningObjectives": [ @@ -1466,9 +1544,9 @@ "slug": "job-application", "repo": "Laboratoria/bootcamp", "path": "projects/06-job-application", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:31.574Z", + "createdAt": "2023-05-17T20:37:07.518Z", "prefix": 6, "track": "web-dev", "intl": { diff --git a/dist/projects/burger-queen-api-client.json b/dist/projects/burger-queen-api-client.json index eed02d7d8..8c7cea9ef 100644 --- a/dist/projects/burger-queen-api-client.json +++ b/dist/projects/burger-queen-api-client.json @@ -2,9 +2,9 @@ "slug": "burger-queen-api-client", "repo": "Laboratoria/bootcamp", "path": "projects/04-burger-queen-api-client", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:24.164Z", + "createdAt": "2023-05-17T20:36:36.055Z", "prefix": 4, "track": "web-dev", "learningObjectives": [ diff --git a/dist/projects/burger-queen-api.json b/dist/projects/burger-queen-api.json index 48e21bd48..c4624366b 100644 --- a/dist/projects/burger-queen-api.json +++ b/dist/projects/burger-queen-api.json @@ -2,9 +2,9 @@ "slug": "burger-queen-api", "repo": "Laboratoria/bootcamp", "path": "projects/04-burger-queen-api", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:24.175Z", + "createdAt": "2023-05-17T20:36:35.478Z", "prefix": 4, "track": "web-dev", "learningObjectives": [ diff --git a/dist/projects/burger-queen.json b/dist/projects/burger-queen.json index 20f2b1725..40a9abdb9 100644 --- a/dist/projects/burger-queen.json +++ b/dist/projects/burger-queen.json @@ -2,9 +2,9 @@ "slug": "burger-queen", "repo": "Laboratoria/bootcamp", "path": "projects/04-burger-queen", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:24.310Z", + "createdAt": "2023-05-17T20:36:35.623Z", "prefix": 4, "track": "web-dev", "learningObjectives": [ diff --git a/dist/projects/card-validation.json b/dist/projects/card-validation.json index 6f35a2c4a..0fb1322f4 100644 --- a/dist/projects/card-validation.json +++ b/dist/projects/card-validation.json @@ -2,9 +2,9 @@ "slug": "card-validation", "repo": "Laboratoria/bootcamp", "path": "projects/01-card-validation", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:11.907Z", + "createdAt": "2023-05-17T20:35:45.831Z", "prefix": 1, "track": "web-dev", "learningObjectives": [ diff --git a/dist/projects/chat-app.json b/dist/projects/chat-app.json index c20f586bf..227bb37df 100644 --- a/dist/projects/chat-app.json +++ b/dist/projects/chat-app.json @@ -2,9 +2,9 @@ "slug": "chat-app", "repo": "Laboratoria/bootcamp", "path": "projects/05-chat-app", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:26.127Z", + "createdAt": "2023-05-17T20:36:46.076Z", "prefix": 5, "track": "web-dev", "learningObjectives": [ diff --git a/dist/projects/cipher.json b/dist/projects/cipher.json index 33390748a..4e4ceee7f 100644 --- a/dist/projects/cipher.json +++ b/dist/projects/cipher.json @@ -2,9 +2,9 @@ "slug": "cipher", "repo": "Laboratoria/bootcamp", "path": "projects/01-cipher", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:14.110Z", + "createdAt": "2023-05-17T20:35:59.250Z", "prefix": 1, "track": "web-dev", "learningObjectives": [ diff --git a/dist/projects/data-lovers.json b/dist/projects/data-lovers.json index fa1d74796..b10b6963f 100644 --- a/dist/projects/data-lovers.json +++ b/dist/projects/data-lovers.json @@ -2,9 +2,9 @@ "slug": "data-lovers", "repo": "Laboratoria/bootcamp", "path": "projects/02-data-lovers", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:16.268Z", + "createdAt": "2023-05-17T20:36:09.362Z", "prefix": 2, "track": "web-dev", "learningObjectives": [ diff --git a/dist/projects/design-and-usability.json b/dist/projects/design-and-usability.json index ca5748503..5610fb96f 100644 --- a/dist/projects/design-and-usability.json +++ b/dist/projects/design-and-usability.json @@ -2,9 +2,9 @@ "slug": "design-and-usability", "repo": "Laboratoria/bootcamp", "path": "projects/01-design-and-usability", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:13.936Z", + "createdAt": "2023-05-17T20:35:59.011Z", "prefix": 1, "track": "ux", "learningObjectives": [ diff --git a/dist/projects/design-detectives.json b/dist/projects/design-detectives.json index d6b7d1021..5e280e625 100644 --- a/dist/projects/design-detectives.json +++ b/dist/projects/design-detectives.json @@ -2,9 +2,9 @@ "slug": "design-detectives", "repo": "Laboratoria/bootcamp", "path": "projects/01-design-detectives", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:14.110Z", + "createdAt": "2023-05-17T20:35:58.467Z", "prefix": 1, "track": "ux", "learningObjectives": [ diff --git a/dist/projects/emergency-room.json b/dist/projects/emergency-room.json index 6f30ed2e2..d0b8a669c 100644 --- a/dist/projects/emergency-room.json +++ b/dist/projects/emergency-room.json @@ -2,9 +2,9 @@ "slug": "emergency-room", "repo": "Laboratoria/bootcamp", "path": "projects/02-emergency-room", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:16.348Z", + "createdAt": "2023-05-17T20:36:08.981Z", "prefix": 2, "track": "web-dev", "learningObjectives": [ diff --git a/dist/projects/fleet-management.json b/dist/projects/fleet-management.json index 7a84814c0..95efa2488 100644 --- a/dist/projects/fleet-management.json +++ b/dist/projects/fleet-management.json @@ -2,9 +2,9 @@ "slug": "fleet-management", "repo": "Laboratoria/bootcamp", "path": "projects/05-fleet-management", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:27.846Z", + "createdAt": "2023-05-17T20:36:54.248Z", "prefix": 5, "track": "web-dev", "learningObjectives": [ diff --git a/dist/projects/hcd-intro.json b/dist/projects/hcd-intro.json index 056899b3b..3423fa319 100644 --- a/dist/projects/hcd-intro.json +++ b/dist/projects/hcd-intro.json @@ -2,9 +2,9 @@ "slug": "hcd-intro", "repo": "Laboratoria/bootcamp", "path": "projects/00-hcd-intro", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:11.615Z", + "createdAt": "2023-05-17T20:35:44.390Z", "prefix": 0, "track": "ux", "learningObjectives": [ diff --git a/dist/projects/industry-deep-dive.json b/dist/projects/industry-deep-dive.json index 01d5baab1..35a3eab2c 100644 --- a/dist/projects/industry-deep-dive.json +++ b/dist/projects/industry-deep-dive.json @@ -2,9 +2,9 @@ "slug": "industry-deep-dive", "repo": "Laboratoria/bootcamp", "path": "projects/03-industry-deep-dive", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:21.585Z", + "createdAt": "2023-05-17T20:36:24.540Z", "prefix": 3, "track": "ux", "learningObjectives": [ diff --git a/dist/projects/job-application.json b/dist/projects/job-application.json index 31b0b138c..c7a81c870 100644 --- a/dist/projects/job-application.json +++ b/dist/projects/job-application.json @@ -2,9 +2,9 @@ "slug": "job-application", "repo": "Laboratoria/bootcamp", "path": "projects/06-job-application", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:31.574Z", + "createdAt": "2023-05-17T20:37:07.518Z", "prefix": 6, "track": "web-dev", "intl": { diff --git a/dist/projects/md-links.json b/dist/projects/md-links.json index ae4a62e67..3bf7364d1 100644 --- a/dist/projects/md-links.json +++ b/dist/projects/md-links.json @@ -2,9 +2,9 @@ "slug": "md-links", "repo": "Laboratoria/bootcamp", "path": "projects/04-md-links", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:26.127Z", + "createdAt": "2023-05-17T20:36:46.215Z", "prefix": 4, "track": "web-dev", "learningObjectives": [ diff --git a/dist/projects/memory-match.json b/dist/projects/memory-match.json index 3ba00d0f4..7c9a4813c 100644 --- a/dist/projects/memory-match.json +++ b/dist/projects/memory-match.json @@ -2,9 +2,9 @@ "slug": "memory-match", "repo": "Laboratoria/bootcamp", "path": "projects/02-memory-match", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:16.213Z", + "createdAt": "2023-05-17T20:36:09.342Z", "prefix": 2, "track": "web-dev", "learningObjectives": [ diff --git a/dist/projects/movie-challenge-fw.json b/dist/projects/movie-challenge-fw.json new file mode 100644 index 000000000..46b421a48 --- /dev/null +++ b/dist/projects/movie-challenge-fw.json @@ -0,0 +1,78 @@ +{ + "slug": "movie-challenge-fw", + "repo": "Laboratoria/bootcamp", + "path": "projects/05-movie-challenge-fw", + "version": "6.3.0", + "parserVersion": "5.0.0-alpha.4", + "createdAt": "2023-05-17T20:36:54.293Z", + "prefix": 5, + "track": "web-dev", + "learningObjectives": [ + "html/semantics", + "css/selectors", + "css/box-model", + "css/flexbox", + "browser/dom/selectors", + "browser/dom/events", + "browser/dom/manipulation", + "browser/fetch", + "js/data-types/primitive-vs-non-primitive", + "js/data-types/arrays", + "js/data-types/objects", + "js/variables", + "js/conditionals", + "js/loops", + "js/functions", + "js/testing/unit", + "js/modules/es-modules", + "js/linting", + "js/semantics", + "js/expression-vs-statement", + "scm/git/setup", + "scm/git/intro", + "scm/git/integration", + "scm/github/setup", + "scm/github/gh-pages", + "scm/github/collaboration", + "http/request-response", + "http/headers", + "http/body", + "http/verbs", + "http/status-codes", + "http/json", + "http/cors", + "angular/components-and-templates", + "angular/structural-directives", + "angular/input-output", + "angular/services", + "angular/routing", + "angular/observables", + "angular/http-client", + "angular/styles", + "react/jsx", + "react/components", + "react/events", + "react/lists-and-keys", + "react/conditional-rendering", + "react/lifting-up-state", + "react/hooks", + "react/css-modules", + "react/routing", + "user-centricity/centricity", + "product-design/interactivity", + "product-design/visual-design", + "research/test" + ], + "intl": { + "es": { + "title": "Movie Challenge con Framework", + "summary": "

La idea de este proyecto es que, usando una API con información de películas,\npuedas idear, planear, organizar y desarrollar una aplicación web que aproveche\nestos datos y tenga una propuesta de valor atractiva para lxs usuarixs.

" + }, + "pt": { + "title": "Desafio de Filmes com Framework", + "summary": "

A ideia deste projeto é que, usando uma API com informações de filmes, você\npossa planejar, organizar e desenvolver uma aplicação web que utilize esses\ndados e tenha uma proposta de valor atraente para lxs usuárixs.

" + } + }, + "cover": "https://live.staticflickr.com/117/257368762_38bf6fcf9f_h.jpg", + "thumb": "data:image/png;base64,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" +} diff --git a/dist/projects/movie-challenge.json b/dist/projects/movie-challenge.json index a154e920a..cb4806c56 100644 --- a/dist/projects/movie-challenge.json +++ b/dist/projects/movie-challenge.json @@ -2,9 +2,9 @@ "slug": "movie-challenge", "repo": "Laboratoria/bootcamp", "path": "projects/02-movie-challenge", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:18.661Z", + "createdAt": "2023-05-17T20:36:18.418Z", "prefix": 2, "track": "web-dev", "learningObjectives": [ diff --git a/dist/projects/notes.json b/dist/projects/notes.json index acbe69a8f..c384a0d66 100644 --- a/dist/projects/notes.json +++ b/dist/projects/notes.json @@ -2,9 +2,9 @@ "slug": "notes", "repo": "Laboratoria/bootcamp", "path": "projects/04-notes", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:25.974Z", + "createdAt": "2023-05-17T20:36:45.562Z", "prefix": 4, "track": "web-dev", "learningObjectives": [ diff --git a/dist/projects/open-project.json b/dist/projects/open-project.json index 766c9555d..bd0fbf3c2 100644 --- a/dist/projects/open-project.json +++ b/dist/projects/open-project.json @@ -2,9 +2,9 @@ "slug": "open-project", "repo": "Laboratoria/bootcamp", "path": "projects/05-open-project", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:27.746Z", + "createdAt": "2023-05-17T20:36:53.998Z", "prefix": 5, "track": "web-dev", "intl": { diff --git a/dist/projects/roman-numerals-slack.json b/dist/projects/roman-numerals-slack.json index 0d3ae899a..5741ee828 100644 --- a/dist/projects/roman-numerals-slack.json +++ b/dist/projects/roman-numerals-slack.json @@ -2,9 +2,9 @@ "slug": "roman-numerals-slack", "repo": "Laboratoria/bootcamp", "path": "projects/05-roman-numerals-slack", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:29.642Z", + "createdAt": "2023-05-17T20:37:00.715Z", "prefix": 5, "track": "web-dev", "learningObjectives": [ diff --git a/dist/projects/roman-numerals.json b/dist/projects/roman-numerals.json index 004d6c6c9..ed28c6128 100644 --- a/dist/projects/roman-numerals.json +++ b/dist/projects/roman-numerals.json @@ -2,9 +2,9 @@ "slug": "roman-numerals", "repo": "Laboratoria/bootcamp", "path": "projects/05-roman-numerals", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:27.840Z", + "createdAt": "2023-05-17T20:37:00.407Z", "prefix": 5, "track": "web-dev", "learningObjectives": [ diff --git a/dist/projects/small-businesses.json b/dist/projects/small-businesses.json index f2f1f2cc4..f33271d11 100644 --- a/dist/projects/small-businesses.json +++ b/dist/projects/small-businesses.json @@ -2,9 +2,9 @@ "slug": "small-businesses", "repo": "Laboratoria/bootcamp", "path": "projects/02-small-businesses", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:18.578Z", + "createdAt": "2023-05-17T20:36:17.496Z", "prefix": 2, "track": "ux", "learningObjectives": [ diff --git a/dist/projects/social-network-fw.json b/dist/projects/social-network-fw.json index 3f2dac577..53cd6f423 100644 --- a/dist/projects/social-network-fw.json +++ b/dist/projects/social-network-fw.json @@ -2,9 +2,9 @@ "slug": "social-network-fw", "repo": "Laboratoria/bootcamp", "path": "projects/05-social-network-fw", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:29.635Z", + "createdAt": "2023-05-17T20:37:00.404Z", "prefix": 5, "track": "web-dev", "learningObjectives": [ diff --git a/dist/projects/social-network.json b/dist/projects/social-network.json index b427e4b4b..8280743b6 100644 --- a/dist/projects/social-network.json +++ b/dist/projects/social-network.json @@ -2,9 +2,9 @@ "slug": "social-network", "repo": "Laboratoria/bootcamp", "path": "projects/03-social-network", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:22.024Z", + "createdAt": "2023-05-17T20:36:25.131Z", "prefix": 3, "track": "web-dev", "learningObjectives": [ diff --git a/dist/projects/trivia.json b/dist/projects/trivia.json index 3256c09e6..d6387dddb 100644 --- a/dist/projects/trivia.json +++ b/dist/projects/trivia.json @@ -2,9 +2,9 @@ "slug": "trivia", "repo": "Laboratoria/bootcamp", "path": "projects/00-trivia", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:11.906Z", + "createdAt": "2023-05-17T20:35:45.355Z", "prefix": 0, "track": "web-dev", "learningObjectives": [ diff --git a/dist/projects/ux-consultancy.json b/dist/projects/ux-consultancy.json index 30faafcfc..b61d2202a 100644 --- a/dist/projects/ux-consultancy.json +++ b/dist/projects/ux-consultancy.json @@ -2,9 +2,9 @@ "slug": "ux-consultancy", "repo": "Laboratoria/bootcamp", "path": "projects/03-ux-consultancy", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:21.571Z", + "createdAt": "2023-05-17T20:36:24.826Z", "prefix": 3, "track": "ux", "learningObjectives": [ diff --git a/dist/projects/uxploradora.json b/dist/projects/uxploradora.json index c498c1da9..38500987b 100644 --- a/dist/projects/uxploradora.json +++ b/dist/projects/uxploradora.json @@ -2,9 +2,9 @@ "slug": "uxploradora", "repo": "Laboratoria/bootcamp", "path": "projects/02-uxploradora", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:18.808Z", + "createdAt": "2023-05-17T20:36:17.446Z", "prefix": 2, "track": "ux", "learningObjectives": [ diff --git a/dist/projects/wordpress-plugin.json b/dist/projects/wordpress-plugin.json index 598d95829..942873802 100644 --- a/dist/projects/wordpress-plugin.json +++ b/dist/projects/wordpress-plugin.json @@ -2,9 +2,9 @@ "slug": "wordpress-plugin", "repo": "Laboratoria/bootcamp", "path": "projects/05-wordpress-plugin", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:29.744Z", + "createdAt": "2023-05-17T20:37:07.365Z", "prefix": 5, "track": "web-dev", "learningObjectives": [ diff --git a/dist/topics.json b/dist/topics.json index 6e2a330e5..69e055192 100644 --- a/dist/topics.json +++ b/dist/topics.json @@ -3,9 +3,9 @@ "slug": "browser", "repo": "Laboratoria/bootcamp", "path": "topics/browser", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:32.215Z", + "createdAt": "2023-05-17T20:37:08.711Z", "track": "web-dev", "intl": { "es": { @@ -24,9 +24,9 @@ "slug": "content-management", "repo": "Laboratoria/bootcamp", "path": "topics/content-management", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:31.731Z", + "createdAt": "2023-05-17T20:37:14.434Z", "track": "ux", "intl": { "es": { @@ -41,9 +41,9 @@ "slug": "css", "repo": "Laboratoria/bootcamp", "path": "topics/css", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:34.696Z", + "createdAt": "2023-05-17T20:37:15.641Z", "track": "web-dev", "intl": { "es": { @@ -62,9 +62,9 @@ "slug": "functional", "repo": "Laboratoria/bootcamp", "path": "topics/functional", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:34.714Z", + "createdAt": "2023-05-17T20:37:15.352Z", "track": "web-dev", "intl": { "es": { @@ -79,9 +79,9 @@ "slug": "html", "repo": "Laboratoria/bootcamp", "path": "topics/html", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:34.336Z", + "createdAt": "2023-05-17T20:37:20.943Z", "track": "web-dev", "intl": { "es": { @@ -100,9 +100,9 @@ "slug": "interaction-design", "repo": "Laboratoria/bootcamp", "path": "topics/interaction-design", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:36.798Z", + "createdAt": "2023-05-17T20:37:20.975Z", "track": "ux", "intl": { "es": { @@ -117,9 +117,9 @@ "slug": "intro-ux", "repo": "Laboratoria/bootcamp", "path": "topics/intro-ux", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:36.624Z", + "createdAt": "2023-05-17T20:37:20.375Z", "track": "ux", "intl": { "es": { @@ -134,9 +134,9 @@ "slug": "javascript", "repo": "Laboratoria/bootcamp", "path": "topics/javascript", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:37.787Z", + "createdAt": "2023-05-17T20:37:28.374Z", "track": "web-dev", "intl": { "es": { @@ -155,9 +155,9 @@ "slug": "learning-mindset", "repo": "Laboratoria/bootcamp", "path": "topics/learning-mindset", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:39.558Z", + "createdAt": "2023-05-17T20:37:25.229Z", "track": "web-dev", "intl": { "es": { @@ -172,9 +172,9 @@ "slug": "paradigms", "repo": "Laboratoria/bootcamp", "path": "topics/paradigms", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:39.928Z", + "createdAt": "2023-05-17T20:37:26.465Z", "track": "web-dev", "intl": { "es": { @@ -189,9 +189,9 @@ "slug": "prototyping", "repo": "Laboratoria/bootcamp", "path": "topics/prototyping", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:39.620Z", + "createdAt": "2023-05-17T20:37:32.865Z", "track": "ux", "intl": { "es": { @@ -206,9 +206,9 @@ "slug": "scm", "repo": "Laboratoria/bootcamp", "path": "topics/scm", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:41.950Z", + "createdAt": "2023-05-17T20:37:33.525Z", "track": "web-dev", "intl": { "es": { @@ -227,9 +227,9 @@ "slug": "shell", "repo": "Laboratoria/bootcamp", "path": "topics/shell", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:41.835Z", + "createdAt": "2023-05-17T20:37:33.164Z", "track": "web-dev", "intl": { "es": { @@ -248,9 +248,9 @@ "slug": "ux-research", "repo": "Laboratoria/bootcamp", "path": "topics/ux-research", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:42.263Z", + "createdAt": "2023-05-17T20:37:36.192Z", "track": "ux", "intl": { "es": { diff --git a/dist/topics/browser.json b/dist/topics/browser.json index e65745538..9b8e7008b 100644 --- a/dist/topics/browser.json +++ b/dist/topics/browser.json @@ -2,9 +2,9 @@ "slug": "browser", "repo": "Laboratoria/bootcamp", "path": "topics/browser", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:32.215Z", + "createdAt": "2023-05-17T20:37:08.711Z", "track": "web-dev", "intl": { "es": { @@ -55,11 +55,11 @@ "intl": { "es": { "title": "Document Object Model (DOM)", - "body": "

Objetivos de Aprendizaje

\n

En esta unidad aprenderemos:

\n\n

¿Qué es el DOM?

\n

La creación del Document Object Model o DOM es una de las innovaciones\nque más ha influido en el desarrollo de las páginas web dinámicas y de las\naplicaciones web más complejas.

\n

DOM es una herramienta que permite a los programadores web acceder y manipular\nlas páginas XHTML como si fueran documentos XML. De hecho, DOM se diseñó\noriginalmente para manipular de forma sencilla los documentos XML.

\n

A pesar de sus orígenes, DOM se ha convertido en una utilidad disponible para\nla mayoría de lenguajes de programación (Java, PHP, JavaScript) y cuyas únicas\ndiferencias se encuentran en la forma de implementarlo.

\n

Una de las tareas habituales en la programación de aplicaciones web con\nJavaScript consiste en la manipulación de las páginas web. De esta forma,\nes habitual obtener el valor almacenado por algunos elementos (por ejemplo\nlos elementos de un formulario), crear un elemento (párrafos, <div>, etc.)\nde forma dinámica y añadirlo a la página, aplicar una animación a un elemento\n(que aparezca/desaparezca, que se desplace, etc.).

\n

Todas estas tareas habituales son muy sencillas de realizar gracias a DOM, sin\nembargo, para poder realizar dichas tareas es necesario \"transformar\" la\npágina original.

\n

Una página HTML no es más que una sucesión de caracteres, por lo que es un\nformato muy difícil de manipular por esta razón, los navegadores web (Chrome,\nMozilla, IE, etc) transforman automáticamente todas las páginas web en una\nestructura más eficiente de manipular.

\n

Esta transformación la realizan todos los navegadores de forma automática y nos\npermite utilizar las herramientas de DOM de forma muy sencilla.

\n

DOM transforma todos los documentos XHTML en un conjunto de elementos llamados\nnodos, que están interconectados y que representan el contenido de la página\nweb y la relacion entre ellos. Por su aspecto, la unión de todos los nodos se\nllama \"árbol de nodos\" tal y como se muestra en la imagen.

\n

Página Web (1) | Árbol de Nodos DOM (2)\n-- | --\n\"Página | \"DOM\" |

\n

Tipos de Nodos

\n

La transformación automática de la página en un árbol de nodos siempre sigue las\nmismas reglas.

\n\n
\n

El primero es la propia etiqueta y el segundo nodo es hijo del primero y\nconsiste en el contenido textual de la etiqueta.

\n
\n\n
\n

Se sigue el mismo procedimiento anterior, pero los nodos generados serán\nnodos hijo de su etiqueta padre.

\n
\n

Como se puede suponer, las páginas XHTML habituales producen árboles con\nmiles de nodos. Aun así, el proceso de transformación es rápido y automático,\nsiendo las funciones proporcionadas por DOM (que se verán más adelante) las\núnicas que permiten acceder a cualquier nodo de la página de forma sencilla\ne inmediata.

\n

La especificación completa de DOM define 12 tipos de nodos, los cuales se\ndetallan a continuación:

\n

| Nombre del Nodo | Significado | Tipo de Nodo |\n| :------- | :------: | -----: |\n| ELEMENT_NODE | Nodo del tipo Element | 1 |\n| ATTRIBUTE_NODE | Nodo del tipo Attr | 2 |\n| TEXT_NODE | Nodo del tipo Text | 3 |\n| CDATA_SECTION_NODE | Nodo del tipo CDATASection | 4 |\n| ENTITY_REFERENCE_NODE | Nodo del tipo EntityReference | 5 |\n| ENTITY_NODE | Nodo del tipo Entity | 6 |\n| PROCESSING_INSTRUCTION_NODE | Nodo del tipo ProcessingInstruction | 7 |\n| COMMENT_NODE | Nodo del tipo Comment | 8 |\n| DOCUMENT_NODE | Nodo del tipo Document | 9 |\n| DOCUMENT_TYPE_NODE | Nodo del tipo DocumentType | 10 |\n| DOCUMENT_FRAGMENT_NODE | Nodo del tipo DocumentFragment | 11 |\n| NOTATION_NODE | Nodo del tipo Notation | 12 |

\n

Aunque las páginas XHTML que manejaremos se pueden manipular manejando\nsolamente cuatro o cinco tipos de estos nodos:

\n\n

Los otros tipos de nodos existentes que no se van a considerar son\nDocumentType, CDataSection, DocumentFragment, Entity, EntityReference,\nProcessingInstruction y Notation.

\n

Relación entre Nodos

\n

Los nodos del DOM se relacionan entre sí teniendo en cuenta quien es el nodo\npadre, los nodos hermanos e hijos. Así como tú tienes hermanos,padre o hijos,\nlos nodos del DOM también tienen una relación familiar.

\n

Analicemos esta imagen

\n

\"DOM

\n\n

Relación hermanos

\n

Analizando la misma imagen de arriba:

\n\n

Propiedades de los nodos

\n

Primero, cada vez que hablemos de nodos en realidad nos estamos refiriendo a\nun objeto y como recordarás, los objetos tienen propiedades y métodos.\nPor lo tanto los nodos tienen propiedades y métodos que te ayudarán a\nidentificarlos.

\n

A continuación te presentamos tres propiedades de los nodos las cuales te\nayudarán a identificar su nombre, tipo y valor.

\n\n

Recapitulando

\n

Prepara tu editor de código, replica lo que realiza Lulú en el siguiente video y\nrefuerza lo aprendido.

\n

\"Recorriendo

" + "body": "

Objetivos de Aprendizaje

\n

En esta unidad aprenderemos:

\n\n

¿Qué es el DOM?

\n

La creación del Document Object Model o DOM es una de las innovaciones\nque más ha influido en el desarrollo de las páginas web dinámicas y de las\naplicaciones web más complejas.

\n

DOM es una herramienta que permite a los programadores web acceder y manipular\nlas páginas XHTML como si fueran documentos XML. De hecho, DOM se diseñó\noriginalmente para manipular de forma sencilla los documentos XML.

\n

A pesar de sus orígenes, DOM se ha convertido en una utilidad disponible para\nla mayoría de lenguajes de programación (Java, PHP, JavaScript) y cuyas únicas\ndiferencias se encuentran en la forma de implementarlo.

\n

Una de las tareas habituales en la programación de aplicaciones web con\nJavaScript consiste en la manipulación de las páginas web. De esta forma,\nes habitual obtener el valor almacenado por algunos elementos (por ejemplo\nlos elementos de un formulario), crear un elemento (párrafos, <div>, etc.)\nde forma dinámica y añadirlo a la página, aplicar una animación a un elemento\n(que aparezca/desaparezca, que se desplace, etc.).

\n

Todas estas tareas habituales son muy sencillas de realizar gracias a DOM, sin\nembargo, para poder realizar dichas tareas es necesario \"transformar\" la\npágina original.

\n

Una página HTML no es más que una sucesión de caracteres, por lo que es un\nformato muy difícil de manipular por esta razón, los navegadores web (Chrome,\nMozilla, IE, etc) transforman automáticamente todas las páginas web en una\nestructura más eficiente de manipular.

\n

Esta transformación la realizan todos los navegadores de forma automática y nos\npermite utilizar las herramientas de DOM de forma muy sencilla.

\n

DOM transforma todos los documentos XHTML en un conjunto de elementos llamados\nnodos, que están interconectados y que representan el contenido de la página\nweb y la relacion entre ellos. Por su aspecto, la unión de todos los nodos se\nllama \"árbol de nodos\" tal y como se muestra en la imagen.

\n

Página Web (1) | Árbol de Nodos DOM (2)\n-- | --\n\"Página | \"DOM\" |

\n

Tipos de Nodos

\n

La transformación automática de la página en un árbol de nodos siempre sigue las\nmismas reglas.

\n\n
\n

El primero es la propia etiqueta y el segundo nodo es hijo del primero y\nconsiste en el contenido textual de la etiqueta.

\n
\n\n
\n

Se sigue el mismo procedimiento anterior, pero los nodos generados serán\nnodos hijo de su etiqueta padre.

\n
\n

Como se puede suponer, las páginas XHTML habituales producen árboles con\nmiles de nodos. Aun así, el proceso de transformación es rápido y automático,\nsiendo las funciones proporcionadas por DOM (que se verán más adelante) las\núnicas que permiten acceder a cualquier nodo de la página de forma sencilla\ne inmediata.

\n

La especificación completa de DOM define 12 tipos de nodos, los cuales se\ndetallan a continuación:

\n

| Nombre del Nodo | Significado | Tipo de Nodo |\n| :------- | :------: | -----: |\n| ELEMENT_NODE | Nodo del tipo Element | 1 |\n| ATTRIBUTE_NODE | Nodo del tipo Attr | 2 |\n| TEXT_NODE | Nodo del tipo Text | 3 |\n| CDATA_SECTION_NODE | Nodo del tipo CDATASection | 4 |\n| ENTITY_REFERENCE_NODE | Nodo del tipo EntityReference | 5 |\n| ENTITY_NODE | Nodo del tipo Entity | 6 |\n| PROCESSING_INSTRUCTION_NODE | Nodo del tipo ProcessingInstruction | 7 |\n| COMMENT_NODE | Nodo del tipo Comment | 8 |\n| DOCUMENT_NODE | Nodo del tipo Document | 9 |\n| DOCUMENT_TYPE_NODE | Nodo del tipo DocumentType | 10 |\n| DOCUMENT_FRAGMENT_NODE | Nodo del tipo DocumentFragment | 11 |\n| NOTATION_NODE | Nodo del tipo Notation | 12 |

\n

Aunque las páginas XHTML que manejaremos se pueden manipular manejando\nsolamente cuatro o cinco tipos de estos nodos:

\n\n

Los otros tipos de nodos existentes que no se van a considerar son\nDocumentType, CDataSection, DocumentFragment, Entity, EntityReference,\nProcessingInstruction y Notation.

\n

Relación entre Nodos

\n

Los nodos del DOM se relacionan entre sí teniendo en cuenta quien es el nodo\npadre, los nodos hermanos e hijos. Así como tú tienes hermanos,padre o hijos,\nlos nodos del DOM también tienen una relación familiar.

\n

Analicemos esta imagen

\n

\"DOM

\n\n

Relación hermanos

\n

Analizando la misma imagen de arriba:

\n\n

Propiedades de los nodos

\n

Primero, cada vez que hablemos de nodos en realidad nos estamos refiriendo a\nun objeto y como recordarás, los objetos tienen propiedades y métodos.\nPor lo tanto los nodos tienen propiedades y métodos que te ayudarán a\nidentificarlos.

\n

A continuación te presentamos tres propiedades de los nodos las cuales te\nayudarán a identificar su nombre, tipo y valor.

\n\n

Recapitulando

\n

Prepara tu editor de código, replica lo que realiza Lulú en el siguiente video y\nrefuerza lo aprendido.

\n

" }, "pt": { "title": "Document Object Model (DOM)", - "body": "

Objetivos de Aprendizagem

\n

Nesta unidade aprenderemos:

\n\n

O que é o DOM?

\n

A criação do Document Object Model o DOM é uma das inovações que mais\ninfluênciou o desenvolvimento de sites e de aplicações mais complexas.

\n

DOM é uma ferrramente que permite que permite os programadoes a acessar e\nmanipular as páginas XHTML como se fossem documentos XML. Na verdade, o DOM\nfoi projetado originalmente para manipular o XML de forma mais simples.

\n

Apesar de suas origens, o DOM virou uma utilidade disponível para a maioria\ndas linguagens de programação (Java, PHP, JavaScript) com a única forma sendo a\nmaneira de implementar.

\n

Uma das tarefas mais comuns da programação web com JavaScript consiste em\nmanipular as páginas web. Desta forma, é comum obter o valor armazenado em\nalguns elementos (por exemplo os elementos de um formulário), criar um elemento\n(<p>, <div>) de forma dinâmica e adicionar ele na página, inserir uma\nanimação com um elemento (fazer aparecer e desaparecer, fazer se mover, etc).

\n

Todas essas tarefas comuns são muito simples de realizar graças ao DOM, sem\ndificuldades, para poder realizar estas tarefas é necessário \"transformar\" a\npágina original.

\n

Uma página HTML não é mais do que uma sequência de caracteres, por isso que é\num formato difícil de manipular, os navegadores web (Chrome, Mozilla, IE, etc)\ntransformam automaticamente todas as páginas web em uma estrutura mais eficiente\nde manipular.

\n

Está transformação é realizada por todos os navegadores de forma automática e\nque nos permite utilizar as ferramentas do DOM de forma simples.

\n

DOM transforma todos os documentos XHTML em um conjunto de elementos\nchamados nós, que estão interconectados e que representam o conteúdo da página\nweb e a relação entre eles. Por causa de seu formato, a união de todos os nós é\nchamado de árvore de nós como mostrado na imagem.

\n

Página Web (1)| Árbol de Nodos DOM (2)\n-- | --\n\"Página | \"DOM\" |

\n

Tipos de Nós

\n

A transformação automática de uma página em uma árvore de nós sempre segue as\nmesmas regras.

\n\n
\n

O primeira é a própria tag e o segundo nó é o filho do primeiro e consistem no\nconteúdo de texto da tag.

\n
\n\n
\n

Segue o mesmo procedimento anterior, mas os nós gerados serão nós filhos das\ntags pai.

\n
\n

Como se pode supor, as páginas XHTML normalmente produzem árvores com milhares\nde nós. Mesmo assim, o processo de transformação é rápido e automático, sendo as\nfunções fornecidas pelo DOM (que serão vistas posteriormente) as únicas que\npermitem o acesso a qualquer nó da página de forma simples e imediata.

\n

A especificação completa de DOM define 12 tipos de nós, que estão detalhados\nabaixo:

\n

| Nome do Nó | Significado | Tipo de Nó |\n| :--- | :---: | ---: |\n| ELEMENT_NODE | Nó do tipo Element | 1 |\n| ATTRIBUTE_NODE | Nó do tipo Attr | 2 |\n| TEXT_NODE | Nó do tipo Text | 3 |\n| CDATA_SECTION_NODE | Nó do tipo CDATASection | 4 |\n| ENTITY_REFERENCE_NODE | Nó do tipo EntityReference | 5 |\n| ENTITY_NODE | Nó do tipo Entity | 6 |\n| PROCESSING_INSTRUCTION_NODE | Nó do tipo ProcessingInstruction | 7 |\n| COMMENT_NODE | Nó do tipo Comment | 8 |\n| DOCUMENT_NODE | Nó do tipo Document | 9 |\n| DOCUMENT_TYPE_NODE | Nó do tipo DocumentType | 10 |\n| DOCUMENT_FRAGMENT_NODE | Nó do tipo DocumentFragment | 11 |\n| NOTATION_NODE | Nó do tipo Notation | 12 |

\n

Embora as páginas XHTML que iremos gerenciar possam ser manipuladas manipulando\napenas quatro ou cinco tipos desses nós:

\n\n

Existem outros tipos de nós que não vamos mostrar aqui, como por exemplo:\nDocumentType, CDataSection, DocumentFragment, Entity, EntityReference,\nProcessingInstruction e Notation.

\n

Relação entre nós

\n

Os nós do DOM se relacionam entre si, tendo em conta quem é o nós pai, quem\nsão os irmão e filhos. Assim como você tem irmãos, pais e filhos, todos os\nnós do DOM também tem alguma relação familiar.

\n

Analisemos esta imagem

\n

\"DOM\nTree\"

\n\n

Irmãos de relacionamento

\n

Analisando a mesma imagem acima:

\n\n

Propriedades dos nós

\n

Primeiro, cada vez que falamos em nós na realidade estão nos referindo a um\nobjeto e como você lembra, os objetos possuem propriedades e métodos. Com\nisso os nós tem também tem propriedades e métodos que irão te ajudar a\nidentificá-los.

\n

Os nós DOM possuem propriedades básicas, que são:

\n\n

Recapitulando

\n

Prepare seu editor, replique o que Daniel realiza no vídeo a seguir e reforce\nseu aprendizado.

\n

\"Navegando

" + "body": "

Objetivos de Aprendizagem

\n

Nesta unidade aprenderemos:

\n\n

O que é o DOM?

\n

A criação do Document Object Model o DOM é uma das inovações que mais\ninfluênciou o desenvolvimento de sites e de aplicações mais complexas.

\n

DOM é uma ferrramente que permite que permite os programadoes a acessar e\nmanipular as páginas XHTML como se fossem documentos XML. Na verdade, o DOM\nfoi projetado originalmente para manipular o XML de forma mais simples.

\n

Apesar de suas origens, o DOM virou uma utilidade disponível para a maioria\ndas linguagens de programação (Java, PHP, JavaScript) com a única forma sendo a\nmaneira de implementar.

\n

Uma das tarefas mais comuns da programação web com JavaScript consiste em\nmanipular as páginas web. Desta forma, é comum obter o valor armazenado em\nalguns elementos (por exemplo os elementos de um formulário), criar um elemento\n(<p>, <div>) de forma dinâmica e adicionar ele na página, inserir uma\nanimação com um elemento (fazer aparecer e desaparecer, fazer se mover, etc).

\n

Todas essas tarefas comuns são muito simples de realizar graças ao DOM, sem\ndificuldades, para poder realizar estas tarefas é necessário \"transformar\" a\npágina original.

\n

Uma página HTML não é mais do que uma sequência de caracteres, por isso que é\num formato difícil de manipular, os navegadores web (Chrome, Mozilla, IE, etc)\ntransformam automaticamente todas as páginas web em uma estrutura mais eficiente\nde manipular.

\n

Está transformação é realizada por todos os navegadores de forma automática e\nque nos permite utilizar as ferramentas do DOM de forma simples.

\n

DOM transforma todos os documentos XHTML em um conjunto de elementos\nchamados nós, que estão interconectados e que representam o conteúdo da página\nweb e a relação entre eles. Por causa de seu formato, a união de todos os nós é\nchamado de árvore de nós como mostrado na imagem.

\n

Página Web (1)| Árbol de Nodos DOM (2)\n-- | --\n\"Página | \"DOM\" |

\n

Tipos de Nós

\n

A transformação automática de uma página em uma árvore de nós sempre segue as\nmesmas regras.

\n\n
\n

O primeira é a própria tag e o segundo nó é o filho do primeiro e consistem no\nconteúdo de texto da tag.

\n
\n\n
\n

Segue o mesmo procedimento anterior, mas os nós gerados serão nós filhos das\ntags pai.

\n
\n

Como se pode supor, as páginas XHTML normalmente produzem árvores com milhares\nde nós. Mesmo assim, o processo de transformação é rápido e automático, sendo as\nfunções fornecidas pelo DOM (que serão vistas posteriormente) as únicas que\npermitem o acesso a qualquer nó da página de forma simples e imediata.

\n

A especificação completa de DOM define 12 tipos de nós, que estão detalhados\nabaixo:

\n

| Nome do Nó | Significado | Tipo de Nó |\n| :--- | :---: | ---: |\n| ELEMENT_NODE | Nó do tipo Element | 1 |\n| ATTRIBUTE_NODE | Nó do tipo Attr | 2 |\n| TEXT_NODE | Nó do tipo Text | 3 |\n| CDATA_SECTION_NODE | Nó do tipo CDATASection | 4 |\n| ENTITY_REFERENCE_NODE | Nó do tipo EntityReference | 5 |\n| ENTITY_NODE | Nó do tipo Entity | 6 |\n| PROCESSING_INSTRUCTION_NODE | Nó do tipo ProcessingInstruction | 7 |\n| COMMENT_NODE | Nó do tipo Comment | 8 |\n| DOCUMENT_NODE | Nó do tipo Document | 9 |\n| DOCUMENT_TYPE_NODE | Nó do tipo DocumentType | 10 |\n| DOCUMENT_FRAGMENT_NODE | Nó do tipo DocumentFragment | 11 |\n| NOTATION_NODE | Nó do tipo Notation | 12 |

\n

Embora as páginas XHTML que iremos gerenciar possam ser manipuladas manipulando\napenas quatro ou cinco tipos desses nós:

\n\n

Existem outros tipos de nós que não vamos mostrar aqui, como por exemplo:\nDocumentType, CDataSection, DocumentFragment, Entity, EntityReference,\nProcessingInstruction e Notation.

\n

Relação entre nós

\n

Os nós do DOM se relacionam entre si, tendo em conta quem é o nós pai, quem\nsão os irmão e filhos. Assim como você tem irmãos, pais e filhos, todos os\nnós do DOM também tem alguma relação familiar.

\n

Analisemos esta imagem

\n

\"DOM\nTree\"

\n\n

Irmãos de relacionamento

\n

Analisando a mesma imagem acima:

\n\n

Propriedades dos nós

\n

Primeiro, cada vez que falamos em nós na realidade estão nos referindo a um\nobjeto e como você lembra, os objetos possuem propriedades e métodos. Com\nisso os nós tem também tem propriedades e métodos que irão te ajudar a\nidentificá-los.

\n

Os nós DOM possuem propriedades básicas, que são:

\n\n

Recapitulando

\n

Prepare seu editor, replique o que Daniel realiza no vídeo a seguir e reforce\nseu aprendizado.

\n

" } } }, @@ -87,11 +87,11 @@ "intl": { "es": { "title": "Manipulación del DOM", - "body": "

Objetivos de Aprendizaje

\n

En esta unidad aprenderemos:

\n\n
\n

Selección de nodos del DOM

\n

Una vez construido automáticamente el árbol completo de nodos DOM, ya es\nposible utilizar las funciones DOM para acceder de forma directa a cualquier\nnodo del árbol.

\n

Como acceder a un nodo del árbol es equivalente a acceder a\n\"un trozo\" de la página, una vez construido el árbol, ya es posible manipular\nde forma sencilla la página: acceder al valor de un elemento, establecer el\nvalor de un elemento, mover un elemento de la página, crear y añadir nuevos\nelementos, etc.

\n

DOM proporciona dos métodos alternativos para acceder a un nodo específico:\nacceso a través de sus nodos padre y acceso directo.

\n

Las funciones que proporciona DOM para acceder a un nodo a través de sus nodos\npadre consisten en acceder al nodo raíz de la página y después a sus nodos\nhijos y a los nodos hijos de esos hijos y así sucesivamente hasta el último\nnodo de la rama terminada por el nodo buscado. Sin embargo, cuando se quiere\nacceder a un nodo específico, es mucho más rápido acceder directamente a ese\nnodo y no llegar hasta él descendiendo a través de todos sus nodos padre.

\n

Por ese motivo, no se van a presentar las funciones necesarias para el acceso\njerárquico de nodos y se muestran solamente las que permiten acceder de forma\ndirecta a los nodos.

\n

Es importante recordar que el acceso a los nodos, su modificación\ny su eliminación solamente es posible cuando el árbol DOM ha sido construido\ncompletamente, es decir, después de que la página XHTML se cargue por\ncompleto. Más adelante se verá cómo asegurar que un código JavaScript\nsolamente se ejecute cuando el navegador ha cargado entera la página XHTML.

\n

Por último, te recomendamos que pruebes los siguientes métodos replicando el\ncódigo en tu editor favorito.

\n

getElementById()

\n

La función getElementById() es la más utilizada cuando se desarrollan\naplicaciones web dinámicas. Se trata de la función preferida para acceder\ndirectamente a un nodo y poder leer o modificar sus propiedades.

\n

La función getElementById() devuelve el elemento XHTML cuyo atributo id\ncoincide con el parámetro indicado en la función. Como el atributo id debe ser\núnico para cada elemento de una misma página, la función devuelve únicamente\nel nodo deseado.

\n
<body>\n <h2>Hola Laboratoria</h2>\n <h2>Hola Mundo</h2>\n <h2>Mis Hobbies</h2>\n <ul>\n  <li id=\"highlight\">Programar</li>\n  <li class=\"bolded\">Bailar</li>\n  <li class=\"bolded\">Ver peliculas</li>\n </ul>\n</body>\n
\n
const firstItem = document.getElementById(\"highlight\");\n
\n

getElementsByClassName()

\n

La función getElementsByClassName() devuelve una lista de nodos\nXHTML cuyo atributo classcoincide con el parámetro indicado en la función.

\n
<body>\n <h2>Hola Laboratoria</h2>\n <h2>Hola Mundo</h2>\n <h2>Mis Hobbies</h2>\n <ul>\n  <li id=\"highlight\">Programar</li>\n  <li class=\"bolded\">Bailar</li>\n  <li class=\"bolded\">Ver peliculas</li>\n </ul>\n</body>\n
\n
const items = document.getElementsByClassName(\"bolded\");\n
\n

getElementsByTagName()

\n

Como sucede con todas las funciones que proporciona DOM, la función\ngetElementsByTagName() tiene un nombre muy largo, pero que lo hace\nautoexplicativo.

\n

La función getElementsByTagName(nombreEtiqueta) obtiene una lista de nodos.\nde la página XHTML cuya etiqueta sea igual que el parámetro que se le pasa a la\nfunción.

\n
<body>\n <h2>Hola Laboratoria</h2>\n <h2>Hola Mundo</h2>\n <h2>Mis Hobbies</h2>\n <ul>\n  <li id=\"highlight\">Programar</li>\n  <li class=\"bolded\">Bailar</li>\n  <li class=\"bolded\">Ver peliculas</li>\n </ul>\n</body>\n
\n
const titles = document.getElementsByTagName('h2');\n\nconsole.log(titles[0]);\nconsole.log(titles[1]);\nconsole.log(titles[2]);\n\nconst listItems = document.getElementsByTagName('li');\nconsole.log(listItems[0]);\nconsole.log(listItems[1]);\nconsole.log(listItems[2]);\n\n
\n

querySelector()

\n

Función que retorna el primer elemento que coincide con el selector CSS dado\ncomo parámetro.

\n
<body>\n <h2>Hola Laboratoria</h2>\n <h2>Hola Mundo</h2>\n <h2>Mis Hobbies</h2>\n <ul>\n  <li id=\"highlight\">Programar</li>\n  <li class=\"bolded\">Bailar</li>\n  <li class=\"bolded\">Ver peliculas</li>\n </ul>\n</body>\n
\n
// Selector css - id\nconst item = document.querySelector('#highlight');\nconsole.log(item);\n
\n
// Selector css - class\nconst item = document.querySelector('.bolded');\nconsole.log(item);\n
\n
// Selector css - etiqueta\nconst title = document.querySelector('h2');\nconsole.log(title);\n
\n

querySelectorAll()

\n

Función que retorna una lista de nodos\nque coinciden con el selector CSS dado como parámetro.

\n
<body>\n <h2>Hola Laboratoria</h2>\n <h2>Hola Mundo</h2>\n <h2>Mis Hobbies</h2>\n <ul>\n  <li id=\"highlight\">Programar</li>\n  <li class=\"bolded\">Bailar</li>\n  <li class=\"bolded\">Ver peliculas</li>\n </ul>\n</body>\n
\n
// Selector css - etiqueta\nconst titles = document.querySelectorAll('h2');\nconsole.log(titles);\n
\n
// Selector css - etiqueta\nconst items = document.querySelectorAll('.bolded');\nconsole.log(items);\n
\n

Recapitulando

\n

Prepara tu editor de código, replica lo que realiza Lulú en el siguiente video y\nrefuerza lo aprendido.

\n

\"Métodos

\n

También tenemos el link\nde la documentación oficial de Mozilla de qué es el DOM.

\n

Otro link\nde cómo acceder a elementos del DOM con JS de la documentación oficial.

" + "body": "

Objetivos de Aprendizaje

\n

En esta unidad aprenderemos:

\n\n
\n

Selección de nodos del DOM

\n

Una vez construido automáticamente el árbol completo de nodos DOM, ya es\nposible utilizar las funciones DOM para acceder de forma directa a cualquier\nnodo del árbol.

\n

Como acceder a un nodo del árbol es equivalente a acceder a\n\"un trozo\" de la página, una vez construido el árbol, ya es posible manipular\nde forma sencilla la página: acceder al valor de un elemento, establecer el\nvalor de un elemento, mover un elemento de la página, crear y añadir nuevos\nelementos, etc.

\n

DOM proporciona dos métodos alternativos para acceder a un nodo específico:\nacceso a través de sus nodos padre y acceso directo.

\n

Las funciones que proporciona DOM para acceder a un nodo a través de sus nodos\npadre consisten en acceder al nodo raíz de la página y después a sus nodos\nhijos y a los nodos hijos de esos hijos y así sucesivamente hasta el último\nnodo de la rama terminada por el nodo buscado. Sin embargo, cuando se quiere\nacceder a un nodo específico, es mucho más rápido acceder directamente a ese\nnodo y no llegar hasta él descendiendo a través de todos sus nodos padre.

\n

Por ese motivo, no se van a presentar las funciones necesarias para el acceso\njerárquico de nodos y se muestran solamente las que permiten acceder de forma\ndirecta a los nodos.

\n

Es importante recordar que el acceso a los nodos, su modificación\ny su eliminación solamente es posible cuando el árbol DOM ha sido construido\ncompletamente, es decir, después de que la página XHTML se cargue por\ncompleto. Más adelante se verá cómo asegurar que un código JavaScript\nsolamente se ejecute cuando el navegador ha cargado entera la página XHTML.

\n

Por último, te recomendamos que pruebes los siguientes métodos replicando el\ncódigo en tu editor favorito.

\n

getElementById()

\n

La función getElementById() es la más utilizada cuando se desarrollan\naplicaciones web dinámicas. Se trata de la función preferida para acceder\ndirectamente a un nodo y poder leer o modificar sus propiedades.

\n

La función getElementById() devuelve el elemento XHTML cuyo atributo id\ncoincide con el parámetro indicado en la función. Como el atributo id debe ser\núnico para cada elemento de una misma página, la función devuelve únicamente\nel nodo deseado.

\n
<body>\n <h2>Hola Laboratoria</h2>\n <h2>Hola Mundo</h2>\n <h2>Mis Hobbies</h2>\n <ul>\n  <li id=\"highlight\">Programar</li>\n  <li class=\"bolded\">Bailar</li>\n  <li class=\"bolded\">Ver peliculas</li>\n </ul>\n</body>\n
\n
const firstItem = document.getElementById(\"highlight\");\n
\n

getElementsByClassName()

\n

La función getElementsByClassName() devuelve una lista de nodos\nXHTML cuyo atributo classcoincide con el parámetro indicado en la función.

\n
<body>\n <h2>Hola Laboratoria</h2>\n <h2>Hola Mundo</h2>\n <h2>Mis Hobbies</h2>\n <ul>\n  <li id=\"highlight\">Programar</li>\n  <li class=\"bolded\">Bailar</li>\n  <li class=\"bolded\">Ver peliculas</li>\n </ul>\n</body>\n
\n
const items = document.getElementsByClassName(\"bolded\");\n
\n

getElementsByTagName()

\n

Como sucede con todas las funciones que proporciona DOM, la función\ngetElementsByTagName() tiene un nombre muy largo, pero que lo hace\nautoexplicativo.

\n

La función getElementsByTagName(nombreEtiqueta) obtiene una lista de nodos.\nde la página XHTML cuya etiqueta sea igual que el parámetro que se le pasa a la\nfunción.

\n
<body>\n <h2>Hola Laboratoria</h2>\n <h2>Hola Mundo</h2>\n <h2>Mis Hobbies</h2>\n <ul>\n  <li id=\"highlight\">Programar</li>\n  <li class=\"bolded\">Bailar</li>\n  <li class=\"bolded\">Ver peliculas</li>\n </ul>\n</body>\n
\n
const titles = document.getElementsByTagName('h2');\n\nconsole.log(titles[0]);\nconsole.log(titles[1]);\nconsole.log(titles[2]);\n\nconst listItems = document.getElementsByTagName('li');\nconsole.log(listItems[0]);\nconsole.log(listItems[1]);\nconsole.log(listItems[2]);\n\n
\n

querySelector()

\n

Función que retorna el primer elemento que coincide con el selector CSS dado\ncomo parámetro.

\n
<body>\n <h2>Hola Laboratoria</h2>\n <h2>Hola Mundo</h2>\n <h2>Mis Hobbies</h2>\n <ul>\n  <li id=\"highlight\">Programar</li>\n  <li class=\"bolded\">Bailar</li>\n  <li class=\"bolded\">Ver peliculas</li>\n </ul>\n</body>\n
\n
// Selector css - id\nconst item = document.querySelector('#highlight');\nconsole.log(item);\n
\n
// Selector css - class\nconst item = document.querySelector('.bolded');\nconsole.log(item);\n
\n
// Selector css - etiqueta\nconst title = document.querySelector('h2');\nconsole.log(title);\n
\n

querySelectorAll()

\n

Función que retorna una lista de nodos\nque coinciden con el selector CSS dado como parámetro.

\n
<body>\n <h2>Hola Laboratoria</h2>\n <h2>Hola Mundo</h2>\n <h2>Mis Hobbies</h2>\n <ul>\n  <li id=\"highlight\">Programar</li>\n  <li class=\"bolded\">Bailar</li>\n  <li class=\"bolded\">Ver peliculas</li>\n </ul>\n</body>\n
\n
// Selector css - etiqueta\nconst titles = document.querySelectorAll('h2');\nconsole.log(titles);\n
\n
// Selector css - etiqueta\nconst items = document.querySelectorAll('.bolded');\nconsole.log(items);\n
\n

Recapitulando

\n

Prepara tu editor de código, replica lo que realiza Lulú en el siguiente video y\nrefuerza lo aprendido.

\n

\n

También tenemos el link\nde la documentación oficial de Mozilla de qué es el DOM.

\n

Otro link\nde cómo acceder a elementos del DOM con JS de la documentación oficial.

" }, "pt": { "title": "Modificando o DOM", - "body": "

Objetivos de Aprendizagem

\n

Nesta unidade aprenderemos:

\n\n
\n

Seleção de nós com DOM

\n

Uma vez construído automaticamente a árvore completa de nós do DOM, já é\npossível utilizar as funções DOM para acessar de maneira direta qualquer nó da\nárvore.

\n

Como acessar um nó da árvore equivale a acessar \"um pedaço\" da página, uma vez\nconstruída a árvore já é possível manipular de forma simples a página: acessar o\nvalor de um elemento, estabelecer o valor de um elemento, mover um elemento da\npágina, criar e adicionar novos elementos, etc.

\n

DOM fornece dois métodos alternativos para acessar um nó específico: acesso por\nmeios de seus nós pais e acesso direto.

\n

As funções que o DOM disponibiliza para acessar um nó por meio de seus nós pais\nconsistem em acessar o nó raiz da página e depois seus nós filhos e os nós\nfilhos desses filhos e assim sucessivamente até o último nó folha contendo o nó\nprocurado. Porém, quando queremos acessar um nó específico, é muito mais rápido\nacessar diretamente esse nó e não chegar até ele caminhando por todos os seus\nnós pais.

\n

Por essa razão, não vamos apresentar as funções necessárias para o acesso\nhierárquico dos nós e mostraremos somente as que permitem acesso os nós de forma\ndireta.

\n

É importante lembrar que o acesso aos nós, sua modificação e sua eliminação\nsomente são possíveis quando a árvore do DOM estiver construída completamente,\nou seja, depois que a página XHTML estiver carregada completamente. Mais adiante\nveremos como garantir que um código JavaScript só seja executado quando o\nnavegador tenha carregado toda a página XHTML.

\n

Por fim, tem recomendamos que prove os seguintes métodos replicando o código no\nseu editor de texto.

\n

getElementById()

\n

A função getElementById() é a mais utilizada quando desenvolvemos aplicações\nweb dinâmicas. É a função preferida para acessar diretamente um nó e poder ler\nsuas propriedades.

\n

A função getElementById() retorna o elemento XHTML cujo atributo id coincide\ncom o parâmetro informando na função. Como o atributo id deve ser único para\ncada elemento de uma mesma página, a função devolve somente o nó desejado.

\n
<body>\n <h2>Hello Laboratoria</h2>\n <h2>Hello Mundo</h2>\n <h2>My Hobbies</h2>\n <ul>\n  <li id=\"highlight\">Programming</li>\n  <li class=\"bolded\">Dancing</li>\n  <li class=\"bolded\">Watch Netflix</li>\n </ul>\n</body>\n
\n
const firstItem = document.getElementById(\"highlight\");\n
\n

getElementsByClassName()

\n

A função getElementsByClassName() retorna uma lista de nós da página XHTML\ncuja o atributo class é igual ao parâmetro indicado na função.

\n
<body>\n <h2>Hello Laboratoria</h2>\n <h2>Hello Mundo</h2>\n <h2>My Hobbies</h2>\n <ul>\n  <li id=\"highlight\">Programming</li>\n  <li class=\"bolded\">Dancing</li>\n  <li class=\"bolded\">Watch Netflix</li>\n </ul>\n</body>\n
\n
const items = document.getElementsByClassName(\"bolded\");\n
\n

getElementsByTagName()

\n

Como algumas funções do DOM , a função getElementsByTagName() tem o nome\nmuito grande, mas autoexplicativo.

\n

A função getElementsByTagName(tagName) retorna uma lista de nós da página\nXHTML cuja a tag é igual ao parâmetro que foi passado na função.

\n
<body>\n <h2>Hello Laboratoria</h2>\n <h2>Hello Mundo</h2>\n <h2>My Hobbies</h2>\n <ul>\n  <li id=\"highlight\">Programming</li>\n  <li class=\"bolded\">Dancing</li>\n  <li class=\"bolded\">Watch Netflix</li>\n </ul>\n</body>\n
\n
const titles = document.getElementsByTagName('h2');\nconsole.log(titles[0]);\nconsole.log(titles[1]);\nconsole.log(titles[2]);\n\nconst listItems = document.getElementsByTagName('li');\nconsole.log(listItems[0]);\nconsole.log(listItems[1]);\nconsole.log(listItems[2]);\n
\n

querySelector()

\n

Está função retorna o primeiro elemento que coincide com o seletor CSS passado\ncomo parâmetro.

\n
<body>\n <h2>Hello Laboratoria</h2>\n <h2>Hello Mundo</h2>\n <h2>My Hobbies</h2>\n <ul>\n  <li id=\"highlight\">Programming</li>\n  <li class=\"bolded\">Dancing</li>\n  <li class=\"bolded\">Watch Netflix</li>\n </ul>\n</body>\n
\n
// Selector css - id\nconst item = document.querySelector('#highlight');\nconsole.log(item);\n
\n
// Selector css - class\nconst item = document.querySelector('.bolded');\nconsole.log(item);\n
\n
// Selector css - tag\nconst title = document.querySelector('h2');\nconsole.log(title);\n
\n

querySelectorAll()

\n

Está função retorna uma lista de nós que coincidem com o seletor CSS passado\ncomo parâmetro.

\n
<body>\n <h2>Hello Laboratoria</h2>\n <h2>Hello Mundo</h2>\n <h2>My Hobbies</h2>\n <ul>\n  <li id=\"highlight\">Programming</li>\n  <li class=\"bolded\">Dancing</li>\n  <li class=\"bolded\">Watch Netflix</li>\n </ul>\n</body>\n
\n
// Selector css - tag\nconst titles = document.querySelectorAll('h2');\nconsole.log(titles);\n
\n
// Selector css - class\nconst items = document.querySelectorAll('.bolded');\nconsole.log(items);\n
\n

Recapitulando

\n

Prepare seueditor, replique o que Daniel realiza no seguinte vídeo e\nreforce seu aprendizado.

\n

\"Manipulando\nHTML\"

\n

Também recomendamos o\nlink\nda documentação oficinal do Mozilla sobre o DOM.

" + "body": "

Objetivos de Aprendizagem

\n

Nesta unidade aprenderemos:

\n\n
\n

Seleção de nós com DOM

\n

Uma vez construído automaticamente a árvore completa de nós do DOM, já é\npossível utilizar as funções DOM para acessar de maneira direta qualquer nó da\nárvore.

\n

Como acessar um nó da árvore equivale a acessar \"um pedaço\" da página, uma vez\nconstruída a árvore já é possível manipular de forma simples a página: acessar o\nvalor de um elemento, estabelecer o valor de um elemento, mover um elemento da\npágina, criar e adicionar novos elementos, etc.

\n

DOM fornece dois métodos alternativos para acessar um nó específico: acesso por\nmeios de seus nós pais e acesso direto.

\n

As funções que o DOM disponibiliza para acessar um nó por meio de seus nós pais\nconsistem em acessar o nó raiz da página e depois seus nós filhos e os nós\nfilhos desses filhos e assim sucessivamente até o último nó folha contendo o nó\nprocurado. Porém, quando queremos acessar um nó específico, é muito mais rápido\nacessar diretamente esse nó e não chegar até ele caminhando por todos os seus\nnós pais.

\n

Por essa razão, não vamos apresentar as funções necessárias para o acesso\nhierárquico dos nós e mostraremos somente as que permitem acesso os nós de forma\ndireta.

\n

É importante lembrar que o acesso aos nós, sua modificação e sua eliminação\nsomente são possíveis quando a árvore do DOM estiver construída completamente,\nou seja, depois que a página XHTML estiver carregada completamente. Mais adiante\nveremos como garantir que um código JavaScript só seja executado quando o\nnavegador tenha carregado toda a página XHTML.

\n

Por fim, tem recomendamos que prove os seguintes métodos replicando o código no\nseu editor de texto.

\n

getElementById()

\n

A função getElementById() é a mais utilizada quando desenvolvemos aplicações\nweb dinâmicas. É a função preferida para acessar diretamente um nó e poder ler\nsuas propriedades.

\n

A função getElementById() retorna o elemento XHTML cujo atributo id coincide\ncom o parâmetro informando na função. Como o atributo id deve ser único para\ncada elemento de uma mesma página, a função devolve somente o nó desejado.

\n
<body>\n <h2>Hello Laboratoria</h2>\n <h2>Hello Mundo</h2>\n <h2>My Hobbies</h2>\n <ul>\n  <li id=\"highlight\">Programming</li>\n  <li class=\"bolded\">Dancing</li>\n  <li class=\"bolded\">Watch Netflix</li>\n </ul>\n</body>\n
\n
const firstItem = document.getElementById(\"highlight\");\n
\n

getElementsByClassName()

\n

A função getElementsByClassName() retorna uma lista de nós da página XHTML\ncuja o atributo class é igual ao parâmetro indicado na função.

\n
<body>\n <h2>Hello Laboratoria</h2>\n <h2>Hello Mundo</h2>\n <h2>My Hobbies</h2>\n <ul>\n  <li id=\"highlight\">Programming</li>\n  <li class=\"bolded\">Dancing</li>\n  <li class=\"bolded\">Watch Netflix</li>\n </ul>\n</body>\n
\n
const items = document.getElementsByClassName(\"bolded\");\n
\n

getElementsByTagName()

\n

Como algumas funções do DOM , a função getElementsByTagName() tem o nome\nmuito grande, mas autoexplicativo.

\n

A função getElementsByTagName(tagName) retorna uma lista de nós da página\nXHTML cuja a tag é igual ao parâmetro que foi passado na função.

\n
<body>\n <h2>Hello Laboratoria</h2>\n <h2>Hello Mundo</h2>\n <h2>My Hobbies</h2>\n <ul>\n  <li id=\"highlight\">Programming</li>\n  <li class=\"bolded\">Dancing</li>\n  <li class=\"bolded\">Watch Netflix</li>\n </ul>\n</body>\n
\n
const titles = document.getElementsByTagName('h2');\nconsole.log(titles[0]);\nconsole.log(titles[1]);\nconsole.log(titles[2]);\n\nconst listItems = document.getElementsByTagName('li');\nconsole.log(listItems[0]);\nconsole.log(listItems[1]);\nconsole.log(listItems[2]);\n
\n

querySelector()

\n

Está função retorna o primeiro elemento que coincide com o seletor CSS passado\ncomo parâmetro.

\n
<body>\n <h2>Hello Laboratoria</h2>\n <h2>Hello Mundo</h2>\n <h2>My Hobbies</h2>\n <ul>\n  <li id=\"highlight\">Programming</li>\n  <li class=\"bolded\">Dancing</li>\n  <li class=\"bolded\">Watch Netflix</li>\n </ul>\n</body>\n
\n
// Selector css - id\nconst item = document.querySelector('#highlight');\nconsole.log(item);\n
\n
// Selector css - class\nconst item = document.querySelector('.bolded');\nconsole.log(item);\n
\n
// Selector css - tag\nconst title = document.querySelector('h2');\nconsole.log(title);\n
\n

querySelectorAll()

\n

Está função retorna uma lista de nós que coincidem com o seletor CSS passado\ncomo parâmetro.

\n
<body>\n <h2>Hello Laboratoria</h2>\n <h2>Hello Mundo</h2>\n <h2>My Hobbies</h2>\n <ul>\n  <li id=\"highlight\">Programming</li>\n  <li class=\"bolded\">Dancing</li>\n  <li class=\"bolded\">Watch Netflix</li>\n </ul>\n</body>\n
\n
// Selector css - tag\nconst titles = document.querySelectorAll('h2');\nconsole.log(titles);\n
\n
// Selector css - class\nconst items = document.querySelectorAll('.bolded');\nconsole.log(items);\n
\n

Recapitulando

\n

Prepare seueditor, replique o que Daniel realiza no seguinte vídeo e\nreforce seu aprendizado.

\n

\n

Também recomendamos o\nlink\nda documentação oficinal do Mozilla sobre o DOM.

" } } }, @@ -103,11 +103,11 @@ "intl": { "es": { "title": "Modificando el DOM", - "body": "

Objetivos de Aprendizaje

\n

En esta unidad aprenderemos:

\n\n

Modificando elementos y contenido del DOM

\n

En el tema anterior vimos qué es el DOM y cómo seleccionar nodos utilizando\nJavaScript. En esta ocasión vamos a utilizar el DOM para modificar el\ndocumento HTML utilizando JavaScript.

\n

Creación de nodos

\n

El DOM nos ofrece una serie de métodos para añadir nodos al árbol de un\ndocumento, pero los más básicos son .createElement(), que crea un elemento, y\n.createTextNode(), que crea un nodo de texto.

\n

Crear y añadir a la página un nuevo elemento XHTML sencillo consta de cuatro\npasos diferentes:

\n
    \n
  1. Creación de un nodo de tipo Element que represente al elemento.
  2. \n
  3. Creación de un nodo de tipo Text que represente el contenido del elemento.
  4. \n
  5. Añadir el nodo Text como nodo hijo del nodo Element.
  6. \n
  7. Añadir el nodo Element a la página, en forma de nodo hijo de el nodo\nexistente en el HTML, en el cual se quiere insertar.
  8. \n
\n

Este proceso de creación de nuevos nodos implica la utilización de tres\nfunciones DOM:

\n
    \n
  1. \n

    createElement(etiqueta)

    \n

    Crea un nodo de tipo Element que representa al elemento XHTML cuya etiqueta\nse pasa como parámetro.

    \n
  2. \n
  3. \n

    createTextNode(contenido)

    \n

    Crea un nodo de tipo Text que almacena el contenido textual de los elementos\nXHTML.

    \n
  4. \n
  5. \n

    nodoPadre.appendChild(nodoHijo)

    \n

    Añade un nodo como hijo de otro nodo. Si se ocupa esta función para añadir el\nnodo Text como hijo del nodo Element y a su vez este nodo Element como\nhijo del nodo existente en el HTML, appendChild se utiliza al menos dos\nveces. Con esta función el nuevo nodo se incluye inmediatamente después de\nlos hijos ya existentes.

    \n
  6. \n
\n

De este modo, si se quiere añadir un párrafo simple al final de una página\nXHTML, es necesario incluir el siguiente código JavaScript.

\n
// Crear nodo de tipo Element\nconst paragraph = document.createElement(\"p\");\n// Crear nodo de tipo Text\nconst content = document.createTextNode(\"Hola Mundo!\");\n// Añadir el nodo Text como hijo del nodo Element\nparagraph.appendChild(content);\n// Añadir el nodo Element como hijo de la pagina\ndocument.body.appendChild(parrafo);\n
\n

Hay que recordar que el DOM es la interfaz que conecta el documento HTML con\nJavaScript. Es por eso que, al utilizar .createElement(), el nodo no será\nvisible, ya que hasta este momento no es más que una especie de fantasma que\nexiste en el documento, pero hasta que no se le asigne una posición en el árbol\nno se mostrará al usuario. De la misma manera, con la función\n.createTextNode() el texto existe, pero en ninguna parte mas. Es necesario\nconvertir cualquiera de estos nodos en hijo de otro nodo existente por medio de\nla función .appendChild().

\n

Eliminar nodos del DOM

\n

Dado que podemos incluir nuevos hijos en un nodo, tiene sentido que podamos\neliminarlos. Para ello existe el siguiente método:

\n

removeChild()

\n

Para quitar un nodo del documento tenemos que seleccionar el padre del nodo, y\ndesde ahí, remover el nodo deseado.

\n

Si no conocemos el padre del nodo podemos seleccionar directamente el nodo,\nobtener el padre, con .parentNode, para después utilizar .removeChild()\ny eliminarlo.

\n\n
const container = document.getElementById('container');\nconst paragraph = document.getElementById('paragraph');\ncontainer.removeChild(paragraph);\n\n/*\n * Con el nodo seleccionado utilizamos `.parentNode`\n * para seleccionar el padre. Desde el padre utilizamos\n * `.removeChild()` para eliminar el nodo seleccionado.\n */\n\nconst paragraph = document.getElementById('paragraph');\nparagraph.parentNode.removeChild(paragraph);\n
\n

Cuando se elimina un nodo, también se eliminan automáticamente todos los nodos\nhijos que tenga, por lo que no es necesario borrar manualmente cada nodo hijo.

\n

Más funciones para manipulación de DOM

\n

Aquí arriba te hemos mostrado algunas funciones con las cuales puedes empezar a\nguiarte, pero es importante mencionar que a la hora de programar no hay una\núnica solución posible y la solución que uno como desarrollador puede ofrecer\ndepende mucho de las necesidades de cada proyecto, así que te presentaremos\notros métodos y propiedades que puedes comenzar a probar.

\n

Comencemos por .textContent y .innerHTML que funcionan como propiedades para\nobtener y establecer el valor de un elemento específico.

\n

textContent

\n

Al utilizar textContent sobre un nodo, se va a mostrar el contenido del texto\nque exista en el nodo y en los hijos del mismo. Si hay etiquetas HTML, son\nignoradas. Si se le asigna un valor, va a reemplazar todo el contenido del nodo\npor la cadena de texto que se le asigne. Si la cadena de texto contiene\netiquetas HTML, éstas se van a escapar y se van a visualizar como texto.\nLos cambios realizados no van a ser permanentes, el documento va a regresar a\nsu estado original una vez que se recargue el sitio.

\n

\"textContent\"

\n

innerHTML

\n

Funciona de manera similar a textContent pero, además de mostrar el texto que\nexista en el nodo seleccionado y en los hijos, se van a mostrar las etiquetas\nde HTML que pudieran existir. Si se le asigna un valor, se va a reemplazar el\ncontenido del nodo incluyendo a sus hijos por la cadena de texto que se le\nasigne. A diferencia de textContent, si dentro de la cadena de texto asignada\nexisten etiquetas HTML, se van a visualizar en el navegador. Los cambios\nrealizados no van a ser permanentes, el documento va a regresar a su estado\noriginal una vez que se recargue el sitio.

\n

\"textContent\"

\n

En el siguiente video vemos de forma práctica, cómo utilizar .innerHTML y\n.textContent:

\n

Modificando, reemplazando y eliminando nodos

\n

value

\n

La propiedad value establece o devuelve el valor del atributo value de un\nelemento html, siempre y cuando en dicho elemento exista la propiedad value,\nalgunas de las etiquetas que contienen la propiedad value son elementos de\nformularios.

\n\n
\n

Nota: el valor devuelto es un string, que representa el valor del campo de\ntexto.

\n
\n

Puedes ver un ejemplo más claro en este pen.

\n

insertBefore

\n

Nos permite elegir un nodo del documento e incluir otro antes que él.

\n
padre.insertBefore(nuevoNodo, nodoDeReferencia);\n
\n

Si tuviéramos un fragmento de un documento como éste:

\n
<div id=\"container\">\n    <p>Primer párrafo.</p>\n    <p>Segundo párrafo.</p>\n</div>\n
\n

y quisiéramos añadir un nuevo párrafo antes del segundo, lo haríamos así:

\n
// Creamos el nuevo párrafo con su hijo texto\nconst newParagraph = document.createElement('p');\nconst paragraphText = document.createTextNode('Nuevo párrafo.');\nnewParagraph.appendChild(paragraphText);\n\n// Guardamos en una variable el padre y en otra variable el segundo párrafo\nconst container = document.getElementById('container');\nconst secondParagraph = container.getElementsByTagName('p')[1];\n\n// Y ahora lo insertamos\ncontainer.insertBefore(newParagraph, secondParagraph);\n
\n

replaceChild

\n

Este método se utiliza para reemplazar un nodo secundario por otro. Toma como\nargumentos dos nodos: un nuevo nodo y el nodo a ser reemplazado. El nodo\nreemplazado debe ser un elemento secundario del elemento al que se llama el\nmétodo.

\n\n

Con el mismo HTML que para el ejemplo de .insertBefore(), si quisiéramos\nsustituir el segundo párrafo por el que creamos, lo haríamos así:

\n
container.replaceChild(newParagraph, secondParagraph);\n
\n
\n

Tenga en cuenta que tanto .replaceChild() como .insertBefore() esperan el\nnuevo nodo como su primer argumento.

\n
\n

A practicar

\n

Te recomendamos replicar los ejemplos de código que se han ido mostrando a la\nlargo de la lectura. Además de poner en práctica la teoría con los siguientes\nvídeos.

\n" + "body": "

Objetivos de Aprendizaje

\n

En esta unidad aprenderemos:

\n\n

Modificando elementos y contenido del DOM

\n

En el tema anterior vimos qué es el DOM y cómo seleccionar nodos utilizando\nJavaScript. En esta ocasión vamos a utilizar el DOM para modificar el\ndocumento HTML utilizando JavaScript.

\n

Creación de nodos

\n

El DOM nos ofrece una serie de métodos para añadir nodos al árbol de un\ndocumento, pero los más básicos son .createElement(), que crea un elemento, y\n.createTextNode(), que crea un nodo de texto.

\n

Crear y añadir a la página un nuevo elemento XHTML sencillo consta de cuatro\npasos diferentes:

\n
    \n
  1. Creación de un nodo de tipo Element que represente al elemento.
  2. \n
  3. Creación de un nodo de tipo Text que represente el contenido del elemento.
  4. \n
  5. Añadir el nodo Text como nodo hijo del nodo Element.
  6. \n
  7. Añadir el nodo Element a la página, en forma de nodo hijo de el nodo\nexistente en el HTML, en el cual se quiere insertar.
  8. \n
\n

Este proceso de creación de nuevos nodos implica la utilización de tres\nfunciones DOM:

\n
    \n
  1. \n

    createElement(etiqueta)

    \n

    Crea un nodo de tipo Element que representa al elemento XHTML cuya etiqueta\nse pasa como parámetro.

    \n
  2. \n
  3. \n

    createTextNode(contenido)

    \n

    Crea un nodo de tipo Text que almacena el contenido textual de los elementos\nXHTML.

    \n
  4. \n
  5. \n

    nodoPadre.appendChild(nodoHijo)

    \n

    Añade un nodo como hijo de otro nodo. Si se ocupa esta función para añadir el\nnodo Text como hijo del nodo Element y a su vez este nodo Element como\nhijo del nodo existente en el HTML, appendChild se utiliza al menos dos\nveces. Con esta función el nuevo nodo se incluye inmediatamente después de\nlos hijos ya existentes.

    \n
  6. \n
\n

De este modo, si se quiere añadir un párrafo simple al final de una página\nXHTML, es necesario incluir el siguiente código JavaScript.

\n
// Crear nodo de tipo Element\nconst paragraph = document.createElement(\"p\");\n// Crear nodo de tipo Text\nconst content = document.createTextNode(\"Hola Mundo!\");\n// Añadir el nodo Text como hijo del nodo Element\nparagraph.appendChild(content);\n// Añadir el nodo Element como hijo de la pagina\ndocument.body.appendChild(parrafo);\n
\n

Hay que recordar que el DOM es la interfaz que conecta el documento HTML con\nJavaScript. Es por eso que, al utilizar .createElement(), el nodo no será\nvisible, ya que hasta este momento no es más que una especie de fantasma que\nexiste en el documento, pero hasta que no se le asigne una posición en el árbol\nno se mostrará al usuario. De la misma manera, con la función\n.createTextNode() el texto existe, pero en ninguna parte mas. Es necesario\nconvertir cualquiera de estos nodos en hijo de otro nodo existente por medio de\nla función .appendChild().

\n

Eliminar nodos del DOM

\n

Dado que podemos incluir nuevos hijos en un nodo, tiene sentido que podamos\neliminarlos. Para ello existe el siguiente método:

\n

removeChild()

\n

Para quitar un nodo del documento tenemos que seleccionar el padre del nodo, y\ndesde ahí, remover el nodo deseado.

\n

Si no conocemos el padre del nodo podemos seleccionar directamente el nodo,\nobtener el padre, con .parentNode, para después utilizar .removeChild()\ny eliminarlo.

\n\n
const container = document.getElementById('container');\nconst paragraph = document.getElementById('paragraph');\ncontainer.removeChild(paragraph);\n\n/*\n * Con el nodo seleccionado utilizamos `.parentNode`\n * para seleccionar el padre. Desde el padre utilizamos\n * `.removeChild()` para eliminar el nodo seleccionado.\n */\n\nconst paragraph = document.getElementById('paragraph');\nparagraph.parentNode.removeChild(paragraph);\n
\n

Cuando se elimina un nodo, también se eliminan automáticamente todos los nodos\nhijos que tenga, por lo que no es necesario borrar manualmente cada nodo hijo.

\n

Más funciones para manipulación de DOM

\n

Aquí arriba te hemos mostrado algunas funciones con las cuales puedes empezar a\nguiarte, pero es importante mencionar que a la hora de programar no hay una\núnica solución posible y la solución que uno como desarrollador puede ofrecer\ndepende mucho de las necesidades de cada proyecto, así que te presentaremos\notros métodos y propiedades que puedes comenzar a probar.

\n

Comencemos por .textContent y .innerHTML que funcionan como propiedades para\nobtener y establecer el valor de un elemento específico.

\n

textContent

\n

Al utilizar textContent sobre un nodo, se va a mostrar el contenido del texto\nque exista en el nodo y en los hijos del mismo. Si hay etiquetas HTML, son\nignoradas. Si se le asigna un valor, va a reemplazar todo el contenido del nodo\npor la cadena de texto que se le asigne. Si la cadena de texto contiene\netiquetas HTML, éstas se van a escapar y se van a visualizar como texto.\nLos cambios realizados no van a ser permanentes, el documento va a regresar a\nsu estado original una vez que se recargue el sitio.

\n

\"textContent\"

\n

innerHTML

\n

Funciona de manera similar a textContent pero, además de mostrar el texto que\nexista en el nodo seleccionado y en los hijos, se van a mostrar las etiquetas\nde HTML que pudieran existir. Si se le asigna un valor, se va a reemplazar el\ncontenido del nodo incluyendo a sus hijos por la cadena de texto que se le\nasigne. A diferencia de textContent, si dentro de la cadena de texto asignada\nexisten etiquetas HTML, se van a visualizar en el navegador. Los cambios\nrealizados no van a ser permanentes, el documento va a regresar a su estado\noriginal una vez que se recargue el sitio.

\n

\"textContent\"

\n

En el siguiente video vemos de forma práctica, cómo utilizar .innerHTML y\n.textContent:

\n

\n

value

\n

La propiedad value establece o devuelve el valor del atributo value de un\nelemento html, siempre y cuando en dicho elemento exista la propiedad value,\nalgunas de las etiquetas que contienen la propiedad value son elementos de\nformularios.

\n\n
\n

Nota: el valor devuelto es un string, que representa el valor del campo de\ntexto.

\n
\n

Puedes ver un ejemplo más claro en este pen.

\n

insertBefore

\n

Nos permite elegir un nodo del documento e incluir otro antes que él.

\n
padre.insertBefore(nuevoNodo, nodoDeReferencia);\n
\n

Si tuviéramos un fragmento de un documento como éste:

\n
<div id=\"container\">\n    <p>Primer párrafo.</p>\n    <p>Segundo párrafo.</p>\n</div>\n
\n

y quisiéramos añadir un nuevo párrafo antes del segundo, lo haríamos así:

\n
// Creamos el nuevo párrafo con su hijo texto\nconst newParagraph = document.createElement('p');\nconst paragraphText = document.createTextNode('Nuevo párrafo.');\nnewParagraph.appendChild(paragraphText);\n\n// Guardamos en una variable el padre y en otra variable el segundo párrafo\nconst container = document.getElementById('container');\nconst secondParagraph = container.getElementsByTagName('p')[1];\n\n// Y ahora lo insertamos\ncontainer.insertBefore(newParagraph, secondParagraph);\n
\n

replaceChild

\n

Este método se utiliza para reemplazar un nodo secundario por otro. Toma como\nargumentos dos nodos: un nuevo nodo y el nodo a ser reemplazado. El nodo\nreemplazado debe ser un elemento secundario del elemento al que se llama el\nmétodo.

\n\n

Con el mismo HTML que para el ejemplo de .insertBefore(), si quisiéramos\nsustituir el segundo párrafo por el que creamos, lo haríamos así:

\n
container.replaceChild(newParagraph, secondParagraph);\n
\n
\n

Tenga en cuenta que tanto .replaceChild() como .insertBefore() esperan el\nnuevo nodo como su primer argumento.

\n
\n

A practicar

\n

Te recomendamos replicar los ejemplos de código que se han ido mostrando a la\nlargo de la lectura. Además de poner en práctica la teoría con los siguientes\nvídeos.

\n" }, "pt": { "title": "Modificando o DOM", - "body": "

Objetivos de Aprendizagem

\n

Nesta unidade aprenderemos:

\n\n

Modificando elementos e conteúdo do DOM

\n

No tópico anterior vimos o que é o DOM e como selecionar nós usando JavaScript.\nDesta vez vamos usar o DOM para modificar o documento HTML usando JavaScript.

\n

Criação de nós

\n

O DOM nos oferece uma série de métodos para adicionar nós a árvore de um\ndocumento, os métodos mais básicos são .createElement(), para criar um\nelemento e .createTextNode(), para criar um nós de texto.

\n

Criar e adicionar a uma página um novo elemento é simples, você precisa de\napenas quatro passos:

\n
    \n
  1. Criar um nó do tipo Element que represente o elemento.
  2. \n
  3. Criar um nós do tipo Text que presente o conteúdo do elemento.
  4. \n
  5. Adicionar o nós Text como filho do nós Element.
  6. \n
  7. Adicionar nós Element na página.
  8. \n
\n

Este processo de criação de novos nós implica na utilização de três funções de\nDOM:

\n
    \n
  1. \n

    createElement(tag)

    \n

    Cria um nós do tipo Element que representa um elemento XHTML cuja a tag\né passada como parâmetro.

    \n
  2. \n
  3. \n

    createTextNode(conteúdo)

    \n

    Criar um nós do tipo Text que armazena o conteúdo de texto dos elementos.

    \n
  4. \n
  5. \n

    nóPai.appendChild(nóFilho)

    \n

    Adiciona o nóFilho dentro do nóPai.

    \n
  6. \n
\n

Desta maneira, se quiser adicionar um parágrafo no final de um página, é\nnecessário incluir o seguinte código JavaScript.

\n
// Cria o nó do tipo Element\nconst paragraph = document.createElement(\"p\");\n// Cria o nó do tipo Text\nconst content = document.createTextNode(\"Hola Mundo!\");\n// Adiciona o nó Text como filho do nós Element\nparagraph.appendChild(content);\n// Adiciona o nó Element como filho da página\ndocument.body.appendChild(paragraph);\n
\n

Temos que lembrar que o DOM é uma interface que conecta o documento HTML com o\nJavaScript. É por isso que ao utilizar .createElement(), o nó não ficará\nvisível, ele será uma espécie de fantasma dentro do documento. Isso ocorre da\nmesma maneira com a função .createTextNode() e o texto passado como parâmetro.\nPara que esses elementos sejam visíveis na tela, temos que lembrar de utilizar\nalguma função como .appendChild() para adicionar esses elementos ao documento\nHTML.

\n

Remover nós do DOM

\n

Como podemos incluir novos filhos em um nó, faz sentido eliminá-los. Para isso,\nexiste o seguinte método:

\n

removeChild()

\n

Para remover um nó do documento, temos que selecionar o pai do nó e, a partir\ndaí, remover o nó desejado.

\n

Se não soubermos o pai do nó, podemos selecionar diretamente o nó, obter o pai\n(com .parentElement) e usar .removeChild() para excluí-lo.

\n

Sintaxis:

\n
  pai.removeChild(nóParaEliminacao);\n
\n
const container = document.getElementById('container');\nconst paragraph = document.getElementById('paragraph');\ncontainer.removeChild(paragraph);\n\n/*\n * Com o nó selecionado utilizamos '.parentElement'\n * para selecionar o pai. A partir do pai utilizamos\n * '.removeChild()' para eliminar o nó selecionado.\n */\n\nconst paragraph = document.getElementById('paragraph');\nparagraph.parentNode.removeChild(paragraph);\n
\n

Cuando se elimina un nodo, también se eliminan automáticamente todos los nodos\nhijos que tenga, por lo que no es necesario borrar manualmente cada nodo hijo.

\n

Más funciones para manipulación de DOM

\n

A cima mostramos algumas funções com as quais você pode começar a praticar, mas\né importante mencionar que na hora de programar não existe apenas uma única\nmaneira de fazer ou uma única solução possível. Pensando nisso vamos te\napresentar alguns outros métodos e propriedade para você praticar.

\n

Os atributos .textContent e .innerHTML funcionam como propriedades para\nobter e modificar o valor de um elemento específico.

\n

textContent

\n

Ao usar textContent em um nó, ele mostrará o conteúdo do texto que existe no\nnó e seus filhos. Se houver tags HTML, elas serão ignoradas. Se um valor for\natribuído, ele substituirá todo o conteúdo do nó pela string atribuída a ele.\nSe a string contiver tags HTML, elas serão interpretadas e exibidas como\ntexto. As alterações feitas não serão permanentes, o documento retornará ao seu\nestado original assim que o site for recarregado.

\n

\"textContent\"

\n

innerHTML

\n

Funciona de maneira semelhante ao textContent, mas, além de mostrar o texto que\nexiste no nó selecionado e nos filhos, ele mostrará as tags HTML que podem\nexistir. Se um valor for atribuído a ele, o conteúdo do nó será substituído,\nincluindo seus filhos, pela sequência de texto atribuída a ele. Ao contrário\ndotextContent, se as tags HTML existirem na string atribuída, elas serão\nexibidas no navegador. As alterações feitas não serão permanentes, o documento\nretornará ao seu estado original assim que o site for recarregado.

\n

\"textContent\"

\n

No vídeo a seguir, vemos de uma maneira prática, como usar .innerHTML e\n.textContent:

\n

Modificando, substituindo e excluindo nós

\n

value

\n

A propriedade value retorna o valor do atributo value de um elemento HTML,\nsempre e quando existir a propriedade value no elemento. Algunas das tags\nque contém a propriedade value são os elementos de formulário.

\n

Sintaxis

\n\n
\n

Nota: o valor de retorno é uma string, que representa o valor do campo de texto.

\n
\n

Você pode ver um exemplo mais claro neste\npen .

\n

insertBefore

\n

Permite escolher um nó do documento e incluir outro antes dele.

\n
pai.insertBefore(novoNo, noDeReferencia);\n
\n

Se tivéssemos um fragmento de um documento como este:

\n
<div id=\"container\">\n    <p>Primeiro parágrafo</p>\n    <p>Segundo paragráfo</p>\n</div>\n
\n

e quiséssemos adicionar um novo parágrafo antes do segundo, faríamos assim:

\n
// Criamos o novo parágrafo com seu texto filho\nconst newParagraph = document.createElement('p');\nconst paragraphText = document.createTextNode('Novo parágrafo.');\nnewParagraph.appendChild(paragraphText);\n\n// Armazenamos em uma variável o pai e em outra variável o segundo parágrafo\nconst container = document.getElementById('container');\nconst secondParagraph = container.getElementsByTagName('p')[1];\n\n// Agora inserimos\ncontainer.insertBefore(newParagraph, secondParagraph);\n
\n

replaceChild

\n

Este método é usado para substituir um nó secundário por outro. Tome como\nargumentos dois nós: um novo nó e o nó a ser substituído. O nó substituído deve\nser um filho do elemento para o qual o método é chamado.

\n

Sintaxe:

\n
    pai.replaceChild(novoNo, noParaSubstituir);\n
\n

Com o mesmo HTML do exemplo de .insertBefore(), se quiséssemos substituir o\nsegundo parágrafo pelo qual criamos, faríamos assim:

\n
container.replaceChild(newParagraph, secondParagraph);\n
\n
\n

Note que tanto .replaceChild() tanto quanto .insertBefore() esperam que o\nnovo nó seja o primeiro argumento.

\n
\n

Vamos praticar

\n

Nos vídeos a seguir vamos colocar em prática a parte teórica já que eles usam os\nmétodos como criar, adicionar e eliminar os nós do DOM por meio do Javascript e\nassim poder criar páginas dinâmicas. sugerimos que você faça o exercício junto\ncom o vídeo e se necessário, você pode ir pausando.

\n

\"Criando

\n\n

\"Adicionando

" + "body": "

Objetivos de Aprendizagem

\n

Nesta unidade aprenderemos:

\n\n

Modificando elementos e conteúdo do DOM

\n

No tópico anterior vimos o que é o DOM e como selecionar nós usando JavaScript.\nDesta vez vamos usar o DOM para modificar o documento HTML usando JavaScript.

\n

Criação de nós

\n

O DOM nos oferece uma série de métodos para adicionar nós a árvore de um\ndocumento, os métodos mais básicos são .createElement(), para criar um\nelemento e .createTextNode(), para criar um nós de texto.

\n

Criar e adicionar a uma página um novo elemento é simples, você precisa de\napenas quatro passos:

\n
    \n
  1. Criar um nó do tipo Element que represente o elemento.
  2. \n
  3. Criar um nós do tipo Text que presente o conteúdo do elemento.
  4. \n
  5. Adicionar o nós Text como filho do nós Element.
  6. \n
  7. Adicionar nós Element na página.
  8. \n
\n

Este processo de criação de novos nós implica na utilização de três funções de\nDOM:

\n
    \n
  1. \n

    createElement(tag)

    \n

    Cria um nós do tipo Element que representa um elemento XHTML cuja a tag\né passada como parâmetro.

    \n
  2. \n
  3. \n

    createTextNode(conteúdo)

    \n

    Criar um nós do tipo Text que armazena o conteúdo de texto dos elementos.

    \n
  4. \n
  5. \n

    nóPai.appendChild(nóFilho)

    \n

    Adiciona o nóFilho dentro do nóPai.

    \n
  6. \n
\n

Desta maneira, se quiser adicionar um parágrafo no final de um página, é\nnecessário incluir o seguinte código JavaScript.

\n
// Cria o nó do tipo Element\nconst paragraph = document.createElement(\"p\");\n// Cria o nó do tipo Text\nconst content = document.createTextNode(\"Hola Mundo!\");\n// Adiciona o nó Text como filho do nós Element\nparagraph.appendChild(content);\n// Adiciona o nó Element como filho da página\ndocument.body.appendChild(paragraph);\n
\n

Temos que lembrar que o DOM é uma interface que conecta o documento HTML com o\nJavaScript. É por isso que ao utilizar .createElement(), o nó não ficará\nvisível, ele será uma espécie de fantasma dentro do documento. Isso ocorre da\nmesma maneira com a função .createTextNode() e o texto passado como parâmetro.\nPara que esses elementos sejam visíveis na tela, temos que lembrar de utilizar\nalguma função como .appendChild() para adicionar esses elementos ao documento\nHTML.

\n

Remover nós do DOM

\n

Como podemos incluir novos filhos em um nó, faz sentido eliminá-los. Para isso,\nexiste o seguinte método:

\n

removeChild()

\n

Para remover um nó do documento, temos que selecionar o pai do nó e, a partir\ndaí, remover o nó desejado.

\n

Se não soubermos o pai do nó, podemos selecionar diretamente o nó, obter o pai\n(com .parentElement) e usar .removeChild() para excluí-lo.

\n

Sintaxis:

\n
  pai.removeChild(nóParaEliminacao);\n
\n
const container = document.getElementById('container');\nconst paragraph = document.getElementById('paragraph');\ncontainer.removeChild(paragraph);\n\n/*\n * Com o nó selecionado utilizamos '.parentElement'\n * para selecionar o pai. A partir do pai utilizamos\n * '.removeChild()' para eliminar o nó selecionado.\n */\n\nconst paragraph = document.getElementById('paragraph');\nparagraph.parentNode.removeChild(paragraph);\n
\n

Cuando se elimina un nodo, también se eliminan automáticamente todos los nodos\nhijos que tenga, por lo que no es necesario borrar manualmente cada nodo hijo.

\n

Más funciones para manipulación de DOM

\n

A cima mostramos algumas funções com as quais você pode começar a praticar, mas\né importante mencionar que na hora de programar não existe apenas uma única\nmaneira de fazer ou uma única solução possível. Pensando nisso vamos te\napresentar alguns outros métodos e propriedade para você praticar.

\n

Os atributos .textContent e .innerHTML funcionam como propriedades para\nobter e modificar o valor de um elemento específico.

\n

textContent

\n

Ao usar textContent em um nó, ele mostrará o conteúdo do texto que existe no\nnó e seus filhos. Se houver tags HTML, elas serão ignoradas. Se um valor for\natribuído, ele substituirá todo o conteúdo do nó pela string atribuída a ele.\nSe a string contiver tags HTML, elas serão interpretadas e exibidas como\ntexto. As alterações feitas não serão permanentes, o documento retornará ao seu\nestado original assim que o site for recarregado.

\n

\"textContent\"

\n

innerHTML

\n

Funciona de maneira semelhante ao textContent, mas, além de mostrar o texto que\nexiste no nó selecionado e nos filhos, ele mostrará as tags HTML que podem\nexistir. Se um valor for atribuído a ele, o conteúdo do nó será substituído,\nincluindo seus filhos, pela sequência de texto atribuída a ele. Ao contrário\ndotextContent, se as tags HTML existirem na string atribuída, elas serão\nexibidas no navegador. As alterações feitas não serão permanentes, o documento\nretornará ao seu estado original assim que o site for recarregado.

\n

\"textContent\"

\n

No vídeo a seguir, vemos de uma maneira prática, como usar .innerHTML e\n.textContent:

\n

\n

value

\n

A propriedade value retorna o valor do atributo value de um elemento HTML,\nsempre e quando existir a propriedade value no elemento. Algunas das tags\nque contém a propriedade value são os elementos de formulário.

\n

Sintaxis

\n\n
\n

Nota: o valor de retorno é uma string, que representa o valor do campo de texto.

\n
\n

Você pode ver um exemplo mais claro neste\npen .

\n

insertBefore

\n

Permite escolher um nó do documento e incluir outro antes dele.

\n
pai.insertBefore(novoNo, noDeReferencia);\n
\n

Se tivéssemos um fragmento de um documento como este:

\n
<div id=\"container\">\n    <p>Primeiro parágrafo</p>\n    <p>Segundo paragráfo</p>\n</div>\n
\n

e quiséssemos adicionar um novo parágrafo antes do segundo, faríamos assim:

\n
// Criamos o novo parágrafo com seu texto filho\nconst newParagraph = document.createElement('p');\nconst paragraphText = document.createTextNode('Novo parágrafo.');\nnewParagraph.appendChild(paragraphText);\n\n// Armazenamos em uma variável o pai e em outra variável o segundo parágrafo\nconst container = document.getElementById('container');\nconst secondParagraph = container.getElementsByTagName('p')[1];\n\n// Agora inserimos\ncontainer.insertBefore(newParagraph, secondParagraph);\n
\n

replaceChild

\n

Este método é usado para substituir um nó secundário por outro. Tome como\nargumentos dois nós: um novo nó e o nó a ser substituído. O nó substituído deve\nser um filho do elemento para o qual o método é chamado.

\n

Sintaxe:

\n
    pai.replaceChild(novoNo, noParaSubstituir);\n
\n

Com o mesmo HTML do exemplo de .insertBefore(), se quiséssemos substituir o\nsegundo parágrafo pelo qual criamos, faríamos assim:

\n
container.replaceChild(newParagraph, secondParagraph);\n
\n
\n

Note que tanto .replaceChild() tanto quanto .insertBefore() esperam que o\nnovo nó seja o primeiro argumento.

\n
\n

Vamos praticar

\n

Nos vídeos a seguir vamos colocar em prática a parte teórica já que eles usam os\nmétodos como criar, adicionar e eliminar os nós do DOM por meio do Javascript e\nassim poder criar páginas dinâmicas. sugerimos que você faça o exercício junto\ncom o vídeo e se necessário, você pode ir pausando.

\n

\n\n

" } } }, @@ -151,11 +151,11 @@ "intl": { "es": { "title": "Eventos", - "body": "

Objetivos de Aprendizaje

\n

En esta unidad aprenderemos:

\n
    \n
  1. ¿Qué es un evento y para qué nos sirve?
  2. \n
  3. ¿Cómo usarlos?
  4. \n
  5. Manejo y flujo de eventos (propagación).
  6. \n
  7. Tipos
  8. \n
\n
\n

¿Qué es un evento?

\n

Un evento representa la idea de que algo ha pasado en nuestro programa, y\ntenemos la oportunidad de hacer algo o reaccionar a esa cosa que ha ocurrido\n(el evento).

\n

Por ejemplo, la interacción con el usuario se hace através de eventos. Cuando el\nusuario realiza una acción como hacer un click, esto dispara un evento que\nnos va a permir reaccionar, y así agregar interacción al programa. A cada evento\nse le asocian una o más funciones que serán ejecutadas cuando ocurra dicho\nevento. A estas funciones las llamamos manejadores o manejadores de eventos\n(conocidos en inglés como event handlers o event listeners).

\n

Aquí hay un video de referencia.

\n

¿Cómo usar los eventos?

\n

Para poder hacer uso de la magia de los eventos es necesario saber primero como\n\"escucharlos\", esto se puede lograr mediante el método addEventListener.

\n

La sintaxis es muy sencilla:

\n
  elemento_que_escucha.addEventListener('evento', funcion_a_ejecutar);\n
\n

Aquí un link de\nreferencia.

\n

Existen diferentes formas de asociar un evento a elementos del DOM, para saber\nmás sobre ello visita éste link\n(a partir del punto 6.2).

\n

Manejo de eventos

\n

Además de agregar el listener al evento también se puede eliminar usando el\nmétodo removeEventListener, el cual funciona casi de la misma manera. La\nsintaxis es de la siguiente manera:

\n
  elemento_que_escucha.removeEventListener('evento', funcion_a_eliminar);\n
\n

Para que el método funcione correctamente es obligatorio mandar como parámetro\nel callback (función) utilizado con addEventListener.

\n

Ahora hablemos sobre objectEvent que es otro tema de importancia en el\nmanejo de eventos. Cuando un evento ocurre, la función que se ejecutará\nnecesita información adicional sobre éste.

\n

objectEvent es el objeto que representa el evento que se ha producido. Se\ncrea automáticamente cuando ocurre el evento y se destruye una vez se haya\nejecutado su función manejadora. Éste objeto tiene un conjunto de propiedades\ncon información sobre el evento. En el siguiente código podrás encontrar un\nejemplo.

\n
const holaMundo = (event) => {\n  const evento = window.event || event;\n  alert('Hola Mundo.');\n};\n\nconst boton = document.getElementById('boton');\nboton.addEventListener('click', holaMundo, false);\n
\n

En ocasiones es necesario prevenir un cierto comportamiento que un evento tiene\npor defecto, para ello existe preventDefault, a continuación un ejemplo:

\n
\n

Este es el código para un formulario muy sencillo\nHay un input para ingresar el nombre y otro para ingresar el apellido\nPor último, hay un input de tipo submit (botón enviar)

\n
\n
<form>\n  <div>\n    <label for=\"fname\">First name: </label>\n    <input id=\"fname\" type=\"text\">\n  </div>\n  <div>\n    <label for=\"lname\">Last name: </label>\n    <input id=\"lname\" type=\"text\">\n  </div>\n  <div>\n     <input id=\"submit\" type=\"submit\">\n  </div>\n</form>\n<p></p>\n
\n
\n

Ahora veámos la funcionalidad del JS:\nEn la primera parte se guardan en variables los elementos del formulario\nDespués tenemos la función que detona el evento submit\nEsta función comprueba si los campos están vacios\nSi la condición se cumple se ejecuta la función preventDefault para el\neventObject (e)\nImpidiendo que el formulario se envíe automáticamente (acción que tiene por\ndefecto este tipo de \"botón\") para mostrar al usuario un mensaje de error.

\n
\n
const form = document.querySelector('form');\nconst fname = document.getElementById('fname');\nconst lname = document.getElementById('lname');\nconst submit = document.getElementById('submit');\nconst para = document.querySelector('p');\n\nform.onsubmit = function(e) {\n  if (fname.value === '' || lname.value === '') {\n    e.preventDefault();\n    para.textContent = 'You need to fill in both names!';\n  }\n}\n
\n

Flujo de eventos (Propagation)

\n

Cuando un evento se ejecuta pasa por diferentes fases: Capture phase, Target\nphase y Bubbling phase, como se muestra en las siguientes imágenes.

\n

\"Event

\n

\"Event

\n

Revisa éste video en donde encontrarás\nun ejemplo práctico del flujo que siguen los eventos.

\n

Tipo de eventos

\n

Cuando el usuario interactúa con el navegador se pueden desencadenar múltiples\ntipos de eventos, algunos de los más comunes son:

\n\n

Para mayor información sobre todos los eventos visita éste link\ny también éste otro link.

\n

Key Events

\n

Estos son algunos de los eventos más utilizados:

\n\n

Aquí podrás encontrar un\nejemplo sobre la interacción con los eventos.

\n
\n

Guía de uso:

\n
    \n
  1. Nota como el fondo es de color blanco
  2. \n
  3. Ahora haz click en el botón Hacer magia :)
  4. \n
  5. Revisa el código y analiza la lógica de programación
  6. \n
  7. Ahora intenta modificar el código para que reaccione con otros eventos,\ndiviertete ;)
  8. \n
\n
\n

Finalmente, te adjuntamos el link\nde la documentación oficial explicando todo acerca de eventos:

" + "body": "

Objetivos de Aprendizaje

\n

En esta unidad aprenderemos:

\n
    \n
  1. ¿Qué es un evento y para qué nos sirve?
  2. \n
  3. ¿Cómo usarlos?
  4. \n
  5. Manejo y flujo de eventos (propagación).
  6. \n
  7. Tipos
  8. \n
\n
\n

¿Qué es un evento?

\n

Un evento representa la idea de que algo ha pasado en nuestro programa, y\ntenemos la oportunidad de hacer algo o reaccionar a esa cosa que ha ocurrido\n(el evento).

\n

Por ejemplo, la interacción con el usuario se hace através de eventos. Cuando el\nusuario realiza una acción como hacer un click, esto dispara un evento que\nnos va a permir reaccionar, y así agregar interacción al programa. A cada evento\nse le asocian una o más funciones que serán ejecutadas cuando ocurra dicho\nevento. A estas funciones las llamamos manejadores o manejadores de eventos\n(conocidos en inglés como event handlers o event listeners).

\n

Aquí hay un de referencia.

\n

¿Cómo usar los eventos?

\n

Para poder hacer uso de la magia de los eventos es necesario saber primero como\n\"escucharlos\", esto se puede lograr mediante el método addEventListener.

\n

La sintaxis es muy sencilla:

\n
  elemento_que_escucha.addEventListener('evento', funcion_a_ejecutar);\n
\n

Aquí un link de\nreferencia.

\n

Existen diferentes formas de asociar un evento a elementos del DOM, para saber\nmás sobre ello visita éste link\n(a partir del punto 6.2).

\n

Manejo de eventos

\n

Además de agregar el listener al evento también se puede eliminar usando el\nmétodo removeEventListener, el cual funciona casi de la misma manera. La\nsintaxis es de la siguiente manera:

\n
  elemento_que_escucha.removeEventListener('evento', funcion_a_eliminar);\n
\n

Para que el método funcione correctamente es obligatorio mandar como parámetro\nel callback (función) utilizado con addEventListener.

\n

Ahora hablemos sobre objectEvent que es otro tema de importancia en el\nmanejo de eventos. Cuando un evento ocurre, la función que se ejecutará\nnecesita información adicional sobre éste.

\n

objectEvent es el objeto que representa el evento que se ha producido. Se\ncrea automáticamente cuando ocurre el evento y se destruye una vez se haya\nejecutado su función manejadora. Éste objeto tiene un conjunto de propiedades\ncon información sobre el evento. En el siguiente código podrás encontrar un\nejemplo.

\n
const holaMundo = (event) => {\n  const evento = window.event || event;\n  alert('Hola Mundo.');\n};\n\nconst boton = document.getElementById('boton');\nboton.addEventListener('click', holaMundo, false);\n
\n

En ocasiones es necesario prevenir un cierto comportamiento que un evento tiene\npor defecto, para ello existe preventDefault, a continuación un ejemplo:

\n
\n

Este es el código para un formulario muy sencillo\nHay un input para ingresar el nombre y otro para ingresar el apellido\nPor último, hay un input de tipo submit (botón enviar)

\n
\n
<form>\n  <div>\n    <label for=\"fname\">First name: </label>\n    <input id=\"fname\" type=\"text\">\n  </div>\n  <div>\n    <label for=\"lname\">Last name: </label>\n    <input id=\"lname\" type=\"text\">\n  </div>\n  <div>\n     <input id=\"submit\" type=\"submit\">\n  </div>\n</form>\n<p></p>\n
\n
\n

Ahora veámos la funcionalidad del JS:\nEn la primera parte se guardan en variables los elementos del formulario\nDespués tenemos la función que detona el evento submit\nEsta función comprueba si los campos están vacios\nSi la condición se cumple se ejecuta la función preventDefault para el\neventObject (e)\nImpidiendo que el formulario se envíe automáticamente (acción que tiene por\ndefecto este tipo de \"botón\") para mostrar al usuario un mensaje de error.

\n
\n
const form = document.querySelector('form');\nconst fname = document.getElementById('fname');\nconst lname = document.getElementById('lname');\nconst submit = document.getElementById('submit');\nconst para = document.querySelector('p');\n\nform.onsubmit = function(e) {\n  if (fname.value === '' || lname.value === '') {\n    e.preventDefault();\n    para.textContent = 'You need to fill in both names!';\n  }\n}\n
\n

Flujo de eventos (Propagation)

\n

Cuando un evento se ejecuta pasa por diferentes fases: Capture phase, Target\nphase y Bubbling phase, como se muestra en las siguientes imágenes.

\n

\"Event

\n

\"Event

\n

Revisa éste en donde encontrarás\nun ejemplo práctico del flujo que siguen los eventos.

\n

Tipo de eventos

\n

Cuando el usuario interactúa con el navegador se pueden desencadenar múltiples\ntipos de eventos, algunos de los más comunes son:

\n\n

Para mayor información sobre todos los eventos visita éste link\ny también éste otro link.

\n

Key Events

\n

Estos son algunos de los eventos más utilizados:

\n\n

Aquí podrás encontrar un\nejemplo sobre la interacción con los eventos.

\n
\n

Guía de uso:

\n
    \n
  1. Nota como el fondo es de color blanco
  2. \n
  3. Ahora haz click en el botón Hacer magia :)
  4. \n
  5. Revisa el código y analiza la lógica de programación
  6. \n
  7. Ahora intenta modificar el código para que reaccione con otros eventos,\ndiviertete ;)
  8. \n
\n
\n

Finalmente, te adjuntamos el link\nde la documentación oficial explicando todo acerca de eventos:

" }, "pt": { "title": "Eventos", - "body": "

Objetivos de Aprendizagem

\n

Nesta unidade aprenderemos:

\n
    \n
  1. O que é um evento e para que serve?
  2. \n
  3. Como usá-los?
  4. \n
  5. Gerenciamento e fluxo de eventos (propagação).
  6. \n
  7. Tipos
  8. \n
\n
\n

O que é um evento?

\n

É quando o usuário realiza uma ação permitindo que ele interaja com o programa.\nCada evento é associado a um manipulador (conhecidos como eventHandlers ou\neventListener), que será executado quando o evento ocorrer.

\n

Aqui está um vídeo de referência.

\n

Como usar os eventos?

\n

Para poder fazer uso da magia dos eventos é necessário saber primeiro como\n\"escutá-los\". Isto pode ser conseguido através do método addEventListener .

\n

A sintaxe é muito simples:

\n
  elemento_que_escuta.addEventListener('evento', funcao_para_escutar);\n
\n

Aqui um link de referência.

\n

Existem diferentes formas de associar um evento a elementos do DOM. Para saber\nmais visite este\nlink\n(a partir de 6.2).

\n

Tratamento de eventos

\n

Além de adicionar o listener ao evento, ele também pode ser eliminado usando o\nmétodo removeEventListener , que funciona quase da mesma maneira. A sintaxe\né a seguinte:

\n
  elemento_que_escuta.removeEventListener('evento', funcao_para_remover);\n
\n

Para que o método funcione corretamente, é obrigatório enviar como parâmetro o\nretorno de chamada (função) usado com addEventListener.

\n

Agora vamos falar sobre objectEvent, que é outra questão importante no\ntratamento de eventos. Quando um evento ocorre, a função que será executada\nprecisa de informações adicionais sobre ele.

\n

objectEvent é o objeto que representa o evento que ocorreu. É criado\nautomaticamente quando o evento ocorre e é destruído quando sua função de\ngerenciamento é executada. Este objeto tem um conjunto de propriedades com\ninformações sobre o evento. No código a seguir, você encontrará um exemplo.

\n
function olaMundo(event){\n  const evento = window.event || event;\n  alert('Olá Mundo.');\n}\n\nconst botao = document.getElementById('botao');\nbotao.addEventListener('click', olaMundo, false);\n
\n

Às vezes é necessário evitar certos comportamentos que um evento tem por padrão.\nPara isso existe preventDefault. Aqui está um exemplo:

\n
\n

Este é o código para um formulário muito simples Há um input para inserir o\nnome e outro para inserir o sobrenome. Finalmente, há um input do tipo\nsubmit (botão de envio)

\n
\n
<form>\n  <div>\n    <label for=\"fname\">First name: </label>\n    <input id=\"fname\" type=\"text\">\n  </div>\n  <div>\n    <label for=\"lname\">Last name: </label>\n    <input id=\"lname\" type=\"text\">\n  </div>\n  <div>\n     <input id=\"submit\" type=\"submit\">\n  </div>\n</form>\n<p></p>\n
\n
\n

Agora vejamos a funcionalidade JS: Na primeira parte são armazenados em\nvariáveis os elementos do formulário. Em seguida, temos a função que dispara o\nevento submit. Esta função verifica se os campos estão vazios. Se a condição\nse cumpre a função executa preventDefault para eventObject (e) impedindo\nque o formulário seja enviado automaticamente (ação que tem por padrão este\ntipo de \"botão\") para mostrar ao usuário uma mensagem de erro.

\n
\n
const form = document.querySelector('form');\nconst fname = document.getElementById('fname');\nconst lname = document.getElementById('lname');\nconst submit = document.getElementById('submit');\nconst para = document.querySelector('p');\n\nform.onsubmit = function(e) {\n  if (fname.value === '' || lname.value === '') {\n    e.preventDefault();\n    para.textContent = 'You need to fill in both names!';\n  }\n}\n
\n

Fluxo de Eventos (Propagação)

\n

Quando um evento é executado, ele passa por diferentes fases: Capture phase,\nTarget phase e Bubbling phase , conforme mostrado na imagem a seguir.

\n

\"flow-event\"

\n

A seguir, um vídeo que te explicará com um exemplo o fluxo que seguem os\neventos:

\n

\"Adicionando

\n

Tipo de eventos

\n

Quando o usuário interage com o navegador, vários tipos de eventos podem ser\nacionados. Alguns dos mais comuns são:

\n\n

Para mais informações sobre todos os eventos, acesse este\nlink.

\n

Principais eventos

\n

Estes são alguns dos eventos mais usados:

\n\n

Aqui você pode encontrar um\nexemplo sobre interação com eventos.

\n
\n

Guia de uso:

\n
    \n
  1. Observe como o fundo é branco
  2. \n
  3. Agora clique no botão Make magic :)
  4. \n
  5. Verifique o código e analise a lógica de programação
  6. \n
  7. Agora tente modificar o código para que ele reaja com outros eventos,\ndivirta-se;)
  8. \n
\n
\n

Finalmente, anexamos o\nlink da documentação\noficial explicando tudo sobre os eventos:

" + "body": "

Objetivos de Aprendizagem

\n

Nesta unidade aprenderemos:

\n
    \n
  1. O que é um evento e para que serve?
  2. \n
  3. Como usá-los?
  4. \n
  5. Gerenciamento e fluxo de eventos (propagação).
  6. \n
  7. Tipos
  8. \n
\n
\n

O que é um evento?

\n

É quando o usuário realiza uma ação permitindo que ele interaja com o programa.\nCada evento é associado a um manipulador (conhecidos como eventHandlers ou\neventListener), que será executado quando o evento ocorrer.

\n

Aqui está um de referência.

\n

Como usar os eventos?

\n

Para poder fazer uso da magia dos eventos é necessário saber primeiro como\n\"escutá-los\". Isto pode ser conseguido através do método addEventListener .

\n

A sintaxe é muito simples:

\n
  elemento_que_escuta.addEventListener('evento', funcao_para_escutar);\n
\n

Aqui um link de referência.

\n

Existem diferentes formas de associar um evento a elementos do DOM. Para saber\nmais visite este\nlink\n(a partir de 6.2).

\n

Tratamento de eventos

\n

Além de adicionar o listener ao evento, ele também pode ser eliminado usando o\nmétodo removeEventListener , que funciona quase da mesma maneira. A sintaxe\né a seguinte:

\n
  elemento_que_escuta.removeEventListener('evento', funcao_para_remover);\n
\n

Para que o método funcione corretamente, é obrigatório enviar como parâmetro o\nretorno de chamada (função) usado com addEventListener.

\n

Agora vamos falar sobre objectEvent, que é outra questão importante no\ntratamento de eventos. Quando um evento ocorre, a função que será executada\nprecisa de informações adicionais sobre ele.

\n

objectEvent é o objeto que representa o evento que ocorreu. É criado\nautomaticamente quando o evento ocorre e é destruído quando sua função de\ngerenciamento é executada. Este objeto tem um conjunto de propriedades com\ninformações sobre o evento. No código a seguir, você encontrará um exemplo.

\n
function olaMundo(event){\n  const evento = window.event || event;\n  alert('Olá Mundo.');\n}\n\nconst botao = document.getElementById('botao');\nbotao.addEventListener('click', olaMundo, false);\n
\n

Às vezes é necessário evitar certos comportamentos que um evento tem por padrão.\nPara isso existe preventDefault. Aqui está um exemplo:

\n
\n

Este é o código para um formulário muito simples Há um input para inserir o\nnome e outro para inserir o sobrenome. Finalmente, há um input do tipo\nsubmit (botão de envio)

\n
\n
<form>\n  <div>\n    <label for=\"fname\">First name: </label>\n    <input id=\"fname\" type=\"text\">\n  </div>\n  <div>\n    <label for=\"lname\">Last name: </label>\n    <input id=\"lname\" type=\"text\">\n  </div>\n  <div>\n     <input id=\"submit\" type=\"submit\">\n  </div>\n</form>\n<p></p>\n
\n
\n

Agora vejamos a funcionalidade JS: Na primeira parte são armazenados em\nvariáveis os elementos do formulário. Em seguida, temos a função que dispara o\nevento submit. Esta função verifica se os campos estão vazios. Se a condição\nse cumpre a função executa preventDefault para eventObject (e) impedindo\nque o formulário seja enviado automaticamente (ação que tem por padrão este\ntipo de \"botão\") para mostrar ao usuário uma mensagem de erro.

\n
\n
const form = document.querySelector('form');\nconst fname = document.getElementById('fname');\nconst lname = document.getElementById('lname');\nconst submit = document.getElementById('submit');\nconst para = document.querySelector('p');\n\nform.onsubmit = function(e) {\n  if (fname.value === '' || lname.value === '') {\n    e.preventDefault();\n    para.textContent = 'You need to fill in both names!';\n  }\n}\n
\n

Fluxo de Eventos (Propagação)

\n

Quando um evento é executado, ele passa por diferentes fases: Capture phase,\nTarget phase e Bubbling phase , conforme mostrado na imagem a seguir.

\n

\"flow-event\"

\n

A seguir, um vídeo que te explicará com um exemplo o fluxo que seguem os\neventos:

\n

\n

Tipo de eventos

\n

Quando o usuário interage com o navegador, vários tipos de eventos podem ser\nacionados. Alguns dos mais comuns são:

\n\n

Para mais informações sobre todos os eventos, acesse este\nlink.

\n

Principais eventos

\n

Estes são alguns dos eventos mais usados:

\n\n

Aqui você pode encontrar um\nexemplo sobre interação com eventos.

\n
\n

Guia de uso:

\n
    \n
  1. Observe como o fundo é branco
  2. \n
  3. Agora clique no botão Make magic :)
  4. \n
  5. Verifique o código e analise a lógica de programação
  6. \n
  7. Agora tente modificar o código para que ele reaja com outros eventos,\ndivirta-se;)
  8. \n
\n
\n

Finalmente, anexamos o\nlink da documentação\noficial explicando tudo sobre os eventos:

" } } }, @@ -167,11 +167,11 @@ "intl": { "es": { "title": "Atributos data", - "body": "

Objetivos de Aprendizaje

\n

En esta unidad aprenderemos a profundidad:

\n\n
\n

¿Qué son los atributos data?

\n

Son atributos personalizados que nos permiten añadir datos a nuestros elementos\nHTML, que no necesariamente son visibles pero que nos ayudan mucho al momento\nde dar información adicional de dichos elementos.

\n

¿Cómo se usan?

\n

Usarlos es muy fácil, ya que su sintaxis e interacción es sencilla.

\n

Sintaxis

\n

Se compone de un prefijo data- acompañado del nombre (en minúsculas) que\nconsideremos más apropiado para el valor que va a guardar:

\n
<elemento id=\"ejemplo\" data-nombre=\"valor\" data-otro-nombre=\"otro valor\">\n
\n

Interacción con JavaScript

\n

Para poder acceder a estos atributos hacemos uso del método dataset.

\n
const ejemplo = document.getElementById(\"ejemplo\");\nconst valor = ejemplo.dataset.nombre;\nconst otroValor = ejemplo.dataset.otroNombre;\n
\n

En este link podemos\nencontrar información más detallada acerca de esto que acabamos de leer.

\n
\n

Y ahora ¿qué sigue?

\n

Ya que tenemos una noción de qué son y el cómo se usan los atributos data, qué\nte parece si vemos el siguiente video en el que se muestra un ejercicio\nhaciendo uso de éstos.

\n

\"Atributos

\n

Para leer más acerca de los atributos data, revisa este link\ny este otro link.

" + "body": "

Objetivos de Aprendizaje

\n

En esta unidad aprenderemos a profundidad:

\n\n
\n

¿Qué son los atributos data?

\n

Son atributos personalizados que nos permiten añadir datos a nuestros elementos\nHTML, que no necesariamente son visibles pero que nos ayudan mucho al momento\nde dar información adicional de dichos elementos.

\n

¿Cómo se usan?

\n

Usarlos es muy fácil, ya que su sintaxis e interacción es sencilla.

\n

Sintaxis

\n

Se compone de un prefijo data- acompañado del nombre (en minúsculas) que\nconsideremos más apropiado para el valor que va a guardar:

\n
<elemento id=\"ejemplo\" data-nombre=\"valor\" data-otro-nombre=\"otro valor\">\n
\n

Interacción con JavaScript

\n

Para poder acceder a estos atributos hacemos uso del método dataset.

\n
const ejemplo = document.getElementById(\"ejemplo\");\nconst valor = ejemplo.dataset.nombre;\nconst otroValor = ejemplo.dataset.otroNombre;\n
\n

En este link podemos\nencontrar información más detallada acerca de esto que acabamos de leer.

\n
\n

Y ahora ¿qué sigue?

\n

Ya que tenemos una noción de qué son y el cómo se usan los atributos data, qué\nte parece si vemos el siguiente video en el que se muestra un ejercicio\nhaciendo uso de éstos.

\n

\n

Para leer más acerca de los atributos data, revisa este link\ny este otro link.

" }, "pt": { "title": "Atributos de dados", - "body": "

Objetivos de Aprendizagem

\n

Nesta unidade aprenderemos em profundidade:

\n\n
\n

O que são os atributos de dados?

\n

Eles são atributos personalizados que nos permitem adicionar dados aos nossos\nelementos HTML, que não são necessariamente visíveis, mas que nos ajudam muito\nao fornecer informações adicionais sobre esses elementos.

\n

Como eles são usados?

\n

Usá-los é muito fácil, já que sua sintaxe e interação são simples.

\n

Sintaxe

\n

Consiste em um prefixo data- acompanhado do nome (em letras minúsculas)\nque consideramos mais apropriado para o valor que você irá salvar:

\n
<elemento id=\"exemplo\" data-nome=\"valor\" data-outro-nome=\"outro valor\">\n
\n

Interação com JavaScript

\n

Para acessar esses atributos, usamos o método dataset.

\n
  const exemplo = document.getElementById(\"exemplo\");\n  const valor = exemplo.dataset.nome;\n  const outroValor = exemplo.dataset.outroNome;\n
\n

E o que vem agora?

\n

Como temos uma noção do que são e como os atributos de dados são usados, o que\nvocê acha de vermos o vídeo a seguir, no qual um exercício é mostrado fazendo\nuso deles.

\n

\"Atributos

\n

Para ler mais sobre os atributos de dados, verifique este\nlink\ne este outro link.

" + "body": "

Objetivos de Aprendizagem

\n

Nesta unidade aprenderemos em profundidade:

\n\n
\n

O que são os atributos de dados?

\n

Eles são atributos personalizados que nos permitem adicionar dados aos nossos\nelementos HTML, que não são necessariamente visíveis, mas que nos ajudam muito\nao fornecer informações adicionais sobre esses elementos.

\n

Como eles são usados?

\n

Usá-los é muito fácil, já que sua sintaxe e interação são simples.

\n

Sintaxe

\n

Consiste em um prefixo data- acompanhado do nome (em letras minúsculas)\nque consideramos mais apropriado para o valor que você irá salvar:

\n
<elemento id=\"exemplo\" data-nome=\"valor\" data-outro-nome=\"outro valor\">\n
\n

Interação com JavaScript

\n

Para acessar esses atributos, usamos o método dataset.

\n
  const exemplo = document.getElementById(\"exemplo\");\n  const valor = exemplo.dataset.nome;\n  const outroValor = exemplo.dataset.outroNome;\n
\n

E o que vem agora?

\n

Como temos uma noção do que são e como os atributos de dados são usados, o que\nvocê acha de vermos o vídeo a seguir, no qual um exercício é mostrado fazendo\nuso deles.

\n

\n

Para ler mais sobre os atributos de dados, verifique este\nlink\ne este outro link.

" } } }, @@ -183,11 +183,11 @@ "intl": { "es": { "title": "Casos prácticos (videos)", - "body": "

Objetivos

\n\n
\n

Enunciados

\n

Al igual que hemos hecho antes, es hora de aplicar los conceptos aprendidos\npara resolver problemas.

\n

A continuación tendrás varios problemas que debes resolver. Intenta\nresolverlos primero por tu cuenta. Más abajo encontrarás las soluciones.

\n

Después de haberlo intentado, compara tus soluciones con los videos de abajo.

\n

NO antes.

\n

1. Reserva de puestos aerolínea

\n

Una pequeña aerolínea acaba de comprar una computadora para su nuevo sistema\nde reservaciones automatizadas. Se te ha pedido que desarrolles el nuevo\nsistema. Escribirás una aplicación para asignar asientos en cada vuelo del\núnico avión de la aerolínea (capacidad: 10 asientos).

\n

\"GitHub

\n

Tu aplicación debe mostrar las siguientes alternativas:

\n

Por favor escriba 1 para Primera Clase y Por favor escriba 2 para Económico.

\n

\"GitHub

\n

Si el usuario escribe 1, tu aplicación debe asignarle un asiento en la\nsección de primera clase (asientos 1 a 4). Si el usuario escribe 2, tu\naplicación debe asignarle un asiento en la sección económica\n(asientos 5 a 10).

\n

Tu aplicación deberá entonces imprimir un pase de abordar, indicando el\nnúmero de asiento de la persona y si se encuentra en la sección de primera\nclase o clase económica.

\n

\"GitHub

\n

Tips para la solución

\n

A continuación, encontrarás tips que podrían ayudarte con la solución, ¡mucha suerte!

\n

[Tip. | Diagrama de flujo]

\n

\"GitHub

\n

[Tip. | Representación usando Arrays]

\n

Usa un arreglo unidimensional del tipo booleano para representar la tabla de\nasientos del avión. Inicializa todos los elementos del arreglo con -false-\npara indicar que todos los asientos están vacíos. A medida que se asigne cada\nasiento, establezca el elemento correspondiente del arreglo en true para\nindicar que ese asiento ya no está disponible.

\n

Tu aplicación nunca deberá asignar un asiento que ya haya sido asignado.\nCuando esté llena la sección económica o primera clase, tu programa deberá\npreguntar a la persona si acepta ser colocada en la sección de primera clase\n(y viceversa).

\n

\"GitHub

\n

Si la persona acepta, haga la asignación de asiento apropiada.

\n

Si no, debe imprimir el mensaje “El próximo vuelo sale en 3 horas”.

\n

\"GitHub

\n

2. Buscaminas

\n

El juego de buscaminas funciona de la siguiente forma:

\n

Se muestra una tabla donde se encuentran celdas vacías, con número o con minas.\nEn caso de oprimir una mina entonces el juego termina, si se oprimen lugares\nsin minas (vacía o de número), el juego continúa.

\n

\"Buscaminas\"

\n

Preguntas guía

\n\n

Requerimientos

\n\n
Puntos extra
\n\n

3. Crear un menú de hamburguesa

\n

Un menú de hamburguesa nos permite tener escondido el menú y únicamente mostrar\nun botón (3 líneas horizontales) que cuando lo apretamos (o hacemos click), se\nmuestra en la pantalla todas las opciones del menú.

\n

Algo así:

\n

\"Hamburger

\n

Replicar esa funcionalidad usando DOM y CSS. (No agregar efectos \"bonitos\",\núnicamente enfocarse en funcionalidad)

\n

4. Crear tabs

\n

Las tabs nos sirven para agrupar contenido similar usando solo un espacio.

\n

Algo así:

\n

\"Tabs

\n

Replicar esa funcionalidad usando DOM y CSS. (No agregar efectos \"bonitos\",\núnicamente enfocarse en funcionalidad)

\n

5. Crear un menú drop down

\n

El menú drop down nos ayuda a ahorrar espacio en un menú, ya que agrupa\nelementos similares.

\n

Algo así:

\n

\"Drop

\n

6. Mini Zoo

\n

Esta página permite elegir efectos como sepia, blanco y negro e\ninvertir colores que deseamos que obtengan nuestras imágenes.\nDeberás replicarla usando DOM y CSS.

\n

Veamos como debe quedar la página...\n\"Mini

\n

Solucionarios

\n

A continuación Silvana, Meme, Amalia, Karla e Inti te explican cómo resolvieron\ncada uno de los ejercicios anteriores.

\n

1. Aerolínea

\n

\"Solución

\n

2. Buscaminas

\n

\"Solución

\n

3. Menú de Hamburguesa

\n

\"Solución

\n

4. Tabs

\n

\"Solución

\n

5. Menú dropdown

\n

\"Solución

\n

6. Mini Zoo

\n

https://docs.google.com/presentation/d/1LM2RPWTuo2SmrWT6nId2UrLyK5IXGeBQ_dMG_VN_FFw/edit#slide=id.g1554294399_1_0

" + "body": "

Objetivos

\n\n
\n

Enunciados

\n

Al igual que hemos hecho antes, es hora de aplicar los conceptos aprendidos\npara resolver problemas.

\n

A continuación tendrás varios problemas que debes resolver. Intenta\nresolverlos primero por tu cuenta. Más abajo encontrarás las soluciones.

\n

Después de haberlo intentado, compara tus soluciones con los videos de abajo.

\n

NO antes.

\n

1. Reserva de puestos aerolínea

\n

Una pequeña aerolínea acaba de comprar una computadora para su nuevo sistema\nde reservaciones automatizadas. Se te ha pedido que desarrolles el nuevo\nsistema. Escribirás una aplicación para asignar asientos en cada vuelo del\núnico avión de la aerolínea (capacidad: 10 asientos).

\n

\"GitHub

\n

Tu aplicación debe mostrar las siguientes alternativas:

\n

Por favor escriba 1 para Primera Clase y Por favor escriba 2 para Económico.

\n

\"GitHub

\n

Si el usuario escribe 1, tu aplicación debe asignarle un asiento en la\nsección de primera clase (asientos 1 a 4). Si el usuario escribe 2, tu\naplicación debe asignarle un asiento en la sección económica\n(asientos 5 a 10).

\n

Tu aplicación deberá entonces imprimir un pase de abordar, indicando el\nnúmero de asiento de la persona y si se encuentra en la sección de primera\nclase o clase económica.

\n

\"GitHub

\n

Tips para la solución

\n

A continuación, encontrarás tips que podrían ayudarte con la solución, ¡mucha suerte!

\n

[Tip. | Diagrama de flujo]

\n

\"GitHub

\n

[Tip. | Representación usando Arrays]

\n

Usa un arreglo unidimensional del tipo booleano para representar la tabla de\nasientos del avión. Inicializa todos los elementos del arreglo con -false-\npara indicar que todos los asientos están vacíos. A medida que se asigne cada\nasiento, establezca el elemento correspondiente del arreglo en true para\nindicar que ese asiento ya no está disponible.

\n

Tu aplicación nunca deberá asignar un asiento que ya haya sido asignado.\nCuando esté llena la sección económica o primera clase, tu programa deberá\npreguntar a la persona si acepta ser colocada en la sección de primera clase\n(y viceversa).

\n

\"GitHub

\n

Si la persona acepta, haga la asignación de asiento apropiada.

\n

Si no, debe imprimir el mensaje “El próximo vuelo sale en 3 horas”.

\n

\"GitHub

\n

2. Buscaminas

\n

El juego de buscaminas funciona de la siguiente forma:

\n

Se muestra una tabla donde se encuentran celdas vacías, con número o con minas.\nEn caso de oprimir una mina entonces el juego termina, si se oprimen lugares\nsin minas (vacía o de número), el juego continúa.

\n

\"Buscaminas\"

\n

Preguntas guía

\n\n

Requerimientos

\n\n
Puntos extra
\n\n

3. Crear un menú de hamburguesa

\n

Un menú de hamburguesa nos permite tener escondido el menú y únicamente mostrar\nun botón (3 líneas horizontales) que cuando lo apretamos (o hacemos click), se\nmuestra en la pantalla todas las opciones del menú.

\n

Algo así:

\n

\"Hamburger

\n

Replicar esa funcionalidad usando DOM y CSS. (No agregar efectos \"bonitos\",\núnicamente enfocarse en funcionalidad)

\n

4. Crear tabs

\n

Las tabs nos sirven para agrupar contenido similar usando solo un espacio.

\n

Algo así:

\n

\"Tabs

\n

Replicar esa funcionalidad usando DOM y CSS. (No agregar efectos \"bonitos\",\núnicamente enfocarse en funcionalidad)

\n

5. Crear un menú drop down

\n

El menú drop down nos ayuda a ahorrar espacio en un menú, ya que agrupa\nelementos similares.

\n

Algo así:

\n

\"Drop

\n

6. Mini Zoo

\n

Esta página permite elegir efectos como sepia, blanco y negro e\ninvertir colores que deseamos que obtengan nuestras imágenes.\nDeberás replicarla usando DOM y CSS.

\n

Veamos como debe quedar la página...\n\"Mini

\n

Solucionarios

\n

A continuación Silvana, Meme, Amalia, Karla e Inti te explican cómo resolvieron\ncada uno de los ejercicios anteriores.

\n

1. Aerolínea

\n

\n

2. Buscaminas

\n

\n

3. Menú de Hamburguesa

\n

\n

4. Tabs

\n

\n

5. Menú dropdown

\n

\n

6. Mini Zoo

\n

https://docs.google.com/presentation/d/1LM2RPWTuo2SmrWT6nId2UrLyK5IXGeBQ_dMG_VN_FFw/edit#slide=id.g1554294399_1_0

" }, "pt": { "title": "Exercícios Livres", - "body": "

Objetivos

\n\n
\n

Enunciados

\n

Como já fizemos antes, é hora de aplicar os conceitos aprendidos para resolver\nproblemas.

\n

A seguir, você terá vários problemas que deverá resolver. Tente resolvê-los\nprimeiro por conta própria. Abaixo você encontrará as soluções.

\n

Depois de tentar, compare suas soluções com os vídeos abaixo.

\n

NÃO antes.

\n

1. Reserva de assentos de avião

\n

Uma pequena companhia aérea acaba de comprar um computador para seu novo sistema\nde reservas automatizado. Você foi solicitada a desenvolver o novo sistema.\nEscreva uma aplicação para atribuir assentos em cada voo do único avião da\ncompanhia (capacidade: 10 assentos).

\n

\"Avião\"

\n

Sua aplicação deve mostrar as seguintes alternativas:

\n

Por favor, digite 1 para Primeira Classe e Por favor, digite 2 para Econômica.

\n

\"Avião\"

\n

Se o usuário digitar 1, seu aplicativo deve atribuir um lugar na seção de\nprimeira classe (assentos 1 a 4). Se o usuário digitar 2, sua aplicação deve\natribuir um assento na seção econômica (assentos 5 a 10).

\n

A sua aplicação deverá então imprimir um cartão de embarque, indicando o número\ndo lugar da pessoa e se está na primeira classe ou na classe econômica.

\n

\"Avião\"

\n

Dicas para a solução

\n

Abaixo, você encontrará dicas que poderão ajudá-la com a solução, boa sorte!

\n

[Dica | Diagrama de fluxo]

\n

\"Fluxo\"

\n

[Dica | Representação usando Arrays]

\n

Use uma matriz unidimensional do tipo booleano para representar a tabela de\nassentos do avião. Inicialize todos os elementos do array com -false- para\nindicar que todos os lugares estão vazios. À medida que cada lugar é atribuído,\ndefina o elemento correspondente da matriz como true para indicar que esse lugar\nnão está mais disponível.

\n

Seu aplicativo nunca deverá atribuir um lugar que já tenha sido atribuído.\nQuando a seção econômica ou a primeira classe estiver cheia, seu programa deve\nperguntar à pessoa se ela concorda em ser colocada na primeira classe (e\nvice-versa).

\n

\"Avião\"

\n

Se a pessoa aceitar, faça a atribuição de lugar apropriada.

\n

Se não, você deve exibir a mensagem \"O próximo vôo sai em 3 horas\".

\n

\"Avião\"

\n

2. Crie um menu de hambúrguer

\n

Um menu de hambúrguer nos permite ter o menu escondido e mostrar apenas um botão\n(3 linhas horizontais) que quando pressionamos (ou clicamos), todas as\nopções de menu são mostradas na tela.

\n

Algo assim:

\n

\"Menu\nhamburger\"

\n

Replicar essa funcionalidade usando DOM e CSS. (Não adicione efeitos \"legais\",\napenas foque na funcionalidade)

\n

3. Criação de tabs

\n

As abas são usadas para agrupar conteúdo semelhante usando apenas um espaço.

\n

Algo assim:

\n

\"Menu

\n

Replicar essa funcionalidade usando DOM e CSS. (Não adicione efeitos \"legais\",\napenas foque na funcionalidade)

\n

4. Mini Zoo

\n

Esta página permite eleger efeitos como sepia, branco e preto e\ninverter cores que desejamos que nossas imagens tenham.\nVocê deverá replicar usando DOM e CSS.

\n

Veja como a página deve ficar:\n\"Mini\nZoo\"

\n

Soluções

\n

A seguir a equipe te explica como ela resolveu cada um dos exercícios.

\n

1. Reserva de assentos de avião

\n

\"Reserva

\n

2. Crie um menu de hambúrguer

\n

\"Menu\nHambúrguer\"

\n

3. Criação de tabs

\n

\"Menu\nTabs\"

\n

4. Mini Zoo

\n

\"Mini\nZoo\"

" + "body": "

Objetivos

\n\n
\n

Enunciados

\n

Como já fizemos antes, é hora de aplicar os conceitos aprendidos para resolver\nproblemas.

\n

A seguir, você terá vários problemas que deverá resolver. Tente resolvê-los\nprimeiro por conta própria. Abaixo você encontrará as soluções.

\n

Depois de tentar, compare suas soluções com os vídeos abaixo.

\n

NÃO antes.

\n

1. Reserva de assentos de avião

\n

Uma pequena companhia aérea acaba de comprar um computador para seu novo sistema\nde reservas automatizado. Você foi solicitada a desenvolver o novo sistema.\nEscreva uma aplicação para atribuir assentos em cada voo do único avião da\ncompanhia (capacidade: 10 assentos).

\n

\"Avião\"

\n

Sua aplicação deve mostrar as seguintes alternativas:

\n

Por favor, digite 1 para Primeira Classe e Por favor, digite 2 para Econômica.

\n

\"Avião\"

\n

Se o usuário digitar 1, seu aplicativo deve atribuir um lugar na seção de\nprimeira classe (assentos 1 a 4). Se o usuário digitar 2, sua aplicação deve\natribuir um assento na seção econômica (assentos 5 a 10).

\n

A sua aplicação deverá então imprimir um cartão de embarque, indicando o número\ndo lugar da pessoa e se está na primeira classe ou na classe econômica.

\n

\"Avião\"

\n

Dicas para a solução

\n

Abaixo, você encontrará dicas que poderão ajudá-la com a solução, boa sorte!

\n

[Dica | Diagrama de fluxo]

\n

\"Fluxo\"

\n

[Dica | Representação usando Arrays]

\n

Use uma matriz unidimensional do tipo booleano para representar a tabela de\nassentos do avião. Inicialize todos os elementos do array com -false- para\nindicar que todos os lugares estão vazios. À medida que cada lugar é atribuído,\ndefina o elemento correspondente da matriz como true para indicar que esse lugar\nnão está mais disponível.

\n

Seu aplicativo nunca deverá atribuir um lugar que já tenha sido atribuído.\nQuando a seção econômica ou a primeira classe estiver cheia, seu programa deve\nperguntar à pessoa se ela concorda em ser colocada na primeira classe (e\nvice-versa).

\n

\"Avião\"

\n

Se a pessoa aceitar, faça a atribuição de lugar apropriada.

\n

Se não, você deve exibir a mensagem \"O próximo vôo sai em 3 horas\".

\n

\"Avião\"

\n

2. Crie um menu de hambúrguer

\n

Um menu de hambúrguer nos permite ter o menu escondido e mostrar apenas um botão\n(3 linhas horizontais) que quando pressionamos (ou clicamos), todas as\nopções de menu são mostradas na tela.

\n

Algo assim:

\n

\"Menu\nhamburger\"

\n

Replicar essa funcionalidade usando DOM e CSS. (Não adicione efeitos \"legais\",\napenas foque na funcionalidade)

\n

3. Criação de tabs

\n

As abas são usadas para agrupar conteúdo semelhante usando apenas um espaço.

\n

Algo assim:

\n

\"Menu

\n

Replicar essa funcionalidade usando DOM e CSS. (Não adicione efeitos \"legais\",\napenas foque na funcionalidade)

\n

4. Mini Zoo

\n

Esta página permite eleger efeitos como sepia, branco e preto e\ninverter cores que desejamos que nossas imagens tenham.\nVocê deverá replicar usando DOM e CSS.

\n

Veja como a página deve ficar:\n\"Mini\nZoo\"

\n

Soluções

\n

A seguir a equipe te explica como ela resolveu cada um dos exercícios.

\n

1. Reserva de assentos de avião

\n

\n

2. Crie um menu de hambúrguer

\n

\n

3. Criação de tabs

\n

\n

4. Mini Zoo

\n

" } } }, @@ -199,7 +199,7 @@ "intl": { "es": { "title": "Clase Práctica", - "body": "

Objetivos

\n\n
\n

Enunciados

\n

A continuación tienes más problemas de práctica.

\n

1. Tic Tac Toe

\n

Crea una página web que implemente el juego Tic Tac Toe (también conocido como\ngato, michi, tres en línea, etc). Este es un divertido juego entre dos jugadores\nX y O, quienes marcan los espacios de un tablero 3x3 alternadamente,\nel ganador es quien primero consigue tener una línea horizontal, vertical o\ndiagonal de 3 espacios consecutivos con su elemento.\nPara esto deberás crear el tablero directamente en el archivo html y la\nfuncionalidad se desarrollará mediante uso del DOM.

\n

Para desarrollar el juego debemos tener en cuenta ciertos puntos:

\n
    \n
  1. Debes contar con un botón RESET para limpiar el tablero y comenzar a\njugar desde cero.
  2. \n
  3. Bajo el tablero deberás indicar, al finalizar, qué elemento fue el ganador\no si se produjo un empate.
  4. \n
  5. Deben poder participar ambos jugadores, por ejemplo: el primer click\ncorresponde al elemento X y el siguiente click automáticamente\ncorresponde al elemento O, pudiendo así alternarse ambos turnos.
  6. \n
\n

\"Tic

\n

2. Creando animación en el DOM

\n

Necesitamos generar 12 cuadros blancos en filas de 3. Uno de esos cuadros\nserá de un color diferente. Necesitamos mover ese cuadro a través de los\ncuadros blancos usando las flechas del teclado.

\n

En el siguiente video explicamos un poco más el ejercicio:

\n

\"Animación

\n

3. Freelancer v2

\n

¿Recuerdas el reto de código de Freelancer?\nAhora, nos enfocaremos en replicar la funcionalidad de la sección de Portfolio\nque es el modal al dar click sobre cada una de las imágenes. Debe quedar como\nen la siguiente imagen:

\n

\"Freelancer

\n

4. Nuestras Coders v2

\n

¿Recuerdas el ejercicio guíado de Nuestras Coders?\nAhora agregaremos un filtro para seleccionar a las coders dependiendo de su sede.\nAl final, deberá quedarte algo así:

\n

\"Nuestras

\n

5. Captcha

\n

En la vida diaria usamos servicios que generan el CAPTCHA.\nEl más usado es el de Google, puedes encontrar su documentación aquí.\nEstos CAPTCHA tienen como objetivo final poder identificar si eres o no un\nhumano y van cambiando conforme avanza la tecnología.

\n

Inicialmente consistía en un conjunto de imágenes que el usuario debía\ndeterminar el contenido de las mismas e indicarlo al sistema. Hoy en día\nevalúan tu comportamiento en el navegador, y de tener dudas te pide evaluar un\nconjunto de imágenes mucho más grande.

\n

Armaremos un Captcha (tal cual se muestra en el diseño de abajo), este\ncomprobará que el usuario escriba lo mismo que el Captcha que le\nproporcionaremos. El valor ingresado se evaluará al momento de que el usuario\nhaga clic en el símbolo y se generará otro código cuando el usuario haga\nclic en el símbolo .

\n

Dato: Genera los números y letras de manera random

\n\n

\"Captcha\"

" + "body": "

Objetivos

\n\n
\n

Enunciados

\n

A continuación tienes más problemas de práctica.

\n

1. Tic Tac Toe

\n

Crea una página web que implemente el juego Tic Tac Toe (también conocido como\ngato, michi, tres en línea, etc). Este es un divertido juego entre dos jugadores\nX y O, quienes marcan los espacios de un tablero 3x3 alternadamente,\nel ganador es quien primero consigue tener una línea horizontal, vertical o\ndiagonal de 3 espacios consecutivos con su elemento.\nPara esto deberás crear el tablero directamente en el archivo html y la\nfuncionalidad se desarrollará mediante uso del DOM.

\n

Para desarrollar el juego debemos tener en cuenta ciertos puntos:

\n
    \n
  1. Debes contar con un botón RESET para limpiar el tablero y comenzar a\njugar desde cero.
  2. \n
  3. Bajo el tablero deberás indicar, al finalizar, qué elemento fue el ganador\no si se produjo un empate.
  4. \n
  5. Deben poder participar ambos jugadores, por ejemplo: el primer click\ncorresponde al elemento X y el siguiente click automáticamente\ncorresponde al elemento O, pudiendo así alternarse ambos turnos.
  6. \n
\n

\"Tic

\n

2. Creando animación en el DOM

\n

Necesitamos generar 12 cuadros blancos en filas de 3. Uno de esos cuadros\nserá de un color diferente. Necesitamos mover ese cuadro a través de los\ncuadros blancos usando las flechas del teclado.

\n

En el siguiente video explicamos un poco más el ejercicio:

\n

\n

3. Freelancer v2

\n

¿Recuerdas el reto de código de Freelancer?\nAhora, nos enfocaremos en replicar la funcionalidad de la sección de Portfolio\nque es el modal al dar click sobre cada una de las imágenes. Debe quedar como\nen la siguiente imagen:

\n

\"Freelancer

\n

4. Nuestras Coders v2

\n

¿Recuerdas el ejercicio guíado de Nuestras Coders?\nAhora agregaremos un filtro para seleccionar a las coders dependiendo de su sede.\nAl final, deberá quedarte algo así:

\n

\"Nuestras

\n

5. Captcha

\n

En la vida diaria usamos servicios que generan el CAPTCHA.\nEl más usado es el de Google, puedes encontrar su documentación aquí.\nEstos CAPTCHA tienen como objetivo final poder identificar si eres o no un\nhumano y van cambiando conforme avanza la tecnología.

\n

Inicialmente consistía en un conjunto de imágenes que el usuario debía\ndeterminar el contenido de las mismas e indicarlo al sistema. Hoy en día\nevalúan tu comportamiento en el navegador, y de tener dudas te pide evaluar un\nconjunto de imágenes mucho más grande.

\n

Armaremos un Captcha (tal cual se muestra en el diseño de abajo), este\ncomprobará que el usuario escriba lo mismo que el Captcha que le\nproporcionaremos. El valor ingresado se evaluará al momento de que el usuario\nhaga clic en el símbolo y se generará otro código cuando el usuario haga\nclic en el símbolo .

\n

Dato: Genera los números y letras de manera random

\n\n

\"Captcha\"

" }, "pt": { "title": "Aula Prática", @@ -263,7 +263,7 @@ "intl": { "es": { "title": "Opening", - "body": "

Objetivos de Aprendizaje

\n\n

HTML5 y la magia de sus APIs

\n

Anteriormente, nos enteramos que HTML5 viene con un conjunto de APIs, vamos\na entrar un poco en contexto con la siguiente diapositiva:

\n
\n

Entonces, ¿qué es una API?

\n

Una interfaz de programación de aplicaciones es una colección de instrucciones\ny estándares de programación para acceder a una aplicación de software. Con\nuna API, es posible diseñar productos basados en el servicio que proporciona\nla API.

\n

HTML5 tiene varias APIs nuevas. Por ejemplo:

\n\n

Este texto es un extracto del blog publicado en IBM\npor Grace Walker.

\n
\n

¿Qué APIs veremos en esta unidad?

\n

En esta unidad nos enfocaremos en 4 APIs del navegador, pero no será una\nlimitante, lo que verás te dará una base para enfrentarte al variado universo\nde APIs que HTML5 trae consigo. Las APIs que revisaremos son Media, Web\nStorage, Geolocation y Drag and Drop.

\n

¿Quieres saber qué APIs existen?

\n

En el sitio de html5index.org puedes encontrar la lista\nde HTML5 JavaScript APIs con algunos recursos para que puedas obtener mayor\ninformación. Como te darás cuenta, hay muchas de estas APIs y cubrirlas todas\nno sería posible, pero te sugerimos que no solo revises las que verás a\ncontinuación.

\n

Guía de preguntas y conceptos clave

\n

Cuando empezamos a estudiar un tema nuevo, es útil tener una idea de los\nconceptos más importantes de lo que vamos a aprender y de los temas centrales\nque debemos prestar particular atención.

\n

A continuación te presentamos una serie de preguntas que debes ser capaz de\nresponder al terminar esta unidad. Utiliza estas preguntas como guía para\norientar tus esfuerzos de aprendizaje. Regresa a ellas constantemente a\nmedida que avanzas para validar que estás avanzando en la dirección correcta.\nQue te sirva como un \"checklist\" que vas marcando a medida que vas progresando.

\n" + "body": "

Objetivos de Aprendizaje

\n\n

HTML5 y la magia de sus APIs

\n

Anteriormente, nos enteramos que HTML5 viene con un conjunto de APIs, vamos\na entrar un poco en contexto con la siguiente diapositiva:

\n\n
\n

Entonces, ¿qué es una API?

\n

Una interfaz de programación de aplicaciones es una colección de instrucciones\ny estándares de programación para acceder a una aplicación de software. Con\nuna API, es posible diseñar productos basados en el servicio que proporciona\nla API.

\n

HTML5 tiene varias APIs nuevas. Por ejemplo:

\n\n

Este texto es un extracto del blog publicado en IBM\npor Grace Walker.

\n
\n

¿Qué APIs veremos en esta unidad?

\n

En esta unidad nos enfocaremos en 4 APIs del navegador, pero no será una\nlimitante, lo que verás te dará una base para enfrentarte al variado universo\nde APIs que HTML5 trae consigo. Las APIs que revisaremos son Media, Web\nStorage, Geolocation y Drag and Drop.

\n

¿Quieres saber qué APIs existen?

\n

En el sitio de html5index.org puedes encontrar la lista\nde HTML5 JavaScript APIs con algunos recursos para que puedas obtener mayor\ninformación. Como te darás cuenta, hay muchas de estas APIs y cubrirlas todas\nno sería posible, pero te sugerimos que no solo revises las que verás a\ncontinuación.

\n

Guía de preguntas y conceptos clave

\n

Cuando empezamos a estudiar un tema nuevo, es útil tener una idea de los\nconceptos más importantes de lo que vamos a aprender y de los temas centrales\nque debemos prestar particular atención.

\n

A continuación te presentamos una serie de preguntas que debes ser capaz de\nresponder al terminar esta unidad. Utiliza estas preguntas como guía para\norientar tus esfuerzos de aprendizaje. Regresa a ellas constantemente a\nmedida que avanzas para validar que estás avanzando en la dirección correcta.\nQue te sirva como un \"checklist\" que vas marcando a medida que vas progresando.

\n" }, "pt": { "title": "Opening", @@ -279,11 +279,11 @@ "intl": { "es": { "title": "Media: Audio & Video", - "body": "

Objetivos de Aprendizaje

\n

Aprender a grandes rasgos cómo usar el API de Audio y Video.

\n

Audio y video en la web

\n
\n

Lxs desarrolladorxs web han querido usar video y audio desde hace mucho tiempo,\na inicio de los 2000, cuando empezamos a tener un ancho de banda lo\nsuficientemente rápido para soportar cualquier tipo de video (los archivos de\nvideo son más grandes que texto o incluso imágenes). Al principio, las\ntecnologías web nativas como HTML no tenían la habilidad para embeber video o\naudio en la web, así que tecnologías propietarias (o basadas en plugins) como\nFlash (y posteriormente Silverlight) se volvieron muy populares para manejar\neste tipo de contenido. Estas tecnologías funcionaron bien, pero tenían un gran\nnúmero de problemas, incluyendo que no funcionaban bien con HTML/CSS, seguridad\ny problemas de accesibilidad.

\n

Una solución nativa resolvería esto si se hiciera bien. Afortunadamente, unos\naños después, la especificación de HTML5 incluiría estos features con los\nelementos <video> y <audio>, y algunas JavaScript APIs para controlarlos.

\n
\n

Este es un extracto de la documentación de MDN\nsobre las etiquetas de audio y video, para entrar en contexto de lo genial que\nfue agregar soporte nativo desde HTML5 con su API de media.

\n

Insertando contenido multimedia a nuestra web

\n

Para insertar contenido multimedia en nuestra web, debemos usar las etiquetas\n<video> y <audio>. A continuación te mostramos unos ejemplos de cómo\ninsertarlos:

\n

¿Te diste cuenta de lo sencillo que es agregarlo? Bueno, adicional a esto,\ndebemos de tener en cuenta lo siguiente:

\n\n

¿Dónde encuentro la lista de atributos y formatos soportados?

\n

La W3Schools (uno de tus mejores amigos en este momento) tiene una serie de\nrecursos que te pueden ayudar a obtener esta información.

\n\n

¿Y cómo interactúo con la API?

\n

Interactuamos a través de la interfaz HTMLMediaElement, ésta agrega las\npropiedades y métodos necesarios para soportar capacidades básicas relacionados\na elementos multimedia (audio y video).

\n

Ejemplo:

\n

¿Cómo te imaginas que sería con el audio? ¿Básicamente lo mismo no? Esperamos lo\nintentes y veas el resultado.

\n

¿Y cómo sería con jQuery?

\n

Si bien jQuery nos permite manipular el DOM con mayor facilidad, no provee\nsoporte para HTMLMediaElements, y lo que nos queda por hacer es obtener el\nelemento del DOM usando el método .get y debido a que es un único elemento\n(por lo tanto, el primero), hacemos $video.get(0) para poder interactuar con\nel API de video. Otro detalle interesante a notar es que, al estar esperando que\nel DOM esté listo a través de $(document).ready no significa necesariamente\nque el video haya cargado como tal, por eso, para obtener la duración, fue\nnecesario agregar un evento que nos indique que los datos del video se han\nterminado de cargar (video.onloadeddata).

\n

Recursos

\n

Si deseas hacer una aplicación con audio y/o video, pero no se te ocurre de\ndónde obtener dicho audio y/o video, puedes obtener algunos gratuitos desde los\nsiguientes enlaces:

\n\n

Si en alguna no te deja descargar, recuerda que eres una desarrolladora web y\ntienes superpoderes para inspeccionar elementos y obtener los enlaces desde\ntu Dev Tools ;).

" + "body": "

Objetivos de Aprendizaje

\n

Aprender a grandes rasgos cómo usar el API de Audio y Video.

\n

Audio y video en la web

\n
\n

Lxs desarrolladorxs web han querido usar video y audio desde hace mucho tiempo,\na inicio de los 2000, cuando empezamos a tener un ancho de banda lo\nsuficientemente rápido para soportar cualquier tipo de video (los archivos de\nvideo son más grandes que texto o incluso imágenes). Al principio, las\ntecnologías web nativas como HTML no tenían la habilidad para embeber video o\naudio en la web, así que tecnologías propietarias (o basadas en plugins) como\nFlash (y posteriormente Silverlight) se volvieron muy populares para manejar\neste tipo de contenido. Estas tecnologías funcionaron bien, pero tenían un gran\nnúmero de problemas, incluyendo que no funcionaban bien con HTML/CSS, seguridad\ny problemas de accesibilidad.

\n

Una solución nativa resolvería esto si se hiciera bien. Afortunadamente, unos\naños después, la especificación de HTML5 incluiría estos features con los\nelementos <video> y <audio>, y algunas JavaScript APIs para controlarlos.

\n
\n

Este es un extracto de la documentación de MDN\nsobre las etiquetas de audio y video, para entrar en contexto de lo genial que\nfue agregar soporte nativo desde HTML5 con su API de media.

\n

Insertando contenido multimedia a nuestra web

\n

Para insertar contenido multimedia en nuestra web, debemos usar las etiquetas\n<video> y <audio>. A continuación te mostramos unos ejemplos de cómo\ninsertarlos:

\n\n See the Pen [Video Tag](https://codepen.io/ivandevp/pen/gvMPjW/) by Ivan\n ([@ivandevp](https://codepen.io/ivandevp)) on [CodePen](https://codepen.io).\n\n\n See the Pen [Audio Tag](https://codepen.io/ivandevp/pen/PQzNoE/) by Ivan\n ([@ivandevp](https://codepen.io/ivandevp)) on [CodePen](https://codepen.io).\n\n

¿Te diste cuenta de lo sencillo que es agregarlo? Bueno, adicional a esto,\ndebemos de tener en cuenta lo siguiente:

\n
    \n
  • Atributos, en los ejemplos la etiqueta video y audio cuentan con un atributo\ncontrols, ¿te imaginas qué pasa si se lo quitas?. Así como este atributo hay\nmuchos más, conforme vayas necesitando irás reconociendo qué otros existen.
  • \n
  • Soporte entre navegadores, si te diste cuenta, solo usamos un video con\nextensión .mp4 y un audio con extensión .mp3. No todos los navegadores\nsoportan el mismo formato, para garantizar que nuestro audio y/o video\nfuncione en cualquier formato, debemos de agregarlo nuestro recurso en\ndiversos formatos, eso lo logramos con la etiqueta <source>.
  • \n
\n

¿Dónde encuentro la lista de atributos y formatos soportados?

\n

La W3Schools (uno de tus mejores amigos en este momento) tiene una serie de\nrecursos que te pueden ayudar a obtener esta información.

\n
    \n
  • HTML <audio> Tag, aquí\npuedes encontrar la lista de atributos que soporta esta etiqueta y formatos\nde audio que cada navegador soporta.
  • \n
  • HTML <video> Tag, aquí\npuedes encontrar la lista de atributos que soporta esta etiqueta y formatos\nde video que cada navegador soporta.
  • \n
  • HTML Audio/Video DOM Reference,\nno olvidar que al ser etiquetas de HTML, éstas pueden ser manipuladas por el\nDOM, y por lo tanto cuentan con métodos y eventos que podemos utilizar. Esto\ntenlo como referencia, no es necesario que te memorices todo esto ahora mismo.
  • \n
\n

¿Y cómo interactúo con la API?

\n

Interactuamos a través de la interfaz HTMLMediaElement, ésta agrega las\npropiedades y métodos necesarios para soportar capacidades básicas relacionados\na elementos multimedia (audio y video).

\n

Ejemplo:

\n\n See the Pen [HTMLMediaElement JS](https://codepen.io/ivandevp/pen/KQMWMy/) by\n Ivan ([@ivandevp](https://codepen.io/ivandevp)) on [CodePen](https://codepen.io).\n\n

¿Cómo te imaginas que sería con el audio? ¿Básicamente lo mismo no? Esperamos lo\nintentes y veas el resultado.

\n

¿Y cómo sería con jQuery?

\n\n See the Pen [HTMLMediaElement jQuery](https://codepen.io/ivandevp/pen/XZKMjx/)\n by Ivan ([@ivandevp](https://codepen.io/ivandevp)) on\n [CodePen](https://codepen.io).\n\n

Si bien jQuery nos permite manipular el DOM con mayor facilidad, no provee\nsoporte para HTMLMediaElements, y lo que nos queda por hacer es obtener el\nelemento del DOM usando el método .get y debido a que es un único elemento\n(por lo tanto, el primero), hacemos $video.get(0) para poder interactuar con\nel API de video. Otro detalle interesante a notar es que, al estar esperando que\nel DOM esté listo a través de $(document).ready no significa necesariamente\nque el video haya cargado como tal, por eso, para obtener la duración, fue\nnecesario agregar un evento que nos indique que los datos del video se han\nterminado de cargar (video.onloadeddata).

\n

Recursos

\n

Si deseas hacer una aplicación con audio y/o video, pero no se te ocurre de\ndónde obtener dicho audio y/o video, puedes obtener algunos gratuitos desde los\nsiguientes enlaces:

\n\n

Si en alguna no te deja descargar, recuerda que eres una desarrolladora web y\ntienes superpoderes para inspeccionar elementos y obtener los enlaces desde\ntu Dev Tools ;).

" }, "pt": { "title": "Media: Áudio & Vídeo", - "body": "

Objetivos de Aprendizagem

\n

Aprender de forma geral como usar a API de Áudio e Vídeo.

\n

Áudio e vídeo na web

\n
\n

Os desenvolvedores web desejam usar áudio e vídeo há muito tempo, desde o\ninício dos anos 2000, quando começamos a ter uma largura de banda\nsuficientemente rápida para suportar qualquer tipo de vídeo (os arquivos de\nvídeo são maiores que textos ou imagens). No início, as tecnologias web\nnativas como HTML não possuíam as habilidade para incorporar vídeo ou áudio na\nweb, o que fez com que tecnologias proprietárias (ou baseadas em plugins) como\nFlash (e posteriormente Silverlight) se tornassem muito populares para\nmanipular esse tipo de conteúdo. Estas tecnologias funcionaram bem, mas\npossuíam um grande número de problemas, incluindo que não funcionavam bem com\nHTML/CSS, problemas de segurança e de acessibilidade.

\n

Uma solução nativa resolveria isto se fosse bem feita. Felizmente, alguns anos\ndepois, a especificação de HTML5 incluiria estas features com os elementos\n<video> e <audio> e algumas APIs JavaScript para controlá-los.

\n
\n

Este é um trecho da documentação de\nMDN\nsobre as tags de áudio e vídeo, para você entender o contexto de como foi\nimportante adicionar suporte nativo no HTML5 com sua API de mídia.

\n

Inserindo conteúdo multimídia na nossa página web

\n

Para inserir conteúdo multimídia em nossa web, devemos usar as tags <video>\ne <audio>. A seguir mostramos alguns exemplos de como inseri-los:

\n

Você percebeu como é fácil adicioná-los? Bem, além disso, devemos levar em\nconsideração o seguinte:

\n
    \n
  • Atributos: nos exemplos a tag vídeo e áudio contam com um atributo\ncontrols. Você consegue imaginar o que acontece se o remover? Assim como\neste atributo, existem muitos mais que você verá conforme for precisando.
  • \n
  • Suporte entre navegadores: se você percebeu, só usamos um vídeo com extensão\n.mp4 e um áudio com extensão .mp3. Nem todos os navegadores suportam o\nmesmo formato. Para garantir que nosso áudio e/ou vídeo funcione em qualquer\nformato, devemos adicioná-lo com vários formatos e para isso usamos a etiqueta\n<source>.
  • \n
\n

Onde encontro a lista de atributos e formatos suportados?

\n

A W3Schools (uma de suas melhores amigas neste momento) possui uma série de\nrecursos para ajudar a obter essa informação.

\n
    \n
  • HTML <audio> Tag: aqui você\npode encontrar a lista de atributos que são suportados por esta tag e\nformatos de áudio que cada navegador suporta.
  • \n
  • HTML <video> Tag: aqui você\npode encontrar a lista de atributos que são suportados por esta tag e\nformatos de vídeo que cada navegador suporta.
  • \n
  • HTML Audio/Video DOM\nReference: não esqueça de que,\npor serem tags HTML, estas podem ser manipuladas pelo DOM e para tanto\ncontam com métodos e eventos que possamos utilizar. Tenha isso como\nreferência, não é necessário que você memorize tudo isso agora.
  • \n
\n

E como interajo com a API?

\n

Interagimos por meio da interface HTMLMediaElement. Ela agrega as propriedades\ne métodos necessários para suportar capacidades básicas relacionadas a elementos\nmultimídia (áudio e vídeo).

\n

Exemplo:

\n

Como você imagina que seria com o áudio? Basicamente o mesmo? Esperamos que você\ntente e veja qual é o resultado.

\n

E como seria com jQuery?

\n

Ainda que jQuery nos permita manipular o DOM com mais facilidade, ele não\nfornece suporte para HTMLMediaElements, o que nos força a obter o elemento do\nDOM usando o método .get; como ele é um único elemento (portanto, o primeiro),\nfazemos $video.get(0) para poder interagir com a API de vídeo. Outro detalhe\ninteressante a observar é que, ao aguardar que o DOM esteja pronto por meio de\n$(document).ready não significa necessariamente que o vídeo esteja carregado\ncomo tal. Por isso, para obter a duração, foi necessário adicionar um evento que\nnos indique que os dados do vídeo tenham terminado de carregar\n(video.onloadeddata).

\n

Recursos

\n

Se deseja fazer uma aplicação com áudio e/ou vídeo, mas não lhe ocorre onde\nobter os arquivos, pode utilizar alguns gratuitos nos links abaixo:

\n\n

Se não conseguir baixar algum, lembre-se de que você é uma desenvolvedora web e\nvocê possui superpoderes para inspecionar elementos e obter os links a partir de\nsuas Dev Tools ;).

" + "body": "

Objetivos de Aprendizagem

\n

Aprender de forma geral como usar a API de Áudio e Vídeo.

\n

Áudio e vídeo na web

\n
\n

Os desenvolvedores web desejam usar áudio e vídeo há muito tempo, desde o\ninício dos anos 2000, quando começamos a ter uma largura de banda\nsuficientemente rápida para suportar qualquer tipo de vídeo (os arquivos de\nvídeo são maiores que textos ou imagens). No início, as tecnologias web\nnativas como HTML não possuíam as habilidade para incorporar vídeo ou áudio na\nweb, o que fez com que tecnologias proprietárias (ou baseadas em plugins) como\nFlash (e posteriormente Silverlight) se tornassem muito populares para\nmanipular esse tipo de conteúdo. Estas tecnologias funcionaram bem, mas\npossuíam um grande número de problemas, incluindo que não funcionavam bem com\nHTML/CSS, problemas de segurança e de acessibilidade.

\n

Uma solução nativa resolveria isto se fosse bem feita. Felizmente, alguns anos\ndepois, a especificação de HTML5 incluiria estas features com os elementos\n<video> e <audio> e algumas APIs JavaScript para controlá-los.

\n
\n

Este é um trecho da documentação de\nMDN\nsobre as tags de áudio e vídeo, para você entender o contexto de como foi\nimportante adicionar suporte nativo no HTML5 com sua API de mídia.

\n

Inserindo conteúdo multimídia na nossa página web

\n

Para inserir conteúdo multimídia em nossa web, devemos usar as tags <video>\ne <audio>. A seguir mostramos alguns exemplos de como inseri-los:

\n\n See the Pen [Video Tag](https://codepen.io/ivandevp/pen/gvMPjW/) by Ivan\n ([@ivandevp](https://codepen.io/ivandevp)) on [CodePen](https://codepen.io).\n\n\n See the Pen [Audio Tag](https://codepen.io/ivandevp/pen/PQzNoE/) by Ivan\n ([@ivandevp](https://codepen.io/ivandevp)) on [CodePen](https://codepen.io).\n\n

Você percebeu como é fácil adicioná-los? Bem, além disso, devemos levar em\nconsideração o seguinte:

\n
    \n
  • Atributos: nos exemplos a tag vídeo e áudio contam com um atributo\ncontrols. Você consegue imaginar o que acontece se o remover? Assim como\neste atributo, existem muitos mais que você verá conforme for precisando.
  • \n
  • Suporte entre navegadores: se você percebeu, só usamos um vídeo com extensão\n.mp4 e um áudio com extensão .mp3. Nem todos os navegadores suportam o\nmesmo formato. Para garantir que nosso áudio e/ou vídeo funcione em qualquer\nformato, devemos adicioná-lo com vários formatos e para isso usamos a etiqueta\n<source>.
  • \n
\n

Onde encontro a lista de atributos e formatos suportados?

\n

A W3Schools (uma de suas melhores amigas neste momento) possui uma série de\nrecursos para ajudar a obter essa informação.

\n
    \n
  • HTML <audio> Tag: aqui você\npode encontrar a lista de atributos que são suportados por esta tag e\nformatos de áudio que cada navegador suporta.
  • \n
  • HTML <video> Tag: aqui você\npode encontrar a lista de atributos que são suportados por esta tag e\nformatos de vídeo que cada navegador suporta.
  • \n
  • HTML Audio/Video DOM\nReference: não esqueça de que,\npor serem tags HTML, estas podem ser manipuladas pelo DOM e para tanto\ncontam com métodos e eventos que possamos utilizar. Tenha isso como\nreferência, não é necessário que você memorize tudo isso agora.
  • \n
\n

E como interajo com a API?

\n

Interagimos por meio da interface HTMLMediaElement. Ela agrega as propriedades\ne métodos necessários para suportar capacidades básicas relacionadas a elementos\nmultimídia (áudio e vídeo).

\n

Exemplo:

\n\n See the Pen [HTMLMediaElement JS](https://codepen.io/ivandevp/pen/KQMWMy/) by\n Ivan ([@ivandevp](https://codepen.io/ivandevp)) on\n [CodePen](https://codepen.io).\n\n

Como você imagina que seria com o áudio? Basicamente o mesmo? Esperamos que você\ntente e veja qual é o resultado.

\n

E como seria com jQuery?

\n\n See the Pen [HTMLMediaElement jQuery](https://codepen.io/ivandevp/pen/XZKMjx/)\n by Ivan ([@ivandevp](https://codepen.io/ivandevp)) on\n [CodePen](https://codepen.io).\n\n

Ainda que jQuery nos permita manipular o DOM com mais facilidade, ele não\nfornece suporte para HTMLMediaElements, o que nos força a obter o elemento do\nDOM usando o método .get; como ele é um único elemento (portanto, o primeiro),\nfazemos $video.get(0) para poder interagir com a API de vídeo. Outro detalhe\ninteressante a observar é que, ao aguardar que o DOM esteja pronto por meio de\n$(document).ready não significa necessariamente que o vídeo esteja carregado\ncomo tal. Por isso, para obter a duração, foi necessário adicionar um evento que\nnos indique que os dados do vídeo tenham terminado de carregar\n(video.onloadeddata).

\n

Recursos

\n

Se deseja fazer uma aplicação com áudio e/ou vídeo, mas não lhe ocorre onde\nobter os arquivos, pode utilizar alguns gratuitos nos links abaixo:

\n\n

Se não conseguir baixar algum, lembre-se de que você é uma desenvolvedora web e\nvocê possui superpoderes para inspecionar elementos e obter os links a partir de\nsuas Dev Tools ;).

" } } }, @@ -312,11 +312,11 @@ "intl": { "es": { "title": "Web Storage", - "body": "

Objetivos de Aprendizaje

\n
    \n
  • Aprender a almacenar datos en el navegador a través de la API de Web Storage
  • \n
\n

Almacenamiento web

\n

La API de almacenamiento web proporciona los mecanismos mediante los cuales\nel navegador puede almacenar información de tipo clave/valor, de una forma\nmucho más intuitiva que utilizando cookies.

\n

Los dos mecanismos en el almacenamiento web son los siguientes:

\n
    \n
  • sessionStorage mantiene un área de almacenamiento separada para cada origen\nque está disponible por la duración de la sesión de la página (tanto si el\nnavegador esta abierto como si no, incluyendo recargas de página y\nrestablecimientos).
  • \n
  • localStorage hace lo mismo, pero persiste incluso cuando el navegador es\ncerrado y reabierto.
  • \n
\n

Fuente: MDN - API de almacenamiento web

\n

Mira el siguiente enlace: https://mdn.github.io/dom-examples/web-storage/,\njuega con él y recarga la página, si deseas cierra la pestaña o el navegador y\nvuelve a ingresar. ¿Te diste cuenta que tus cambios permanecieron? Esto es lo\nque la API de Web Storage (almacenamiento web) nos permite hacer fácilmente.

\n

¿Aun no te queda del todo claro? Acá te dejamos un post de Medium\nescrito por nuestra súper profe Marcia donde te explica los métodos que tenemos\ndisponibles a través de esta API.

\n

Si eres de las que prefiere el contenido visual, acá te dejamos un video que\nte permite ver un ejemplo de cómo usar localStorage.

\n

\"Local

\n

¿JSON.stringify(), JSON.parse()?

\n

Si revisaste el video, habrás percibido que usa los métodos JSON.stringify() y\nJSON.parse(), sino lo viste, aun así es bueno que tengas presente ambos\nmétodos.

\n

Como bien es mencionado en la parte superior, esta API almacena elementos en el\nformato de clave/valor. Ejemplo: si tengo el nombre del usuario en una variable\nllamada name y quiero almacenarla en el navegador, haría lo siguiente:

\n
const name = 'nombre de usuario';\n/*\n * name es el identificador (clave),\n * y el valor está almacenada en la variable `name`\n */\nlocalStorage.setItem('name', name);\n// Si usáramos sessionStorage, solo cambiaríamos el objeto de localStorage\n// sessionStorage.setItem('name', name);\n
\n
\n

El valor siempre será almacenado como string independientemente del tipo de\ndato con el que se almacenen.

\n
\n
// signup.html\nconst age = 50;\nlocalStorage.setItem('age', 50);\n\n// home.html\nconst userAge = localStorage.getItem('age');\ntypeof userAge; // \"string\"\n
\n

Bien, esto deberíamos tenerlo presente siempre, en especial cuando vamos a\nquerer operar con esos valores como el caso de números o booleanos, pero\n¿cuándo usamos los métodos del objeto JSON entonces?. En ocasiones vamos a\nnecesitar almacenar múltiples valores que estén relacionados entre sí,\nnormalmente, lo representaríamos en un objeto, y debido a que todo lo que se\nalmacena es un string, no lo podemos hacer directamente. Ejemplo:

\n
// login.html\nconst user = {\n    name: 'user',\n    email: 'user@gmail.com',\n    photoUrl: 'https://images.com/user.png',\n};\n\nsessionStorage.setItem('loggedUser', user);\n\n// home.html\nconst loggedUser = sessionStorage.getItem('loggedUser');\nconsole.log(loggedUser); // \"[object Object]\"\n
\n

Esto ocurre ya que el intérprete trata de convertir el objeto a un string y\nesto hace que se almacence como \"[object Object]\". Si quieres saber más sobre\nporqué el objeto se convierte a string de esa manera, debes de entender un poco\nsobre como funciona coerción en JavaScript,\ny entender sobre el método .toString() de los objetos.

\n

En fin, ¿cómo solucionamos este inconveniente y logremos almacenar nuestro\nobjeto? Entendamos qué hacen los siguientes métodos:

\n
    \n
  • JSON.stringify(): convierte el objeto que es pasado como argumento a un\nstring, serializando las propiedades y valores.
  • \n
  • JSON.parse(): convierte el string pasado como argumento a un objeto,\ndeserializando las propiedades y valores.
  • \n
\n

Ejemplo:

\n
// login.html\nconst user = {\n    name: 'user',\n    email: 'user@gmail.com',\n    photoUrl: 'https://images.com/user.png',\n};\n\n/*\n * Aquí se guarda el objeto en forma de string\n */\nsessionStorage.setItem('loggedUser', JSON.stringify(user));\n\nconsole.log(sessionStorage.getItem('loggedUser'));\n// {\"name\":\"user\",\"email\":\"user@gmail.com\",\"photoUrl\":\"https://images.com/user.png\"}\n\n\n// home.html\n/*\n * Aquí se obtiene el objeto en forma de string y se convierte (parsea) a objeto\n */\nconst loggedUser = JSON.parse(sessionStorage.getItem('loggedUser'));\nconsole.log(typeof loggedUser); // \"object\"\n
\n
\n

Para terminar, no olvides que lo almacenado en el localStorage persiste aun\ncuando se cierra el navegador, así que si deseamos limpiar o eliminar lo que\ntenemos almacenado, debemos de usar los métodos .removeItem() o .clear()\ndependiendo si queremos eliminar una clave específica o todas.

\n
" + "body": "

Objetivos de Aprendizaje

\n
    \n
  • Aprender a almacenar datos en el navegador a través de la API de Web Storage
  • \n
\n

Almacenamiento web

\n

La API de almacenamiento web proporciona los mecanismos mediante los cuales\nel navegador puede almacenar información de tipo clave/valor, de una forma\nmucho más intuitiva que utilizando cookies.

\n

Los dos mecanismos en el almacenamiento web son los siguientes:

\n
    \n
  • sessionStorage mantiene un área de almacenamiento separada para cada origen\nque está disponible por la duración de la sesión de la página (tanto si el\nnavegador esta abierto como si no, incluyendo recargas de página y\nrestablecimientos).
  • \n
  • localStorage hace lo mismo, pero persiste incluso cuando el navegador es\ncerrado y reabierto.
  • \n
\n

Fuente: MDN - API de almacenamiento web

\n

Mira el siguiente enlace: https://mdn.github.io/dom-examples/web-storage/,\njuega con él y recarga la página, si deseas cierra la pestaña o el navegador y\nvuelve a ingresar. ¿Te diste cuenta que tus cambios permanecieron? Esto es lo\nque la API de Web Storage (almacenamiento web) nos permite hacer fácilmente.

\n

¿Aun no te queda del todo claro? Acá te dejamos un post de Medium\nescrito por nuestra súper profe Marcia donde te explica los métodos que tenemos\ndisponibles a través de esta API.

\n

Si eres de las que prefiere el contenido visual, acá te dejamos un video que\nte permite ver un ejemplo de cómo usar localStorage.

\n

\n

¿JSON.stringify(), JSON.parse()?

\n

Si revisaste el video, habrás percibido que usa los métodos JSON.stringify() y\nJSON.parse(), sino lo viste, aun así es bueno que tengas presente ambos\nmétodos.

\n

Como bien es mencionado en la parte superior, esta API almacena elementos en el\nformato de clave/valor. Ejemplo: si tengo el nombre del usuario en una variable\nllamada name y quiero almacenarla en el navegador, haría lo siguiente:

\n
const name = 'nombre de usuario';\n/*\n * name es el identificador (clave),\n * y el valor está almacenada en la variable `name`\n */\nlocalStorage.setItem('name', name);\n// Si usáramos sessionStorage, solo cambiaríamos el objeto de localStorage\n// sessionStorage.setItem('name', name);\n
\n
\n

El valor siempre será almacenado como string independientemente del tipo de\ndato con el que se almacenen.

\n
\n
// signup.html\nconst age = 50;\nlocalStorage.setItem('age', 50);\n\n// home.html\nconst userAge = localStorage.getItem('age');\ntypeof userAge; // \"string\"\n
\n

Bien, esto deberíamos tenerlo presente siempre, en especial cuando vamos a\nquerer operar con esos valores como el caso de números o booleanos, pero\n¿cuándo usamos los métodos del objeto JSON entonces?. En ocasiones vamos a\nnecesitar almacenar múltiples valores que estén relacionados entre sí,\nnormalmente, lo representaríamos en un objeto, y debido a que todo lo que se\nalmacena es un string, no lo podemos hacer directamente. Ejemplo:

\n
// login.html\nconst user = {\n    name: 'user',\n    email: 'user@gmail.com',\n    photoUrl: 'https://images.com/user.png',\n};\n\nsessionStorage.setItem('loggedUser', user);\n\n// home.html\nconst loggedUser = sessionStorage.getItem('loggedUser');\nconsole.log(loggedUser); // \"[object Object]\"\n
\n

Esto ocurre ya que el intérprete trata de convertir el objeto a un string y\nesto hace que se almacence como \"[object Object]\". Si quieres saber más sobre\nporqué el objeto se convierte a string de esa manera, debes de entender un poco\nsobre como funciona coerción en JavaScript,\ny entender sobre el método .toString() de los objetos.

\n

En fin, ¿cómo solucionamos este inconveniente y logremos almacenar nuestro\nobjeto? Entendamos qué hacen los siguientes métodos:

\n
    \n
  • JSON.stringify(): convierte el objeto que es pasado como argumento a un\nstring, serializando las propiedades y valores.
  • \n
  • JSON.parse(): convierte el string pasado como argumento a un objeto,\ndeserializando las propiedades y valores.
  • \n
\n

Ejemplo:

\n
// login.html\nconst user = {\n    name: 'user',\n    email: 'user@gmail.com',\n    photoUrl: 'https://images.com/user.png',\n};\n\n/*\n * Aquí se guarda el objeto en forma de string\n */\nsessionStorage.setItem('loggedUser', JSON.stringify(user));\n\nconsole.log(sessionStorage.getItem('loggedUser'));\n// {\"name\":\"user\",\"email\":\"user@gmail.com\",\"photoUrl\":\"https://images.com/user.png\"}\n\n\n// home.html\n/*\n * Aquí se obtiene el objeto en forma de string y se convierte (parsea) a objeto\n */\nconst loggedUser = JSON.parse(sessionStorage.getItem('loggedUser'));\nconsole.log(typeof loggedUser); // \"object\"\n
\n
\n

Para terminar, no olvides que lo almacenado en el localStorage persiste aun\ncuando se cierra el navegador, así que si deseamos limpiar o eliminar lo que\ntenemos almacenado, debemos de usar los métodos .removeItem() o .clear()\ndependiendo si queremos eliminar una clave específica o todas.

\n
" }, "pt": { "title": "Web Storage", - "body": "

Objetivos de Aprendizagem

\n
    \n
  • Aprender a armazenar dados no navegador por meio da API de Web Storage.
  • \n
\n

Armazenamento web

\n

A API de armazenamento web fornece os mecanismos através do quais o navegador\npode armazenar informação do tipo chave/valor de uma maneira muito mais\nintuitiva do que utilizando cookies.

\n

Os dois mecanismos de armazenamento web são os seguintes:

\n
    \n
  • sessionStorage: mantém uma área de armazenamento separada para cada origem\nque estiver disponível pela duração da sessão da página (tanto se o navegador\nestiver aberto como se estiver fechado, incluindo recarregamento de páginas e\nrestabelecimentos).
  • \n
  • localStorage faz o mesmo, mas persiste inclusive quando o navegador é\nfechado e reaberto.
  • \n
\n

Fonte: MDN - API de armazenamento\nweb

\n

Veja o seguinte link:\nhttps://mdn.github.io/dom-examples/web-storage/,\nbrinque com ele e recarregue a página ou, se desejar, feche a janela ou o\nnavegador e volte a acessar. Ele informa quantas mudanças permaneceram? Isto é o\nque a API de Web Storage (armazenamento web) permite que façamos facilmente.

\n

Ainda não está claro pra você? Aqui deixamos um post de\nMedium\nescrito por nossa super professora Marcia no qual ela explica os métodos que\ntemos disponíveis por meio desta API.

\n

Se você for das que preferem o conteúdo visual, deixamos aqui um vídeo que lhe\npermite ver um exemplo de como usar localStorage.

\n

\"Local\nStorage\"

\n

JSON.stringify(), JSON.parse()?

\n

Se você assistiu ao vídeo, percebeu que ele usa os métodos JSON.stringify() e\nJSON.parse(). Se não o viu, é bom que tenha em mente ambos os métodos.

\n

Como é mencionado na parte superior, esta API armazena elementos no formato de\nchave/valor. Exemplo: se tenho o nome do usuário em uma variável chamada name\ne quero armazená-la no navegador, você faria o seguinte:

\n
const name = 'nome de usuário';\n/*\n * name é o identificador (chave),\n * e o valor está armazenado na variável `name`\n */\nlocalStorage.setItem('name', name);\n// Se usássemos sessionStorage, só mudaríamos o objeto de localStorage\n// sessionStorage.setItem('name', name);\n
\n
\n

O valor sempre será armazenado como string independentemente do tipo de\ndado.

\n
\n
// signup.html\nconst age = 50;\nlocalStorage.setItem('age', 50);\n\n// home.html\nconst userAge = localStorage.getItem('age');\ntypeof userAge; // \"string\"\n
\n

Bem, isso deveríamos saber sempre, em particular quando vamos operar com esses\nvalores como o caso de números e booleanos. Mas e quando usamos os métodos do\nobjeto JSON? Há situações em que vamos precisar armazenar múltiplos valores\nque estão relacionados entre si. Normalmente, representaríamos isso como um\nobjeto e como tudo que ele armazena é uma string, não podemos fazê-lo\ndiretamente. Exemplo:

\n
// login.html\nconst user = {\n    name: 'user',\n    email: 'user@gmail.com',\n    photoUrl: 'https://images.com/user.png',\n};\n\nsessionStorage.setItem('loggedUser', user);\n\n// home.html\nconst loggedUser = sessionStorage.getItem('loggedUser');\nconsole.log(loggedUser); // \"[object Object]\"\n
\n

Isto acontece porque o interpretador trata de converter o objeto para uma string\ne isto faz com que armazene como \"[object Object]\". Se você quiser saber mais\nsobre porque o objeto é convertido para uma string dessa maneira, deve entender\num pouco sobre como funciona a coerção em\nJavaScript e\nentender sobre o método .toString() dos\nobjetos.

\n

Enfim, como resolvemos esta inconveniência e conseguimos armazenar nosso objeto?\nEntendamos o que fazem os seguintes métodos:

\n
    \n
  • JSON.stringify(): converte o objeto que é passado como argumento para uma\nstring, serializando as propriedades e valores.
  • \n
  • JSON.parse(): converte a string passada como argumento para um objeto,\ndesserializando as propriedades e valores.
  • \n
\n

Exemplo:

\n
// login.html\nconst user = {\n    name: 'user',\n    email: 'user@gmail.com',\n    photoUrl: 'https://images.com/user.png',\n};\n\n/*\n * Aqui guardamos o objeto em forma de string.\n */\nsessionStorage.setItem('loggedUser', JSON.stringify(user));\n\nconsole.log(sessionStorage.getItem('loggedUser'));\n// {\n//   \"name\":\"user\",\n//   \"email\":\"user@gmail.com\",\n//   \"photoUrl\":\"https://images.com/user.png\"\n// }\n\n\n// home.html\n/*\n * Aqui obtemos o objeto em forma de string e convertemos (parse) para objeto.\n */\nconst loggedUser = JSON.parse(sessionStorage.getItem('loggedUser'));\nconsole.log(typeof loggedUser); // \"object\"\n
\n
\n

Para finalizar, não esqueça de que o que foi armazenado no localStorage é\npersistido mesmo quando fechamos o navegador. Logo, se desejamos limpar ou\napagar o que temos armazenado, devemos usar os métodos .removeItem() ou\n.clear() dependendo se queremos eliminar uma chave específica ou todas.

\n
" + "body": "

Objetivos de Aprendizagem

\n
    \n
  • Aprender a armazenar dados no navegador por meio da API de Web Storage.
  • \n
\n

Armazenamento web

\n

A API de armazenamento web fornece os mecanismos através do quais o navegador\npode armazenar informação do tipo chave/valor de uma maneira muito mais\nintuitiva do que utilizando cookies.

\n

Os dois mecanismos de armazenamento web são os seguintes:

\n
    \n
  • sessionStorage: mantém uma área de armazenamento separada para cada origem\nque estiver disponível pela duração da sessão da página (tanto se o navegador\nestiver aberto como se estiver fechado, incluindo recarregamento de páginas e\nrestabelecimentos).
  • \n
  • localStorage faz o mesmo, mas persiste inclusive quando o navegador é\nfechado e reaberto.
  • \n
\n

Fonte: MDN - API de armazenamento\nweb

\n

Veja o seguinte link:\nhttps://mdn.github.io/dom-examples/web-storage/,\nbrinque com ele e recarregue a página ou, se desejar, feche a janela ou o\nnavegador e volte a acessar. Ele informa quantas mudanças permaneceram? Isto é o\nque a API de Web Storage (armazenamento web) permite que façamos facilmente.

\n

Ainda não está claro pra você? Aqui deixamos um post de\nMedium\nescrito por nossa super professora Marcia no qual ela explica os métodos que\ntemos disponíveis por meio desta API.

\n

Se você for das que preferem o conteúdo visual, deixamos aqui um vídeo que lhe\npermite ver um exemplo de como usar localStorage.

\n

\n

JSON.stringify(), JSON.parse()?

\n

Se você assistiu ao vídeo, percebeu que ele usa os métodos JSON.stringify() e\nJSON.parse(). Se não o viu, é bom que tenha em mente ambos os métodos.

\n

Como é mencionado na parte superior, esta API armazena elementos no formato de\nchave/valor. Exemplo: se tenho o nome do usuário em uma variável chamada name\ne quero armazená-la no navegador, você faria o seguinte:

\n
const name = 'nome de usuário';\n/*\n * name é o identificador (chave),\n * e o valor está armazenado na variável `name`\n */\nlocalStorage.setItem('name', name);\n// Se usássemos sessionStorage, só mudaríamos o objeto de localStorage\n// sessionStorage.setItem('name', name);\n
\n
\n

O valor sempre será armazenado como string independentemente do tipo de\ndado.

\n
\n
// signup.html\nconst age = 50;\nlocalStorage.setItem('age', 50);\n\n// home.html\nconst userAge = localStorage.getItem('age');\ntypeof userAge; // \"string\"\n
\n

Bem, isso deveríamos saber sempre, em particular quando vamos operar com esses\nvalores como o caso de números e booleanos. Mas e quando usamos os métodos do\nobjeto JSON? Há situações em que vamos precisar armazenar múltiplos valores\nque estão relacionados entre si. Normalmente, representaríamos isso como um\nobjeto e como tudo que ele armazena é uma string, não podemos fazê-lo\ndiretamente. Exemplo:

\n
// login.html\nconst user = {\n    name: 'user',\n    email: 'user@gmail.com',\n    photoUrl: 'https://images.com/user.png',\n};\n\nsessionStorage.setItem('loggedUser', user);\n\n// home.html\nconst loggedUser = sessionStorage.getItem('loggedUser');\nconsole.log(loggedUser); // \"[object Object]\"\n
\n

Isto acontece porque o interpretador trata de converter o objeto para uma string\ne isto faz com que armazene como \"[object Object]\". Se você quiser saber mais\nsobre porque o objeto é convertido para uma string dessa maneira, deve entender\num pouco sobre como funciona a coerção em\nJavaScript e\nentender sobre o método .toString() dos\nobjetos.

\n

Enfim, como resolvemos esta inconveniência e conseguimos armazenar nosso objeto?\nEntendamos o que fazem os seguintes métodos:

\n
    \n
  • JSON.stringify(): converte o objeto que é passado como argumento para uma\nstring, serializando as propriedades e valores.
  • \n
  • JSON.parse(): converte a string passada como argumento para um objeto,\ndesserializando as propriedades e valores.
  • \n
\n

Exemplo:

\n
// login.html\nconst user = {\n    name: 'user',\n    email: 'user@gmail.com',\n    photoUrl: 'https://images.com/user.png',\n};\n\n/*\n * Aqui guardamos o objeto em forma de string.\n */\nsessionStorage.setItem('loggedUser', JSON.stringify(user));\n\nconsole.log(sessionStorage.getItem('loggedUser'));\n// {\n//   \"name\":\"user\",\n//   \"email\":\"user@gmail.com\",\n//   \"photoUrl\":\"https://images.com/user.png\"\n// }\n\n\n// home.html\n/*\n * Aqui obtemos o objeto em forma de string e convertemos (parse) para objeto.\n */\nconst loggedUser = JSON.parse(sessionStorage.getItem('loggedUser'));\nconsole.log(typeof loggedUser); // \"object\"\n
\n
\n

Para finalizar, não esqueça de que o que foi armazenado no localStorage é\npersistido mesmo quando fechamos o navegador. Logo, se desejamos limpar ou\napagar o que temos armazenado, devemos usar os métodos .removeItem() ou\n.clear() dependendo se queremos eliminar uma chave específica ou todas.

\n
" } } }, @@ -328,11 +328,11 @@ "intl": { "es": { "title": "Jugando con Web Storage", - "body": "

Objetivos

\n
    \n
  • Practicar todo lo aprendido haciendo uso del API de almacenamiento web
  • \n
  • Practicar, practicar y practicar
  • \n
\n

Ejercicios

\n

Debes subir todos tus ejercicios a GitHub y publicarlos en gh-pages.

\n

Perfil de usuario

\n

Implementa un login con Firebase, sea manual o con alguna red social,\nredireccionálo a la página principal de tu sitio (puedes darle la temática que\ndesees) y permite tener una edición de perfil, para esto los datos deben de\nestar precargados con lo que almacenaste en el navegador. Ten en cuenta que\ndebe funcionar para distintos usuarios, por lo que deberá estar existente\ndurante una sesión del usuario. ¿Deberás usar localStorage o sessionStorage?

\n

Lector personalizado

\n

Alguna vez te has puesto a leer un post de un blog pero te has sentido incómoda\ncon la fuente, el tamaño o incluso los colores usados. Es hora de darle una\nsolución, crea un sitio responsive (esto no es necesario indicarlo, pero por si\nlas dudas) con un post real (tu preferido, no Lorem Ipsum) y dale la opción a tu\nusuario de personalizar su modo de lectura de la mejor forma que creas\nconveniente.

\n

Algo muy similar al ejemplo visto en la lectura del self-learning anterior.\nSi deseas que se mantenga la configuración del usuario guardada, ¿qué usarás?

" + "body": "

Objetivos

\n
    \n
  • Practicar todo lo aprendido haciendo uso del API de almacenamiento web
  • \n
  • Practicar, practicar y practicar
  • \n
\n

Ejercicios

\n

Debes subir todos tus ejercicios a GitHub y publicarlos en gh-pages.

\n

Perfil de usuario

\n

Implementa un login con Firebase, sea manual o con alguna red social,\nredireccionálo a la página principal de tu sitio (puedes darle la temática que\ndesees) y permite tener una edición de perfil, para esto los datos deben de\nestar precargados con lo que almacenaste en el navegador. Ten en cuenta que\ndebe funcionar para distintos usuarios, por lo que deberá estar existente\ndurante una sesión del usuario. ¿Deberás usar localStorage o sessionStorage?

\n\n See the Pen [Edit Profile with Angular](https://codepen.io/DonPage/pen/HCjem/)\n by Don Page ([@DonPage](https://codepen.io/DonPage)) on\n [CodePen](https://codepen.io).\n\n

Lector personalizado

\n

Alguna vez te has puesto a leer un post de un blog pero te has sentido incómoda\ncon la fuente, el tamaño o incluso los colores usados. Es hora de darle una\nsolución, crea un sitio responsive (esto no es necesario indicarlo, pero por si\nlas dudas) con un post real (tu preferido, no Lorem Ipsum) y dale la opción a tu\nusuario de personalizar su modo de lectura de la mejor forma que creas\nconveniente.

\n

Algo muy similar al ejemplo visto en la lectura del self-learning anterior.\nSi deseas que se mantenga la configuración del usuario guardada, ¿qué usarás?

" }, "pt": { "title": "Exercitando com Web Storage", - "body": "

Objetivos

\n
    \n
  • Praticar tudo o que foi aprendido utilizando a API de armazenamento web.
  • \n
  • Praticar, praticar e praticar.
  • \n
\n

Exercícios

\n

Você deve subir todos os seus exercícios para o GitHub e publicá-los nas gh-pages.

\n

Perfil de usuário

\n

Implemente um login com Firebase, seja manual ou com alguma rede social,\nredirecione para a página principal de seu sítio web (pode dar-lhe a temática\nque desejar) e permita ter uma edição de perfil. Para isto, os dados devem estar\npré-carregados com o que foi armazenado no navegador. Leve em consideração que\ndeve funcionar para diferentes usuários, motivo pelo qual deverá existir sessões\npor usuário. Você deverá usar localStorage ou sessionStorage?

\n

Leitura personalizada

\n

Alguma vez você começou a ler um post de um blog, mas você se sentiu incomodada\ncom a fonte, o tamanho ou as cores usados? Chegou a hora de resolver isso. Crie\num site responsivo (não é preciso dizer, mas por via das dúvidas) com um post\nreal (seu preferido, sem Lorem Ipsum) e implemente a opção para que o usuário\npossa personalizar seu modo de leitura da forma que achar conveniente.

\n

Algo muito similar ao exemplo visto na leitura de self-learning\nanterior. Se desejar armazenar\na configuração do usuário, o que você usará?

" + "body": "

Objetivos

\n
    \n
  • Praticar tudo o que foi aprendido utilizando a API de armazenamento web.
  • \n
  • Praticar, praticar e praticar.
  • \n
\n

Exercícios

\n

Você deve subir todos os seus exercícios para o GitHub e publicá-los nas gh-pages.

\n

Perfil de usuário

\n

Implemente um login com Firebase, seja manual ou com alguma rede social,\nredirecione para a página principal de seu sítio web (pode dar-lhe a temática\nque desejar) e permita ter uma edição de perfil. Para isto, os dados devem estar\npré-carregados com o que foi armazenado no navegador. Leve em consideração que\ndeve funcionar para diferentes usuários, motivo pelo qual deverá existir sessões\npor usuário. Você deverá usar localStorage ou sessionStorage?

\n\n See the Pen [Edit Profile with Angular](https://codepen.io/DonPage/pen/HCjem/)\n by Don Page ([@DonPage](https://codepen.io/DonPage)) on\n [CodePen](https://codepen.io).\n\n

Leitura personalizada

\n

Alguma vez você começou a ler um post de um blog, mas você se sentiu incomodada\ncom a fonte, o tamanho ou as cores usados? Chegou a hora de resolver isso. Crie\num site responsivo (não é preciso dizer, mas por via das dúvidas) com um post\nreal (seu preferido, sem Lorem Ipsum) e implemente a opção para que o usuário\npossa personalizar seu modo de leitura da forma que achar conveniente.

\n

Algo muito similar ao exemplo visto na leitura de self-learning\nanterior. Se desejar armazenar\na configuração do usuário, o que você usará?

" } }, "challenges": [] @@ -345,7 +345,7 @@ "intl": { "es": { "title": "Geolocation", - "body": "

Objetivos de Aprendizaje

\n

Entender qué es la geolocalización y cómo usar el API

\n

Geolocalización

\n

Revisemos las siguientes diapositivas

\n

Ahora vamos a leer el siguiente enlace\nde DevCode que aparte de tener información importante cuenta con un ejemplo\npráctico para ir resolviendo.

\n

Para finalizar, veamos el siguiente vídeo, notarás que pone todo en su HTML\npero tú eres una desarrolladora que ama las buenas prácticas y a la hora de\nponer manos a la obra en tu editor de texto, pondrás cada cosa en su archivo\ncorrespondiente.

\n

video

\n

Si ya realizando lo anterior quieres algo más, DevCode tiene un tutorial\npara obtener la geolocalización con Nodejs.

" + "body": "

Objetivos de Aprendizaje

\n

Entender qué es la geolocalización y cómo usar el API

\n

Geolocalización

\n

Revisemos las siguientes diapositivas

\n\n

Ahora vamos a leer el siguiente enlace\nde DevCode que aparte de tener información importante cuenta con un ejemplo\npráctico para ir resolviendo.

\n

Para finalizar, veamos el siguiente vídeo, notarás que pone todo en su HTML\npero tú eres una desarrolladora que ama las buenas prácticas y a la hora de\nponer manos a la obra en tu editor de texto, pondrás cada cosa en su archivo\ncorrespondiente.

\n

\n

Si ya realizando lo anterior quieres algo más, DevCode tiene un tutorial\npara obtener la geolocalización con Nodejs.

" }, "pt": { "title": "Geolocalização", @@ -361,7 +361,7 @@ "intl": { "es": { "title": "Jugando con Geolocation", - "body": "

Objetivos

\n
    \n
  • Practicar todo lo aprendido haciendo uso del API de geolocalización
  • \n
  • Practicar, practicar y practicar
  • \n
\n

Ejercicios

\n

Debes subir todos tus ejercicios a GitHub y publicarlos en gh-pages.

\n

Sigamos las siguientes diapositivas para resolver nuestro\nreto

\n

Encuéntrame

\n

Encuéntrame Hacker Edition

\n

EASY-VRECO

" + "body": "

Objetivos

\n
    \n
  • Practicar todo lo aprendido haciendo uso del API de geolocalización
  • \n
  • Practicar, practicar y practicar
  • \n
\n

Ejercicios

\n

Debes subir todos tus ejercicios a GitHub y publicarlos en gh-pages.

\n

Sigamos las siguientes diapositivas para resolver nuestro\nreto

\n

Encuéntrame

\n\n

Encuéntrame Hacker Edition

\n\n

EASY-VRECO

\n" }, "pt": { "title": "Exercitando com Geolocalização", @@ -394,7 +394,7 @@ "intl": { "es": { "title": "Jugando con DnD", - "body": "

Objetivos

\n
    \n
  • Practicar todo lo aprendido haciendo uso del API de Drag and Drop
  • \n
  • Practicar, practicar y practicar
  • \n
\n

Ejercicios

\n

Debes subir todos tu ejercicios a GitHub y publicarlos en gh-pages.

\n

Inta Collage

\n

Revisa las siguientes diapositivas para resolver tu ejercicio

" + "body": "

Objetivos

\n
    \n
  • Practicar todo lo aprendido haciendo uso del API de Drag and Drop
  • \n
  • Practicar, practicar y practicar
  • \n
\n

Ejercicios

\n

Debes subir todos tu ejercicios a GitHub y publicarlos en gh-pages.

\n

Inta Collage

\n

Revisa las siguientes diapositivas para resolver tu ejercicio

\n" }, "pt": { "title": "Exercitando com DnD", @@ -411,11 +411,11 @@ "intl": { "es": { "title": "Más APIs", - "body": "

Objetivos de Aprendizaje

\n
    \n
  • Incentivar a explorar otras APIs de HTML5
  • \n
\n

Otras APIs

\n

En esta unidad, nos hemos enfocado en algunas APIs específicas, pero como bien\nlo hemos mencionado, no son las únicas y te invitamos a explorar por tu cuenta\notras.

\n

Acá te dejamos algunas con las que puedes ir jugando:

\n

Canvas

\n

El elemento HTML <canvas> es usado para dibujar gráficos a través de\nJavaScript. A nivel de HTML, el elemento solo es un contenedor de gráficos.\nEl API provee variados métodos para dibujar rutas, cajas, círculos, texto y\nagregar imágenes.

\n

Retos

\n
Jugando con formas
\n

Dibuja las diversas formas geométricas que conozcas y comienza a darle un estilo\npersonalizado a cada una.

\n

Ejemplo:

\n
Imágenes pixeleadas
\n

Crea una interfaz con tus imágenes preferidas y vuélvelas pixeleadas.

\n

Ejemplo: Mira la sección de Quiénes somos? en la web de Developers\nLaboratoria.

\n

Referencias

\n\n

File

\n

Esta probablemente ya la haz conocido, ya sea a través del elemento <input type=\"file\" /> o cuando has querido adjuntar una imagen al momento de postear\nen tu red social. Cualquiera que haya sido el escenario, te habrás dado cuenta\nque es muy útil saber manipularla.

\n

Retos

\n
Editando foto de perfil
\n

¿Recuerdas el reto de web storage, donde podías editar los datos tu perfil? ¿Qué\nte parece si ahora editas también su foto de perfil? ¿Y si recargas la página,\npermanece la imagen que acabas de cambiar? Comienza a mezclar ambas APIs y\ncomprueba hasta donde te lleva tu imaginación. Recuerda que una buena manera de\nindicar al usuario que su edición está correcta es mostrándole como quedaría\nantes de guardarlo.

\n
\n

Debes probar esto en tu móvil una vez terminado, estamos seguros que te\nllamará la atención ver que puedes poner un selfie que te tomas con la cámara\ncomo foto de perfil. Ooopss, la idea era que lo descubrieras por tu cuenta ;)

\n
\n
¿Instragram?
\n

Si ya sabes cómo mostrar las imágenes que tienes almacenadas en tu PC o móvil,\ntienes el poder de agregar interacción con el DOM, loguearte con redes sociales\ny almacenarlo en una base de datos gracias a Firebase; esto quiere decir que\n¡tienes todo lo necesario para construir tu propio Instagram! Deja volar tu\nimaginación y diviértete creando tu red social de fotografía a tu gusto.

\n
\n

Nota, con CSS puedes hacer filtros a tus imágenes\n:scream:

\n
\n

Referencias

\n\n

WebSockets

\n

¿Alguna vez te has preguntado cómo funcionan las aplicaciones en tiempo real?\n¿Cómo hace Facebook, WhatsApp u otra red social para notificarte que has\nrecibido un mensaje inmediatamente después de que el remitente lo envió? Un\nejemplo más técnico sería mediante Firebase, ¿te has dado cuenta que si escuchas\nlos cambios de su base de datos, tu aplicación se actualzia automáticamente?

\n

Todo esto es gracias a los Web Sockets, HTML5 provee esta API con la que puedes\nestablecer conecciones socket entre el navegador y un servidor. Esto significa\nque existe una conexión persistente en la que puedes enviar datos en cualquier\nmomento.

\n

Como bien lo menciona en el párrafo anterior, se necesita escribir un script en\nel servidor y en el cliente para establecer una conexión de Web Sockets. Esto\npuede ser un poco complicado sobre todo porque la implementación varía en el\nback-end dependiendo del lenguaje y varía en el cliente por la compatibilidad\nentre navegadores. Para hacer probar esta API de una manera sencilla, podrías\nusar Node.js (JavaScript del lado del servidor) y una librería que funcione en\nambos lados (cliente y servidor) como socket.io.

\n

Retos

\n
Real-time chat
\n

Probablemente dirás que con Firebase ya puedes hacer un chat en tiempo real, aun\nasí te invitamos a vivir la experiencia de crearlo sin Firebase y veas como\npuedes armar una aplicación en tiempo real escribiendo código tanto en el cliente\ncomo en el servidor.

\n
Canvas + Socket.io
\n

¿Te imaginas tener una pizarra compartida? Con canvas puedes crear un lienzo y\nmediante eventos del mouse dibujar en él, si estos gráficos los envías hacia un\nsocket podrías dibujarlo entre todos los usuarios conectados en tiempo real,\nalgo así como una pizarra mágina. Piénsalo, puede ayudarte cuando quieres\nenseñar o estudiar junto a alguien.

\n
¿Hangouts, Skype?
\n

Si pudieras encender la cámara de tu laptop, mostrarla en la web, y enviarla a\ntravés de un socket, tendrías una aplicación de videollamadas. ¿Crees que aun\nno puedes lograrlo? Pues te comentamos, que con un par de APIs más Web Sockets\ny sobre todo tus ganas de querer hacerlo, lo puedes lograr ;)

\n

Las APIs serían getUserMedia\n(parte de Media API) y Canvas. Y probablemente al investigar al respecto, te\nencontrarás con el término de WebRTC.

\n

Tranquila, le tendrás que dedicar tiempo, pero si te interesa estamos 100%\nseguros de que podrás lograrlo :).

\n

Referencias

\n\n

Notifications

\n
\n

La API de Notificaciones permite a una página web enviar notificaciones que\nse mostrarán fuera de la web al nivel del sistema. Esto permite a las\naplicaciones web enviar información al usuario aunque estas estén de fondo.

\n
\n

Fuente: MDN - Usando la API de Notificaciones

\n

Retos

\n
Notificaciones de mensajes
\n

Ya tienes tu chat o red social ya sea con Firebase o tu propia implementación de\nWeb Sockets, ahora que te parece si cada vez que un usuario interactúa con tu\napp, le envías una notificación. Eso estaría muy cool :muscle:

\n

Referencias

\n\n

Vibration

\n
\n

La mayoría de los dispositivos modernos pueden vibrar a través del hardware,\nesto permite que a través del código de software se pueda emitir estas\nvibraciones. La Vibration API ofrece a las aplicaciones web la capacidad de\nacceder a este hardware en caso este lo soporte, caso contrario el dispositivo\nno hace nada.

\n
\n

Fuente: MDN - Vibración API

\n

Retos

\n
Vibración de notificaciones
\n

Ya tienes tus notificaciones, ahora que te parece si agregas la capacidad de\nvibrar cuando éstas lleguen a tu usuario.

\n

Referencias

\n\n

Conclusión

\n

Existen muchas APIs que vuelven cada vez más potente al navegador, y esto a\npermitido grandes avances en la web, lo único que te podemos decir es que nunca\nnos va a dar el tiempo de ver todos, solo hay que ser curiosas y comenzar a\njugar sin miedo con ellas.

\n

Recuerda tener presente que muchas de ellas tienen problemas de compatibilidad\ncon dispositivos o navegadores específicos así que no vayas a pensar que algo\nestá fallando en tu código necesariamente, puede que sea algo de hardware. Por\notro lado, recuerda que en The HTML 5 JavaScript API Index\npuedes indagar un poco más acerca de las APIs existentes.

\n

Y mira de manera interactiva cómo ha evolucionado la web en\nwww.evolutionoftheweb.com.

\n

\"Evolution

" + "body": "

Objetivos de Aprendizaje

\n
    \n
  • Incentivar a explorar otras APIs de HTML5
  • \n
\n

Otras APIs

\n

En esta unidad, nos hemos enfocado en algunas APIs específicas, pero como bien\nlo hemos mencionado, no son las únicas y te invitamos a explorar por tu cuenta\notras.

\n

Acá te dejamos algunas con las que puedes ir jugando:

\n

Canvas

\n

El elemento HTML <canvas> es usado para dibujar gráficos a través de\nJavaScript. A nivel de HTML, el elemento solo es un contenedor de gráficos.\nEl API provee variados métodos para dibujar rutas, cajas, círculos, texto y\nagregar imágenes.

\n

Retos

\n
Jugando con formas
\n

Dibuja las diversas formas geométricas que conozcas y comienza a darle un estilo\npersonalizado a cada una.

\n

Ejemplo:

\n\n See the Pen [CSS Basic Shapes](https://codepen.io/krystalcampioni/pen/bgYxQa/)\n by Krystal Campioni ([@krystalcampioni](https://codepen.io/krystalcampioni))\n on [CodePen](https://codepen.io).\n\n
Imágenes pixeleadas
\n

Crea una interfaz con tus imágenes preferidas y vuélvelas pixeleadas.

\n

Ejemplo: Mira la sección de Quiénes somos? en la web de Developers\nLaboratoria.

\n

Referencias

\n\n

File

\n

Esta probablemente ya la haz conocido, ya sea a través del elemento <input type=\"file\" /> o cuando has querido adjuntar una imagen al momento de postear\nen tu red social. Cualquiera que haya sido el escenario, te habrás dado cuenta\nque es muy útil saber manipularla.

\n

Retos

\n
Editando foto de perfil
\n

¿Recuerdas el reto de web storage, donde podías editar los datos tu perfil? ¿Qué\nte parece si ahora editas también su foto de perfil? ¿Y si recargas la página,\npermanece la imagen que acabas de cambiar? Comienza a mezclar ambas APIs y\ncomprueba hasta donde te lleva tu imaginación. Recuerda que una buena manera de\nindicar al usuario que su edición está correcta es mostrándole como quedaría\nantes de guardarlo.

\n
\n

Debes probar esto en tu móvil una vez terminado, estamos seguros que te\nllamará la atención ver que puedes poner un selfie que te tomas con la cámara\ncomo foto de perfil. Ooopss, la idea era que lo descubrieras por tu cuenta ;)

\n
\n
¿Instragram?
\n

Si ya sabes cómo mostrar las imágenes que tienes almacenadas en tu PC o móvil,\ntienes el poder de agregar interacción con el DOM, loguearte con redes sociales\ny almacenarlo en una base de datos gracias a Firebase; esto quiere decir que\n¡tienes todo lo necesario para construir tu propio Instagram! Deja volar tu\nimaginación y diviértete creando tu red social de fotografía a tu gusto.

\n
\n

Nota, con CSS puedes hacer filtros a tus imágenes\n:scream:

\n
\n

Referencias

\n\n

WebSockets

\n

¿Alguna vez te has preguntado cómo funcionan las aplicaciones en tiempo real?\n¿Cómo hace Facebook, WhatsApp u otra red social para notificarte que has\nrecibido un mensaje inmediatamente después de que el remitente lo envió? Un\nejemplo más técnico sería mediante Firebase, ¿te has dado cuenta que si escuchas\nlos cambios de su base de datos, tu aplicación se actualzia automáticamente?

\n

Todo esto es gracias a los Web Sockets, HTML5 provee esta API con la que puedes\nestablecer conecciones socket entre el navegador y un servidor. Esto significa\nque existe una conexión persistente en la que puedes enviar datos en cualquier\nmomento.

\n

Como bien lo menciona en el párrafo anterior, se necesita escribir un script en\nel servidor y en el cliente para establecer una conexión de Web Sockets. Esto\npuede ser un poco complicado sobre todo porque la implementación varía en el\nback-end dependiendo del lenguaje y varía en el cliente por la compatibilidad\nentre navegadores. Para hacer probar esta API de una manera sencilla, podrías\nusar Node.js (JavaScript del lado del servidor) y una librería que funcione en\nambos lados (cliente y servidor) como socket.io.

\n

Retos

\n
Real-time chat
\n

Probablemente dirás que con Firebase ya puedes hacer un chat en tiempo real, aun\nasí te invitamos a vivir la experiencia de crearlo sin Firebase y veas como\npuedes armar una aplicación en tiempo real escribiendo código tanto en el cliente\ncomo en el servidor.

\n
Canvas + Socket.io
\n

¿Te imaginas tener una pizarra compartida? Con canvas puedes crear un lienzo y\nmediante eventos del mouse dibujar en él, si estos gráficos los envías hacia un\nsocket podrías dibujarlo entre todos los usuarios conectados en tiempo real,\nalgo así como una pizarra mágina. Piénsalo, puede ayudarte cuando quieres\nenseñar o estudiar junto a alguien.

\n
¿Hangouts, Skype?
\n

Si pudieras encender la cámara de tu laptop, mostrarla en la web, y enviarla a\ntravés de un socket, tendrías una aplicación de videollamadas. ¿Crees que aun\nno puedes lograrlo? Pues te comentamos, que con un par de APIs más Web Sockets\ny sobre todo tus ganas de querer hacerlo, lo puedes lograr ;)

\n

Las APIs serían getUserMedia\n(parte de Media API) y Canvas. Y probablemente al investigar al respecto, te\nencontrarás con el término de WebRTC.

\n

Tranquila, le tendrás que dedicar tiempo, pero si te interesa estamos 100%\nseguros de que podrás lograrlo :).

\n

Referencias

\n\n

Notifications

\n
\n

La API de Notificaciones permite a una página web enviar notificaciones que\nse mostrarán fuera de la web al nivel del sistema. Esto permite a las\naplicaciones web enviar información al usuario aunque estas estén de fondo.

\n
\n

Fuente: MDN - Usando la API de Notificaciones

\n

Retos

\n
Notificaciones de mensajes
\n

Ya tienes tu chat o red social ya sea con Firebase o tu propia implementación de\nWeb Sockets, ahora que te parece si cada vez que un usuario interactúa con tu\napp, le envías una notificación. Eso estaría muy cool :muscle:

\n

Referencias

\n\n

Vibration

\n
\n

La mayoría de los dispositivos modernos pueden vibrar a través del hardware,\nesto permite que a través del código de software se pueda emitir estas\nvibraciones. La Vibration API ofrece a las aplicaciones web la capacidad de\nacceder a este hardware en caso este lo soporte, caso contrario el dispositivo\nno hace nada.

\n
\n

Fuente: MDN - Vibración API

\n

Retos

\n
Vibración de notificaciones
\n

Ya tienes tus notificaciones, ahora que te parece si agregas la capacidad de\nvibrar cuando éstas lleguen a tu usuario.

\n

Referencias

\n\n

Conclusión

\n

Existen muchas APIs que vuelven cada vez más potente al navegador, y esto a\npermitido grandes avances en la web, lo único que te podemos decir es que nunca\nnos va a dar el tiempo de ver todos, solo hay que ser curiosas y comenzar a\njugar sin miedo con ellas.

\n

Recuerda tener presente que muchas de ellas tienen problemas de compatibilidad\ncon dispositivos o navegadores específicos así que no vayas a pensar que algo\nestá fallando en tu código necesariamente, puede que sea algo de hardware. Por\notro lado, recuerda que en The HTML 5 JavaScript API Index\npuedes indagar un poco más acerca de las APIs existentes.

\n

Y mira de manera interactiva cómo ha evolucionado la web en\nwww.evolutionoftheweb.com.

\n

\"Evolution

" }, "pt": { "title": "Mais APIs", - "body": "

Objetivos de Aprendizagem

\n
    \n
  • Incentivar a explorar outras APIs de HTML5.
  • \n
\n

Outras APIs

\n

Nesta unidade, focamos em algumas APIs específicas, mas como mencionamos, não\nsão as únicas. Convidamos você a explorar por conta própria as outras.

\n

Aqui deixamos algumas com as quais você pode ir brincando:

\n

Canvas

\n

O elemento HTML <canvas> é utilizado para desenhar gráficos por meio de\nJavaScript. No HTML, o elemento é só um contêiner de gráficos. A API fornece\ndiversos métodos para desenhar linhas, caixas, círculos, texto e adicionar\nimagens.

\n

Desafios

\n
Exercitando com formas
\n

Desenhe as diversas formas geométricas que você conhece e comece a dar um estilo\npersonalizado a cada uma delas.

\n

Exemplo:

\n
Imagens pixeladas
\n

Crie uma interface com suas imagens preferidas e torne-as pixeladas.

\n

Exemplo: Veja a seção de Quem somos? no sítio web das Developers\nLaboratoria.

\n

Referências

\n\n

File

\n

Esta provavelmente você já conhece, por meio do elemento <input type=\"file\" />\nou quando você quis adicionar uma imagem no momento de postar em sua rede\nsocial. Qualquer que tenha sido o cenário, você perceberá que é muito útil saber\nmanipulá-la.

\n

Desafios

\n
Editando foto de perfil
\n

Lembra do desafio de web storage, no qual você podia editar os dados do seu\nperfil? Que tal se agora você puder alterar também sua foto de perfil? E se\nrecarregar a página, permanecer a imagem que acabou de trocar? Comece a mesclar\nas duas APIs e vá até onde sua imaginação deixar. Lembre-se de que uma boa\nmaneira de indicar ao usuário que sua edição está correta é exibindo como ficará\nantes de salvar efetivamente.

\n
\n

Você deve testar isto no seu dispositivo móvel quando terminar. Estamos\nconfiantes que você perceberá que pode colocar uma selfie que tirou com sua\ncâmera como foto de perfil. Ooopss, a ideia era que você percebesse isso\nsozinha ;)

\n
\n
Instagram?
\n

Se você já sabe como exibir imagens que estão armazenadas em seu PC ou celular,\nvocê pode adicionar interação com o DOM, logar em redes sociais e armazenar as\ninformações em uma base de dados graças ao Firebase; isto quer dizer que você\ntem tudo o que precisa para construir o seu próprio Instagram! Solte sua\nimaginação e divirta-se criando sua rede social de imagens do seu jeito.

\n
\n

Nota: com CSS você pode adicionar filtros em suas\nimagens :scream:

\n
\n

Referências

\n\n

WebSockets

\n

Algumas vez lhe perguntaram como funcionam as aplicações em tempo real? Como\nfunciona o Facebook, WhatsApp e outras redes sociais para notificar que você\nrecebeu uma mensagem imediatamente depois de que o remetente a tenha enviado? Um\nexemplo mais técnico seria por meio de Firebase. Você percebeu que, se sua\naplicação ouve as mudanças na base de dados, ela atualiza automaticamente?

\n

Tudo isso é graças aos Web Sockets. HTML5 fornece esta API com a qual você\npode estabelecer conexões socket entre o navegador e um servidor. Isso\nsignifica que existe uma conexão persistente na qual você pode enviar dados a\nqualquer momento.

\n

Como dissemos no parágrafo anterior, é necessário escrever um script no servidor\ne no cliente estabelecer uma conexão com Web Sockets. Isso pode ser um pouco\ncomplicado principalmente porque a implementação varia no back-end dependendo\nda linguagem e varia no cliente devido à compatibilidade entre navegadores. Para\ntestar esta API de uma maneira simples, você poderia utilizar Node.js\n(JavaScript ao lado do servidor) e uma biblioteca que funcione em ambos os lados\n(cliente e servidor) como socket.io.

\n

Desafios

\n
Real-time chat
\n

Provavelmente você dirá que com Firebase já pode fazer um chat em tempo real,\ncontudo convidamos você a viver a experiência de criá-lo sem Firebase e veja\ncomo pode fazer uma aplicação em tempo real escrevendo código tanto no cliente\ncomo no servidor.

\n
Canvas + Socket.io
\n

Você pode imaginar ter uma lousa compartilhada? Com canvas você pode criar uma\ntela e usando eventos de mouse para desenhar nela. Se esses desenhos forem\nenviados para um socket você poderia desenhá-los para todos os usuários\nconectados em tempo real (quase como um quadro mágico). Pense nisso, pode\najudá-la quando quiser ensinar ou estudar em conjunto com alguém.

\n
Hangouts, Skype
\n

Se você pudesse acessar a câmera de seu notebook, exibi-la na web e transmitir a\nimagem por meio de um socket, você teria uma aplicação de vídeo-chamadas. Acha\nque ainda não pode? Como já lhe dissemos, com um par de APIs associados a Web\nSockets e com sua vontade de fazer, você consegue ;)

\n

As APIs seriam getUserMedia (parte\nde Media API) e Canvas. E provavelmente ao pesquisar sobre o assunto, você\nacabará encontrando o WebRTC.

\n

Calma, você terá que dedicar tempo, mas se estiver interessada, temos 100% de\ncerteza de que você consegue :).

\n

Referências

\n\n

Notificações

\n
\n

A API de notificações permite que uma página web envie notificações que serão\nexibidas fora da web no nível de sistema. Isso permite às aplicações web\nenviar informações para o usuário embora estas estejam em segundo plano.

\n
\n

Fonte: MDN - Usando a API de\nNotificações

\n

Desafios

\n
Notificações de Mensagens
\n

Você já tem seu chat ou rede social seja com Firebase ou com sua própria\nimplementação de Web Sockets. Agora, o que acha se a cada vez que um usuário\ninterage com sua aplicação, ela envia uma notificação? Isso seria muito legal!

\n

Referências

\n\n

Vibração

\n
\n

A maioria dos dispositivos modernos podem vibrar utilizando o hardware. Isso\npermite que por meio do código de software se possa emitir essas vibrações. A\nVibration API permite às aplicações web a capacidade de acessar esse hardware\nno caso de haver suporte para tal. Caso contrário, o dispositivo não faz nada.

\n
\n

Fonte: MDN - Vibration\nAPI

\n

Desafios

\n
Vibração de notificações
\n

Você já tem suas notificações. Agora, o que acha de adicionar a capacidade de\nvibrar quando elas chegarem para o usuário?

\n

Referências

\n\n

Conclusão

\n

Existem muitas APIs que tornam o navegador cada vez mais poderoso e isso tem\npermitido grandes avanços na web. Só podemos dizer que nunca teremos tempo de\nlhe mostrar todas, portanto você deve ser curiosa e começar a brincar com elas\nsem medo.

\n

Lembre-se que muitas delas possuem problemas de compatibilidade com dispositivos\ne navegadores específicos. Portanto, alguma falha pode estar acontecendo por\nfalha de hardware e não por causa de seu software. Por outro lado, lembre-se que\nem The HTML 5 JavaScript API Index você pode aprender\num pouco mais sobre as APIs existentes.

\n

E veja de forma interativa como a web tem evoluído em\nwww.evolutionoftheweb.com.

\n

\"Evolution

" + "body": "

Objetivos de Aprendizagem

\n
    \n
  • Incentivar a explorar outras APIs de HTML5.
  • \n
\n

Outras APIs

\n

Nesta unidade, focamos em algumas APIs específicas, mas como mencionamos, não\nsão as únicas. Convidamos você a explorar por conta própria as outras.

\n

Aqui deixamos algumas com as quais você pode ir brincando:

\n

Canvas

\n

O elemento HTML <canvas> é utilizado para desenhar gráficos por meio de\nJavaScript. No HTML, o elemento é só um contêiner de gráficos. A API fornece\ndiversos métodos para desenhar linhas, caixas, círculos, texto e adicionar\nimagens.

\n

Desafios

\n
Exercitando com formas
\n

Desenhe as diversas formas geométricas que você conhece e comece a dar um estilo\npersonalizado a cada uma delas.

\n

Exemplo:

\n See the Pen [CSS Basic\n Shapes](https://codepen.io/krystalcampioni/pen/bgYxQa/) by Krystal Campioni\n ([@krystalcampioni](https://codepen.io/krystalcampioni)) on\n [CodePen](https://codepen.io).\n\n
Imagens pixeladas
\n

Crie uma interface com suas imagens preferidas e torne-as pixeladas.

\n

Exemplo: Veja a seção de Quem somos? no sítio web das Developers\nLaboratoria.

\n

Referências

\n\n

File

\n

Esta provavelmente você já conhece, por meio do elemento <input type=\"file\" />\nou quando você quis adicionar uma imagem no momento de postar em sua rede\nsocial. Qualquer que tenha sido o cenário, você perceberá que é muito útil saber\nmanipulá-la.

\n

Desafios

\n
Editando foto de perfil
\n

Lembra do desafio de web storage, no qual você podia editar os dados do seu\nperfil? Que tal se agora você puder alterar também sua foto de perfil? E se\nrecarregar a página, permanecer a imagem que acabou de trocar? Comece a mesclar\nas duas APIs e vá até onde sua imaginação deixar. Lembre-se de que uma boa\nmaneira de indicar ao usuário que sua edição está correta é exibindo como ficará\nantes de salvar efetivamente.

\n
\n

Você deve testar isto no seu dispositivo móvel quando terminar. Estamos\nconfiantes que você perceberá que pode colocar uma selfie que tirou com sua\ncâmera como foto de perfil. Ooopss, a ideia era que você percebesse isso\nsozinha ;)

\n
\n
Instagram?
\n

Se você já sabe como exibir imagens que estão armazenadas em seu PC ou celular,\nvocê pode adicionar interação com o DOM, logar em redes sociais e armazenar as\ninformações em uma base de dados graças ao Firebase; isto quer dizer que você\ntem tudo o que precisa para construir o seu próprio Instagram! Solte sua\nimaginação e divirta-se criando sua rede social de imagens do seu jeito.

\n
\n

Nota: com CSS você pode adicionar filtros em suas\nimagens :scream:

\n
\n

Referências

\n\n

WebSockets

\n

Algumas vez lhe perguntaram como funcionam as aplicações em tempo real? Como\nfunciona o Facebook, WhatsApp e outras redes sociais para notificar que você\nrecebeu uma mensagem imediatamente depois de que o remetente a tenha enviado? Um\nexemplo mais técnico seria por meio de Firebase. Você percebeu que, se sua\naplicação ouve as mudanças na base de dados, ela atualiza automaticamente?

\n

Tudo isso é graças aos Web Sockets. HTML5 fornece esta API com a qual você\npode estabelecer conexões socket entre o navegador e um servidor. Isso\nsignifica que existe uma conexão persistente na qual você pode enviar dados a\nqualquer momento.

\n

Como dissemos no parágrafo anterior, é necessário escrever um script no servidor\ne no cliente estabelecer uma conexão com Web Sockets. Isso pode ser um pouco\ncomplicado principalmente porque a implementação varia no back-end dependendo\nda linguagem e varia no cliente devido à compatibilidade entre navegadores. Para\ntestar esta API de uma maneira simples, você poderia utilizar Node.js\n(JavaScript ao lado do servidor) e uma biblioteca que funcione em ambos os lados\n(cliente e servidor) como socket.io.

\n

Desafios

\n
Real-time chat
\n

Provavelmente você dirá que com Firebase já pode fazer um chat em tempo real,\ncontudo convidamos você a viver a experiência de criá-lo sem Firebase e veja\ncomo pode fazer uma aplicação em tempo real escrevendo código tanto no cliente\ncomo no servidor.

\n
Canvas + Socket.io
\n

Você pode imaginar ter uma lousa compartilhada? Com canvas você pode criar uma\ntela e usando eventos de mouse para desenhar nela. Se esses desenhos forem\nenviados para um socket você poderia desenhá-los para todos os usuários\nconectados em tempo real (quase como um quadro mágico). Pense nisso, pode\najudá-la quando quiser ensinar ou estudar em conjunto com alguém.

\n
Hangouts, Skype
\n

Se você pudesse acessar a câmera de seu notebook, exibi-la na web e transmitir a\nimagem por meio de um socket, você teria uma aplicação de vídeo-chamadas. Acha\nque ainda não pode? Como já lhe dissemos, com um par de APIs associados a Web\nSockets e com sua vontade de fazer, você consegue ;)

\n

As APIs seriam getUserMedia (parte\nde Media API) e Canvas. E provavelmente ao pesquisar sobre o assunto, você\nacabará encontrando o WebRTC.

\n

Calma, você terá que dedicar tempo, mas se estiver interessada, temos 100% de\ncerteza de que você consegue :).

\n

Referências

\n\n

Notificações

\n
\n

A API de notificações permite que uma página web envie notificações que serão\nexibidas fora da web no nível de sistema. Isso permite às aplicações web\nenviar informações para o usuário embora estas estejam em segundo plano.

\n
\n

Fonte: MDN - Usando a API de\nNotificações

\n

Desafios

\n
Notificações de Mensagens
\n

Você já tem seu chat ou rede social seja com Firebase ou com sua própria\nimplementação de Web Sockets. Agora, o que acha se a cada vez que um usuário\ninterage com sua aplicação, ela envia uma notificação? Isso seria muito legal!

\n

Referências

\n\n

Vibração

\n
\n

A maioria dos dispositivos modernos podem vibrar utilizando o hardware. Isso\npermite que por meio do código de software se possa emitir essas vibrações. A\nVibration API permite às aplicações web a capacidade de acessar esse hardware\nno caso de haver suporte para tal. Caso contrário, o dispositivo não faz nada.

\n
\n

Fonte: MDN - Vibration\nAPI

\n

Desafios

\n
Vibração de notificações
\n

Você já tem suas notificações. Agora, o que acha de adicionar a capacidade de\nvibrar quando elas chegarem para o usuário?

\n

Referências

\n\n

Conclusão

\n

Existem muitas APIs que tornam o navegador cada vez mais poderoso e isso tem\npermitido grandes avanços na web. Só podemos dizer que nunca teremos tempo de\nlhe mostrar todas, portanto você deve ser curiosa e começar a brincar com elas\nsem medo.

\n

Lembre-se que muitas delas possuem problemas de compatibilidade com dispositivos\ne navegadores específicos. Portanto, alguma falha pode estar acontecendo por\nfalha de hardware e não por causa de seu software. Por outro lado, lembre-se que\nem The HTML 5 JavaScript API Index você pode aprender\num pouco mais sobre as APIs existentes.

\n

E veja de forma interativa como a web tem evoluído em\nwww.evolutionoftheweb.com.

\n

\"Evolution

" } } } @@ -441,11 +441,11 @@ "intl": { "es": { "title": "Comunicación Cliente Servidor", - "body": "

Objetivos de Aprendizaje

\n
    \n
  • Entender el flujo de petición y respuesta
  • \n
  • Qué significa que sea asíncrono
  • \n
\n

Petición y Respuesta

\n

Para entender esto, lo primero es recordar que existe un protocolo de\ncomunicación en el que se deja claro cómo y de que manera un cliente\n(navegador) pide información/datos a un servidor. Ya teniendo en cuenta\nesto revisemos la siguiente imagen:

\n

\"comunicación\"

\n

En la imagen se puede apreciar como un cliente (emisor) realiza una solicitud\nHTTP (HTTP Request) a un servidor (receptor) y este último le responde\n(HTTP Response) el pedido.

\n

Estas peticiones y respuestas (que generalmente son conocidas como requests\ny responses, su traducción en inglés) son transportados a través de internet\ncomo medio de comunicación.

\n

Cuando hacemos esto normalmente lo realizamos de forma Síncrona, es decir\nque necesitamos que cada petición tenga su respuesta antes de enviar otra\npetición, tal como en una conversación entre dos personas.

\n
\n

Cuando el navegador hace una petición de forma síncrona tiene que esperar la\nrespuesta antes de proceder a la carga de una página

\n
\n

Pero esto en algún momento ya no nos va a resultar tan eficiente o funcional,\nten en cuenta que generalmente solo una petición no es lo único que una\naplicación está haciendo, y en general estará haciendo muchas peticiones a la\nvez, es por eso que podemos, y debemos, hacerlo de manera Asíncrona haciendo\nuso de AJAX y así lograr hacer más de una \"tarea\" a la vez.

\n
\n

Cuando el navegador hace peticiones de forma asíncrona, estas pueden\nocurrir en el fondo sin bloquear la carga de una página

\n
\n

En el siguiente vídeo los geniales amigos de UDACITY nos explican de manera\nvisual lo anterior, está en inglés pero ya sabemos que ese no es impedimento\npara que entendamos el concepto :muscle:

\n

\"Client-server

" + "body": "

Objetivos de Aprendizaje

\n
    \n
  • Entender el flujo de petición y respuesta
  • \n
  • Qué significa que sea asíncrono
  • \n
\n

Petición y Respuesta

\n

Para entender esto, lo primero es recordar que existe un protocolo de\ncomunicación en el que se deja claro cómo y de que manera un cliente\n(navegador) pide información/datos a un servidor. Ya teniendo en cuenta\nesto revisemos la siguiente imagen:

\n

\"comunicación\"

\n

En la imagen se puede apreciar como un cliente (emisor) realiza una solicitud\nHTTP (HTTP Request) a un servidor (receptor) y este último le responde\n(HTTP Response) el pedido.

\n

Estas peticiones y respuestas (que generalmente son conocidas como requests\ny responses, su traducción en inglés) son transportados a través de internet\ncomo medio de comunicación.

\n

Cuando hacemos esto normalmente lo realizamos de forma Síncrona, es decir\nque necesitamos que cada petición tenga su respuesta antes de enviar otra\npetición, tal como en una conversación entre dos personas.

\n
\n

Cuando el navegador hace una petición de forma síncrona tiene que esperar la\nrespuesta antes de proceder a la carga de una página

\n
\n

Pero esto en algún momento ya no nos va a resultar tan eficiente o funcional,\nten en cuenta que generalmente solo una petición no es lo único que una\naplicación está haciendo, y en general estará haciendo muchas peticiones a la\nvez, es por eso que podemos, y debemos, hacerlo de manera Asíncrona haciendo\nuso de AJAX y así lograr hacer más de una \"tarea\" a la vez.

\n
\n

Cuando el navegador hace peticiones de forma asíncrona, estas pueden\nocurrir en el fondo sin bloquear la carga de una página

\n
\n

En el siguiente vídeo los geniales amigos de UDACITY nos explican de manera\nvisual lo anterior, está en inglés pero ya sabemos que ese no es impedimento\npara que entendamos el concepto :muscle:

\n

" }, "pt": { "title": "Comunicação Cliente Servidor", - "body": "

Objetivos de Aprendizagem

\n
    \n
  • Entender o fluxo de request e response e o que significa assíncrono.
  • \n
\n

Requisição e Resposta

\n

Para entender isso, primeiro precisamos lembrar que existe um protocolo de\ncomunicação que deixa claro de que maneira um cliente (navegador) solicita\ninformações/dados de um servidor. Levando em conta isso vamos revisar com a\nimagem a seguir:

\n

\"Comunicação\"

\n

Na imagem podemos ver como um cliente (emissor) faz uma solicitação HTTP (HTTP\nRequest) para um servidor (receptor) e este último responde ao pedido (HTTP\nResponse).

\n

Esses request e response são transportados pela internet como intermediário.

\n

Quando fazemos isso normalmente o fazemos de forma síncrona, ou seja,\nnecessitamos que cada solicitação tenha sua resposta antes de enviar outra\npetição.

\n
\n

Quando o navegador faz uma petição de forma síncrona ele precisa esperar a\nresposta antes de continuar com o carregamento de uma página.

\n
\n

Mas isso em algum momento já não vai ser tão eficiente ou funcional, de maneira\nque podemos fazê-lo de forma assíncrona utilizando AJAX, podendo fazer\nmais de uma \"tarefa\" por vez.

\n
\n

Quando o navegador faz petições de forma assíncrona, elas podem ocorrer por\ntrás sem bloquear o carregamento de uma página.

\n
\n

No vídeo a seguir os amigos geniais da UDACITY explicam de maneira visual o\nconteúdo anterior. Está em inglês mas já sabemos que isso não é impedimento para\nque entendamos o conceito :muscle:

\n

\"Client-server\ncommunication\"

" + "body": "

Objetivos de Aprendizagem

\n
    \n
  • Entender o fluxo de request e response e o que significa assíncrono.
  • \n
\n

Requisição e Resposta

\n

Para entender isso, primeiro precisamos lembrar que existe um protocolo de\ncomunicação que deixa claro de que maneira um cliente (navegador) solicita\ninformações/dados de um servidor. Levando em conta isso vamos revisar com a\nimagem a seguir:

\n

\"Comunicação\"

\n

Na imagem podemos ver como um cliente (emissor) faz uma solicitação HTTP (HTTP\nRequest) para um servidor (receptor) e este último responde ao pedido (HTTP\nResponse).

\n

Esses request e response são transportados pela internet como intermediário.

\n

Quando fazemos isso normalmente o fazemos de forma síncrona, ou seja,\nnecessitamos que cada solicitação tenha sua resposta antes de enviar outra\npetição.

\n
\n

Quando o navegador faz uma petição de forma síncrona ele precisa esperar a\nresposta antes de continuar com o carregamento de uma página.

\n
\n

Mas isso em algum momento já não vai ser tão eficiente ou funcional, de maneira\nque podemos fazê-lo de forma assíncrona utilizando AJAX, podendo fazer\nmais de uma \"tarefa\" por vez.

\n
\n

Quando o navegador faz petições de forma assíncrona, elas podem ocorrer por\ntrás sem bloquear o carregamento de uma página.

\n
\n

No vídeo a seguir os amigos geniais da UDACITY explicam de maneira visual o\nconteúdo anterior. Está em inglês mas já sabemos que isso não é impedimento para\nque entendamos o conceito :muscle:

\n

" } } }, @@ -457,11 +457,11 @@ "intl": { "es": { "title": "AJAX", - "body": "

Objetivos de Aprendizaje

\n
    \n
  • Entender qué significa AJAX
  • \n
\n

Un poco de historia

\n
\n

JavaScript Asíncrono y XML (AJAX) no es una tecnología por sí misma,\nes un término que describe un nuevo modo de utilizar conjuntamente varias\ntecnologías existentes. Esto incluye: HTML o XHTML, CSS, JavaScript, DOM,\nXML, XSLT, y el objeto XMLHttpRequest. Cuando estas tecnologías se combinan\nen un modelo AJAX, es posible lograr aplicaciones web capaces de actualizarse\ncontinuamente sin tener que volver a cargar la página completa. Esto crea\naplicaciones más rápidas y con mejor respuesta a las acciones del usuario.

\n
\n

Extracto de MDN WEB DOCS:

\n
\n

En la aplicación web tradicional, la computadora cliente realiza una solicitud\nde una página web. El servidor crea y regresa la página para el cliente.\nFinalmente, el cliente carga la nueva página y muestra la información.\nSi interactúan con la página, digamos para agregar o eliminar algo o al enviar\nun formulario, vuelve a comenzar el ciclo. El cliente hará otra solicitud,\nel servidor regresa una página totalmente nueva, el cliente carga y se\nlo presenta nuevamente al usuario.

\n
\n

Hasta mediados de la década de los 2000, esta era básicamente la única forma\nen que se producía la comunicación por Internet. La información residiría en\nel servidor, un cliente solicitaría esos datos, actualizaría la página y\nla mostraría. Este ciclo se repetiría para todas y cada una de las\nnuevas solicitudes.

\n

A finales de los años 90, el equipo de Microsoft Outlook agregó el componente\nXMLHTTP a Internet Explorer y compiló la versión web del cliente de correo de\nOutlook. Este código fue recogido por otros navegadores como\nXMLHttpRequest. Esto permitió a los navegadores realizar solicitudes HTTP\ndesde Javascript y actualizar la página actual sin recuperar una página\ncompleta del servidor. En lugar del modelo síncrono de espera para una página\ncompleta, la interfaz de usuario podría actualizarse de forma asíncrona a\nmedida que el usuario siguiera trabajando.

\n

AJAX

\n

En 2005, Jesse James Garrett acuñó el término AJAX para significar\n\"Javascript y XML asíncronos\". Esta es esencialmente la técnica de usar\nXMLHTTPRequest para recuperar datos y luego modificar la página actual.

\n

AJAX tomó el mundo de la web por asalto, extendiéndose mucho más allá de\nMicrosoft Outlook. Las aplicaciones web de vanguardia como Flickr, GMail y\nGoogle Maps lo adoptaron rápidamente. En lugar de tener que esperar para\nobtener datos y actualizar la página completa, estas nuevas aplicaciones\ncasi instantáneas fueron increíbles.

\n

Video AJAX

\n

En la lectura y vídeo anterior se menciona JSON y XML, vayamos a este enlace\npara leer al respecto.

\n

Y por último terminamos con esta lectura\nque nos resume y explica con otras palabras que es AJAX.

" + "body": "

Objetivos de Aprendizaje

\n
    \n
  • Entender qué significa AJAX
  • \n
\n

Un poco de historia

\n
\n

JavaScript Asíncrono y XML (AJAX) no es una tecnología por sí misma,\nes un término que describe un nuevo modo de utilizar conjuntamente varias\ntecnologías existentes. Esto incluye: HTML o XHTML, CSS, JavaScript, DOM,\nXML, XSLT, y el objeto XMLHttpRequest. Cuando estas tecnologías se combinan\nen un modelo AJAX, es posible lograr aplicaciones web capaces de actualizarse\ncontinuamente sin tener que volver a cargar la página completa. Esto crea\naplicaciones más rápidas y con mejor respuesta a las acciones del usuario.

\n
\n

Extracto de MDN WEB DOCS:

\n
\n

En la aplicación web tradicional, la computadora cliente realiza una solicitud\nde una página web. El servidor crea y regresa la página para el cliente.\nFinalmente, el cliente carga la nueva página y muestra la información.\nSi interactúan con la página, digamos para agregar o eliminar algo o al enviar\nun formulario, vuelve a comenzar el ciclo. El cliente hará otra solicitud,\nel servidor regresa una página totalmente nueva, el cliente carga y se\nlo presenta nuevamente al usuario.

\n
\n

Hasta mediados de la década de los 2000, esta era básicamente la única forma\nen que se producía la comunicación por Internet. La información residiría en\nel servidor, un cliente solicitaría esos datos, actualizaría la página y\nla mostraría. Este ciclo se repetiría para todas y cada una de las\nnuevas solicitudes.

\n

A finales de los años 90, el equipo de Microsoft Outlook agregó el componente\nXMLHTTP a Internet Explorer y compiló la versión web del cliente de correo de\nOutlook. Este código fue recogido por otros navegadores como\nXMLHttpRequest. Esto permitió a los navegadores realizar solicitudes HTTP\ndesde Javascript y actualizar la página actual sin recuperar una página\ncompleta del servidor. En lugar del modelo síncrono de espera para una página\ncompleta, la interfaz de usuario podría actualizarse de forma asíncrona a\nmedida que el usuario siguiera trabajando.

\n

AJAX

\n

En 2005, Jesse James Garrett acuñó el término AJAX para significar\n\"Javascript y XML asíncronos\". Esta es esencialmente la técnica de usar\nXMLHTTPRequest para recuperar datos y luego modificar la página actual.

\n

AJAX tomó el mundo de la web por asalto, extendiéndose mucho más allá de\nMicrosoft Outlook. Las aplicaciones web de vanguardia como Flickr, GMail y\nGoogle Maps lo adoptaron rápidamente. En lugar de tener que esperar para\nobtener datos y actualizar la página completa, estas nuevas aplicaciones\ncasi instantáneas fueron increíbles.

\n

\n

En la lectura y vídeo anterior se menciona JSON y XML, vayamos a este enlace\npara leer al respecto.

\n

Y por último terminamos con esta lectura\nque nos resume y explica con otras palabras que es AJAX.

" }, "pt": { "title": "AJAX", - "body": "

Objetivos de Aprendizagem

\n
    \n
  • Entender o que significa AJAX
  • \n
\n

Um pouco de história

\n
\n

JavaScript Assíncrono e XML (AJAX) não são uma tecnologia por si mesmas, mas\num termo que descreve um novo modo de utilizar conjuntamente várias\ntecnologias existentes. Isso inclui: HTML ou XHTML, CSS, JavaScript, DOM, XML,\nXSLT e o objeto XMLHttpRequest. Quando essas tecnologias se combinam em um\nmodelo AJAX, é possível fazer aplicações web capazes de atualização contínua\nsem precisar recarregar a página completamente. Isso cria aplicações mais\nrápidas e com melhor resposta às ações do usuário.

\n
\n

Parta do MDN WEB DOCS

\n
\n

Na aplicação web tradicional, o computador cliente realiza uma solicitação de\numa página web. O servidor cria e retorna a página para o cliente. Finalmente,\no cliente carrega a nova página e mostra a informação. Há interação com as\npáginas, digamos para adicionar ou eliminar algo ou enviar um formulário e de\nnovo começa o ciclo. O cliente fará outra solicitação, o servidor retorna uma\npágina totalmente nova, o cliente carrega e a apresenta ao usuário.

\n
\n

Até meados da década de 2000, esta era basicamente a única maneira de se\nproduzir comunicação pela Internet. A informação residiria no servidor, um\ncliente solicitaria esses dados, atualizaria a página e a mostraria. Esse ciclo\nse repetiria para toda nova solicitação.

\n

No final dos anos 1990, a equipe do Microsoft Outlook adicionou o componente\nXMLHTTP ao Internet Explorer e compilou uma versão web do cliente de e-mail do\nOutlook. Esse código foi agregado a outros navegadores como XMLHttpRequest.\nIsso permitiu aos navegadores realizar solicitações HTTP a partir do JavaScript\ne atualizar a página sem buscá-la no servidor. No lugar do modelo síncrono de\nespera para uma página completa, a interface do usuário poderia ser atualizada\nde forma assíncrona a medida que o usuário seguisse trabalhando.

\n

AJAX

\n

Em 2005, Jesse James Garrett cunhou o termo AJAX como significado de \"JavaScript\ne XML assíncronos\". Essa é essencialmente a técnica de utilizar XMLHttpRequest\npara recuperar dados e em seguida modificar a página atual.

\n

AJAX tomou de assalto o mundo da web, indo muito mais além do Microsoft Outlook.\nAs aplicações web de vanguarda como Flickr, GMail e Google Maps adotaram AJAX\nrapidamente. No lugar de ter que esperar para obter dados e atualizar a página\ncompleta, essas novas aplicações quase instantâneas eram incríveis.

\n

Video AJAX

\n

Na leitura e vídeo anteriores são mencionados JSON e XML. Vejamos este\nlink\nem espanhol para ler a respeito.

\n

E por último terminamos com esta\nleitura\nem espanhol que resume e explica com outras palavras o que é AJAX.

" + "body": "

Objetivos de Aprendizagem

\n
    \n
  • Entender o que significa AJAX
  • \n
\n

Um pouco de história

\n
\n

JavaScript Assíncrono e XML (AJAX) não são uma tecnologia por si mesmas, mas\num termo que descreve um novo modo de utilizar conjuntamente várias\ntecnologias existentes. Isso inclui: HTML ou XHTML, CSS, JavaScript, DOM, XML,\nXSLT e o objeto XMLHttpRequest. Quando essas tecnologias se combinam em um\nmodelo AJAX, é possível fazer aplicações web capazes de atualização contínua\nsem precisar recarregar a página completamente. Isso cria aplicações mais\nrápidas e com melhor resposta às ações do usuário.

\n
\n

Parta do MDN WEB DOCS

\n
\n

Na aplicação web tradicional, o computador cliente realiza uma solicitação de\numa página web. O servidor cria e retorna a página para o cliente. Finalmente,\no cliente carrega a nova página e mostra a informação. Há interação com as\npáginas, digamos para adicionar ou eliminar algo ou enviar um formulário e de\nnovo começa o ciclo. O cliente fará outra solicitação, o servidor retorna uma\npágina totalmente nova, o cliente carrega e a apresenta ao usuário.

\n
\n

Até meados da década de 2000, esta era basicamente a única maneira de se\nproduzir comunicação pela Internet. A informação residiria no servidor, um\ncliente solicitaria esses dados, atualizaria a página e a mostraria. Esse ciclo\nse repetiria para toda nova solicitação.

\n

No final dos anos 1990, a equipe do Microsoft Outlook adicionou o componente\nXMLHTTP ao Internet Explorer e compilou uma versão web do cliente de e-mail do\nOutlook. Esse código foi agregado a outros navegadores como XMLHttpRequest.\nIsso permitiu aos navegadores realizar solicitações HTTP a partir do JavaScript\ne atualizar a página sem buscá-la no servidor. No lugar do modelo síncrono de\nespera para uma página completa, a interface do usuário poderia ser atualizada\nde forma assíncrona a medida que o usuário seguisse trabalhando.

\n

AJAX

\n

Em 2005, Jesse James Garrett cunhou o termo AJAX como significado de \"JavaScript\ne XML assíncronos\". Essa é essencialmente a técnica de utilizar XMLHttpRequest\npara recuperar dados e em seguida modificar a página atual.

\n

AJAX tomou de assalto o mundo da web, indo muito mais além do Microsoft Outlook.\nAs aplicações web de vanguarda como Flickr, GMail e Google Maps adotaram AJAX\nrapidamente. No lugar de ter que esperar para obter dados e atualizar a página\ncompleta, essas novas aplicações quase instantâneas eram incríveis.

\n

\n

Na leitura e vídeo anteriores são mencionados JSON e XML. Vejamos este\nlink\nem espanhol para ler a respeito.

\n

E por último terminamos com esta\nleitura\nem espanhol que resume e explica com outras palavras o que é AJAX.

" } } }, @@ -489,11 +489,11 @@ "intl": { "es": { "title": "XHR", - "body": "

Objetivos de Aprendizaje

\n
    \n
  • Entender qué es XHR
  • \n
\n

Analogía

\n

Una buena manera de entender XHR es usando la siguiente analogía:

\n
\n

Preparar un pastel!\nPara prepararlo necesitamos, harina, huevo, leche, mantequilla y un horno.\nEncendemos el horno. Luego procedemos a mezclar los 4 ingredientes y ya\nlista la mezcla la metemos al horno, aquí va a tardar un poco en lo que se\nhornea pero mientras podemos ir preparando la cubierta del pastel.

\n
\n

Un objeto XHR es proporcionado por el entorno de JavaScript y se utiliza para\nhacer peticiones AJAX, es muy parecido a la parte de la preparación de la mezcla\ndonde primero debemos \"preparar\" las configuraciones y luego mandar nuestra\npetición, pero una vez hecho esto nuestro código puede seguir adelante y hacer\notras peticiones o tareas.

\n
\n

Cuando el horno nos regresa el pastel horneado podemos continuar con\ndecorarlo

\n
\n

Una vez que nuestra petición tiene respuesta puede seguir adelante con lo que\nhayamos dispuesto para esta \"tarea\".

\n

XMLHTTPRequest

\n

El entorno de JavaScript nos proporciona una forma de realizar solicitudes\nHTTP asíncronas. Esto lo hacemos con un objeto XMLHttpRequest, podemos usar\neste objeto con la función de constructor XMLHttpRequest proporcionada.

\n

XMLHttpRequests (comúnmente abreviado como XHR o xhr) se puede utilizar para\nsolicitar cualquier tipo de archivo (por ejemplo, archivos de texto plano,\nHTML, JSON, de imagen, etc.) o datos de una API.

\n

Ahora profundizaremos en el objeto XMLHttpRequest. Veremos cómo crearlo, qué\nmétodos y propiedades se deben usar y cómo enviar realmente solicitudes\nasíncronas.

\n

XMLHttpRequests

\n

El objeto XHR y su método .open()

\n

Ya que hemos construido un objeto XHR llamado asyncRequestObject.

\n
const asyncRequestObject = new XMLHttpRequest ();\n
\n

Podemos acceder a sus métodos, uno de los más importantes es el método .open()

\n

asyncRequestObject.open();

\n

.open() toma una serie de parámetros, pero los más importantes son sus dos\nprimeros: el método HTTP y la URL para enviar la solicitud.

\n

\"sintax-open\"

\n

Si queremos solicitar de manera asíncrona la página de inicio del popular sitio\nde imágenes de alta resolución, Unsplash, usaremos una solicitud GET y\nproporcionaremos la URL:

\n
asyncRequestObject.open('GET', 'https://unsplash.com');\n
\n
\n

Los métodos HTTP que por el momento más usaremos son:\nGET - para recuperar datos.\nPOST - para enviar datos.

\n
\n

El objeto XHR y su método .send()

\n

Para enviar la solicitud, necesitamos usar el método de envío:

\n
asyncRequestObject.send();\n
\n

Ya sabemos que no hay mejor manera de aprender que practicar, para ver como\nfunciona, dirígete a Unsplash, abre tu developer tools\ny agrega en consola el objeto y sus métodos open y send.

\n

\"XHR

\n

En el siguiente video podemos ver que es lo pasa, está en inglés pero si vas\nhaciendo el paso a paso como en el video, seguro que le entiendes.

\n

\"XHR

\n

Respuesta correcta

\n

Ya que la petición ha sido enviada debemos establecer la propiedad onload en\nel objeto a una función que manejará la respuesta exitosa de nuestra solicitud\nXHR:

\n
function handleSuccess () {\n    // en la función, `this` es el valor del objeto XHR\n    // this.responseText contiene la respuesta del servidor\n\n    console.log( this.responseText ); // el HTML de https://unsplash.com/\n}\n\nasyncRequestObject.onload = handleSuccess;\n
\n

Con esto nos damos cuenta que si onload no está configurado, la solicitud\nvuelve pero no ocurre nada con eso.

\n

En caso de error

\n

Ahora veamos que pasa si sucede algo con la solicitud y no se puede cumplir,\nentonces necesitamos usar la propiedad onerror:

\n
function handleError () {\n    console.log( 'An error occurred 😞' );\n}\n\nasyncRequestObject.onerror = handleError;\n
\n

Al igual que con onload, si onerror no está configurado y se produce un\nerror, ese error simplemente fallará en silencio y tu código (¡y tu usuario!)\nno sabrá qué es lo que está mal ni cómo recuperarlo.

\n

Es una buena práctica el tener ambos casos, correcto y error, en control\nsiempre. Es nuestra responsabilidad de desarrolladoras el comunicar al usuario\nqué es lo que sucede mientras espera. Y ofrecer opciones en caso de error, eso\nhará que nuestras aplicaciones tengan una mejor UX (experiencia de usuario) y\nsean más robustas, esto es, que no se caigan con nada.

\n

Juntando todo

\n

Aquí está el código completo que hemos desarrollado.

\n

Se crea el objeto XHR, se le dice qué información solicitar, configuramos los\nmanejadores para un éxito o error y luego finalmente se envía la solicitud:

\n
function handleSuccess () {\n  console.log( this.responseText );\n\n}\n\nfunction handleError () {\n  console.log( 'An error occurred 😞' );\n}\n\nconst asyncRequestObject = new XMLHttpRequest();\nasyncRequestObject.open('GET', 'https://unsplash.com');\nasyncRequestObject.onload = handleSuccess;\nasyncRequestObject.onerror = handleError;\nasyncRequestObject.send();\n
\n

APIs y JSON

\n

Obtener el HTML de un sitio web está bien, pero probablemente no sea muy útil.\nLos datos que devuelve están en un formato que es extremadamente difícil de\nanalizar y consumir.

\n

Sería mucho más fácil (y útil) si pudiéramos obtener solo los datos que\nqueremos en una estructura de datos mejor ordenada, aquí entra JSON\n(JavaScript Object Notation).

\n

JSON

\n

Es un formato de texto, es una forma de ordenar los datos de manera que sea\nfácil procesarlos y manejarlos. Nace del problema de cómo podemos intercambiar\ndatos entre aplicaciones, páginas o servicios de una manera cómoda.\nJSON ES texto, pero con una estructura bien definida, tal como ordenamos\nlibros en capítulos, secciones, parrafos, lineas. Un JSON estará compuesto de\nllaves y valores tal como en el siguiente ejemplo:

\n
{\n  \"título\": \"La guía del viajero intergaláctico\",\n  \"autor\": \"Douglas Adams\",\n  \"descripción\": \"Triología de cinco partes\"\n}\n
\n

Título, autor y descripción son las llaves, mientras que el resto son los\nvalores de esas llaves.

\n

Comunicándose con una API-JSON

\n

Entonces, si estamos comunicándonos con una API a través de JSON, necesitamos\nque nuestro código entienda el formato de este texto especial, a este proceso le\nllamaremos análisis o parsing en inglés. Luego de este análisis, el texto pasa\na ser un objeto de javascript, que podemos manipular y acceder como cualquier\notro objeto que hemos visto.\nSupongamos que la respuesta es el JSON que pusimos de ejemplo anteriormente,\nveamos cómo podemos analizar o parsear ésta :

\n
function handleSuccess () {\n  const data = JSON.parse( this.responseText );\n  console.log( `${data.autor} escribió el libro : ${data.título}` );\n}\n\nasyncRequestObject.onload = handleSuccess;\n
\n

Para obtener más información sobre el uso del objeto XHR para realizar\nsolicitudes asíncronas, puedes consultar estos enlaces:

\n" + "body": "

Objetivos de Aprendizaje

\n
    \n
  • Entender qué es XHR
  • \n
\n

Analogía

\n

Una buena manera de entender XHR es usando la siguiente analogía:

\n
\n

Preparar un pastel!\nPara prepararlo necesitamos, harina, huevo, leche, mantequilla y un horno.\nEncendemos el horno. Luego procedemos a mezclar los 4 ingredientes y ya\nlista la mezcla la metemos al horno, aquí va a tardar un poco en lo que se\nhornea pero mientras podemos ir preparando la cubierta del pastel.

\n
\n

Un objeto XHR es proporcionado por el entorno de JavaScript y se utiliza para\nhacer peticiones AJAX, es muy parecido a la parte de la preparación de la mezcla\ndonde primero debemos \"preparar\" las configuraciones y luego mandar nuestra\npetición, pero una vez hecho esto nuestro código puede seguir adelante y hacer\notras peticiones o tareas.

\n
\n

Cuando el horno nos regresa el pastel horneado podemos continuar con\ndecorarlo

\n
\n

Una vez que nuestra petición tiene respuesta puede seguir adelante con lo que\nhayamos dispuesto para esta \"tarea\".

\n

XMLHTTPRequest

\n

El entorno de JavaScript nos proporciona una forma de realizar solicitudes\nHTTP asíncronas. Esto lo hacemos con un objeto XMLHttpRequest, podemos usar\neste objeto con la función de constructor XMLHttpRequest proporcionada.

\n

XMLHttpRequests (comúnmente abreviado como XHR o xhr) se puede utilizar para\nsolicitar cualquier tipo de archivo (por ejemplo, archivos de texto plano,\nHTML, JSON, de imagen, etc.) o datos de una API.

\n

Ahora profundizaremos en el objeto XMLHttpRequest. Veremos cómo crearlo, qué\nmétodos y propiedades se deben usar y cómo enviar realmente solicitudes\nasíncronas.

\n

\n

El objeto XHR y su método .open()

\n

Ya que hemos construido un objeto XHR llamado asyncRequestObject.

\n
const asyncRequestObject = new XMLHttpRequest ();\n
\n

Podemos acceder a sus métodos, uno de los más importantes es el método .open()

\n

asyncRequestObject.open();

\n

.open() toma una serie de parámetros, pero los más importantes son sus dos\nprimeros: el método HTTP y la URL para enviar la solicitud.

\n

\"sintax-open\"

\n

Si queremos solicitar de manera asíncrona la página de inicio del popular sitio\nde imágenes de alta resolución, Unsplash, usaremos una solicitud GET y\nproporcionaremos la URL:

\n
asyncRequestObject.open('GET', 'https://unsplash.com');\n
\n
\n

Los métodos HTTP que por el momento más usaremos son:\nGET - para recuperar datos.\nPOST - para enviar datos.

\n
\n

El objeto XHR y su método .send()

\n

Para enviar la solicitud, necesitamos usar el método de envío:

\n
asyncRequestObject.send();\n
\n

Ya sabemos que no hay mejor manera de aprender que practicar, para ver como\nfunciona, dirígete a Unsplash, abre tu developer tools\ny agrega en consola el objeto y sus métodos open y send.

\n

\"XHR

\n

En el siguiente video podemos ver que es lo pasa, está en inglés pero si vas\nhaciendo el paso a paso como en el video, seguro que le entiendes.

\n

\n

Respuesta correcta

\n

Ya que la petición ha sido enviada debemos establecer la propiedad onload en\nel objeto a una función que manejará la respuesta exitosa de nuestra solicitud\nXHR:

\n
function handleSuccess () {\n    // en la función, `this` es el valor del objeto XHR\n    // this.responseText contiene la respuesta del servidor\n\n    console.log( this.responseText ); // el HTML de https://unsplash.com/\n}\n\nasyncRequestObject.onload = handleSuccess;\n
\n

Con esto nos damos cuenta que si onload no está configurado, la solicitud\nvuelve pero no ocurre nada con eso.

\n

En caso de error

\n

Ahora veamos que pasa si sucede algo con la solicitud y no se puede cumplir,\nentonces necesitamos usar la propiedad onerror:

\n
function handleError () {\n    console.log( 'An error occurred 😞' );\n}\n\nasyncRequestObject.onerror = handleError;\n
\n

Al igual que con onload, si onerror no está configurado y se produce un\nerror, ese error simplemente fallará en silencio y tu código (¡y tu usuario!)\nno sabrá qué es lo que está mal ni cómo recuperarlo.

\n

Es una buena práctica el tener ambos casos, correcto y error, en control\nsiempre. Es nuestra responsabilidad de desarrolladoras el comunicar al usuario\nqué es lo que sucede mientras espera. Y ofrecer opciones en caso de error, eso\nhará que nuestras aplicaciones tengan una mejor UX (experiencia de usuario) y\nsean más robustas, esto es, que no se caigan con nada.

\n

Juntando todo

\n

Aquí está el código completo que hemos desarrollado.

\n

Se crea el objeto XHR, se le dice qué información solicitar, configuramos los\nmanejadores para un éxito o error y luego finalmente se envía la solicitud:

\n
function handleSuccess () {\n  console.log( this.responseText );\n\n}\n\nfunction handleError () {\n  console.log( 'An error occurred 😞' );\n}\n\nconst asyncRequestObject = new XMLHttpRequest();\nasyncRequestObject.open('GET', 'https://unsplash.com');\nasyncRequestObject.onload = handleSuccess;\nasyncRequestObject.onerror = handleError;\nasyncRequestObject.send();\n
\n

APIs y JSON

\n

Obtener el HTML de un sitio web está bien, pero probablemente no sea muy útil.\nLos datos que devuelve están en un formato que es extremadamente difícil de\nanalizar y consumir.

\n

Sería mucho más fácil (y útil) si pudiéramos obtener solo los datos que\nqueremos en una estructura de datos mejor ordenada, aquí entra JSON\n(JavaScript Object Notation).

\n

JSON

\n

Es un formato de texto, es una forma de ordenar los datos de manera que sea\nfácil procesarlos y manejarlos. Nace del problema de cómo podemos intercambiar\ndatos entre aplicaciones, páginas o servicios de una manera cómoda.\nJSON ES texto, pero con una estructura bien definida, tal como ordenamos\nlibros en capítulos, secciones, parrafos, lineas. Un JSON estará compuesto de\nllaves y valores tal como en el siguiente ejemplo:

\n
{\n  \"título\": \"La guía del viajero intergaláctico\",\n  \"autor\": \"Douglas Adams\",\n  \"descripción\": \"Triología de cinco partes\"\n}\n
\n

Título, autor y descripción son las llaves, mientras que el resto son los\nvalores de esas llaves.

\n

Comunicándose con una API-JSON

\n

Entonces, si estamos comunicándonos con una API a través de JSON, necesitamos\nque nuestro código entienda el formato de este texto especial, a este proceso le\nllamaremos análisis o parsing en inglés. Luego de este análisis, el texto pasa\na ser un objeto de javascript, que podemos manipular y acceder como cualquier\notro objeto que hemos visto.\nSupongamos que la respuesta es el JSON que pusimos de ejemplo anteriormente,\nveamos cómo podemos analizar o parsear ésta :

\n
function handleSuccess () {\n  const data = JSON.parse( this.responseText );\n  console.log( `${data.autor} escribió el libro : ${data.título}` );\n}\n\nasyncRequestObject.onload = handleSuccess;\n
\n

Para obtener más información sobre el uso del objeto XHR para realizar\nsolicitudes asíncronas, puedes consultar estos enlaces:

\n" }, "pt": { "title": "XHR", - "body": "

Objetivos de Aprendizagem

\n
    \n
  • Entender o que é XHR
  • \n
\n

Analogia

\n

Uma boa maneira de entender XHR é usando a seguinte analogia:

\n
\n

Preparar uma torta! Para prepará-la, precisamos de farinha, ovo, leite,\nmanteiga e um forno. Acendemos o forno. Em seguida podemos misturar os 4\ningredientes e já pronta a massa a colocamos no forno. Aqui demora um pouco\naté que asse, mas enquanto isso podemos ir fazendo o recheio.

\n
\n

Um objeto XHR é fornecido pelo ambiente de JavaScript e é utilizado para fazer\nrequisições AJAX. É muito parecido com a parte da preparação da massa em que\nprimeiro devemos \"preparar\" as configurações e em seguida enviar nossa\nrequisição. Uma vez isto feito, nosso código pode seguir adiante e fazer outras\nrequisições ou tarefas.

\n
\n

Quando o forno nos devolve a torta assada, podemos continuar a decorá-la.

\n
\n

Uma vez que nossa requisição tem uma resposta, o programa pode seguir em frente\ncom o que programamos para esta \"tarefa\".

\n

XMLHttpRequest

\n

O ambiente de JavaScript proporciona uma forma de realizar requisições HTTP\nassíncronas. Isso é feito com um objeto XMLHttpRequest. Podemos usar este\nobjeto com a função do construtor XMLHttpRequest.

\n

XMLHttpRequests (comummente abreviado como XHR ou xhr) podem ser utilizados para\nrequisitar qualquer tipo de arquivo (por exemplo, arquivos de texto puro, HTML,\nJSON, de imagem, etc.) ou dados de uma API.

\n

Agora aprofundaremos o estudo no objeto XMLHttpRequest. Veremos como criá-lo,\nquais métodos e propriedades devem ser usadas e como enviar requisições\nassíncronas.

\n

XMLHttpRequests

\n

O objeto XHR e seu método .open()

\n

Construímos um objeto XHR chamado asyncRequestObject.

\n
const asyncRequestObject = new XMLHttpRequest();\n
\n

Podemos acessar seus métodos. Um dos mais importantes é o método .open()

\n

asyncRequestObject.open();

\n

.open() recebe uma série de parâmetros, mas os mais importantes são os dois\nprimeiros: o método HTTP e a URL para enviar a requisição.

\n

\"sintax-open\"

\n

Se queremos requisitar de maneira assíncrona a página inicial do popular sítio\nde imagens de alta resolução, Unsplash, usaremos uma requisição GET e\nforneceremos a URL:

\n
asyncRequestObject.open('GET', 'https://unsplash.com');\n
\n
\n

Os métodos HTTP que mais usaremos por enquanto são: GET - para recuperar\ndados. POST - para enviar dados.

\n
\n

O objeto XHR e seu método .send()

\n

Para enviar a requisição, precisamos usar o método de envio:

\n
asyncRequestObject.send();\n
\n

Já sabemos que não há melhor maneira de aprender do que fazendo. Para ver como\nfunciona, vá ao Unsplash, abra suas developer tools e\nadicione no console o objeto e seus métodos open e send.

\n

\"XHR

\n

No vídeo a seguir podemos ver o que acontece:

\n

\"APIs

\n

Resposta de sucesso

\n

Uma vez que a petição foi enviada, devemos estabelecer a propriedade onload no\nobjeto a uma função que manejará a resposta bem sucedida da nossa requisição\nXHR: XHR:

\n
function handleSuccess () {\n    // na função, `this` é o valor do objeto XHR\n    // this.responseText contém a resposta do servidor\n\n    console.log( this.responseText ); // o HTML de https://unsplash.com/\n}\n\nasyncRequestObject.onload = handleSuccess;\n
\n

Com isso percebemos que se onload não estiver configurado, a solicitação\nretorna mas não faz nada.

\n

Manipulação de erros

\n

Agora vejamos o que passa se algo acontece com a requisição e não acontece com\nsucesso. Nesse caso, precisamos usar a propriedade onerror:

\n
function handleError () {\n    console.log( 'Um erro aconteceu 😞' );\n}\n\nasyncRequestObject.onerror = handleError;\n
\n

Assim como com onload, se onerror não estiver configurado e um erro\nacontece, esse erro simplesmente ficará em silêncio e seu código (e seu\nusuário!) não saberá o que deu de errado e nem como refazer a operação.

\n

Juntando tudo

\n

Aqui está o código completo que desenvolvemos:

\n

Criamos o objeto XHR, dissemos qual informação requisitar, configuramos os\nmanipuladores para sucesso ou erro e por fim enviamos a requisição:

\n
function handleSuccess () {\n  console.log( this.responseText );\n\n}\n\nfunction handleError () {\n  console.log( 'Um erro aconteceu 😞' );\n}\n\nconst asyncRequestObject = new XMLHttpRequest();\nasyncRequestObject.open('GET', 'https://unsplash.com');\nasyncRequestObject.onload = handleSuccess;\nasyncRequestObject.onerror = handleError;\nasyncRequestObject.send();\n
\n

APIs e JSON

\n

Obter o HTML de um sítio web é fácil, mas provavelmente não é muito útil. Os\ndados que retornam estão em um formato que é extremamente difícil de analisar e\nconsumir.

\n

Seria muito mais fácil (e útil) se pudéssemos obter somente os dados que\nqueremos em uma estrutura de dados melhor ordenada. Aqui entra JSON.

\n

Ao realizar uma requisição de uma API que retorna um JSON, tudo o que precisamos\nfazer é converter esse retorno JSON em um objeto JavaScript. Podemos fazer isso\ncom JSON.parse();. Modifiquemos a função de carregamento para manipular uma\nresposta JSON:

\n
function handleSuccess () {\n  const data = JSON.parse( this.responseText );\n  console.log( data );\n}\n\nasyncRequestObject.onload = handleSuccess;\n
\n

Para obter mais informação sobre o uso do objeto XHR para realizar requisições\nassíncronas, você pode consultar estes links:

\n" + "body": "

Objetivos de Aprendizagem

\n
    \n
  • Entender o que é XHR
  • \n
\n

Analogia

\n

Uma boa maneira de entender XHR é usando a seguinte analogia:

\n
\n

Preparar uma torta! Para prepará-la, precisamos de farinha, ovo, leite,\nmanteiga e um forno. Acendemos o forno. Em seguida podemos misturar os 4\ningredientes e já pronta a massa a colocamos no forno. Aqui demora um pouco\naté que asse, mas enquanto isso podemos ir fazendo o recheio.

\n
\n

Um objeto XHR é fornecido pelo ambiente de JavaScript e é utilizado para fazer\nrequisições AJAX. É muito parecido com a parte da preparação da massa em que\nprimeiro devemos \"preparar\" as configurações e em seguida enviar nossa\nrequisição. Uma vez isto feito, nosso código pode seguir adiante e fazer outras\nrequisições ou tarefas.

\n
\n

Quando o forno nos devolve a torta assada, podemos continuar a decorá-la.

\n
\n

Uma vez que nossa requisição tem uma resposta, o programa pode seguir em frente\ncom o que programamos para esta \"tarefa\".

\n

XMLHttpRequest

\n

O ambiente de JavaScript proporciona uma forma de realizar requisições HTTP\nassíncronas. Isso é feito com um objeto XMLHttpRequest. Podemos usar este\nobjeto com a função do construtor XMLHttpRequest.

\n

XMLHttpRequests (comummente abreviado como XHR ou xhr) podem ser utilizados para\nrequisitar qualquer tipo de arquivo (por exemplo, arquivos de texto puro, HTML,\nJSON, de imagem, etc.) ou dados de uma API.

\n

Agora aprofundaremos o estudo no objeto XMLHttpRequest. Veremos como criá-lo,\nquais métodos e propriedades devem ser usadas e como enviar requisições\nassíncronas.

\n

\n

O objeto XHR e seu método .open()

\n

Construímos um objeto XHR chamado asyncRequestObject.

\n
const asyncRequestObject = new XMLHttpRequest();\n
\n

Podemos acessar seus métodos. Um dos mais importantes é o método .open()

\n

asyncRequestObject.open();

\n

.open() recebe uma série de parâmetros, mas os mais importantes são os dois\nprimeiros: o método HTTP e a URL para enviar a requisição.

\n

\"sintax-open\"

\n

Se queremos requisitar de maneira assíncrona a página inicial do popular sítio\nde imagens de alta resolução, Unsplash, usaremos uma requisição GET e\nforneceremos a URL:

\n
asyncRequestObject.open('GET', 'https://unsplash.com');\n
\n
\n

Os métodos HTTP que mais usaremos por enquanto são: GET - para recuperar\ndados. POST - para enviar dados.

\n
\n

O objeto XHR e seu método .send()

\n

Para enviar a requisição, precisamos usar o método de envio:

\n
asyncRequestObject.send();\n
\n

Já sabemos que não há melhor maneira de aprender do que fazendo. Para ver como\nfunciona, vá ao Unsplash, abra suas developer tools e\nadicione no console o objeto e seus métodos open e send.

\n

\"XHR

\n

No vídeo a seguir podemos ver o que acontece:

\n

\n

Resposta de sucesso

\n

Uma vez que a petição foi enviada, devemos estabelecer a propriedade onload no\nobjeto a uma função que manejará a resposta bem sucedida da nossa requisição\nXHR: XHR:

\n
function handleSuccess () {\n    // na função, `this` é o valor do objeto XHR\n    // this.responseText contém a resposta do servidor\n\n    console.log( this.responseText ); // o HTML de https://unsplash.com/\n}\n\nasyncRequestObject.onload = handleSuccess;\n
\n

Com isso percebemos que se onload não estiver configurado, a solicitação\nretorna mas não faz nada.

\n

Manipulação de erros

\n

Agora vejamos o que passa se algo acontece com a requisição e não acontece com\nsucesso. Nesse caso, precisamos usar a propriedade onerror:

\n
function handleError () {\n    console.log( 'Um erro aconteceu 😞' );\n}\n\nasyncRequestObject.onerror = handleError;\n
\n

Assim como com onload, se onerror não estiver configurado e um erro\nacontece, esse erro simplesmente ficará em silêncio e seu código (e seu\nusuário!) não saberá o que deu de errado e nem como refazer a operação.

\n

Juntando tudo

\n

Aqui está o código completo que desenvolvemos:

\n

Criamos o objeto XHR, dissemos qual informação requisitar, configuramos os\nmanipuladores para sucesso ou erro e por fim enviamos a requisição:

\n
function handleSuccess () {\n  console.log( this.responseText );\n\n}\n\nfunction handleError () {\n  console.log( 'Um erro aconteceu 😞' );\n}\n\nconst asyncRequestObject = new XMLHttpRequest();\nasyncRequestObject.open('GET', 'https://unsplash.com');\nasyncRequestObject.onload = handleSuccess;\nasyncRequestObject.onerror = handleError;\nasyncRequestObject.send();\n
\n

APIs e JSON

\n

Obter o HTML de um sítio web é fácil, mas provavelmente não é muito útil. Os\ndados que retornam estão em um formato que é extremamente difícil de analisar e\nconsumir.

\n

Seria muito mais fácil (e útil) se pudéssemos obter somente os dados que\nqueremos em uma estrutura de dados melhor ordenada. Aqui entra JSON.

\n

Ao realizar uma requisição de uma API que retorna um JSON, tudo o que precisamos\nfazer é converter esse retorno JSON em um objeto JavaScript. Podemos fazer isso\ncom JSON.parse();. Modifiquemos a função de carregamento para manipular uma\nresposta JSON:

\n
function handleSuccess () {\n  const data = JSON.parse( this.responseText );\n  console.log( data );\n}\n\nasyncRequestObject.onload = handleSuccess;\n
\n

Para obter mais informação sobre o uso do objeto XHR para realizar requisições\nassíncronas, você pode consultar estes links:

\n" } } }, @@ -554,11 +554,11 @@ "intl": { "es": { "title": "AJAX con jQuery", - "body": "

Objetivos de Aprendizaje

\n
    \n
  • Usar jQuery para hacer requests asíncronos y entender qué ventajas nos da
  • \n
\n

Analogía

\n

Dejar que un experto prepare el pastel por ti.

\n

\"XHR

\n

¿Por qué jQuery?

\n

jQuery es una librería muy popular que ya has tenido la oportunidad de usar. El\nuso que le has dado hasta este momento ha sido para manipular y recorrer el DOM\na través de métodos que hacen nuestro código más corto.

\n

Ahora, usaremos esta ventaja de usar métodos más pequeños y dejar la\nresponsabilidad a jQuery de ver la compatibilidad de navegadores por nosotros\nen la implementación de AJAX.

\n

Esto es posible gracias al método .ajax() que jQuery provee para realizar\npeticiones asíncronas.

\n

Método .ajax()

\n

El método .ajax() es el corazón de las peticiones asíncronas en la librería\nde jQuery. Hay 2 formas de usar este método:

\n
$.ajax(<url-a-realizar-la-petición>, <un-objeto-configuración>);\n\n// or\n\n$.ajax(<solo un objeto de configuración>);\n
\n

Fuente: Documentación de jQuery

\n

La manera más común de usar el método .ajax() es usando solo el objeto de\nconfiguración, esto en parte es debido a que es la forma más antigua que está\ndisponible (versión 1.0, a ver si encuentras de donde obtuvimos este dato\nmirando la documentación), además de que toda la configuración lo puedes poner\nen un solo objeto.

\n
\n

Qué es un objeto de configuración?

\n

Es un objeto de JavaScript que se usa para configurar algo.

\n

Por ejemplo:

\n
const settings = {\n  name: 'this is my name',\n  colors: ['orange', 'blue'],\n  layers: 2,\n  isRound: true,\n};\n
\n

El objeto de configuración puede ser pasado como parámetro de una función\nconstructora. Imaginemos la función constructora MakeCake:

\n
const myDeliciousCake = MakeCake(settings);\n
\n

De igual manera, el objeto de configuración puede ser pasado directamente:

\n
const myDeliciousCake = MakeCake({\n  name: 'this is my name',\n  colors: ['orange', 'blue'],\n  layers: 2,\n  isRound: true,\n});\n
\n
\n

Haciendo una llamada AJAX

\n

El método .ajax() de jQuery tiene que ser increíblemente versátil y poderoso\nsi es lo que le da vida a las peticiones asíncronas de jQuery. Una petición Ajax\nsimple se vería así:

\n
$.ajax({\n    url: `https://api.github.com/users/${searchedUser}`\n});\n
\n

Vamos a probarlo:

\n
    \n
  1. Anda al sitio web de jQuery
  2. \n
  3. Abre el Developer Tools de tu navegador
  4. \n
  5. Asegúrate que estás en la pestaña Network y que el botón de grabación está\nencendido
  6. \n
  7. Agrega el script anterior en la consola y ejecútalo
  8. \n
\n

\"jQuery

\n

Este request (petición o solicitud) está siendo realizada hacia un recurso en\nGithub (información del usuario). El request puede ser revisado desde el panel\nde redes (pestaña Network en el Dev Tools).

\n

Ya sabemos cómo realizar una petición con .ajax() pero aun no estamos\ncontrolando la respuesta.

\n

Manipular los datos retornados

\n

Si recordamos cómo podemos lograr esto usando un objeto XHR, el response era\ncontrolado por una función. Para el método .ajax() es exactamente lo mismo,\npodemos encadenar a la ejecución de éste, el método .done(). Vamos a pasar una\nfunción como argumento al método .done() que se ejecutará una vez que la\nllamada Ajax haya terminado:

\n
function handleResponse(data) {\n    console.log('the ajax request has finished!');\n    console.log(data);\n}\n\n$.ajax({\n    url: `https://api.github.com/users/${searchedUser}`\n}).done(handleResponse);\n
\n

\"done

\n

La llamada asíncrona es realizada y controlada una vez que termina por el\nmétodo .done(), en este caso, muestra el response en la consola.

\n

Para ponernos a prueba, vamos a convertir esta petición asíncrona que usa XHR\na una llamada con el método .ajax() de jQuery. Esto es lo que tenemos\nactualmente:

\n
const githubRequest = new XMLHttpRequest();\ngithubRequest.onload = addUser;\ngithubRequest.open('GET', `https://api.github.com/users/${searchedUser}`);\ngithubRequest.send();\n
\n

Muchas de estas operaciones pueden ser manejadas internamente por jQuery, así\nque el primer paso de la conversión sería así:

\n
$.ajax({\n    url: `https://api.github.com/users/${searchedUser}`\n}).done(addUser);\n
\n

Usando jQuery para peticiones asíncronas:

\n
    \n
  • No tenemos la necesidad de crear un objeto XHR
  • \n
  • En vez de especificar que el request es de método GET, jQuery lo da por\ndefecto y solo tenemos que indicarle la URL del recurso que estamos\nsolicitando
  • \n
  • En vez de configurar el evento .onload, usamos el método .done()
  • \n
\n

La petición debe enviarse correctamente ahora. ¡Gran trabajo! Pero ahora tenemos\nproblemas con el response y cómo se está controlando.

\n

Limpiando el callback de success

\n

Ya hemos obtenido la respuesta en la consola, ahora vamos a ver cómo lo\nagregamos a nuestra página a través de jQuery. Primero veamos cómo lo\ntendríamos usando el objeto XHR:

\n
function addUser() {\n    const user = JSON.parse(this.responseText);\n    const firstImage = data.results[0];\n\n    userContainer.insertAdjacentHTML('afterbegin', `<div class=\"card col-md-6 offset-md-3 col-xs-12\">\n        <img class=\"card-img-top\" src=\"${user.avatar_url}\" alt=\"Card image cap\">\n        <div class=\"card-body\">\n        <h5 class=\"card-title\">${user.name || ''}</h5>\n        <h6>@${user.login}</h6>\n        <p class=\"card-text\">${user.bio || ''}</p>\n        <a href=\"${user.html_url}\" class=\"btn btn-primary\">Stalkear coder</a>\n        </div>\n    </div>`);\n}\n
\n
\n

Nota: En este ejemplo, el HTML que se está agregando es un card de\nBootstrap 4, para fines de este ejemplo, el markup puede tener otra\nestructura y diseño.

\n
\n

Si usamos jQuery, podríamos cambiarlo de la siguiente manera:

\n
function addUser(user) {\n    $userContainer.html(`<div class=\"card col-md-6 offset-md-3 col-xs-12\">\n        <img class=\"card-img-top\" src=\"${user.avatar_url}\" alt=\"Card image cap\">\n        <div class=\"card-body\">\n        <h5 class=\"card-title\">${user.name || ''}</h5>\n        <h6>@${user.login}</h6>\n        <p class=\"card-text\">${user.bio || ''}</p>\n        <a href=\"${user.html_url}\" class=\"btn btn-primary\">Stalkear coder</a>\n        </div>\n    </div>`);\n}\n
\n

¿Qué cambió?

\n
    \n
  • La función ahora tienen un parámetro (el usuario)
  • \n
  • El parámetro ya ha sido convertido de JSON a un objeto de JavaScript, así que\nno necesitamos usar JSON.parse()
  • \n
  • Aprovechamos los métodos de jQuery para manipular el DOM
  • \n
\n

El código que agrega el HTML (plantilla) al contenedor no ha cambiado :).

\n

¿Y si ocurre un error, cómo lo controlarías?

\n

Entra a la documentación de jQuery y revisa qué método (así como .done())\nencadenarías a la petición AJAX para controlar un posible error. Una vez\nencontrado, puedes probarlo metiendo un error dentro de la URL por ejemplo.

\n

Código fuente de la demo

\n

El código visto en esta lectura lo puedes encontrar en el siguiente pen:

" + "body": "

Objetivos de Aprendizaje

\n
    \n
  • Usar jQuery para hacer requests asíncronos y entender qué ventajas nos da
  • \n
\n

Analogía

\n

Dejar que un experto prepare el pastel por ti.

\n

\n

¿Por qué jQuery?

\n

jQuery es una librería muy popular que ya has tenido la oportunidad de usar. El\nuso que le has dado hasta este momento ha sido para manipular y recorrer el DOM\na través de métodos que hacen nuestro código más corto.

\n

Ahora, usaremos esta ventaja de usar métodos más pequeños y dejar la\nresponsabilidad a jQuery de ver la compatibilidad de navegadores por nosotros\nen la implementación de AJAX.

\n

Esto es posible gracias al método .ajax() que jQuery provee para realizar\npeticiones asíncronas.

\n

Método .ajax()

\n

El método .ajax() es el corazón de las peticiones asíncronas en la librería\nde jQuery. Hay 2 formas de usar este método:

\n
$.ajax(<url-a-realizar-la-petición>, <un-objeto-configuración>);\n\n// or\n\n$.ajax(<solo un objeto de configuración>);\n
\n

Fuente: Documentación de jQuery

\n

La manera más común de usar el método .ajax() es usando solo el objeto de\nconfiguración, esto en parte es debido a que es la forma más antigua que está\ndisponible (versión 1.0, a ver si encuentras de donde obtuvimos este dato\nmirando la documentación), además de que toda la configuración lo puedes poner\nen un solo objeto.

\n
\n

Qué es un objeto de configuración?

\n

Es un objeto de JavaScript que se usa para configurar algo.

\n

Por ejemplo:

\n
const settings = {\n  name: 'this is my name',\n  colors: ['orange', 'blue'],\n  layers: 2,\n  isRound: true,\n};\n
\n

El objeto de configuración puede ser pasado como parámetro de una función\nconstructora. Imaginemos la función constructora MakeCake:

\n
const myDeliciousCake = MakeCake(settings);\n
\n

De igual manera, el objeto de configuración puede ser pasado directamente:

\n
const myDeliciousCake = MakeCake({\n  name: 'this is my name',\n  colors: ['orange', 'blue'],\n  layers: 2,\n  isRound: true,\n});\n
\n
\n

Haciendo una llamada AJAX

\n

El método .ajax() de jQuery tiene que ser increíblemente versátil y poderoso\nsi es lo que le da vida a las peticiones asíncronas de jQuery. Una petición Ajax\nsimple se vería así:

\n
$.ajax({\n    url: `https://api.github.com/users/${searchedUser}`\n});\n
\n

Vamos a probarlo:

\n
    \n
  1. Anda al sitio web de jQuery
  2. \n
  3. Abre el Developer Tools de tu navegador
  4. \n
  5. Asegúrate que estás en la pestaña Network y que el botón de grabación está\nencendido
  6. \n
  7. Agrega el script anterior en la consola y ejecútalo
  8. \n
\n

\"jQuery

\n

Este request (petición o solicitud) está siendo realizada hacia un recurso en\nGithub (información del usuario). El request puede ser revisado desde el panel\nde redes (pestaña Network en el Dev Tools).

\n

Ya sabemos cómo realizar una petición con .ajax() pero aun no estamos\ncontrolando la respuesta.

\n

Manipular los datos retornados

\n

Si recordamos cómo podemos lograr esto usando un objeto XHR, el response era\ncontrolado por una función. Para el método .ajax() es exactamente lo mismo,\npodemos encadenar a la ejecución de éste, el método .done(). Vamos a pasar una\nfunción como argumento al método .done() que se ejecutará una vez que la\nllamada Ajax haya terminado:

\n
function handleResponse(data) {\n    console.log('the ajax request has finished!');\n    console.log(data);\n}\n\n$.ajax({\n    url: `https://api.github.com/users/${searchedUser}`\n}).done(handleResponse);\n
\n

\"done

\n

La llamada asíncrona es realizada y controlada una vez que termina por el\nmétodo .done(), en este caso, muestra el response en la consola.

\n

Para ponernos a prueba, vamos a convertir esta petición asíncrona que usa XHR\na una llamada con el método .ajax() de jQuery. Esto es lo que tenemos\nactualmente:

\n
const githubRequest = new XMLHttpRequest();\ngithubRequest.onload = addUser;\ngithubRequest.open('GET', `https://api.github.com/users/${searchedUser}`);\ngithubRequest.send();\n
\n

Muchas de estas operaciones pueden ser manejadas internamente por jQuery, así\nque el primer paso de la conversión sería así:

\n
$.ajax({\n    url: `https://api.github.com/users/${searchedUser}`\n}).done(addUser);\n
\n

Usando jQuery para peticiones asíncronas:

\n
    \n
  • No tenemos la necesidad de crear un objeto XHR
  • \n
  • En vez de especificar que el request es de método GET, jQuery lo da por\ndefecto y solo tenemos que indicarle la URL del recurso que estamos\nsolicitando
  • \n
  • En vez de configurar el evento .onload, usamos el método .done()
  • \n
\n

La petición debe enviarse correctamente ahora. ¡Gran trabajo! Pero ahora tenemos\nproblemas con el response y cómo se está controlando.

\n

Limpiando el callback de success

\n

Ya hemos obtenido la respuesta en la consola, ahora vamos a ver cómo lo\nagregamos a nuestra página a través de jQuery. Primero veamos cómo lo\ntendríamos usando el objeto XHR:

\n
function addUser() {\n    const user = JSON.parse(this.responseText);\n    const firstImage = data.results[0];\n\n    userContainer.insertAdjacentHTML('afterbegin', `<div class=\"card col-md-6 offset-md-3 col-xs-12\">\n        <img class=\"card-img-top\" src=\"${user.avatar_url}\" alt=\"Card image cap\">\n        <div class=\"card-body\">\n        <h5 class=\"card-title\">${user.name || ''}</h5>\n        <h6>@${user.login}</h6>\n        <p class=\"card-text\">${user.bio || ''}</p>\n        <a href=\"${user.html_url}\" class=\"btn btn-primary\">Stalkear coder</a>\n        </div>\n    </div>`);\n}\n
\n
\n

Nota: En este ejemplo, el HTML que se está agregando es un card de\nBootstrap 4, para fines de este ejemplo, el markup puede tener otra\nestructura y diseño.

\n
\n

Si usamos jQuery, podríamos cambiarlo de la siguiente manera:

\n
function addUser(user) {\n    $userContainer.html(`<div class=\"card col-md-6 offset-md-3 col-xs-12\">\n        <img class=\"card-img-top\" src=\"${user.avatar_url}\" alt=\"Card image cap\">\n        <div class=\"card-body\">\n        <h5 class=\"card-title\">${user.name || ''}</h5>\n        <h6>@${user.login}</h6>\n        <p class=\"card-text\">${user.bio || ''}</p>\n        <a href=\"${user.html_url}\" class=\"btn btn-primary\">Stalkear coder</a>\n        </div>\n    </div>`);\n}\n
\n

¿Qué cambió?

\n
    \n
  • La función ahora tienen un parámetro (el usuario)
  • \n
  • El parámetro ya ha sido convertido de JSON a un objeto de JavaScript, así que\nno necesitamos usar JSON.parse()
  • \n
  • Aprovechamos los métodos de jQuery para manipular el DOM
  • \n
\n

El código que agrega el HTML (plantilla) al contenedor no ha cambiado :).

\n

¿Y si ocurre un error, cómo lo controlarías?

\n

Entra a la documentación de jQuery y revisa qué método (así como .done())\nencadenarías a la petición AJAX para controlar un posible error. Una vez\nencontrado, puedes probarlo metiendo un error dentro de la URL por ejemplo.

\n

Código fuente de la demo

\n

El código visto en esta lectura lo puedes encontrar en el siguiente pen:

\n\n See the Pen [AJAX con jQuery](https://codepen.io/ivandevp/pen/vdxNMd/) by Ivan\n ([@ivandevp](https://codepen.io/ivandevp)) on [CodePen](https://codepen.io).\n" }, "pt": { "title": "AJAX com jQuery", - "body": "

Objetivos de Aprendizagem

\n
    \n
  • Usar jQuery para fazer requisições assíncronas e entender quais vantagens ele\nnos fornece.
  • \n
\n

Analogia

\n

Deixe um profissional preparar a torta para você.

\n

\"XHR\nanalogy\"

\n

Por que jQuery?

\n

jQuery é uma biblioteca muito popular que você já teve a oportunidade de usar. O\nuso que lhe demos até o momento foi para manipular o DOM por meio de métodos que\nfazem nosso código mais simples.

\n

Agora, usaremos esta vantagem de utilizar métodos menores e deixar para o jQuery\na responsabilidade de checar a compatibilidade dos navegadores na implementação\ndo AJAX.

\n

Isso é possível graças ao método .ajax() que jQuery fornece para realizar\nrequisições assíncronas.

\n

Método .ajax()

\n

O método.ajax() é o coração das requisições assíncronas na biblioteca de\njQuery. Há duas formas de utilizar esse método:

\n
$.ajax(<url-a-realizar-a-requisicao>, <um-objeto-de-configuracao>);\n\n// or\n\n$.ajax(<só um objeto de configuração>);\n
\n

Fonte: Documentação de jQuery

\n

A maneira mais comum de usar o método.ajax() é usando somente o objeto de\nconfiguração, em parte devido a esta ser a forma mais antiga que está disponível\n(versão 1.0). Além disso, toda a configuração pode estar somente em um objeto.

\n

O que é um objeto de configuração?

\n
\n

É um objeto de JavaScript que utilizamos para configurar algo.

\n

Por exemplo:

\n
const settings = {\n  name: 'this is my name',\n  colors: ['orange', 'blue'],\n  layers: 2,\n  isRound: true,\n};\n
\n

O objeto de configuração pode ser passado como parâmetro de uma função\nconstrutora. Imaginemos a função construtora MakeCake:

\n
const myDeliciousCake = MakeCake(settings);\n
\n

Da mesma forma, o objeto de configuração pode ser passado diretamente:

\n
const myDeliciousCake = MakeCake({\n  name: 'this is my name',\n  colors: ['orange', 'blue'],\n  layers: 2,\n  isRound: true,\n});\n
\n
\n

Fazendo uma chamada AJAX

\n

O método .ajax() de jQuery tem que ser incrivelmente versátil e poderoso se é\no que dá vida às requisições assíncronas. Uma requisição AJAX simples seria\nassim:

\n
$.ajax({\n    url: `https://api.github.com/users/${searchedUser}`\n});\n
\n

Vamos testá-lo:

\n
    \n
  1. Vá para o sítio web de jQuery.
  2. \n
  3. Abra as Developer Tools do seu navegador.
  4. \n
  5. Garanta que está na aba Network e que o botão gravação está ligado.
  6. \n
  7. Adicione o script anterior na console e execute-o.
  8. \n
\n

\"jQuery

\n

Esta request (requisição) está sendo realizada para um recurso no GitHub\n(informação do usuário). A requisição pode ser acompanhada no painel de redes\n(aba Networkno Dev Tools).

\n

Já sabemos como realizar uma requisição com .ajax() mas ainda não estamos\ncontrolando a resposta.

\n

Manipular os dados retornados

\n

Recordando como podemos fazer isso usando um objeto XHR, a response era\ncontrolada por uma função. Para o método .ajax() é exatamente o mesmo. Podemos\nencadear a execução dele com o método .done(). Passaremos uma função como\nargumento do método .done() que será executada quando a chamada AJAX estiver\nterminada:

\n
function handleResponse(data) {\n    console.log('the ajax request has finished!');\n    console.log(data);\n}\n\n$.ajax({\n    url: `https://api.github.com/users/${searchedUser}`\n}).done(handleResponse);\n
\n

\"done

\n

A chamada assíncrona é realizada e controlada pelo método .done() assim que é\nfinalizada. Neste caso, exibe a resposta no console.

\n

Para testarmos isso, vamos converter essa requisição assíncrona que usa XHR em\numa chamada com o método .ajax() de jQuery. Isso é que temos agora:

\n
const githubRequest = new XMLHttpRequest();\ngithubRequest.onload = addUser;\ngithubRequest.open('GET', `https://api.github.com/users/${searchedUser}`);\ngithubRequest.send();\n
\n

Muitas destas operações podem ser manipuladas internamente por jQuery. O\nprimeiro passo da conversão seria assim:

\n
$.ajax({\n    url: `https://api.github.com/users/${searchedUser}`\n}).done(addUser);\n
\n

Usando jQuery para requisições assíncronas:

\n
    \n
  • Não temos a necessidade de criar um objeto XHR.
  • \n
  • Ao invés de especificar que a request é do método GET, jQuery o faz por\npadrão e só temos que indicar a URL do recurso que está sendo solicitado.
  • \n
  • Ao invés de configurar o evento .onload, usamos o método .done()
  • \n
\n

A requisição deve ser processada corretamente agora. Bom trabalho! Mas agora\ntemos problemas com a response e como gerenciá-la.

\n

Limpando o callback de success

\n

Já obtivemos nossa resposta no console. Agora veremos como a adicionamos em\nnossa página por meio de jQuery. Primeiro vejamos como o faríamos usando o\nobjeto XHR:

\n
function addUser() {\n    const user = JSON.parse(this.responseText);\n    const firstImage = data.results[0];\n\n    userContainer.insertAdjacentHTML('afterbegin', `<div class=\"card col-md-6 offset-md-3 col-xs-12\">\n        <img class=\"card-img-top\" src=\"${user.avatar_url}\" alt=\"Card image cap\">\n        <div class=\"card-body\">\n        <h5 class=\"card-title\">${user.name || ''}</h5>\n        <h6>@${user.login}</h6>\n        <p class=\"card-text\">${user.bio || ''}</p>\n        <a href=\"${user.html_url}\" class=\"btn btn-primary\">Stalkear coder</a>\n        </div>\n    </div>`);\n}\n
\n
\n

Nota: Nesta exemplo, o HTML que estamos adicionando é um card de\nBootstrap 4. Para a finalidade deste exemplo, você pode usar outra estrutura e\nprojeto.

\n
\n

Se usamos jQuery, poderíamos mudá-lo da seguinte maneira:

\n
function addUser(user) {\n    $userContainer.html(`<div class=\"card col-md-6 offset-md-3 col-xs-12\">\n        <img class=\"card-img-top\" src=\"${user.avatar_url}\" alt=\"Card image cap\">\n        <div class=\"card-body\">\n        <h5 class=\"card-title\">${user.name || ''}</h5>\n        <h6>@${user.login}</h6>\n        <p class=\"card-text\">${user.bio || ''}</p>\n        <a href=\"${user.html_url}\" class=\"btn btn-primary\">Stalkear coder</a>\n        </div>\n    </div>`);\n}\n
\n

O que mudou?

\n
    \n
  • A função agora tem um parâmetro (o usuário).
  • \n
  • O parâmetro já foi convertido de JSON para um objeto JavaScript. Assim, não\nprecisamos usar JSON.parse().
  • \n
  • Aproveitamos os métodos de jQuery para manipular o DOM.
  • \n
\n

O código que adiciona o HTML (template) no contêiner não mudou :).

\n

E se ocorre um erro, como proceder?

\n

Acesse a documentação de jQuery e revise qual método (assim como .done()) você\nencadearia na requisição AJAX para controlar um possível erro. Uma vez\nencontrado, você pode testá-lo forçando um erro dentro da URL por exemplo.

\n

Código fonte do demo

\n

O código visto nesta leitura pode ser encontrado aqui:

" + "body": "

Objetivos de Aprendizagem

\n
    \n
  • Usar jQuery para fazer requisições assíncronas e entender quais vantagens ele\nnos fornece.
  • \n
\n

Analogia

\n

Deixe um profissional preparar a torta para você.

\n

\n

Por que jQuery?

\n

jQuery é uma biblioteca muito popular que você já teve a oportunidade de usar. O\nuso que lhe demos até o momento foi para manipular o DOM por meio de métodos que\nfazem nosso código mais simples.

\n

Agora, usaremos esta vantagem de utilizar métodos menores e deixar para o jQuery\na responsabilidade de checar a compatibilidade dos navegadores na implementação\ndo AJAX.

\n

Isso é possível graças ao método .ajax() que jQuery fornece para realizar\nrequisições assíncronas.

\n

Método .ajax()

\n

O método.ajax() é o coração das requisições assíncronas na biblioteca de\njQuery. Há duas formas de utilizar esse método:

\n
$.ajax(<url-a-realizar-a-requisicao>, <um-objeto-de-configuracao>);\n\n// or\n\n$.ajax(<só um objeto de configuração>);\n
\n

Fonte: Documentação de jQuery

\n

A maneira mais comum de usar o método.ajax() é usando somente o objeto de\nconfiguração, em parte devido a esta ser a forma mais antiga que está disponível\n(versão 1.0). Além disso, toda a configuração pode estar somente em um objeto.

\n

O que é um objeto de configuração?

\n
\n

É um objeto de JavaScript que utilizamos para configurar algo.

\n

Por exemplo:

\n
const settings = {\n  name: 'this is my name',\n  colors: ['orange', 'blue'],\n  layers: 2,\n  isRound: true,\n};\n
\n

O objeto de configuração pode ser passado como parâmetro de uma função\nconstrutora. Imaginemos a função construtora MakeCake:

\n
const myDeliciousCake = MakeCake(settings);\n
\n

Da mesma forma, o objeto de configuração pode ser passado diretamente:

\n
const myDeliciousCake = MakeCake({\n  name: 'this is my name',\n  colors: ['orange', 'blue'],\n  layers: 2,\n  isRound: true,\n});\n
\n
\n

Fazendo uma chamada AJAX

\n

O método .ajax() de jQuery tem que ser incrivelmente versátil e poderoso se é\no que dá vida às requisições assíncronas. Uma requisição AJAX simples seria\nassim:

\n
$.ajax({\n    url: `https://api.github.com/users/${searchedUser}`\n});\n
\n

Vamos testá-lo:

\n
    \n
  1. Vá para o sítio web de jQuery.
  2. \n
  3. Abra as Developer Tools do seu navegador.
  4. \n
  5. Garanta que está na aba Network e que o botão gravação está ligado.
  6. \n
  7. Adicione o script anterior na console e execute-o.
  8. \n
\n

\"jQuery

\n

Esta request (requisição) está sendo realizada para um recurso no GitHub\n(informação do usuário). A requisição pode ser acompanhada no painel de redes\n(aba Networkno Dev Tools).

\n

Já sabemos como realizar uma requisição com .ajax() mas ainda não estamos\ncontrolando a resposta.

\n

Manipular os dados retornados

\n

Recordando como podemos fazer isso usando um objeto XHR, a response era\ncontrolada por uma função. Para o método .ajax() é exatamente o mesmo. Podemos\nencadear a execução dele com o método .done(). Passaremos uma função como\nargumento do método .done() que será executada quando a chamada AJAX estiver\nterminada:

\n
function handleResponse(data) {\n    console.log('the ajax request has finished!');\n    console.log(data);\n}\n\n$.ajax({\n    url: `https://api.github.com/users/${searchedUser}`\n}).done(handleResponse);\n
\n

\"done

\n

A chamada assíncrona é realizada e controlada pelo método .done() assim que é\nfinalizada. Neste caso, exibe a resposta no console.

\n

Para testarmos isso, vamos converter essa requisição assíncrona que usa XHR em\numa chamada com o método .ajax() de jQuery. Isso é que temos agora:

\n
const githubRequest = new XMLHttpRequest();\ngithubRequest.onload = addUser;\ngithubRequest.open('GET', `https://api.github.com/users/${searchedUser}`);\ngithubRequest.send();\n
\n

Muitas destas operações podem ser manipuladas internamente por jQuery. O\nprimeiro passo da conversão seria assim:

\n
$.ajax({\n    url: `https://api.github.com/users/${searchedUser}`\n}).done(addUser);\n
\n

Usando jQuery para requisições assíncronas:

\n
    \n
  • Não temos a necessidade de criar um objeto XHR.
  • \n
  • Ao invés de especificar que a request é do método GET, jQuery o faz por\npadrão e só temos que indicar a URL do recurso que está sendo solicitado.
  • \n
  • Ao invés de configurar o evento .onload, usamos o método .done()
  • \n
\n

A requisição deve ser processada corretamente agora. Bom trabalho! Mas agora\ntemos problemas com a response e como gerenciá-la.

\n

Limpando o callback de success

\n

Já obtivemos nossa resposta no console. Agora veremos como a adicionamos em\nnossa página por meio de jQuery. Primeiro vejamos como o faríamos usando o\nobjeto XHR:

\n
function addUser() {\n    const user = JSON.parse(this.responseText);\n    const firstImage = data.results[0];\n\n    userContainer.insertAdjacentHTML('afterbegin', `<div class=\"card col-md-6 offset-md-3 col-xs-12\">\n        <img class=\"card-img-top\" src=\"${user.avatar_url}\" alt=\"Card image cap\">\n        <div class=\"card-body\">\n        <h5 class=\"card-title\">${user.name || ''}</h5>\n        <h6>@${user.login}</h6>\n        <p class=\"card-text\">${user.bio || ''}</p>\n        <a href=\"${user.html_url}\" class=\"btn btn-primary\">Stalkear coder</a>\n        </div>\n    </div>`);\n}\n
\n
\n

Nota: Nesta exemplo, o HTML que estamos adicionando é um card de\nBootstrap 4. Para a finalidade deste exemplo, você pode usar outra estrutura e\nprojeto.

\n
\n

Se usamos jQuery, poderíamos mudá-lo da seguinte maneira:

\n
function addUser(user) {\n    $userContainer.html(`<div class=\"card col-md-6 offset-md-3 col-xs-12\">\n        <img class=\"card-img-top\" src=\"${user.avatar_url}\" alt=\"Card image cap\">\n        <div class=\"card-body\">\n        <h5 class=\"card-title\">${user.name || ''}</h5>\n        <h6>@${user.login}</h6>\n        <p class=\"card-text\">${user.bio || ''}</p>\n        <a href=\"${user.html_url}\" class=\"btn btn-primary\">Stalkear coder</a>\n        </div>\n    </div>`);\n}\n
\n

O que mudou?

\n
    \n
  • A função agora tem um parâmetro (o usuário).
  • \n
  • O parâmetro já foi convertido de JSON para um objeto JavaScript. Assim, não\nprecisamos usar JSON.parse().
  • \n
  • Aproveitamos os métodos de jQuery para manipular o DOM.
  • \n
\n

O código que adiciona o HTML (template) no contêiner não mudou :).

\n

E se ocorre um erro, como proceder?

\n

Acesse a documentação de jQuery e revise qual método (assim como .done()) você\nencadearia na requisição AJAX para controlar um possível erro. Uma vez\nencontrado, você pode testá-lo forçando um erro dentro da URL por exemplo.

\n

Código fonte do demo

\n

O código visto nesta leitura pode ser encontrado aqui:

\n See the Pen [AJAX con jQuery](https://codepen.io/ivandevp/pen/vdxNMd/)\n by Ivan ([@ivandevp](https://codepen.io/ivandevp)) on\n [CodePen](https://codepen.io).\n" } } }, @@ -586,7 +586,7 @@ "intl": { "es": { "title": "Jugando con AJAX", - "body": "

Objetivos

\n
    \n
  • Practicar todo lo aprendido haciendo peticiones asíncronas
  • \n
  • Practicar, practicar y practicar
  • \n
\n

Ejercicios

\n

Debes subir todos tus ejercicios a GitHub y publicarlos en gh-pages. Eres\nlibre de elegir el método que más te acomode para ejecutar las llamadas a estas\nAPI, así descubrirás por ti misma las ventajas y desventajas de cada método.

\n

Pokedex

\n

¿Alguna ves viste Pokemon? Sino, no importa, ahora te enterarás de que trata.\nUn pokedex es un buscador de Pokemons, donde puedes obtener información sobre\nel pokemon que buscas. Usando la API de Pokeapi diseña\ntu propio pokedex. Acá te dejamos unos slides con algunas instrucciones un\npoco más particulares. Recuerda no limitarte y dar más allá de lo propuesto ;)

\n

Buscador de GIFs

\n

Este reto consiste en hacer literalmente lo que el nombre indica, vamos a darle\nla oportunidad a nuestros usuarios de buscar GIFs y mostrarlo de la manera más\namigable y entretenida posible. Para esto usaremos el\nAPI de Giphy. Notarás que para realizar las\npeticiones te pide un API Key, para obtenerlo tendrás que regitrarte y crear\nuna app. No olvides que las buenas APIs tienen documentación y a pesar de que\nestán en inglés, podemos ingeniárnosla para entenderlo en su mayoría :). Una vez\nlisto tu buscador, ¿qué más se te ocurre poder agregar?

\n

Acá tienes una guía de cómo lograrlo, no te conformes con esto y adáptalo a tu\npropio estilo.

" + "body": "

Objetivos

\n
    \n
  • Practicar todo lo aprendido haciendo peticiones asíncronas
  • \n
  • Practicar, practicar y practicar
  • \n
\n

Ejercicios

\n

Debes subir todos tus ejercicios a GitHub y publicarlos en gh-pages. Eres\nlibre de elegir el método que más te acomode para ejecutar las llamadas a estas\nAPI, así descubrirás por ti misma las ventajas y desventajas de cada método.

\n

Pokedex

\n

¿Alguna ves viste Pokemon? Sino, no importa, ahora te enterarás de que trata.\nUn pokedex es un buscador de Pokemons, donde puedes obtener información sobre\nel pokemon que buscas. Usando la API de Pokeapi diseña\ntu propio pokedex. Acá te dejamos unos slides con algunas instrucciones un\npoco más particulares. Recuerda no limitarte y dar más allá de lo propuesto ;)

\n\n

Buscador de GIFs

\n

Este reto consiste en hacer literalmente lo que el nombre indica, vamos a darle\nla oportunidad a nuestros usuarios de buscar GIFs y mostrarlo de la manera más\namigable y entretenida posible. Para esto usaremos el\nAPI de Giphy. Notarás que para realizar las\npeticiones te pide un API Key, para obtenerlo tendrás que regitrarte y crear\nuna app. No olvides que las buenas APIs tienen documentación y a pesar de que\nestán en inglés, podemos ingeniárnosla para entenderlo en su mayoría :). Una vez\nlisto tu buscador, ¿qué más se te ocurre poder agregar?

\n

Acá tienes una guía de cómo lograrlo, no te conformes con esto y adáptalo a tu\npropio estilo.

\n" }, "pt": { "title": "Brincando com jQuery AJAX", @@ -619,11 +619,11 @@ "intl": { "es": { "title": "Third party APIs", - "body": "

Objetivos de Aprendizaje

\n
    \n
  • Entender la diferencia entre las APIs del navegador y las APIs de terceros
  • \n
  • Conocer las ventajas de usar APIs de terceros
  • \n
\n

Recordemos qué es un web API

\n

Ya hemos visto muchas veces que el acrónimo de API significa Application\nProgramming Interface (Interfaz de programación de aplicaciones) y que la\npodemos encontrar en distintos lugares como el navegador, la computadora, la\nweb y demás. También hemos escuchado que nos da interoperabilidad entre diversos\nsistemas, en esta unidad nos enfocaremos no en la comunicación con un único\ndispositivo sino entre miles o millones de esto, ¿cómo?. A través de internet,\npor ello, nos enfocaremos en las Web APIs. Alista tu subtítulos cone el\ntraductor automático y mira este video:

\n

\"Web

\n

APIs de terceros

\n
\n

Los APIs de terceros son APIs provistas por terceros (duh), estos terceros\nson generalmente compañías como Google, Facebook, entre otras - que permiten\nacceder a su funcionalidad a través de un lenguaje de programación (en nuestro\ncaso JavaScript) y usarlo en nuestra web app.

\n
\n

Este es un extracto traducido de un artículo de MDN sobre Third Party APIs.

\n

Pros y contras del uso de APIs de Terceros

\n
\n

Pros del uso de APIs de terceros

\n
    \n
  • Rapidez. El poder integrar en cuestión de segundos mapas, imágenes o\nservicios de autenticación en nuestras aplicaciones nos descarga de gran parte\nde la programación y nos permite centrarnos rápidamente en nuestro dominio de\nnegocio.
  • \n
  • Robustez. La mayoría de APIs y servicios más populares están tan sumamente\nextendidos que han sido probados en toda clase de situaciones de estrés, por\nlo que podremos asegurar que su respuesta será adecuada en la inmensa mayoría\nde los casos.
  • \n
  • Imagen. Cuando los usuarios usan a menudo un buen servicio, lo acaban\nreconociendo, y el asociar nuestra imagen a la de un grande como Google,\nFacebook o Twitter, puede ayudarnos a contagiarnos de la buena percepción que\nlos usuarios tienen de estos gigantes.
  • \n
  • Mantenimiento. Por norma general, las grandes empresas no dejarán que sus\nproductos se deterioren, por lo que es bastante común que los servicios\naccedidos a través de las APIs estén en una constante mejora, que además en\nmuchos casos será totalmente transparente al programador que las usa.
  • \n
  • Innovación. Al hilo de lo anterior, es lógico pensar que empresas líderes\ncomo Microsoft, eBay o Amazon no se conformarán con mantener sus aplicaciones\npara que funcionen bien, sino que tratarán de mejorarlas constantemente, con\nlo que los usuarios de sus APIs se verán beneficiados con todas las mejoras\nque se vayan produciendo.
  • \n
\n

Contras del uso de APIs de terceros

\n
    \n
  • Condiciones cambiantes. Al ligarnos a una tercera empresa por un contrato\ntan débil como es la licencia de uso de una API, normalmente estamos expuestos\na la voluntad de la otra parte, lo que puede suponer recortes en las\nprestaciones, obsolescencia de métodos implementados o pérdida de la gratuidad\ndel servicio, tal y como acaba de ocurrir con Google Maps.
  • \n
  • Disponibilidad. Como si no fuera suficiente con preocuparnos de mantener\nen funcionamiento nuestro propio servidor y aplicaciones, caídas de servicios\nexternos, como las ocurridas este año con Amazon, pueden dejar tus servicios\ninutilizados. ¿Os imagináis tener una tienda virtual que funcione a la\nperfección pero sólo admita pagos por PayPal y que éstos no funcionen?
  • \n
  • Imagen. Antes lo nombré como una ventaja, ya que podemos favorecernos del\nprestigio de una buena marca al trabajar con ella, pero ¿Qué ocurre cuando la\nreputación de nuestros partners desciende hasta el fango? Desgraciadamente es\nmuy difícil separar por completo la imagen de unos y otros, y nos veremos\nperjudicados por los errores ajenos.
  • \n
  • Falta de innovación. Cuando los servicios de terceros que utilizamos van\npor delante en progreso e innovación no suele haber quejas, pero también puede\nocurrir lo contrario: que se estanquen, nuestra aplicación avance más rápido\ny su API ya no pueda cumplir nuestras exigencias. Ante situaciones así se\nplantea la difícil decisión de cambiar de proveedor de servicios o\nimplementarlos por tu cuenta, con el consiguiente sobrecoste.
  • \n
  • Privacidad. Las leyes son muy distintas en cada país, y algunas como la\nLey Orgánica de Protección de Datos española (LOPD), que es más restrictiva\nque las equivalentes de otros países, pueden impedirnos legalmente delegar\nciertos datos o servicios para su trato por terceros.
  • \n
\n
\n

Estos pros y contras son parte de un post de GenbetaDev.\nNosotros nos enfocaremos en las cosas positivas en este momento y sacaremos\nprovecho de todo lo que nos ofrecen las APIs de terceros y hacer apps increíbles.

" + "body": "

Objetivos de Aprendizaje

\n
    \n
  • Entender la diferencia entre las APIs del navegador y las APIs de terceros
  • \n
  • Conocer las ventajas de usar APIs de terceros
  • \n
\n

Recordemos qué es un web API

\n

Ya hemos visto muchas veces que el acrónimo de API significa Application\nProgramming Interface (Interfaz de programación de aplicaciones) y que la\npodemos encontrar en distintos lugares como el navegador, la computadora, la\nweb y demás. También hemos escuchado que nos da interoperabilidad entre diversos\nsistemas, en esta unidad nos enfocaremos no en la comunicación con un único\ndispositivo sino entre miles o millones de esto, ¿cómo?. A través de internet,\npor ello, nos enfocaremos en las Web APIs. Alista tu subtítulos cone el\ntraductor automático y mira este video:

\n

\n

APIs de terceros

\n
\n

Los APIs de terceros son APIs provistas por terceros (duh), estos terceros\nson generalmente compañías como Google, Facebook, entre otras - que permiten\nacceder a su funcionalidad a través de un lenguaje de programación (en nuestro\ncaso JavaScript) y usarlo en nuestra web app.

\n
\n

Este es un extracto traducido de un artículo de MDN sobre Third Party APIs.

\n

Pros y contras del uso de APIs de Terceros

\n
\n

Pros del uso de APIs de terceros

\n
    \n
  • Rapidez. El poder integrar en cuestión de segundos mapas, imágenes o\nservicios de autenticación en nuestras aplicaciones nos descarga de gran parte\nde la programación y nos permite centrarnos rápidamente en nuestro dominio de\nnegocio.
  • \n
  • Robustez. La mayoría de APIs y servicios más populares están tan sumamente\nextendidos que han sido probados en toda clase de situaciones de estrés, por\nlo que podremos asegurar que su respuesta será adecuada en la inmensa mayoría\nde los casos.
  • \n
  • Imagen. Cuando los usuarios usan a menudo un buen servicio, lo acaban\nreconociendo, y el asociar nuestra imagen a la de un grande como Google,\nFacebook o Twitter, puede ayudarnos a contagiarnos de la buena percepción que\nlos usuarios tienen de estos gigantes.
  • \n
  • Mantenimiento. Por norma general, las grandes empresas no dejarán que sus\nproductos se deterioren, por lo que es bastante común que los servicios\naccedidos a través de las APIs estén en una constante mejora, que además en\nmuchos casos será totalmente transparente al programador que las usa.
  • \n
  • Innovación. Al hilo de lo anterior, es lógico pensar que empresas líderes\ncomo Microsoft, eBay o Amazon no se conformarán con mantener sus aplicaciones\npara que funcionen bien, sino que tratarán de mejorarlas constantemente, con\nlo que los usuarios de sus APIs se verán beneficiados con todas las mejoras\nque se vayan produciendo.
  • \n
\n

Contras del uso de APIs de terceros

\n
    \n
  • Condiciones cambiantes. Al ligarnos a una tercera empresa por un contrato\ntan débil como es la licencia de uso de una API, normalmente estamos expuestos\na la voluntad de la otra parte, lo que puede suponer recortes en las\nprestaciones, obsolescencia de métodos implementados o pérdida de la gratuidad\ndel servicio, tal y como acaba de ocurrir con Google Maps.
  • \n
  • Disponibilidad. Como si no fuera suficiente con preocuparnos de mantener\nen funcionamiento nuestro propio servidor y aplicaciones, caídas de servicios\nexternos, como las ocurridas este año con Amazon, pueden dejar tus servicios\ninutilizados. ¿Os imagináis tener una tienda virtual que funcione a la\nperfección pero sólo admita pagos por PayPal y que éstos no funcionen?
  • \n
  • Imagen. Antes lo nombré como una ventaja, ya que podemos favorecernos del\nprestigio de una buena marca al trabajar con ella, pero ¿Qué ocurre cuando la\nreputación de nuestros partners desciende hasta el fango? Desgraciadamente es\nmuy difícil separar por completo la imagen de unos y otros, y nos veremos\nperjudicados por los errores ajenos.
  • \n
  • Falta de innovación. Cuando los servicios de terceros que utilizamos van\npor delante en progreso e innovación no suele haber quejas, pero también puede\nocurrir lo contrario: que se estanquen, nuestra aplicación avance más rápido\ny su API ya no pueda cumplir nuestras exigencias. Ante situaciones así se\nplantea la difícil decisión de cambiar de proveedor de servicios o\nimplementarlos por tu cuenta, con el consiguiente sobrecoste.
  • \n
  • Privacidad. Las leyes son muy distintas en cada país, y algunas como la\nLey Orgánica de Protección de Datos española (LOPD), que es más restrictiva\nque las equivalentes de otros países, pueden impedirnos legalmente delegar\nciertos datos o servicios para su trato por terceros.
  • \n
\n
\n

Estos pros y contras son parte de un post de GenbetaDev.\nNosotros nos enfocaremos en las cosas positivas en este momento y sacaremos\nprovecho de todo lo que nos ofrecen las APIs de terceros y hacer apps increíbles.

" }, "pt": { "title": "Third party APIs", - "body": "

Objetivos de Aprendizagem

\n
    \n
  • Entender a diferença entre as APIs do navegador e as APIs de terceiros.
  • \n
  • Conhecer as vantagens de utilizar APIs de terceiros.
  • \n
\n

Lembremos o que é uma Web API

\n

Já vimos muitas vezes que o acrônimo de API significa Application Programming\nInterface (Interface de Programação de Aplicações) e que podemos encontrá-las em\ndiferentes lugares como o navegador, no computador, na web e outros. Também\nvimos que elas nos dão interoperabilidade entre diversos sistemas. Nesta unidade\nfocaremos não na comunicação com um único dispositivo, mas sim entre milhares e\nmilhões deles. Como? Por meio da internet, com Web APIs. Ajuste as legendas\nou o tradutor automático e veja este vídeo:

\n

\"Web\nAPIs\"

\n

APIs de terceiros

\n
\n

As APIs de terceiros são APIs fornecidas por terceiros (duh). Esses terceiros\nsão geralmente companhias (como Google, Facebook e outras) que permitem\nacessar suas funcionalidades por meio de linguagem de programação (no nosso\ncaso, JavaScript) e usá-las em nossa aplicação web.

\n
\n

Este é um trecho traduzido de um artigo da MDN sobre Third Party\nAPIs.

\n

Prós e contras do uso de APIs de Terceiros

\n
\n

Prós do uso de APIs de terceiros

\n
    \n
  • Rapidez. Poder integrar em questão de segundos mapas, imagens ou serviços\nde autenticação em nossas aplicações e concentrar esforços nas regras de\nnegócio.
  • \n
  • Robustez. A maioria de APIs e serviços mais populares estão tão bem\ntestadas que podemos garantir que a resposta virá corretamente na maioria dos\ncasos.
  • \n
  • Imagem. Quando os usuários costumam usar um bom serviço, acabam\nreconhecendo isso. Associar a nossa imagem a de uma empresa grande como\nGoogle, Facebook ou Twitter pode nos ajudar a contarmos com a boa percepção\nque os usuários têm desses gigantes.
  • \n
  • Manutenção. De forma geral, as grandes empresas não deixarão que seus\nprodutos se deteriorem, o que faz com que os serviços acessados por meio das\nAPIs estejam em constante melhora, que na maior parte dos casos é totalmente\ntransparente para a programadora que as utiliza.
  • \n
  • Inovação. É lógico pensar que empresas líderes como Microsoft, eBay ou\nAmazon não se satisfazem em manter suas aplicações funcionando bem, mas\ntratam de melhorá-las constantemente, o que fará com que os usuários de suas\nAPIs se vejam beneficiados com todas a melhorias que vão sendo produzidas.
  • \n
\n

Contras do uso de APIs de terceiros

\n
    \n
  • Condições variáveis. Ao nos associarmos a uma empresa por um contrato tão\nfrágil como é uma licença de uso de uma API, normalmente estamos expostos à\nvontade de outra parte, o que pode levar à interrupção do serviço,\nobsolescência de métodos implementados ou perda da gratuidade do serviço,\ncomo acaba de ocorrer com Google Maps.
  • \n
  • Disponibilidade. Como se não fosse suficiente nos preocuparmos em manter\no funcionamento de nosso próprio servidor e aplicações, quedas de serviços\nexternos, como as ocorridas este ano com a Amazon, podem deixar seus serviços\ninutilizados. Você pode imaginar ter uma loja virtual que funciona\nperfeitamente, mas admitindo apenas pagamento por PayPal e este não funciona?
  • \n
  • Imagem. Anteriormente apontamos isso como uma vantagem, já que podemos\nnos favorecer do prestígio de uma boa marca ao trabalhar com ela, mas o que\nacontece quando a reputação de nossos parceiros vai à lama? Infelizmente é\nmuito difícil separar por completo a imagem de um e outro e seremos\nprejudicados por erros alheios.
  • \n
  • Falta de inovação. Quando os serviços de terceiros que usamos são\natualizados constantemente geralmente não há queixas, mas pode acontecer o\ncontrário também: que fiquem estagnados, nosso aplicativo avance mais rápido\ne sua API possa não atender mais às nossas demandas. Em situações como esta,\nsurge a difícil decisão de mudar de provedor de serviços ou implementá-los\npor conta própria, com consequente custo adicional.
  • \n
  • Privacidade. As leis são muito diferentes em cada país. Algumas como a\nLOPD espanhola, que é mais restritiva que as equivalentes em outros países,\npodem nos impedir legalmente de delegar certos dados ou serviços para seu\nprocessamento por terceiros.
  • \n
\n
\n

Esse prós e contras são parte de um post de\nGenbetaDev\n(em espanhol). Nós focaremos nas coisas positivas neste momento e tiraremos\nproveito de tudo o que nos oferecem as APIs de terceiros para fazermos apps\nincríveis.

" + "body": "

Objetivos de Aprendizagem

\n
    \n
  • Entender a diferença entre as APIs do navegador e as APIs de terceiros.
  • \n
  • Conhecer as vantagens de utilizar APIs de terceiros.
  • \n
\n

Lembremos o que é uma Web API

\n

Já vimos muitas vezes que o acrônimo de API significa Application Programming\nInterface (Interface de Programação de Aplicações) e que podemos encontrá-las em\ndiferentes lugares como o navegador, no computador, na web e outros. Também\nvimos que elas nos dão interoperabilidade entre diversos sistemas. Nesta unidade\nfocaremos não na comunicação com um único dispositivo, mas sim entre milhares e\nmilhões deles. Como? Por meio da internet, com Web APIs. Ajuste as legendas\nou o tradutor automático e veja este vídeo:

\n

\n

APIs de terceiros

\n
\n

As APIs de terceiros são APIs fornecidas por terceiros (duh). Esses terceiros\nsão geralmente companhias (como Google, Facebook e outras) que permitem\nacessar suas funcionalidades por meio de linguagem de programação (no nosso\ncaso, JavaScript) e usá-las em nossa aplicação web.

\n
\n

Este é um trecho traduzido de um artigo da MDN sobre Third Party\nAPIs.

\n

Prós e contras do uso de APIs de Terceiros

\n
\n

Prós do uso de APIs de terceiros

\n
    \n
  • Rapidez. Poder integrar em questão de segundos mapas, imagens ou serviços\nde autenticação em nossas aplicações e concentrar esforços nas regras de\nnegócio.
  • \n
  • Robustez. A maioria de APIs e serviços mais populares estão tão bem\ntestadas que podemos garantir que a resposta virá corretamente na maioria dos\ncasos.
  • \n
  • Imagem. Quando os usuários costumam usar um bom serviço, acabam\nreconhecendo isso. Associar a nossa imagem a de uma empresa grande como\nGoogle, Facebook ou Twitter pode nos ajudar a contarmos com a boa percepção\nque os usuários têm desses gigantes.
  • \n
  • Manutenção. De forma geral, as grandes empresas não deixarão que seus\nprodutos se deteriorem, o que faz com que os serviços acessados por meio das\nAPIs estejam em constante melhora, que na maior parte dos casos é totalmente\ntransparente para a programadora que as utiliza.
  • \n
  • Inovação. É lógico pensar que empresas líderes como Microsoft, eBay ou\nAmazon não se satisfazem em manter suas aplicações funcionando bem, mas\ntratam de melhorá-las constantemente, o que fará com que os usuários de suas\nAPIs se vejam beneficiados com todas a melhorias que vão sendo produzidas.
  • \n
\n

Contras do uso de APIs de terceiros

\n
    \n
  • Condições variáveis. Ao nos associarmos a uma empresa por um contrato tão\nfrágil como é uma licença de uso de uma API, normalmente estamos expostos à\nvontade de outra parte, o que pode levar à interrupção do serviço,\nobsolescência de métodos implementados ou perda da gratuidade do serviço,\ncomo acaba de ocorrer com Google Maps.
  • \n
  • Disponibilidade. Como se não fosse suficiente nos preocuparmos em manter\no funcionamento de nosso próprio servidor e aplicações, quedas de serviços\nexternos, como as ocorridas este ano com a Amazon, podem deixar seus serviços\ninutilizados. Você pode imaginar ter uma loja virtual que funciona\nperfeitamente, mas admitindo apenas pagamento por PayPal e este não funciona?
  • \n
  • Imagem. Anteriormente apontamos isso como uma vantagem, já que podemos\nnos favorecer do prestígio de uma boa marca ao trabalhar com ela, mas o que\nacontece quando a reputação de nossos parceiros vai à lama? Infelizmente é\nmuito difícil separar por completo a imagem de um e outro e seremos\nprejudicados por erros alheios.
  • \n
  • Falta de inovação. Quando os serviços de terceiros que usamos são\natualizados constantemente geralmente não há queixas, mas pode acontecer o\ncontrário também: que fiquem estagnados, nosso aplicativo avance mais rápido\ne sua API possa não atender mais às nossas demandas. Em situações como esta,\nsurge a difícil decisão de mudar de provedor de serviços ou implementá-los\npor conta própria, com consequente custo adicional.
  • \n
  • Privacidade. As leis são muito diferentes em cada país. Algumas como a\nLOPD espanhola, que é mais restritiva que as equivalentes em outros países,\npodem nos impedir legalmente de delegar certos dados ou serviços para seu\nprocessamento por terceiros.
  • \n
\n
\n

Esse prós e contras são parte de um post de\nGenbetaDev\n(em espanhol). Nós focaremos nas coisas positivas neste momento e tiraremos\nproveito de tudo o que nos oferecem as APIs de terceiros para fazermos apps\nincríveis.

" } } }, @@ -635,11 +635,11 @@ "intl": { "es": { "title": "Web APIs", - "body": "

Objetivos de Aprendizaje

\n
    \n
  • Conocer e identificar los distintos tipos de Web APIs con los que podemos\ntrabajar
  • \n
\n

¿Dónde puedo saber qué Web APIs públicas hay?

\n

Ya que en esta unidad vamos a trabajar con Web APIs públicas, debemos de saber\ndónde podemos ver cuáles existen. Para ello, te dejamos los siguientes recursos:

\n\n

Para el objetivo de esta lectura, vamos a enfocarnos en un recurso que no hemos\nlistado hace un momento: Public APIs.\nEste repositorio a diferencia de los demás, tiene una manera sintetizada de\nmostrar la autenticación que requiere un API (los demás recursos también\nmuestran este detalle pero no están a primera vista).

\n

\"Different

\n

En la imagen anterior, podemos visualizar el apartado de las APIs de Música, en\nla cual, la columna de Auth tiene valores distintos como: NO, apiKey u\nOAuth. Esto nos da un espacio a darles de cierta manera una clasificación a\nlas Web APIs en base a su medio de autenticación. Así que veamos un poco de qué\ntrata.

\n

Web APIs sin autenticación

\n

Éste tipo de APIs es el más sencillo de consumir a través de AJAX y a su vez el\nde mayor uso público debido a que no debes de registrarte para obtener una clave\no algo. simplemente haces una petición al endpoint especificado y listo. Ejemplo\nde estas APIs pueden ser: Pokeapi, Swapi, entre otras. Aquí te dejamos un pen\nmostrando lo que puedes hacer con la API de Lyrics.ovh.

\n

Web APIs con apiKey

\n

En estas APIs, su método de autenticación es a través de un API Key que\nacompaña a todas las peticiones que se realizan hacia algún endpoint (recurso).\nEn la mayoría de casos, deberás registrarte para obtener este apiKey. Aquí\nte dejamos un ejemplo con Google Maps.

\n

En algunas ocasiones, los API Keys generados deben de ir en las cabeceras HTTP\nde la petición para que en el backend se haga la verificación del token y pueda\nautenticarse correctamente. Por ejemplo, en la API de CoinAPI.io,\nel token se envía a través del header X-CoinAPI-Key, acá te mostramos un pen\nde cómo se haría la petición en este caso:

\n

Web APIs con OAuth

\n

OAuth es un protocolo de autorización que te permite obtener acceso limitado a\naplicaciones de terceros para obtener datos y luego usar dichos datos para el\nregistro o uso de un web service o API. Aquí dejamos un ejemplo para que veas\na qué nos referimos:

\n

¿No notaste la diferencia? Si bien esta implementación es similar a las que\nusan un API Key como método de autenticación, para generar ese key que se puede\nver en la URL del GET Request, se debe crear una aplicación en Stack Apps\ny para poder hacerlo, es necesario registrarse, al momento del registro ofrece\nuna opción de realizarlo mediante Facebook. Cuando esto sucede, el usuario\ngarantiza que StackExchange puede obtener ciertos datos de su cuenta de Facebook\ny estos datos son usados para crear la cuenta y configurar la app que se cree\nen Stack Apps. Ese proceso es lo que OAUth permite realizar de manera\nestandarizada.

\n

Otro ejemplo, si pruebas acceder al API de Spotify, tu te puedes conectar a él\nmediante Facebook y obtener acceso a hacer búsquedas de canciones, artistas,\nplaylists y demás.

\n

Autenticación y Autorización

\n

Estos dos términos fueron mencionados a lo largo de esta lectura, es importante\nhacer mención que son 2 aspectos de seguridad que las APIs toman en cuenta al\nmomento del diseño e implementación.

\n

La autenticación es el proceso de verificar que eres el usuario que indicas ser.\nEs decir, en un inicio de sesión, tu usuario y contraseña deben de coincidir con\nlos datos que tiene almacenado el sistema, este es un ejemplo de autenticación.

\n

Mientas que la autorización, una vez comprobado que eres quien dices ser,\nverifica si tienes acceso o permisos al recurso solicitado.

\n

Aquí te dejamos un par de videos (lo sabemos, está en inglés pero Google\nTranslate nos puede apoyar, no a la perfección pero seguro podrás entenderlo\nbajo el contexto adecuado).

\n

\"Authorization\"

\n

\"Authorization\"

\n

Más recursos

\n" + "body": "

Objetivos de Aprendizaje

\n
    \n
  • Conocer e identificar los distintos tipos de Web APIs con los que podemos\ntrabajar
  • \n
\n

¿Dónde puedo saber qué Web APIs públicas hay?

\n

Ya que en esta unidad vamos a trabajar con Web APIs públicas, debemos de saber\ndónde podemos ver cuáles existen. Para ello, te dejamos los siguientes recursos:

\n\n

Para el objetivo de esta lectura, vamos a enfocarnos en un recurso que no hemos\nlistado hace un momento: Public APIs.\nEste repositorio a diferencia de los demás, tiene una manera sintetizada de\nmostrar la autenticación que requiere un API (los demás recursos también\nmuestran este detalle pero no están a primera vista).

\n

\"Different

\n

En la imagen anterior, podemos visualizar el apartado de las APIs de Música, en\nla cual, la columna de Auth tiene valores distintos como: NO, apiKey u\nOAuth. Esto nos da un espacio a darles de cierta manera una clasificación a\nlas Web APIs en base a su medio de autenticación. Así que veamos un poco de qué\ntrata.

\n

Web APIs sin autenticación

\n

Éste tipo de APIs es el más sencillo de consumir a través de AJAX y a su vez el\nde mayor uso público debido a que no debes de registrarte para obtener una clave\no algo. simplemente haces una petición al endpoint especificado y listo. Ejemplo\nde estas APIs pueden ser: Pokeapi, Swapi, entre otras. Aquí te dejamos un pen\nmostrando lo que puedes hacer con la API de Lyrics.ovh.

\n\n See the Pen [Lyrics API](https://codepen.io/ivandevp/pen/NyjmMm/) by Ivan\n ([@ivandevp](https://codepen.io/ivandevp)) on [CodePen](https://codepen.io).\n\n

Web APIs con apiKey

\n

En estas APIs, su método de autenticación es a través de un API Key que\nacompaña a todas las peticiones que se realizan hacia algún endpoint (recurso).\nEn la mayoría de casos, deberás registrarte para obtener este apiKey. Aquí\nte dejamos un ejemplo con Google Maps.

\n\n See the Pen[ Laboratoria en Google Maps](https://codepen.io/ivandevp/pen/qxmGaY/)\n by Ivan ([@ivandevp](https://codepen.io/ivandevp)) on [CodePen](https://codepen.io).\n\n

En algunas ocasiones, los API Keys generados deben de ir en las cabeceras HTTP\nde la petición para que en el backend se haga la verificación del token y pueda\nautenticarse correctamente. Por ejemplo, en la API de CoinAPI.io,\nel token se envía a través del header X-CoinAPI-Key, acá te mostramos un pen\nde cómo se haría la petición en este caso:

\n\n See the Pen [BYReOj](https://codepen.io/ivandevp/pen/BYReOj/) by Ivan\n ([@ivandevp](https://codepen.io/ivandevp)) on [CodePen](https://codepen.io).\n\n

Web APIs con OAuth

\n

OAuth es un protocolo de autorización que te permite obtener acceso limitado a\naplicaciones de terceros para obtener datos y luego usar dichos datos para el\nregistro o uso de un web service o API. Aquí dejamos un ejemplo para que veas\na qué nos referimos:

\n\n See the Pen [YeQwOe](https://codepen.io/ivandevp/pen/YeQwOe/) by Ivan\n ([@ivandevp](https://codepen.io/ivandevp)) on [CodePen](https://codepen.io).\n\n

¿No notaste la diferencia? Si bien esta implementación es similar a las que\nusan un API Key como método de autenticación, para generar ese key que se puede\nver en la URL del GET Request, se debe crear una aplicación en Stack Apps\ny para poder hacerlo, es necesario registrarse, al momento del registro ofrece\nuna opción de realizarlo mediante Facebook. Cuando esto sucede, el usuario\ngarantiza que StackExchange puede obtener ciertos datos de su cuenta de Facebook\ny estos datos son usados para crear la cuenta y configurar la app que se cree\nen Stack Apps. Ese proceso es lo que OAUth permite realizar de manera\nestandarizada.

\n

Otro ejemplo, si pruebas acceder al API de Spotify, tu te puedes conectar a él\nmediante Facebook y obtener acceso a hacer búsquedas de canciones, artistas,\nplaylists y demás.

\n

Autenticación y Autorización

\n

Estos dos términos fueron mencionados a lo largo de esta lectura, es importante\nhacer mención que son 2 aspectos de seguridad que las APIs toman en cuenta al\nmomento del diseño e implementación.

\n

La autenticación es el proceso de verificar que eres el usuario que indicas ser.\nEs decir, en un inicio de sesión, tu usuario y contraseña deben de coincidir con\nlos datos que tiene almacenado el sistema, este es un ejemplo de autenticación.

\n

Mientas que la autorización, una vez comprobado que eres quien dices ser,\nverifica si tienes acceso o permisos al recurso solicitado.

\n

Aquí te dejamos un par de videos (lo sabemos, está en inglés pero Google\nTranslate nos puede apoyar, no a la perfección pero seguro podrás entenderlo\nbajo el contexto adecuado).

\n

\n

\n

Más recursos

\n" }, "pt": { "title": "Web APIs", - "body": "

Objetivos de Aprendizagem

\n
    \n
  • Conhecer e identificar os diferentes tipos de Web APIs com os quais podemos\ntrabalhar
  • \n
\n

Onde posso saber quais Web APIs públicas existem?

\n

Já que nesta unidade trabalharemos com Web APIs públicas, devemos saber onde\npodemos encontrá-las. Para tanto, deixamos para você os seguintes recursos:

\n\n

Para o objetivo desta leitura, focaremos em um recurso que não vimos até o\nmomentos: Public APIs. Este\nrepositório, diferente dos demais, tem uma maneira sintetizada de mostrar a\nautenticação que uma API necessita (os demais recursos também mostram esse\ndetalhe, mas não à primeira vista).

\n

\"Different

\n

Na imagem anterior, podemos visualizar a seção das APIs de Música, na qual a\ncoluna Auth tem valores distintos como NO, apikey ou OAuth. É uma\nmaneira de classificar as Web APIs com base em seu meio de autenticação. Vejamos\ndo que se trata.

\n

Web APIs sem autenticação

\n

Este tipo de API é o mais simples de consumir por meio de AJAX e por sua vez é o\nde maior uso público, pois não é preciso se registrar para obter uma chave ou\nlogin. Simplesmente faça uma requisição no endpoint especificado e pronto.\nExemplo destas APIs podem ser: Pokeapi, Swapi, entre outras. Aqui temos um pen\nmostrando o que você pode fazer com a API de\nLyrics.ovh.

\n

Web APIs com apiKey

\n

Nestas APIs, o método de autenticação é por meio de um API Key que acompanha\ntodas as requisições que são feitas a algum endpoint (recurso). Na maioria dos\ncasos, você deverá se registrar para obter essa apiKey. Deixamos aqui um\nexemplo com Google Maps.

\n

Em algumas ocasiões, as API Keys geradas devem ir nos cabeçalhos HTTP da\nrequisição, para que no backend se faça a verificação do token e este possa\nser autenticado corretamente. Por exemplo, na API de\nCoinAPI.io, o token é enviado por meio do header\nX-CoinAPI-Key. Aqui temos um pen de como ser faria a requisição nesse caso:

\n

Web APIs com OAuth

\n

OAuth é um protocolo de autorização que permite obter acesso limitado a\naplicações de terceiros para obter dados e em seguida usar esse dados para o\nregistro de um web service ou API. Aqui deixamos um exemplo para que veja do\nque se trata:

\n

Percebeu a diferença? Embora esta implementação seja similar às que usam um API\nKey como método de autenticação, para gerar esse key que vemos na URL do GET\nRequest é preciso criar uma aplicação em Stack Apps,\ne para poder fazê-lo é necessário se cadastrar. No momento do cadastro, é\noferecida a opção de cadastrar-se usando o Facebook. Quando você se registra, o\nusuário garantirá que StackExchange pode obter certos dados de sua conta do\nFacebook; esse dados são usados para criar a conta e configurar a aplicação que\nestá no Stack Apps. É esse processo que o OAuth permite realizar de maneira\npadronizada.

\n

Outro exemplo: se testar acessar a API do Spotify, você pode ser conectar com\nele pode meio do Facebook e obter acesso à busca de músicas, artistas, playlists\ne demais itens.

\n

Autenticação e Autorização

\n

Estes dois termos foram mencionados ao longo desta leitura. É importante\nmencionar que são dois aspectos de segurança que as APIs levam em conta no\nmomento do projeto e implementação.

\n

A autenticação é o processo de verificar quem é o usuário que você indica ser.\nIsto é, no início da sessão, seu usuário e senha devem coincidir com os dados\nque estão armazenados no sistema. Isso é um exemplo de autenticação.

\n

Enquanto que a autorização, uma vez verificado que você é quem diz ser, verifica\nse você tem acesso ou permissão ao recurso solicitado.

\n

Aqui deixamos duas vídeos (nós sabemos, estão em inglês. Mas o Google Translate\npode nos ajudar, não 100%, mas o suficiente para poder entendê-los no contexto\nadequado).

\n

\"Authorization\"

\n

\"Authorization\"

\n

Mais recursos

\n" + "body": "

Objetivos de Aprendizagem

\n
    \n
  • Conhecer e identificar os diferentes tipos de Web APIs com os quais podemos\ntrabalhar
  • \n
\n

Onde posso saber quais Web APIs públicas existem?

\n

Já que nesta unidade trabalharemos com Web APIs públicas, devemos saber onde\npodemos encontrá-las. Para tanto, deixamos para você os seguintes recursos:

\n\n

Para o objetivo desta leitura, focaremos em um recurso que não vimos até o\nmomentos: Public APIs. Este\nrepositório, diferente dos demais, tem uma maneira sintetizada de mostrar a\nautenticação que uma API necessita (os demais recursos também mostram esse\ndetalhe, mas não à primeira vista).

\n

\"Different

\n

Na imagem anterior, podemos visualizar a seção das APIs de Música, na qual a\ncoluna Auth tem valores distintos como NO, apikey ou OAuth. É uma\nmaneira de classificar as Web APIs com base em seu meio de autenticação. Vejamos\ndo que se trata.

\n

Web APIs sem autenticação

\n

Este tipo de API é o mais simples de consumir por meio de AJAX e por sua vez é o\nde maior uso público, pois não é preciso se registrar para obter uma chave ou\nlogin. Simplesmente faça uma requisição no endpoint especificado e pronto.\nExemplo destas APIs podem ser: Pokeapi, Swapi, entre outras. Aqui temos um pen\nmostrando o que você pode fazer com a API de\nLyrics.ovh.

\n See the Pen [Lyrics API](https://codepen.io/ivandevp/pen/NyjmMm/) by\n Ivan ([@ivandevp](https://codepen.io/ivandevp)) on\n [CodePen](https://codepen.io).\n\n

Web APIs com apiKey

\n

Nestas APIs, o método de autenticação é por meio de um API Key que acompanha\ntodas as requisições que são feitas a algum endpoint (recurso). Na maioria dos\ncasos, você deverá se registrar para obter essa apiKey. Deixamos aqui um\nexemplo com Google Maps.

\n See the Pen[ Laboratoria en Google\n Maps](https://codepen.io/ivandevp/pen/qxmGaY/) by Ivan\n ([@ivandevp](https://codepen.io/ivandevp)) on [CodePen](https://codepen.io).\n\n

Em algumas ocasiões, as API Keys geradas devem ir nos cabeçalhos HTTP da\nrequisição, para que no backend se faça a verificação do token e este possa\nser autenticado corretamente. Por exemplo, na API de\nCoinAPI.io, o token é enviado por meio do header\nX-CoinAPI-Key. Aqui temos um pen de como ser faria a requisição nesse caso:

\n See the Pen [BYReOj](https://codepen.io/ivandevp/pen/BYReOj/) by Ivan\n ([@ivandevp](https://codepen.io/ivandevp)) on [CodePen](https://codepen.io).\n\n

Web APIs com OAuth

\n

OAuth é um protocolo de autorização que permite obter acesso limitado a\naplicações de terceiros para obter dados e em seguida usar esse dados para o\nregistro de um web service ou API. Aqui deixamos um exemplo para que veja do\nque se trata:

\n See the Pen [YeQwOe](https://codepen.io/ivandevp/pen/YeQwOe/) by Ivan\n ([@ivandevp](https://codepen.io/ivandevp)) on [CodePen](https://codepen.io).\n\n

Percebeu a diferença? Embora esta implementação seja similar às que usam um API\nKey como método de autenticação, para gerar esse key que vemos na URL do GET\nRequest é preciso criar uma aplicação em Stack Apps,\ne para poder fazê-lo é necessário se cadastrar. No momento do cadastro, é\noferecida a opção de cadastrar-se usando o Facebook. Quando você se registra, o\nusuário garantirá que StackExchange pode obter certos dados de sua conta do\nFacebook; esse dados são usados para criar a conta e configurar a aplicação que\nestá no Stack Apps. É esse processo que o OAuth permite realizar de maneira\npadronizada.

\n

Outro exemplo: se testar acessar a API do Spotify, você pode ser conectar com\nele pode meio do Facebook e obter acesso à busca de músicas, artistas, playlists\ne demais itens.

\n

Autenticação e Autorização

\n

Estes dois termos foram mencionados ao longo desta leitura. É importante\nmencionar que são dois aspectos de segurança que as APIs levam em conta no\nmomento do projeto e implementação.

\n

A autenticação é o processo de verificar quem é o usuário que você indica ser.\nIsto é, no início da sessão, seu usuário e senha devem coincidir com os dados\nque estão armazenados no sistema. Isso é um exemplo de autenticação.

\n

Enquanto que a autorização, uma vez verificado que você é quem diz ser, verifica\nse você tem acesso ou permissão ao recurso solicitado.

\n

Aqui deixamos duas vídeos (nós sabemos, estão em inglês. Mas o Google Translate\npode nos ajudar, não 100%, mas o suficiente para poder entendê-los no contexto\nadequado).

\n

\n

\n

Mais recursos

\n" } } }, @@ -651,11 +651,11 @@ "intl": { "es": { "title": "RESTful APIs", - "body": "

Objetivos de Aprendizaje

\n
    \n
  • Entender a grandes rasgos qué es REST y cómo detectar qué APIs son RESTful
  • \n
\n

Formato de contenido

\n

XML

\n
\n

Extensible Markup Language (XML) es un formato universal para datos y\ndocumentos estructurados. Los archivos XML tienen una extensión de archivo de\n.xml. Al igual que HTML, XML utiliza etiquetas (palabras delimitadas por los\ncaracteres > y <) para estructurar los datos del documento.

\n
<?xml version=\"1.0\" encoding=UTF-8\"?>\n<doc>\n   <customer id='123'>\n      <name>...</name>\n      <address>...</address>\n       ...\n      <order>\n         <amount>...</amount>\n            <date>...</date>\n         <item quant='12'>\n            <name>...</name>\n         </item>\n         <item quant='4'>...</item>\n          ...\n      </order>\n      <order>...</order>\n       ...\n      <payment>\n         <number>...</number>\n         <date>...</date>\n      </payment>\n      <payment>>...</payment>\n       ...\n   </customer>\n   <customer id='124'>...</customer>\n</doc>\n
\n
\n

Fuente: ¿Qué es XML? - IBM

\n

JSON

\n
\n

JSON (JavaScript Object Notation) es un formato para el intercambios de datos,\nbásicamente JSON describe los datos con una sintaxis dedicada que se usa para\nidentificar y gestionar los datos. JSON nació como una alternativa a XML, el\nfácil uso en javascript ha generado un gran numero de seguidores de esta\nalternativa. Una de las mayores ventajas que tiene el uso de JSON es que puede\nser leído por cualquier lenguaje de programación. Por lo tanto, puede ser\nusado para el intercambio de información entre distintas tecnologías.

\n
\n

Fuente: ¿Qué es y para qué sirve JSON? - GeekyTheory

\n
\n
{\n  \"squadName\": \"Super hero squad\",\n  \"homeTown\": \"Metro City\",\n  \"formed\": 2016,\n  \"secretBase\": \"Super tower\",\n  \"active\": true,\n  \"members\": [\n    {\n      \"name\": \"Molecule Man\",\n      \"age\": 29,\n      \"secretIdentity\": \"Dan Jukes\",\n      \"powers\": [\n        \"Radiation resistance\",\n        \"Turning tiny\",\n        \"Radiation blast\"\n      ]\n    },\n    {\n      \"name\": \"Madame Uppercut\",\n      \"age\": 39,\n      \"secretIdentity\": \"Jane Wilson\",\n      \"powers\": [\n        \"Million tonne punch\",\n        \"Damage resistance\",\n        \"Superhuman reflexes\"\n      ]\n    },\n    {\n      \"name\": \"Eternal Flame\",\n      \"age\": 1000000,\n      \"secretIdentity\": \"Unknown\",\n      \"powers\": [\n        \"Immortality\",\n        \"Heat Immunity\",\n        \"Inferno\",\n        \"Teleportation\",\n        \"Interdimensional travel\"\n      ]\n    }\n  ]\n}\n
\n
\n

Fuente: Ejemplo - Trabajando con JSON - MDN

\n

En el siguiente video, encuentras un resumen de formato de contenidos:

\n

\"Content

\n

Si quieres comparar un poco sobre estas 2 estructuras de información, aquí un\nvideo te lo resume:

\n

\"XML

\n

Servicios Web

\n

SOAP

\n
\n

SOAP (originalmente las siglas de Simple Object Access Protocol) es un\nprotocolo estándar que define cómo dos objetos en diferentes procesos pueden\ncomunicarse por medio de intercambio de datos XML. Este protocolo deriva de un\nprotocolo creado por Dave Winer en 1998, llamado XML-RPC. SOAP fue creado por\nMicrosoft, IBM y otros. Está actualmente bajo el auspicio de la W3C. Es uno de\nlos protocolos utilizados en los servicios Web.

\n
\n

Fuente: SOAP - Wikipedia

\n

REST

\n
\n

\"Representational State Transfer\" o traducido a \"Transferencia de presentación\nde estado\" es lo que se domina a REST. ¿Y eso es?, una técnica de arquitectura\nde software usada para construir APIs que permitan comunicar a nuestro servidor\ncon sus clientes usando el protocolo HTTP mediante URIs lo suficientemente\ninteligentes para poder satisfacer la necesidad del cliente.

\n
    \n
  • REST es STATELESS, es decir que cada petición que reciba nuestra API debe\nperecer. Por ejemplo, no podemos RECORDAR un usuario logeado en el API\nusando una sesión, esto es un PECADO ya que agotaría la memoria RAM de\nnuestro servidor (10 mil usuarios conectados a nuestra API). Lo que correcto\nes pasar un TOKEN para cada petición realizada al API, y el API deberá\nvalidar si esta es correcta o no (por ahora no vamos hablar de técnicas para\ngenerar el TOKEN, pero lo más común es usar una COOKIE).
  • \n
  • Se implementan RECURSOS para generar comunicación, es decir crea URIs únicas\nque permiten al cliente entender y utilizar lo que está exponiendo.\nPor ejemplo:\n
      \n
    • https://jsonplaceholder.typicode.com/users
    • \n
    • https://jsonplaceholder.typicode.com/users/1
    • \n
    \n
  • \n
  • Cada petición realizada a nuestra API responde a un verbo, y dicho verbo a\nuna operación en común. Mediante los métodos HTTP hacemos las peticiones, lo\ncomún es GET y POST, PUT y DELETE.\n
      \n
    • POST (create): cuando mandamos información para insertar por ejemplo un\nregistro en la base de datos. La información es enviado en el cuerpo de la\npetición, es decir que los datos no son visibles al usuario.\nPOST /users
    • \n
    • GET (read): es usado para modo lectura, por ejemplo: cuando queremos\nlistar a todos los usuarios de nuestra base de datos. Los parámetros son\nenviados por la URL.\nGET /users
    • \n
    • PUT (update): cuando queremos actualizar un registro. Actualizar la\ninformación de un usuario X.\nPUT /users/:userId
    • \n
    • DELETE (delete): cuando queremos eliminar un registro. Borrar un\nusuario X de nuestra base de datos.\nDELETE /uses/:userId
    • \n
    \n
  • \n
\n

Con esto hemos mencionado algunas caracteristicas básicas de lo que es REST,\nla cual podríamos decir que es un estándar para crear una REST Api o RESTFul.

\n
\n

Lee más: ¿Qué es REST? Conoce su potencia

\n

A continuación puedes ver un video que resume SOAP y REST:

\n

\"Web

\n

Por convenciones, cada uno de los estándares usa un formato de contenido\nparticular. En resumen, SOAP transfiere información a través de XML, mientras\nque REST frecuenta transferir datos usando JSON. Aquí tienes un video que resume\neste mensaje:

\n

\"SOAP

\n

Conclusión

\n

¿No te quedó claro que son RESTful APIs? Mientras REST es un estándar, la\nimplementación de éste en un API, viene a ser los RESTful APIs. Si bien al\ndiseñar un API hay muchas más cosas que se toman en cuenta, la principal es que\nte enfoques en cómo se obtienen los recursos y así poder identificar los métodos\ny URIs necesarias para consumir el API.

\n

Ejemplos de RESTful APIs son:

\n\n

Si quieres saber más sobre REST, aquí un tutorial\nque te puede ayudar.

" + "body": "

Objetivos de Aprendizaje

\n
    \n
  • Entender a grandes rasgos qué es REST y cómo detectar qué APIs son RESTful
  • \n
\n

Formato de contenido

\n

XML

\n
\n

Extensible Markup Language (XML) es un formato universal para datos y\ndocumentos estructurados. Los archivos XML tienen una extensión de archivo de\n.xml. Al igual que HTML, XML utiliza etiquetas (palabras delimitadas por los\ncaracteres > y <) para estructurar los datos del documento.

\n
<?xml version=\"1.0\" encoding=UTF-8\"?>\n<doc>\n   <customer id='123'>\n      <name>...</name>\n      <address>...</address>\n       ...\n      <order>\n         <amount>...</amount>\n            <date>...</date>\n         <item quant='12'>\n            <name>...</name>\n         </item>\n         <item quant='4'>...</item>\n          ...\n      </order>\n      <order>...</order>\n       ...\n      <payment>\n         <number>...</number>\n         <date>...</date>\n      </payment>\n      <payment>>...</payment>\n       ...\n   </customer>\n   <customer id='124'>...</customer>\n</doc>\n
\n
\n

Fuente: ¿Qué es XML? - IBM

\n

JSON

\n
\n

JSON (JavaScript Object Notation) es un formato para el intercambios de datos,\nbásicamente JSON describe los datos con una sintaxis dedicada que se usa para\nidentificar y gestionar los datos. JSON nació como una alternativa a XML, el\nfácil uso en javascript ha generado un gran numero de seguidores de esta\nalternativa. Una de las mayores ventajas que tiene el uso de JSON es que puede\nser leído por cualquier lenguaje de programación. Por lo tanto, puede ser\nusado para el intercambio de información entre distintas tecnologías.

\n
\n

Fuente: ¿Qué es y para qué sirve JSON? - GeekyTheory

\n
\n
{\n  \"squadName\": \"Super hero squad\",\n  \"homeTown\": \"Metro City\",\n  \"formed\": 2016,\n  \"secretBase\": \"Super tower\",\n  \"active\": true,\n  \"members\": [\n    {\n      \"name\": \"Molecule Man\",\n      \"age\": 29,\n      \"secretIdentity\": \"Dan Jukes\",\n      \"powers\": [\n        \"Radiation resistance\",\n        \"Turning tiny\",\n        \"Radiation blast\"\n      ]\n    },\n    {\n      \"name\": \"Madame Uppercut\",\n      \"age\": 39,\n      \"secretIdentity\": \"Jane Wilson\",\n      \"powers\": [\n        \"Million tonne punch\",\n        \"Damage resistance\",\n        \"Superhuman reflexes\"\n      ]\n    },\n    {\n      \"name\": \"Eternal Flame\",\n      \"age\": 1000000,\n      \"secretIdentity\": \"Unknown\",\n      \"powers\": [\n        \"Immortality\",\n        \"Heat Immunity\",\n        \"Inferno\",\n        \"Teleportation\",\n        \"Interdimensional travel\"\n      ]\n    }\n  ]\n}\n
\n
\n

Fuente: Ejemplo - Trabajando con JSON - MDN

\n

En el siguiente video, encuentras un resumen de formato de contenidos:

\n

\n

Si quieres comparar un poco sobre estas 2 estructuras de información, aquí un\nvideo te lo resume:

\n

\n

Servicios Web

\n

SOAP

\n
\n

SOAP (originalmente las siglas de Simple Object Access Protocol) es un\nprotocolo estándar que define cómo dos objetos en diferentes procesos pueden\ncomunicarse por medio de intercambio de datos XML. Este protocolo deriva de un\nprotocolo creado por Dave Winer en 1998, llamado XML-RPC. SOAP fue creado por\nMicrosoft, IBM y otros. Está actualmente bajo el auspicio de la W3C. Es uno de\nlos protocolos utilizados en los servicios Web.

\n
\n

Fuente: SOAP - Wikipedia

\n

REST

\n
\n

\"Representational State Transfer\" o traducido a \"Transferencia de presentación\nde estado\" es lo que se domina a REST. ¿Y eso es?, una técnica de arquitectura\nde software usada para construir APIs que permitan comunicar a nuestro servidor\ncon sus clientes usando el protocolo HTTP mediante URIs lo suficientemente\ninteligentes para poder satisfacer la necesidad del cliente.

\n
    \n
  • REST es STATELESS, es decir que cada petición que reciba nuestra API debe\nperecer. Por ejemplo, no podemos RECORDAR un usuario logeado en el API\nusando una sesión, esto es un PECADO ya que agotaría la memoria RAM de\nnuestro servidor (10 mil usuarios conectados a nuestra API). Lo que correcto\nes pasar un TOKEN para cada petición realizada al API, y el API deberá\nvalidar si esta es correcta o no (por ahora no vamos hablar de técnicas para\ngenerar el TOKEN, pero lo más común es usar una COOKIE).
  • \n
  • Se implementan RECURSOS para generar comunicación, es decir crea URIs únicas\nque permiten al cliente entender y utilizar lo que está exponiendo.\nPor ejemplo:\n
      \n
    • https://jsonplaceholder.typicode.com/users
    • \n
    • https://jsonplaceholder.typicode.com/users/1
    • \n
    \n
  • \n
  • Cada petición realizada a nuestra API responde a un verbo, y dicho verbo a\nuna operación en común. Mediante los métodos HTTP hacemos las peticiones, lo\ncomún es GET y POST, PUT y DELETE.\n
      \n
    • POST (create): cuando mandamos información para insertar por ejemplo un\nregistro en la base de datos. La información es enviado en el cuerpo de la\npetición, es decir que los datos no son visibles al usuario.\nPOST /users
    • \n
    • GET (read): es usado para modo lectura, por ejemplo: cuando queremos\nlistar a todos los usuarios de nuestra base de datos. Los parámetros son\nenviados por la URL.\nGET /users
    • \n
    • PUT (update): cuando queremos actualizar un registro. Actualizar la\ninformación de un usuario X.\nPUT /users/:userId
    • \n
    • DELETE (delete): cuando queremos eliminar un registro. Borrar un\nusuario X de nuestra base de datos.\nDELETE /uses/:userId
    • \n
    \n
  • \n
\n

Con esto hemos mencionado algunas caracteristicas básicas de lo que es REST,\nla cual podríamos decir que es un estándar para crear una REST Api o RESTFul.

\n
\n

Lee más: ¿Qué es REST? Conoce su potencia

\n

A continuación puedes ver un video que resume SOAP y REST:

\n

\n

Por convenciones, cada uno de los estándares usa un formato de contenido\nparticular. En resumen, SOAP transfiere información a través de XML, mientras\nque REST frecuenta transferir datos usando JSON. Aquí tienes un video que resume\neste mensaje:

\n

\n

Conclusión

\n

¿No te quedó claro que son RESTful APIs? Mientras REST es un estándar, la\nimplementación de éste en un API, viene a ser los RESTful APIs. Si bien al\ndiseñar un API hay muchas más cosas que se toman en cuenta, la principal es que\nte enfoques en cómo se obtienen los recursos y así poder identificar los métodos\ny URIs necesarias para consumir el API.

\n

Ejemplos de RESTful APIs son:

\n\n

Si quieres saber más sobre REST, aquí un tutorial\nque te puede ayudar.

" }, "pt": { "title": "RESTful APIs", - "body": "

Objetivos de Aprendizagem

\n
    \n
  • Entender de forma geral o que é REST e como detectar quais APIs são RESTful.
  • \n
\n

Formato de conteúdo

\n

XML

\n
\n

Extensible Markup Language (XML) é um formato universal para dados e\ndocumentos estruturados. Os arquivos XML tem a extensão de arquivo .xml.\nAssim como HTML, XML utiliza tags (palavras delimitadas pelos caracteres <\ne >) para estruturar os dados do documento.

\n
<?xml version=\"1.0\" encoding=UTF-8\"?>\n<doc>\n <customer id='123'>\n    <name>...</name>\n    <address>...</address>\n     ...\n    <order>\n       <amount>...</amount>\n          <date>...</date>\n       <item quant='12'>\n          <name>...</name>\n       </item>\n       <item quant='4'>...</item>\n        ...\n    </order>\n    <order>...</order>\n     ...\n    <payment>\n       <number>...</number>\n       <date>...</date>\n    </payment>\n    <payment>>...</payment>\n     ...\n </customer>\n <customer id='124'>...</customer>\n</doc>\n
\n
\n

Fonte: O que é XML? -\nIBM

\n

JSON

\n
\n

JSON (JavaScript Object Notation) é um formato de dados. Basicamente, JSON\ndescreve os dados com uma sintaxe própria que se para validar e administrar os\ndados. JSON nasceu como uma alternativa ao XML. O uso fácil em JavaScript\ngerou um grande número de seguidores desta alternativa. Uma das maiores\nvantagens do uso de JSON é poder ser lido por qualquer linguagem de\nprogramação. Assim, pode ser utilizado para trocas de informação entre\ndiferentes tecnologias.

\n
\n

Fonte: O que é e para que serve JSON? -\nGeekyTheory

\n
\n
{\n  \"squadName\": \"Super hero squad\",\n  \"homeTown\": \"Metro City\",\n  \"formed\": 2016,\n  \"secretBase\": \"Super tower\",\n  \"active\": true,\n  \"members\": [\n    {\n      \"name\": \"Molecule Man\",\n      \"age\": 29,\n      \"secretIdentity\": \"Dan Jukes\",\n      \"powers\": [\n        \"Radiation resistance\",\n        \"Turning tiny\",\n        \"Radiation blast\"\n      ]\n    },\n    {\n      \"name\": \"Madame Uppercut\",\n      \"age\": 39,\n      \"secretIdentity\": \"Jane Wilson\",\n      \"powers\": [\n        \"Million tonne punch\",\n        \"Damage resistance\",\n        \"Superhuman reflexes\"\n      ]\n    },\n    {\n      \"name\": \"Eternal Flame\",\n      \"age\": 1000000,\n      \"secretIdentity\": \"Unknown\",\n      \"powers\": [\n        \"Immortality\",\n        \"Heat Immunity\",\n        \"Inferno\",\n        \"Teleportation\",\n        \"Interdimensional travel\"\n      ]\n    }\n  ]\n}\n
\n
\n

Fonte: Exemplo - Trabalhando con JSON -\nMDN

\n

No vídeo a seguir, você encontra um resumo do formato de conteúdos:

\n

\"Content\nFormatting\"

\n

Se você quiser comparar um pouco essas 2 estruturas de dados, aqui há um vídeo\nde resumo:

\n

\"XML

\n

Serviços Web

\n

SOAP

\n
\n

SOAP (originalmente as siglas de Simple Object Access Protocol) é um protocolo\npadrão que define como objetos em diferentes processos podem se comunicar por\nmeio de troca de dados XML. Esse protocolo deriva de um protocolo criado por\nDave Winer em 1998, chamado XML-RPC. SOAP foi criado pela Microsoft, IBM e\noutros. Está atualmente sob o controle da W3C. É um dos protocolos mais\nutilizados nos serviços web.

\n
\n

Fonte: SOAP -\nWikipedia

\n

REST

\n
\n

\"Representational State Transfer\" (ou traduzido para \"Transferência de\nRepresentação de Estado\") é o que se denomina REST. E o que é isso? É uma\ntécnica de arquitetura de software para construir APIs que permitam o nosso\nservidor comunicar-se com seus clientes usando protocolo HTTP mediante URIs\nsuficientemente inteligentes para satisfazer a necessidade do cliente.

\n
    \n
  • REST é STATELESS, ou seja, cada requisição que nossa API recebe deve morrer.\nPor exemplo, não podemos LEMBRAR um usuário logado na API usando uma sessão,\nisso é um PECADO já que usaria muita memória RAM de nosso servidor (10 mil\nusuários conectados em nossa API). O que é correto é passar um TOKEN para\ncada requisição realizada na API e a API deverá validar se ela está correta\nou não (por enquanto, não vamos falar de técnicas para gerar o TOKEN, mas o\nmais comum é usar um COOKIE).
  • \n
  • São implementados RECURSOS para gerar comunicação, ou seja, criar URIs\núnicas que permitem ao cliente entender e utilizar o que estão expondo. Por\nexemplo:\n
      \n
    • https://jsonplaceholder.typicode.com/users
    • \n
    • https://jsonplaceholder.typicode.com/users/1
    • \n
    \n
  • \n
  • Cada requisição realizada em nossa API responde a um verbo e este a uma\noperação em comum. Por meio dos métodos HTTP, fazemos as requisições. O\ncomum é GET, POST, PUT e DELETE.\n
      \n
    • POST (create): quando enviamos informação para inserir um registro na\nbase de dados, por exemplo. A informação é enviada no corpo da requisição,\nou seja, os dados não são visíveis ao usuário. POST /users
    • \n
    • GET (read): é utilizado para o modo de leitura. Por exemplo: quando\nqueremos listar todos os usuários de nossa base de dados. Os parâmetros\nsão enviados pela URL. GET /users
    • \n
    • PUT (update): quando queremos atualizar um registro. Atualizar a\ninformação de um usuário X. PUT /users/:userId
    • \n
    • DELETE (delete): quando queremos apagar um registro. Eliminar um\nusuário X de nossa base de dados. DELETE /uses/:userId
    • \n
    \n
  • \n
\n

Com isso mencionamos algumas características básicas do que é REST. Poderíamos\ndizer que são um padrão para criar uma API REST ou RESTFul.

\n
\n

Fonte: O que é REST? Conheça seu poder

\n

A seguir você pode ver um vídeo que resume SOAP e REST:

\n

\"Web

\n

Por convenção, cada um dos padrões usa um formato de conteúdo particular. Em\nresumo, SOAP transfere informação por meio de XML, enquanto REST transfere dados\nusando JSON. Aqui temos um vídeo que resume esta mensagem:

\n

\"SOAP

\n

Conclusão

\n

Não ficou claro para você o que são RESTful APIs? Enquanto REST é um padrão, a\nimplementação deste é uma API, que vem a ser as APIs RESTful. Embora ao projetar\numa API haja muitas coisas mais para levar em conta, a principal é que você se\nconcentre em como se obtém os recursos e assim poder identificar os métodos e\nURIs necessárias para consumir a API.

\n

Exemplos de RESTful APIs são:

\n\n

Se você quiser saber mais sobre REST, aqui tem um\ntutorial que pode te ajudar.

" + "body": "

Objetivos de Aprendizagem

\n
    \n
  • Entender de forma geral o que é REST e como detectar quais APIs são RESTful.
  • \n
\n

Formato de conteúdo

\n

XML

\n
\n

Extensible Markup Language (XML) é um formato universal para dados e\ndocumentos estruturados. Os arquivos XML tem a extensão de arquivo .xml.\nAssim como HTML, XML utiliza tags (palavras delimitadas pelos caracteres <\ne >) para estruturar os dados do documento.

\n
<?xml version=\"1.0\" encoding=UTF-8\"?>\n<doc>\n <customer id='123'>\n    <name>...</name>\n    <address>...</address>\n     ...\n    <order>\n       <amount>...</amount>\n          <date>...</date>\n       <item quant='12'>\n          <name>...</name>\n       </item>\n       <item quant='4'>...</item>\n        ...\n    </order>\n    <order>...</order>\n     ...\n    <payment>\n       <number>...</number>\n       <date>...</date>\n    </payment>\n    <payment>>...</payment>\n     ...\n </customer>\n <customer id='124'>...</customer>\n</doc>\n
\n
\n

Fonte: O que é XML? -\nIBM

\n

JSON

\n
\n

JSON (JavaScript Object Notation) é um formato de dados. Basicamente, JSON\ndescreve os dados com uma sintaxe própria que se para validar e administrar os\ndados. JSON nasceu como uma alternativa ao XML. O uso fácil em JavaScript\ngerou um grande número de seguidores desta alternativa. Uma das maiores\nvantagens do uso de JSON é poder ser lido por qualquer linguagem de\nprogramação. Assim, pode ser utilizado para trocas de informação entre\ndiferentes tecnologias.

\n
\n

Fonte: O que é e para que serve JSON? -\nGeekyTheory

\n
\n
{\n  \"squadName\": \"Super hero squad\",\n  \"homeTown\": \"Metro City\",\n  \"formed\": 2016,\n  \"secretBase\": \"Super tower\",\n  \"active\": true,\n  \"members\": [\n    {\n      \"name\": \"Molecule Man\",\n      \"age\": 29,\n      \"secretIdentity\": \"Dan Jukes\",\n      \"powers\": [\n        \"Radiation resistance\",\n        \"Turning tiny\",\n        \"Radiation blast\"\n      ]\n    },\n    {\n      \"name\": \"Madame Uppercut\",\n      \"age\": 39,\n      \"secretIdentity\": \"Jane Wilson\",\n      \"powers\": [\n        \"Million tonne punch\",\n        \"Damage resistance\",\n        \"Superhuman reflexes\"\n      ]\n    },\n    {\n      \"name\": \"Eternal Flame\",\n      \"age\": 1000000,\n      \"secretIdentity\": \"Unknown\",\n      \"powers\": [\n        \"Immortality\",\n        \"Heat Immunity\",\n        \"Inferno\",\n        \"Teleportation\",\n        \"Interdimensional travel\"\n      ]\n    }\n  ]\n}\n
\n
\n

Fonte: Exemplo - Trabalhando con JSON -\nMDN

\n

No vídeo a seguir, você encontra um resumo do formato de conteúdos:

\n

\n

Se você quiser comparar um pouco essas 2 estruturas de dados, aqui há um vídeo\nde resumo:

\n

\n

Serviços Web

\n

SOAP

\n
\n

SOAP (originalmente as siglas de Simple Object Access Protocol) é um protocolo\npadrão que define como objetos em diferentes processos podem se comunicar por\nmeio de troca de dados XML. Esse protocolo deriva de um protocolo criado por\nDave Winer em 1998, chamado XML-RPC. SOAP foi criado pela Microsoft, IBM e\noutros. Está atualmente sob o controle da W3C. É um dos protocolos mais\nutilizados nos serviços web.

\n
\n

Fonte: SOAP -\nWikipedia

\n

REST

\n
\n

\"Representational State Transfer\" (ou traduzido para \"Transferência de\nRepresentação de Estado\") é o que se denomina REST. E o que é isso? É uma\ntécnica de arquitetura de software para construir APIs que permitam o nosso\nservidor comunicar-se com seus clientes usando protocolo HTTP mediante URIs\nsuficientemente inteligentes para satisfazer a necessidade do cliente.

\n
    \n
  • REST é STATELESS, ou seja, cada requisição que nossa API recebe deve morrer.\nPor exemplo, não podemos LEMBRAR um usuário logado na API usando uma sessão,\nisso é um PECADO já que usaria muita memória RAM de nosso servidor (10 mil\nusuários conectados em nossa API). O que é correto é passar um TOKEN para\ncada requisição realizada na API e a API deverá validar se ela está correta\nou não (por enquanto, não vamos falar de técnicas para gerar o TOKEN, mas o\nmais comum é usar um COOKIE).
  • \n
  • São implementados RECURSOS para gerar comunicação, ou seja, criar URIs\núnicas que permitem ao cliente entender e utilizar o que estão expondo. Por\nexemplo:\n
      \n
    • https://jsonplaceholder.typicode.com/users
    • \n
    • https://jsonplaceholder.typicode.com/users/1
    • \n
    \n
  • \n
  • Cada requisição realizada em nossa API responde a um verbo e este a uma\noperação em comum. Por meio dos métodos HTTP, fazemos as requisições. O\ncomum é GET, POST, PUT e DELETE.\n
      \n
    • POST (create): quando enviamos informação para inserir um registro na\nbase de dados, por exemplo. A informação é enviada no corpo da requisição,\nou seja, os dados não são visíveis ao usuário. POST /users
    • \n
    • GET (read): é utilizado para o modo de leitura. Por exemplo: quando\nqueremos listar todos os usuários de nossa base de dados. Os parâmetros\nsão enviados pela URL. GET /users
    • \n
    • PUT (update): quando queremos atualizar um registro. Atualizar a\ninformação de um usuário X. PUT /users/:userId
    • \n
    • DELETE (delete): quando queremos apagar um registro. Eliminar um\nusuário X de nossa base de dados. DELETE /uses/:userId
    • \n
    \n
  • \n
\n

Com isso mencionamos algumas características básicas do que é REST. Poderíamos\ndizer que são um padrão para criar uma API REST ou RESTFul.

\n
\n

Fonte: O que é REST? Conheça seu poder

\n

A seguir você pode ver um vídeo que resume SOAP e REST:

\n

\n

Por convenção, cada um dos padrões usa um formato de conteúdo particular. Em\nresumo, SOAP transfere informação por meio de XML, enquanto REST transfere dados\nusando JSON. Aqui temos um vídeo que resume esta mensagem:

\n

\n

Conclusão

\n

Não ficou claro para você o que são RESTful APIs? Enquanto REST é um padrão, a\nimplementação deste é uma API, que vem a ser as APIs RESTful. Embora ao projetar\numa API haja muitas coisas mais para levar em conta, a principal é que você se\nconcentre em como se obtém os recursos e assim poder identificar os métodos e\nURIs necessárias para consumir a API.

\n

Exemplos de RESTful APIs são:

\n\n

Se você quiser saber mais sobre REST, aqui tem um\ntutorial que pode te ajudar.

" } } }, @@ -667,11 +667,11 @@ "intl": { "es": { "title": "CRUD", - "body": "

Objetivos de Aprendizaje

\n
    \n
  • Entender qué es CRUD y cómo podemos generar una aplicación consumiendo un API\nRESTful
  • \n
\n

CRUD: Create, Read, Update and Delete

\n

¿Te has percatado que casi toda la interacción qué haces en la web tiene que ver\ncon una base de datos? Cuando entras al perfil de la persona que stalkeas, todas\nsus fotos, publicaciones, comentarios y demás está almacenado en algún lugar\n(base de datos), cuando subes una foto en Instagram o envías un e-mail, estás\ncreando un nuevo registro en la database, cuando cambias tu foto de perfil\nen Whatsapp, estás editando algo existente en la BD, por último, cuándo borras\nel mensaje cuando te equivocas de conversación o grupo, estás alterando tu DB.

\n
\n

El uso de distintas palabras para referirse a base de datos en el párrafo\nanterior fue intencional para saber que hacen referencia a lo mismo.

\n
\n

A todas las acciones descritas anteriormente que tienen interacción con la base\nde datos, tienen un acrónimo en programación: CRUD.

\n

CRUD es el acrónimo de \"Crear, Leer, Actualizar y Eliminar\", palabras que\ncorresponden respectivamente a los verbos HTTP más utilizados: POST, GET,\nPUT y DELETE.

\n

Estas son las operaciones más comunes que queremos tener en el caso de una API,\nque manipula datos.

\n

Para aclararnos vamos a revisar el siguiente vídeo, solo hasta el minuto 3:15.

\n
\n

Nota: El vídeo dura muchísimo (1:28:04)!!! Los primeros tres minutos muestra\nlo que es un CRUD y que uso tendría en un aplicación con Firebase.\nDespués, inicia con el desarrollo de la aplicación y si lo vas siguiendo\neste es un excelente ejercicio guiado.

\n
\n

Vídeo

\n

Ejemplo

\n

Aquí un ejemplo de CRUD para una lista de tareas:

\n

Si bien el ejercicio anterior pierde los cambios al recargar la página, ésta\nmuestra el principio de las acciones que implica un CRUD. Al momento de\npracticar (en las siguientes lecciones), ¡lo pondremos en práctica con una base\nde datos real!

" + "body": "

Objetivos de Aprendizaje

\n
    \n
  • Entender qué es CRUD y cómo podemos generar una aplicación consumiendo un API\nRESTful
  • \n
\n

CRUD: Create, Read, Update and Delete

\n

¿Te has percatado que casi toda la interacción qué haces en la web tiene que ver\ncon una base de datos? Cuando entras al perfil de la persona que stalkeas, todas\nsus fotos, publicaciones, comentarios y demás está almacenado en algún lugar\n(base de datos), cuando subes una foto en Instagram o envías un e-mail, estás\ncreando un nuevo registro en la database, cuando cambias tu foto de perfil\nen Whatsapp, estás editando algo existente en la BD, por último, cuándo borras\nel mensaje cuando te equivocas de conversación o grupo, estás alterando tu DB.

\n
\n

El uso de distintas palabras para referirse a base de datos en el párrafo\nanterior fue intencional para saber que hacen referencia a lo mismo.

\n
\n

A todas las acciones descritas anteriormente que tienen interacción con la base\nde datos, tienen un acrónimo en programación: CRUD.

\n

CRUD es el acrónimo de \"Crear, Leer, Actualizar y Eliminar\", palabras que\ncorresponden respectivamente a los verbos HTTP más utilizados: POST, GET,\nPUT y DELETE.

\n

Estas son las operaciones más comunes que queremos tener en el caso de una API,\nque manipula datos.

\n

Para aclararnos vamos a revisar el siguiente vídeo, solo hasta el minuto 3:15.

\n
\n

Nota: El vídeo dura muchísimo (1:28:04)!!! Los primeros tres minutos muestra\nlo que es un CRUD y que uso tendría en un aplicación con Firebase.\nDespués, inicia con el desarrollo de la aplicación y si lo vas siguiendo\neste es un excelente ejercicio guiado.

\n
\n

\n

Ejemplo

\n

Aquí un ejemplo de CRUD para una lista de tareas:

\n\n See the Pen [Plain JS CRUD Frontend](https://codepen.io/ianseabrook/pen/rxvByR/)\n by Ian Seabrook ([@ianseabrook](https://codepen.io/ianseabrook)) on\n [CodePen](https://codepen.io).\n\n

Si bien el ejercicio anterior pierde los cambios al recargar la página, ésta\nmuestra el principio de las acciones que implica un CRUD. Al momento de\npracticar (en las siguientes lecciones), ¡lo pondremos en práctica con una base\nde datos real!

" }, "pt": { "title": "CRUD", - "body": "

Objetivos de Aprendizagem

\n
    \n
  • Entender o que é CRUD e como podemos gerar uma aplicação consumindo uma API\nRESTful.
  • \n
\n

CRUD: Create, Read, Update and Delete

\n

Você já notou que quase toda a interação que você faz na web tem a ver com uma\nbase de dados? Quando você entra no perfil de uma pessoa que você segue, todas\nas suas fotos, publicações, comentários e demais itens estão armazenados em\nalgum lugar (database). Quando sobe uma uma foto no Instagram ou envia um\ne-mail, você está criando um novo registro no DB. Quando você muda sua foto de\nperfil no WhatsApp, você está editando algo existente no banco de dados. Por\núltimo, quando você apaga a mensagem de uma conversa ou grupo, você está\nalterando seu DB.

\n
\n

O uso de diferentes palavras para se referir à base de dados no parágrafo\nanterior foi intencional para você saber que fazem referência à mesma coisa.

\n
\n

A todas essas ações descritas anteriormente que têm interação com a base de\ndados, possuem um acrônimo na programação: CRUD.

\n

CRUD é o acrônimo de criar, ler, atualizar e apagar, palavras que correspondem\nrespectivamente aos verbos do HTTP mais utilizados: POST, GET, PUT e DELETE.

\n

Estas são as operações mais comuns que queremos ter no caso de uma API que\nmanipula dados.

\n

Exemplo

\n

Aqui um exemplo de CRUD para uma lista de tarefas:

\n

Embora o exercício anterior perca as alterações ao recarregar a página, ele\nmostra o princípio das ações que um CRUD realiza. No momento da prática (nas\nseguintes lições), vamos colocá-lo em prática com uma base de dados reais!

" + "body": "

Objetivos de Aprendizagem

\n
    \n
  • Entender o que é CRUD e como podemos gerar uma aplicação consumindo uma API\nRESTful.
  • \n
\n

CRUD: Create, Read, Update and Delete

\n

Você já notou que quase toda a interação que você faz na web tem a ver com uma\nbase de dados? Quando você entra no perfil de uma pessoa que você segue, todas\nas suas fotos, publicações, comentários e demais itens estão armazenados em\nalgum lugar (database). Quando sobe uma uma foto no Instagram ou envia um\ne-mail, você está criando um novo registro no DB. Quando você muda sua foto de\nperfil no WhatsApp, você está editando algo existente no banco de dados. Por\núltimo, quando você apaga a mensagem de uma conversa ou grupo, você está\nalterando seu DB.

\n
\n

O uso de diferentes palavras para se referir à base de dados no parágrafo\nanterior foi intencional para você saber que fazem referência à mesma coisa.

\n
\n

A todas essas ações descritas anteriormente que têm interação com a base de\ndados, possuem um acrônimo na programação: CRUD.

\n

CRUD é o acrônimo de criar, ler, atualizar e apagar, palavras que correspondem\nrespectivamente aos verbos do HTTP mais utilizados: POST, GET, PUT e DELETE.

\n

Estas são as operações mais comuns que queremos ter no caso de uma API que\nmanipula dados.

\n

Exemplo

\n

Aqui um exemplo de CRUD para uma lista de tarefas:

\n See the Pen [Plain JS CRUD\n Frontend](https://codepen.io/ianseabrook/pen/rxvByR/) by Ian Seabrook\n ([@ianseabrook](https://codepen.io/ianseabrook)) on\n [CodePen](https://codepen.io).\n\n

Embora o exercício anterior perca as alterações ao recarregar a página, ele\nmostra o princípio das ações que um CRUD realiza. No momento da prática (nas\nseguintes lições), vamos colocá-lo em prática com uma base de dados reais!

" } } }, @@ -683,7 +683,7 @@ "intl": { "es": { "title": "Jugando con APIs", - "body": "

Objetivos

\n
    \n
  • Practicar todo lo aprendido respecto a APIs
  • \n
  • Practicar, practicar y practicar
  • \n
\n

Ejercicios

\n

Debes subir todos tus ejercicios a GitHub y publicarlos en gh-pages.

\n

Swapi

\n

Que la fuerza te acompañe en este ejercicio, revisa las siguientes slides para\nque puedas crear esta fenómenal app para los amantes de Star Wars.

\n

La mayor red profesional del mundo

\n

Si tú pensabas que LinkedIn solo servía para mantener actualizado tu CV,\nrevisa las siguientes slides para que te sorprendas con todas las posibilidades\nque nos ofrece para crear diferentes productos.

\n

Weather

\n

¿Has visto que los sistemas operativos móviles vienen con una APP de predicción\ndel clima? ¡Vamos a hacer la nuestra! Para ello, usaremos la API de\nDark Sky y esperemos llegues a usar un API de\nimágenes como Flickr,\nUnsplash u otro. A continuación te dejamos\nunos slides con algunos recursos y guías del flujo de la app. Recuerda que no es\nnecesario que sigas el diseño al pie de la letra, eres completamente libre de\nadaptarlo a tus gustos.

" + "body": "

Objetivos

\n
    \n
  • Practicar todo lo aprendido respecto a APIs
  • \n
  • Practicar, practicar y practicar
  • \n
\n

Ejercicios

\n

Debes subir todos tus ejercicios a GitHub y publicarlos en gh-pages.

\n

Swapi

\n

Que la fuerza te acompañe en este ejercicio, revisa las siguientes slides para\nque puedas crear esta fenómenal app para los amantes de Star Wars.

\n\n

La mayor red profesional del mundo

\n

Si tú pensabas que LinkedIn solo servía para mantener actualizado tu CV,\nrevisa las siguientes slides para que te sorprendas con todas las posibilidades\nque nos ofrece para crear diferentes productos.

\n\n

Weather

\n

¿Has visto que los sistemas operativos móviles vienen con una APP de predicción\ndel clima? ¡Vamos a hacer la nuestra! Para ello, usaremos la API de\nDark Sky y esperemos llegues a usar un API de\nimágenes como Flickr,\nUnsplash u otro. A continuación te dejamos\nunos slides con algunos recursos y guías del flujo de la app. Recuerda que no es\nnecesario que sigas el diseño al pie de la letra, eres completamente libre de\nadaptarlo a tus gustos.

\n" }, "pt": { "title": "Brincando con APIs", diff --git a/dist/topics/content-management.json b/dist/topics/content-management.json index 6124c3d45..d61dd9e93 100644 --- a/dist/topics/content-management.json +++ b/dist/topics/content-management.json @@ -2,9 +2,9 @@ "slug": "content-management", "repo": "Laboratoria/bootcamp", "path": "topics/content-management", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:31.731Z", + "createdAt": "2023-05-17T20:37:14.434Z", "track": "ux", "intl": { "es": { @@ -32,7 +32,7 @@ "intl": { "es": { "title": "Arquitectura de la Información (AI)", - "body": "

Según The Information Architecture Institute, la\narquitectura de información es la práctica de decidir cómo organizar las partes\nde algo para que sea comprensible.

\n

Si tomamos esta definición como base, podemos decir que todo es organizable con\nla arquitectura de la información. Por ejemplo, pensemos en una tienda de ropa.\nEn la tienda tienen muchas pilas de ropa y, si vas a comprar algo,tendrías que\nsumergirte y buscar mucho hasta encontrar lo que deseas. Más aún, si en la pila\nde ropa hay muchos tipos de prendas como pantalones, blusas, shorts, vestidos,\netc.

\n

\"Pila

\n

Pensando en esa tienda, realiza el siguiente ejercicio: ¿cómo ordenarías la\nropa de mujer de esa tienda para que sea fácil de encontrar?

\n

Puedes ver el siguiente:

\n

video

\n

Para entender el concepto de Arquitectura de la Información y leer el\nsiguiente artículo\npara profundizar en el concepto. (borrador del artículo, revisar para corregir\ncomentarios y publicar).

\n

Contexto, contenido, usuarios

\n

Para la Arquitectura de la Información es muy importante tener en cuenta estos 3\nconceptos:

\n

Contexto

\n

El contexto es súper importante. Por ejemplo, será distinta la información que\nbusque o necesite un usuario que está comprando un auto nuevo versus uno que ya\ntiene un auto y está buscando los servicios de la concesionaria. También, el\ncontexto incluye lo objetivos comerciales de la empresa. Por ejemplo, el\nobjetivo puede ser vender más o fidelizar más o mejorar la imagen de una marca.\nOtras variables que tiene en cuenta el contexto son: política, cultura,\ntecnología, restricciones.

\n

Contenido

\n

El contenido es finalmente lo que le vamos a mostrar al usuario y es igual de\nimportante. En este caso tenemos que tener en cuenta también las estructuras que\nya existen. Por ejemplo, si ya tenemos una base de datos estructurada, qué y\ncómo podemos mostrar los datos que provengan de ahí. El volumen también es\nrelevante. Si tenemos un gran volumen de contenido por mostrar, ¿cómo\npriorizamos? ¿Le mostramos todo al usuario?. También tiene que ver el tipo de\ncontenido que vamos a mostrar. Por ejemplo, es distinto mostrar un texto, que\nuna imagen o una infografía o un video.

\n

Usuarios

\n

Los usuarios también son una parte fundamental. Por algo estamos trabajando en\nexperiencia de usuario. Al trabajar la arquitectura de información tenemos que\ntener en cuenta a nuestros usuarios y cuáles son las tareas que espera realizar\ncon nuestro producto, cuáles son sus necesidades, cómo es su comportamiento al\nbuscar información, y qué tan experimentado es con productos digitales.

\n

\"Contexto,

\n

Componentes de la Arquitectura de la información

\n

Según Lou Rosenfeld y Peter Morville\nlos componentes claves de la AI son:

\n
    \n
  • Esquemas de organización y estructuras: cómo categorizamos y estructuramos la información.
  • \n
  • Sistemas de etiquetado: cómo etiquetamos el contenido que presentamos.
  • \n
  • Sistemas de navegación: cómo los usuarios .navegan o se mueven a través de la información
  • \n
  • Sistemas de búsqueda: cómo los usuarios buscan información.
  • \n
\n

Referencias

\n" + "body": "

Según The Information Architecture Institute, la\narquitectura de información es la práctica de decidir cómo organizar las partes\nde algo para que sea comprensible.

\n

Si tomamos esta definición como base, podemos decir que todo es organizable con\nla arquitectura de la información. Por ejemplo, pensemos en una tienda de ropa.\nEn la tienda tienen muchas pilas de ropa y, si vas a comprar algo,tendrías que\nsumergirte y buscar mucho hasta encontrar lo que deseas. Más aún, si en la pila\nde ropa hay muchos tipos de prendas como pantalones, blusas, shorts, vestidos,\netc.

\n

\"Pila

\n

Pensando en esa tienda, realiza el siguiente ejercicio: ¿cómo ordenarías la\nropa de mujer de esa tienda para que sea fácil de encontrar?

\n

Puedes ver el siguiente:

\n

\n

Para entender el concepto de Arquitectura de la Información y leer el\nsiguiente artículo\npara profundizar en el concepto. (borrador del artículo, revisar para corregir\ncomentarios y publicar).

\n

Contexto, contenido, usuarios

\n

Para la Arquitectura de la Información es muy importante tener en cuenta estos 3\nconceptos:

\n

Contexto

\n

El contexto es súper importante. Por ejemplo, será distinta la información que\nbusque o necesite un usuario que está comprando un auto nuevo versus uno que ya\ntiene un auto y está buscando los servicios de la concesionaria. También, el\ncontexto incluye lo objetivos comerciales de la empresa. Por ejemplo, el\nobjetivo puede ser vender más o fidelizar más o mejorar la imagen de una marca.\nOtras variables que tiene en cuenta el contexto son: política, cultura,\ntecnología, restricciones.

\n

Contenido

\n

El contenido es finalmente lo que le vamos a mostrar al usuario y es igual de\nimportante. En este caso tenemos que tener en cuenta también las estructuras que\nya existen. Por ejemplo, si ya tenemos una base de datos estructurada, qué y\ncómo podemos mostrar los datos que provengan de ahí. El volumen también es\nrelevante. Si tenemos un gran volumen de contenido por mostrar, ¿cómo\npriorizamos? ¿Le mostramos todo al usuario?. También tiene que ver el tipo de\ncontenido que vamos a mostrar. Por ejemplo, es distinto mostrar un texto, que\nuna imagen o una infografía o un video.

\n

Usuarios

\n

Los usuarios también son una parte fundamental. Por algo estamos trabajando en\nexperiencia de usuario. Al trabajar la arquitectura de información tenemos que\ntener en cuenta a nuestros usuarios y cuáles son las tareas que espera realizar\ncon nuestro producto, cuáles son sus necesidades, cómo es su comportamiento al\nbuscar información, y qué tan experimentado es con productos digitales.

\n

\"Contexto,

\n

Componentes de la Arquitectura de la información

\n

Según Lou Rosenfeld y Peter Morville\nlos componentes claves de la AI son:

\n
    \n
  • Esquemas de organización y estructuras: cómo categorizamos y estructuramos la información.
  • \n
  • Sistemas de etiquetado: cómo etiquetamos el contenido que presentamos.
  • \n
  • Sistemas de navegación: cómo los usuarios .navegan o se mueven a través de la información
  • \n
  • Sistemas de búsqueda: cómo los usuarios buscan información.
  • \n
\n

Referencias

\n" } } }, @@ -44,7 +44,7 @@ "intl": { "es": { "title": "Card - sorting", - "body": "

El card sorting es una técnica que nos permite saber, desde el lado del usuario,\ncuál sería la mejor manera de organizar la información que tenemos. Es una\ntécnica común cuando hablamos de organizar el contenido para un producto\ndigital.

\n

Existen 3 tipos de card-sorting:

\n
    \n
  • Abierto: los participantes agrupan las tarjetas en categorías y crean nombres\npara las categorías
  • \n
  • Cerrado: los participantes agrupan las tarjetas, pero dentro de las categorías\npreviamente definidas por nosotros
  • \n
  • Híbrido: los participantes agrupan las tarjetas dentro de las categorías\ndefinidas por nosotros, pero tienen la libertad de crear nuevas categorías si\nlo encuentran necesario.
  • \n
\n

Para realizar una sesión de card sorting primero tenemos que hacer un inventario\ndel contenido que tenemos. Luego de eso, si es que tenemos mucho contenido,\nnecesitamos decidir si le vamos a dar todo el contenido al usuario o si solo\npriorizaremos algunos. Después, podemos escribir estos contenidos en post-its,\nimprimirlos o usar una herramienta como Optimal Workshop\nque nos permite realizar este tipo de técnica de manera remota.

\n

Para entender más de card sorting puedes leer este artículo

\n

Además ver este vídeo:

\n

\"Card

\n

Referencias

\n" + "body": "

El card sorting es una técnica que nos permite saber, desde el lado del usuario,\ncuál sería la mejor manera de organizar la información que tenemos. Es una\ntécnica común cuando hablamos de organizar el contenido para un producto\ndigital.

\n

Existen 3 tipos de card-sorting:

\n
    \n
  • Abierto: los participantes agrupan las tarjetas en categorías y crean nombres\npara las categorías
  • \n
  • Cerrado: los participantes agrupan las tarjetas, pero dentro de las categorías\npreviamente definidas por nosotros
  • \n
  • Híbrido: los participantes agrupan las tarjetas dentro de las categorías\ndefinidas por nosotros, pero tienen la libertad de crear nuevas categorías si\nlo encuentran necesario.
  • \n
\n

Para realizar una sesión de card sorting primero tenemos que hacer un inventario\ndel contenido que tenemos. Luego de eso, si es que tenemos mucho contenido,\nnecesitamos decidir si le vamos a dar todo el contenido al usuario o si solo\npriorizaremos algunos. Después, podemos escribir estos contenidos en post-its,\nimprimirlos o usar una herramienta como Optimal Workshop\nque nos permite realizar este tipo de técnica de manera remota.

\n

Para entender más de card sorting puedes leer este artículo

\n

Además ver este vídeo:

\n

\n

Referencias

\n" } } }, diff --git a/dist/topics/css.json b/dist/topics/css.json index 70585363e..b67dfa14d 100644 --- a/dist/topics/css.json +++ b/dist/topics/css.json @@ -2,9 +2,9 @@ "slug": "css", "repo": "Laboratoria/bootcamp", "path": "topics/css", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:34.696Z", + "createdAt": "2023-05-17T20:37:15.641Z", "track": "web-dev", "intl": { "es": { @@ -55,11 +55,11 @@ "intl": { "es": { "title": "Intro a CSS", - "body": "

Objetivos de Aprendizaje

\n
    \n
  • Entender qué es CSS y cómo funciona
  • \n
  • Conocer las diferentes maneras de agregarle estilos a tu web
  • \n
  • Aprender la sintaxis CSS
  • \n
  • Aprender qué son selectores y cuáles son los selectores más utilizados
  • \n
  • Entender cómo funcionan las reglas de cascada y herencia de CSS
  • \n
  • Aprender los valores usuales de CSS y sus unidades
  • \n
\n

¿Qué es CSS y cómo funciona?

\n

CSS significa Cascading Style Sheets\n(en español: hojas de estilo en cascada). Es un lenguaje usado para definir y\ncrear la presentación de un documento escrito en HTML. CSS describe cómo los\nelementos en la estructura del documento deben ser presentados en la\npantalla. Con CSS damos estilo y diseño a las páginas web. Cambiamos colores,\ntamaños, espacios, agregamos animaciones, etc.

\n

Existen tres opciones para incluir CSS en un documento HTML:

\n

1. CSS Inline

\n

Ya hemos visto cómo agregar estilos a nuestros elementos HTML con el atributo\nstyle. Por ejemplo:

\n
<h1 style=\"color: blue;\nbackground-color: yellow;\nborder: 1px solid black;\">¡Hola Mundo!</h1>\n
\n

En el navegador, el titular anterior se vería así:

\n

\"Inline

\n

Esta forma de agregar CSS se llama CSS Inline, pero no es muy recomendada. Su\nmantenimiento es complicado, ya que podríamos tener que\nactualizar la misma información muchas veces a lo largo del documento. Además,\nestamos mezclando la información de estilo con la información estructural del\nHTML, haciendo el CSS difícil de leer y de entender. Manteniendo los distintos\ntipos de código separados y puros facilitará la tarea a aquellos que vayan a\ntrabajar posteriormente en el código. Recuerda que siempre debes pensar en\norganizar tu código de una manera que facilita a otros entender lo que estás\nhaciendo.

\n

2. CSS en el head

\n

Otra opción es colocar los estilos dentro de un elemento html <style> que\ncolocamos en el head. Por ejemplo, para representar\nlos mismos estilos del h1 anterior tendríamos lo siguiente:

\n
<!DOCTYPE html>\n<html>\n  <head>\n    <title>Entendiendo CSS</title>\n    <style>\n      h1 {\n        color: blue;\n        background-color: yellow;\n        border: 1px solid black;\n      }\n    </style>\n  </head>\n  <body>\n    <h1>¡Hola Mundo!</h1>\n  </body>\n</html>\n
\n

Este método continúa siendo ineficiente. ¿Qué pasa si tenemos estilos similares\nen otras páginas de mi sitio web? Tendría que repetir los estilos en cada\npágina. Y recordemos que no nos gusta repetirnos: DRY! :)

\n

3. CSS stylesheet externo

\n

La manera ideal de agregar estilos a tu producto web es tener un archivo CSS\nseparado de tu archivo HTML. Todos los estilos se incluyen en este\narchivo de tipo CSS externo, que las páginas HTML enlazan mediante la\netiqueta html <link>.

\n

Cabe mencionar que este link externo puede ser un archivo\nque esta en tu computadora o un link de un archivo externo\nde internet. (una dirección HTTP)

\n

En el caso de nuestro ejemplo anterior con los estilos para el h1, tendríamos\ndos archivos:

\n

Archivo index.html

\n
<!DOCTYPE html>\n<html>\n  <head>\n    <title>Entendiendo CSS</title>\n    <!--Link a archivo que esta en la misma computadora-->\n    <link rel=\"stylesheet\" href=\"style.css\">\n    <!--Link a archivo que esta en internet-->\n    <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n  </head>\n  <body>\n    <h1>Hello World!</h1>\n  </body>\n</html>\n\n
\n

Archivo style.css

\n
h1 {\n  color: blue;\n  background-color: yellow;\n  border: 1px solid black;\n}\n\n
\n

La etiqueta <link> cuenta con el atributo rel para indicar la relación del\ndocumento enlazado con el actual. El uso más común para este atributo es\nespecificar el enlace a una hoja de estilos externa: el atributo rel se\nestablece con valor stylesheet. El atributo href se establece con la\nruta a la hoja de estilos externa para dar formato a la página. En el ejemplo\nanterior, dado que el archivo a linkear se encuentra en nuestro propio\nambiente, simplemente le ponemos el nombre del archivo: style.css.

\n

Sintaxis CSS

\n

Como hemos visto en la lección anterior, para especificar el estilo hacemos\nuso de los pares propiedades : valores.

\n
    \n
  • \n

    Propiedades: son identificadores que indican\na las personas qué característica de estilo (ancho, color de fondo, fuente)\nqueremos cambiar.

    \n
  • \n
  • \n

    Valores: a cada propiedad se le da un valor, que indica cómo queremos cambiar\nésta característica (por ejemplo qué fuente, qué ancho o qué color usar).

    \n
  • \n
\n

El par formado por una propiedad y un valor se denomina declaración CSS.\nVarias declaraciones juntas forman un bloque de declaraciones. Para\ndefinir a qué elemento de la página web se debe aplicar el estilo\nque especifica el bloque de declaración utilizamos un selector. El\nselector le indica al navegador a qué elemento (o elementos) de una web debe\naplicar cierto estilo. Por ejemplo, un selector puede ser un título, un\npárrafo, una imagen, etc. Los bloques de declaraciones CSS emparejados con\nselectores forman reglas CSS.

\n

Por ejemplo, una regla css sería:

\n
selector\n|\np { color: red; font-size: 15px; }\n      |     |       |       |\n      prop  valor  prop    valor\n      ___________  ______________\n           |              |\n      declaración     declaración\n      ___________________________\n                  |\n         bloque de declaración\n\n/* ejemplo de una regla css */\n
\n

La convención para representar el ejemplo anterior es la siguiente\n(es más fácil de leer cuando colocamos las declaraciones una debajo de la otra):

\n
p {\n  color: red;\n  font-size: 15px;\n}\n\n
\n

En resumen, el bloque de declaración indica qué hay que hacer y el selector\nindica a quién hay que aplicárselo. Por lo tanto, los selectores son\nimprescindibles para aplicar de forma correcta los estilos CSS en una\npágina. A un mismo elemento HTML se le pueden aplicar varias reglas CSS y\ncada regla CSS puede aplicarse a un número ilimitado de elementos.

\n

Selectores

\n

Existen múltiples selectores. Lee la siguiente documentación para que aprendas\nmás sobre selectores:

\n\n

Al finalizar tu investigación debes saber qué es y cómo usar:

\n
    \n
  • Selector universal
  • \n
  • Selector de elementos (de tipo)
  • \n
  • Selectores de clases
  • \n
  • Selectores ID
  • \n
  • Selector descendiente
  • \n
  • Selector hijo
  • \n
  • Selectores de atributo
  • \n
  • Pseudo selectores
  • \n
\n

Reglas de cascada y herencia

\n

Como hemos visto, diferentes reglas CSS pueden aplicarse a un número ilimitado\nde elementos. Esto puede generar estilos que entran en conflicto:\ndeclaraciones con estilos diferentes afectando el mismo elemento.\nAfortunadamente. CSS cuenta con un mecanismo conocido como la cascada\nque gobierna cómo interactúan los estilos y qué estilos tienen preferencia\ncuando existe un conflicto. De hecho, este mecanismo de cascada es la razón\npor la cual CSS tiene su nombre: Cascading Style Sheets\n(en español: hojas de estilo en cascada).

\n

Otra característica de CSS es la herencia de estilos. La herencia es el\nproceso por el cual algunas declaraciones de CSS aplicadas a un elemento pasan\nde forma automática a los elementos que se encuentran anidados\n(sus descendientes).

\n

Lee los siguientes artículos para entender los conceptos de cascada y herencia\nen CSS:

\n\n

Al terminar tu investigación, debes ser capaz de entender los 3 factores que\ndeterminan el mecanismo de cascada. En particular, responde lo siguiente:

\n
    \n
  • ¿Qué orden prevalece para asignar un estilo? ¿el último? ¿el primero?
  • \n
  • ¿Qué significa que un selector es más específico que otro? Dame un ejemplo
  • \n
  • ¿Se aplica el estilo con mayor o menor especificidad?
  • \n
  • ¿Cómo se calcula la especificidad?
  • \n
  • ¿Qué significa !important? ¿Por qué NO debemos usarlo a menos que\nsea estrictamente necesario?
  • \n
  • ¿Todos los estilos en CSS se heredan? ¿Por qué?
  • \n
  • ¿Qué es y para qué sirve inherit?
  • \n
\n

Valores y unidades

\n

Existen una gran variedad de valores CSS,los cuales se pueden expresar con\ndiferentes unidades. Por ejemplo: la altura, el ancho y el margen de un\nelemento pueden ser definidos en milímetros, centímetros, pulgadas\no pixeles. El color podemos definirlo con palabras clave (como red), con\nvalores, o con el modelo RGB.

\n

Haz tu investigación de los siguientes recursos y aprende las múltiples formas\nde representar los valores en CSS:

\n\n

Al finalizar esta lectura, debes saber responder las siguientes preguntas:

\n
    \n
  • Dame un ejemplo de una undidad absoluta y una relativa
  • \n
  • ¿Para qué sirve line-height?
  • \n
  • ¿Para qué sirven valores en procentajes? Dame un ejemplo
  • \n
  • El tamaño de fuente por defecto que los navegadores usan antes de aplicar\nCSS es de ...
  • \n
  • ¿Qué unidad es #ff0000? ¿Qué color representa?
  • \n
  • ¿RGB es una función?
  • \n
  • ¿Qué color representa rgb(0,0,255)?
  • \n
  • ¿Cómo le damos opacidad al color?
  • \n
  • ¿Cuándo se utilizan valores sin unidades?
  • \n
  • ¿Cuáles son las recomendaciones generales para el uso de unidades?
  • \n
\n

Comentarios en CSS

\n

Así como es buena práctica comentar tu código html y tu código js, es buena\npráctica comentar tu CSS. Los comentarios en CSS se hacen de la siguiente manera:

\n
    \n
  • El comienzo se indica mediante los caracteres /* * El final del comentario\nse indica mediante */
  • \n
\n

Veamos un ejemplo:

\n
/* Comentario en CSS */\n
\n

Continuando la página de Grace Hopper de wikipedia

\n

Ahora que ya conoces más a profundidad sobre CSS puedes seguir a Michelle en\nel siguiente video donde termina de desarrollar la página de Garce Hopper,\nutilizando una estructura semántica y todas las bondades de CSS para\nrepresentar el diseño lo más fiel posible.

\n

\"Grace

" + "body": "

Objetivos de Aprendizaje

\n
    \n
  • Entender qué es CSS y cómo funciona
  • \n
  • Conocer las diferentes maneras de agregarle estilos a tu web
  • \n
  • Aprender la sintaxis CSS
  • \n
  • Aprender qué son selectores y cuáles son los selectores más utilizados
  • \n
  • Entender cómo funcionan las reglas de cascada y herencia de CSS
  • \n
  • Aprender los valores usuales de CSS y sus unidades
  • \n
\n\n

¿Qué es CSS y cómo funciona?

\n\n

CSS significa Cascading Style Sheets\n(en español: hojas de estilo en cascada). Es un lenguaje usado para definir y\ncrear la presentación de un documento escrito en HTML. CSS describe cómo los\nelementos en la estructura del documento deben ser presentados en la\npantalla. Con CSS damos estilo y diseño a las páginas web. Cambiamos colores,\ntamaños, espacios, agregamos animaciones, etc.

\n

Existen tres opciones para incluir CSS en un documento HTML:

\n

1. CSS Inline

\n

Ya hemos visto cómo agregar estilos a nuestros elementos HTML con el atributo\nstyle. Por ejemplo:

\n
<h1 style=\"color: blue;\nbackground-color: yellow;\nborder: 1px solid black;\">¡Hola Mundo!</h1>\n
\n

En el navegador, el titular anterior se vería así:

\n

\"Inline

\n

Esta forma de agregar CSS se llama CSS Inline, pero no es muy recomendada. Su\nmantenimiento es complicado, ya que podríamos tener que\nactualizar la misma información muchas veces a lo largo del documento. Además,\nestamos mezclando la información de estilo con la información estructural del\nHTML, haciendo el CSS difícil de leer y de entender. Manteniendo los distintos\ntipos de código separados y puros facilitará la tarea a aquellos que vayan a\ntrabajar posteriormente en el código. Recuerda que siempre debes pensar en\norganizar tu código de una manera que facilita a otros entender lo que estás\nhaciendo.

\n

2. CSS en el head

\n

Otra opción es colocar los estilos dentro de un elemento html <style> que\ncolocamos en el head. Por ejemplo, para representar\nlos mismos estilos del h1 anterior tendríamos lo siguiente:

\n
<!DOCTYPE html>\n<html>\n  <head>\n    <title>Entendiendo CSS</title>\n    <style>\n      h1 {\n        color: blue;\n        background-color: yellow;\n        border: 1px solid black;\n      }\n    </style>\n  </head>\n  <body>\n    <h1>¡Hola Mundo!</h1>\n  </body>\n</html>\n
\n

Este método continúa siendo ineficiente. ¿Qué pasa si tenemos estilos similares\nen otras páginas de mi sitio web? Tendría que repetir los estilos en cada\npágina. Y recordemos que no nos gusta repetirnos: DRY! :)

\n

3. CSS stylesheet externo

\n

La manera ideal de agregar estilos a tu producto web es tener un archivo CSS\nseparado de tu archivo HTML. Todos los estilos se incluyen en este\narchivo de tipo CSS externo, que las páginas HTML enlazan mediante la\netiqueta html <link>.

\n

Cabe mencionar que este link externo puede ser un archivo\nque esta en tu computadora o un link de un archivo externo\nde internet. (una dirección HTTP)

\n

En el caso de nuestro ejemplo anterior con los estilos para el h1, tendríamos\ndos archivos:

\n

Archivo index.html

\n
<!DOCTYPE html>\n<html>\n  <head>\n    <title>Entendiendo CSS</title>\n    <!--Link a archivo que esta en la misma computadora-->\n    <link rel=\"stylesheet\" href=\"style.css\">\n    <!--Link a archivo que esta en internet-->\n    <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n  </head>\n  <body>\n    <h1>Hello World!</h1>\n  </body>\n</html>\n\n
\n

Archivo style.css

\n
h1 {\n  color: blue;\n  background-color: yellow;\n  border: 1px solid black;\n}\n\n
\n

La etiqueta <link> cuenta con el atributo rel para indicar la relación del\ndocumento enlazado con el actual. El uso más común para este atributo es\nespecificar el enlace a una hoja de estilos externa: el atributo rel se\nestablece con valor stylesheet. El atributo href se establece con la\nruta a la hoja de estilos externa para dar formato a la página. En el ejemplo\nanterior, dado que el archivo a linkear se encuentra en nuestro propio\nambiente, simplemente le ponemos el nombre del archivo: style.css.

\n

Sintaxis CSS

\n

Como hemos visto en la lección anterior, para especificar el estilo hacemos\nuso de los pares propiedades : valores.

\n
    \n
  • \n

    Propiedades: son identificadores que indican\na las personas qué característica de estilo (ancho, color de fondo, fuente)\nqueremos cambiar.

    \n
  • \n
  • \n

    Valores: a cada propiedad se le da un valor, que indica cómo queremos cambiar\nésta característica (por ejemplo qué fuente, qué ancho o qué color usar).

    \n
  • \n
\n

El par formado por una propiedad y un valor se denomina declaración CSS.\nVarias declaraciones juntas forman un bloque de declaraciones. Para\ndefinir a qué elemento de la página web se debe aplicar el estilo\nque especifica el bloque de declaración utilizamos un selector. El\nselector le indica al navegador a qué elemento (o elementos) de una web debe\naplicar cierto estilo. Por ejemplo, un selector puede ser un título, un\npárrafo, una imagen, etc. Los bloques de declaraciones CSS emparejados con\nselectores forman reglas CSS.

\n

Por ejemplo, una regla css sería:

\n
selector\n|\np { color: red; font-size: 15px; }\n      |     |       |       |\n      prop  valor  prop    valor\n      ___________  ______________\n           |              |\n      declaración     declaración\n      ___________________________\n                  |\n         bloque de declaración\n\n/* ejemplo de una regla css */\n
\n

La convención para representar el ejemplo anterior es la siguiente\n(es más fácil de leer cuando colocamos las declaraciones una debajo de la otra):

\n
p {\n  color: red;\n  font-size: 15px;\n}\n\n
\n

En resumen, el bloque de declaración indica qué hay que hacer y el selector\nindica a quién hay que aplicárselo. Por lo tanto, los selectores son\nimprescindibles para aplicar de forma correcta los estilos CSS en una\npágina. A un mismo elemento HTML se le pueden aplicar varias reglas CSS y\ncada regla CSS puede aplicarse a un número ilimitado de elementos.

\n

Selectores

\n

Existen múltiples selectores. Lee la siguiente documentación para que aprendas\nmás sobre selectores:

\n\n

Al finalizar tu investigación debes saber qué es y cómo usar:

\n
    \n
  • Selector universal
  • \n
  • Selector de elementos (de tipo)
  • \n
  • Selectores de clases
  • \n
  • Selectores ID
  • \n
  • Selector descendiente
  • \n
  • Selector hijo
  • \n
  • Selectores de atributo
  • \n
  • Pseudo selectores
  • \n
\n

Reglas de cascada y herencia

\n

Como hemos visto, diferentes reglas CSS pueden aplicarse a un número ilimitado\nde elementos. Esto puede generar estilos que entran en conflicto:\ndeclaraciones con estilos diferentes afectando el mismo elemento.\nAfortunadamente. CSS cuenta con un mecanismo conocido como la cascada\nque gobierna cómo interactúan los estilos y qué estilos tienen preferencia\ncuando existe un conflicto. De hecho, este mecanismo de cascada es la razón\npor la cual CSS tiene su nombre: Cascading Style Sheets\n(en español: hojas de estilo en cascada).

\n

Otra característica de CSS es la herencia de estilos. La herencia es el\nproceso por el cual algunas declaraciones de CSS aplicadas a un elemento pasan\nde forma automática a los elementos que se encuentran anidados\n(sus descendientes).

\n

Lee los siguientes artículos para entender los conceptos de cascada y herencia\nen CSS:

\n\n

Al terminar tu investigación, debes ser capaz de entender los 3 factores que\ndeterminan el mecanismo de cascada. En particular, responde lo siguiente:

\n
    \n
  • ¿Qué orden prevalece para asignar un estilo? ¿el último? ¿el primero?
  • \n
  • ¿Qué significa que un selector es más específico que otro? Dame un ejemplo
  • \n
  • ¿Se aplica el estilo con mayor o menor especificidad?
  • \n
  • ¿Cómo se calcula la especificidad?
  • \n
  • ¿Qué significa !important? ¿Por qué NO debemos usarlo a menos que\nsea estrictamente necesario?
  • \n
  • ¿Todos los estilos en CSS se heredan? ¿Por qué?
  • \n
  • ¿Qué es y para qué sirve inherit?
  • \n
\n

Valores y unidades

\n

Existen una gran variedad de valores CSS,los cuales se pueden expresar con\ndiferentes unidades. Por ejemplo: la altura, el ancho y el margen de un\nelemento pueden ser definidos en milímetros, centímetros, pulgadas\no pixeles. El color podemos definirlo con palabras clave (como red), con\nvalores, o con el modelo RGB.

\n

Haz tu investigación de los siguientes recursos y aprende las múltiples formas\nde representar los valores en CSS:

\n\n

Al finalizar esta lectura, debes saber responder las siguientes preguntas:

\n
    \n
  • Dame un ejemplo de una undidad absoluta y una relativa
  • \n
  • ¿Para qué sirve line-height?
  • \n
  • ¿Para qué sirven valores en procentajes? Dame un ejemplo
  • \n
  • El tamaño de fuente por defecto que los navegadores usan antes de aplicar\nCSS es de ...
  • \n
  • ¿Qué unidad es #ff0000? ¿Qué color representa?
  • \n
  • ¿RGB es una función?
  • \n
  • ¿Qué color representa rgb(0,0,255)?
  • \n
  • ¿Cómo le damos opacidad al color?
  • \n
  • ¿Cuándo se utilizan valores sin unidades?
  • \n
  • ¿Cuáles son las recomendaciones generales para el uso de unidades?
  • \n
\n

Comentarios en CSS

\n

Así como es buena práctica comentar tu código html y tu código js, es buena\npráctica comentar tu CSS. Los comentarios en CSS se hacen de la siguiente manera:

\n
    \n
  • El comienzo se indica mediante los caracteres /* * El final del comentario\nse indica mediante */
  • \n
\n

Veamos un ejemplo:

\n
/* Comentario en CSS */\n
\n

Continuando la página de Grace Hopper de wikipedia

\n

Ahora que ya conoces más a profundidad sobre CSS puedes seguir a Michelle en\nel siguiente video donde termina de desarrollar la página de Garce Hopper,\nutilizando una estructura semántica y todas las bondades de CSS para\nrepresentar el diseño lo más fiel posible.

\n

" }, "pt": { "title": "CSS", - "body": "

Objetivos de Aprendizagem

\n
    \n
  • Entender o que é CSS e como funciona
  • \n
  • Conhecer as diferentes maneiras de adicionar estilos à sua web
  • \n
  • Aprender a sintaxe CSS
  • \n
  • Aprender o que são os seletores e quais são os seletores mais usados
  • \n
  • Entender como funcionam as regras de cascata e herança do CSS
  • \n
  • Aprender os valores usuais de CSS e suas unidades
  • \n
\n

O que é CSS e como funciona?

\n

CSS significa Cascading Style Sheets (em português: folhas de estilo em\ncascata). É uma linguagem usada para definir e criar a apresentação de um\ndocumento escrito em HTML. CSS descreve como os elementos na estrutura do\ndocumento devem ser apresentados na tela. Com CSS, damos estilo e design à\npáginas da web. Nós mudamos cores, tamanhos, espaços, adicionamos animações,\netc.

\n

Existem três opções para incluir CSS em um documento HTML:

\n

1. CSS Inline

\n

Já vimos como adicionar estilos aos nossos elementos HTML com o atributo\nstyle. Por exemplo:

\n
<h1 style=\"color: blue;\nbackground-color: yellow;\nborder: 1px solid black;\">Olá Mundo!</h1>\n
\n

No navegador, o título anterior ficaria assim:

\n

\"Estilo

\n

Esta maneira de adicionar CSS é chamada de CSS Inline, mas não é muito\nrecomendada. Sua manutenção é complicada, já que poderíamos ter que atualizar as\nmesmas informações várias vezes ao longo do documento. Além disso, estamos\nmisturando informações de estilo com informações HTML estruturais, tornando o\nCSS difícil de ler e entender. Manter os diferentes tipos de código separados e\npuros facilitará a tarefa para aqueles que posteriormente trabalharão no código.\nLembre-se de que você deve sempre pensar em organizar seu código de uma maneira\nque torne mais fácil para os outros entenderem o que você está fazendo.

\n

2. CSS no head

\n

Outra opção é colocar os estilos dentro de um elemento html <style> que\ncolocamos no head. Por exemplo, para representar os mesmos estilos do h1\nanterior, teríamos o seguinte:

\n
<!DOCTYPE html>\n<html>\n  <head>\n    <title>Entendendo CSS</title>\n    <style>\n      h1 {\n        color: blue;\n        background-color: yellow;\n        border: 1px solid black;\n      }\n    </style>\n  </head>\n  <body>\n    <h1>Olá Mundo!</h1>\n  </body>\n</html>\n
\n

Este método também é ineficiente. O que acontece se tivermos estilos semelhantes\nem outras páginas do meu site? Eu teria que repetir os estilos em cada página. E\nlembre-se que não gostamos de nos repetir: DRY! :)

\n

3. Folha de estilos externa CSS

\n

A maneira ideal de adicionar estilos ao seu sítio da Web é ter um arquivo CSS\nseparado do arquivo HTML. Todos os estilos estão incluídos neste arquivo CSS\nexterno, que as páginas HTML vinculam usando a tag html <link>.

\n

Vale ressaltar que este link externo pode ser um arquivo que está no seu\ncomputador ou um link de um arquivo externo da Internet (um endereço HTTP).

\n

No caso do nosso exemplo anterior com os estilos para ele h1, teríamos dois\narquivos:

\n

Arquivo index.html

\n
<!DOCTYPE html>\n<html>\n  <head>\n    <title>Entendendo CSS</title>\n    <!--Link para o arquivo que está no mesmo computador-->\n    <link rel=\"stylesheet\" href=\"style.css\">\n    <!--Link para o arquivo que está na internet-->\n    <link rel=\"stylesheet\" href=\"https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css\" integrity=\"sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T\" crossorigin=\"anonymous\">\n  </head>\n  <body>\n    <h1>Olá, Mundo!</h1>\n  </body>\n</html>\n
\n

Arquivo style.css

\n
h1 {\n  color: blue;\n  background-color: yellow;\n  border: 1px solid black;\n}\n
\n

A tag <link> tem o atributo rel para indicar o relacionamento do documento\nvinculado ao atual. O uso mais comum desse atributo é especificar o link para\numa folha de estilos externa: o atributo rel é definido com o valor\nstylesheet. O atributo href é definido com o caminho para a folha de estilo\nexterna para formatar a página. No exemplo acima, uma vez que o arquivo para\nligação está em nosso próprio ambiente, nós simplesmente colocar o nome do\narquivo: style.css.

\n

Sintaxe CSS

\n

Como vimos na lição anterior, para especificar o estilo, usamos os pares\npropriedades : valores.

\n
    \n
  • Propriedades: são identificadores que indicam às pessoas qual recurso de\nestilo (largura, cor de fundo, fonte) queremos alterar.
  • \n
  • Valores: cada propriedade recebe um valor, que indica como queremos alterar\nessa característica (por exemplo, qual fonte, qual largura ou qual cor\nusar).
  • \n
\n

O par formado por uma propriedade e um valor é chamado de instrução CSS.\nVárias instruções juntas formam um bloco de instruções. Para definir para\nqual elemento da página da web o estilo especificado pelo bloco de declaração\ndeve ser aplicado, usamos um seletor. O seletor informa ao navegador para\nqual elemento (ou elementos) de uma Web deve aplicar um determinado estilo.\nPor exemplo, um seletor pode ser um título, um parágrafo, uma imagem etc. Blocos\nde declaração CSS combinados com seletores formam regras CSS.

\n

Por exemplo, uma regra de css seria:

\n
seletor\n|\np { color:red; font-size:15px ; }\n      |    |       |      |\n     prop  valor  prop   valor\n     ___________  ______________\n          |             |\n      declaração    declaração\n     ___________________________\n                 |\n         bloco de instruções\n\n/ * exemplo de uma regra css * /\n
\n

A convenção para representar o exemplo anterior é a seguinte (é mais fácil ler\nquando colocamos as instruções uma abaixo da outra):

\n
p {\n   color: red;\n   font-size: 15px ;\n}\n
\n

Em resumo, o bloco de instruções indica o que precisa ser feito e o seletor\nindica a quem deve ser aplicado. Portanto, os seletores são essenciais para\naplicar corretamente estilos CSS em uma página. Várias regras CSS podem ser\naplicadas ao mesmo elemento HTML e cada regra CSS pode ser aplicada a um número\nilimitado de elementos.

\n

Seletores

\n

Existem vários seletores. Leia a documentação a seguir para aprender mais sobre\nseletores:

\n\n

No final da sua pesquisa, você deve saber o que é e como usar:

\n
    \n
  • Seletor universal
  • \n
  • Seletor de elementos (de tipo)
  • \n
  • Seletores de classe
  • \n
  • Seletores ID
  • \n
  • Seletor descendente
  • \n
  • Seletor filho
  • \n
  • Seletores de atributo
  • \n
\n

Pseudo-seletores

\n

Os pseudo seletores são palavras chaves que alteram o estado de um elemento. Os\npseudo seletores não são encontrados sozinhos. Estão sempre acompanhados de um\nseletor e são precedidos por :. Os pseudo seletores ou pseudo classes\napresentam a seguinte sintaxe:

\n
button:hover {\n  color: red;\n}\n
\n

:hover

\n

O :hover é um pseudo seletor que altera o estilo de um elemento quando passamos\no mouse em cima dele. O uso desse pseudo seletor é bastante comum. Não\nprecisamos ir muito longe para ver ele sendo usado na prática. Aqui mesmo no LMS\nao realizarmos o login nos deparamos com o seguinte:

\n

\"hover\"

\n

Note que ao passar do mouse os elementos adquirem estilos novos. Isso é feito\natravés do :hover.

\n

:active

\n

Esse pseudo seletor é utilizado para alterar o estado de links ativos. Mas o que\nseriam links ativos? Os links se tornam ativos no momento do clique.

\n
button {\n  color: black;\n  background-color: yellow;\n}\n\nbutton:active {\n  color: white;\n  background-color: #ff008f;\n}\n
\n

\"active\"

\n

Perceba que no exemplo, o estilo do botão é apenas alterado quando estamos\nclicando. Quando não está mais ocorrendo o evento de clique o botão assume o\nestilo aplicado sem o pseudo seletor :active.

\n

:focus

\n

O :focus é um pseudo seletor que se aplica particularmente aos elementos que\nrecebem eventos como entrada de texto, ou outros inputs de usuário, como por\nexemplo, os inputs e textareas.

\n
input:focus {\n  background-color: yellow;\n}\n
\n

\"focus\"

\n

Regras de cascata e herança

\n

Como vimos, regras CSS diferentes podem ser aplicadas a um número ilimitado de\nelementos. Isso pode gerar estilos que entram em conflito: instruções com\ndiferentes estilos afetando o mesmo elemento. Felizmente O CSS possui um\nmecanismo conhecido como cascata que rege como os estilos interagem e quais\nestilos têm preferência quando há um conflito. Na verdade, esse mecanismo em\ncascata é a razão pela qual o CSS tem o seu nome: Cascading Style Sheets (em\nportuguês: folhas de estilo em cascata).

\n

Outra característica do CSS é a herança de estilos. Herança é o processo\npelo qual algumas instruções CSS aplicadas a um elemento passam automaticamente\npara os elementos que estão aninhados (seus descendentes).

\n

Leia o artigo a seguir para entender os conceitos de cascata e herança em CSS:

\n\n

Quando você terminar sua pesquisa, você deve ser capaz de entender os 3 fatores\nque determinam o mecanismo de cascata. Em particular, responda o seguinte:

\n
    \n
  • Qual ordem prevalece para atribuir um estilo? a última? a primeira?
  • \n
  • O que significa que um seletor é mais específico que outro? Dê um exemplo;
  • \n
  • O estilo se aplica com mais ou menos especificidade?
  • \n
  • Como a especificidade é calculada?
  • \n
  • O que isso significa !important? Por que não devemos usá-lo a menos que\nseja estritamente necessário?
  • \n
  • Todos os estilos em CSS são herdados? Por quê?
  • \n
  • O que é e para que serve inherit?
  • \n
\n

Valores e unidades

\n

Existe uma grande variedade de valores de CSS, que podem ser expressos com\ndiferentes unidades. Por exemplo: a altura, largura e margem de um elemento\npodem ser definidas em milímetros, centímetros, polegadas ou pixels. A cor pode\nser definida com palavras-chave (como red), com valores ou com o padrão RGB.

\n

Faça sua pesquisa dos recursos a seguir e aprenda as várias maneiras de\nrepresentar valores em CSS:

\n\n

No final desta leitura, você deve saber como responder às seguintes perguntas:

\n
    \n
  • Dê um exemplo de uma unidade absoluta e uma relativa
  • \n
  • Para que serve line-height?
  • \n
  • Para que servem valores em porcentagens? Dê um exemplo
  • \n
  • O tamanho de fonte padrão que os navegadores usam antes de aplicar CSS é...
  • \n
  • Que unidade é #ff0000? Que cor representa?
  • \n
  • RGB é uma função?
  • \n
  • Que cor representa rgb(0,0,255)?
  • \n
  • Como damos opacidade à cor?
  • \n
  • Quando os valores são usados sem unidades?
  • \n
  • Quais são as recomendações gerais para o uso de unidades?
  • \n
\n

Comentários em CSS

\n

Como é uma boa prática comentar seu código html e seu código js, é\nrecomendável comentar seu CSS. Comentários em CSS são feitos da seguinte forma:

\n
    \n
  • O começo é indicado pelos caracteres /*. O fim do comentário é indicado por\n*/
  • \n
\n

Vejamos um exemplo:

\n
/ * Comentário no CSS * /\n
\n

Continuando a página de Grace Hopper da wikipedia

\n

Agora que você sabe mais sobre a profundidade CSS você pode acompanhar a\nPalomita no vídeo a seguir no qual ela termina de desenvolver a página de Grace\nHopper, usando uma estrutura semântica e todos os benefícios do CSS para\nrepresentar o projeto o mais fiel possível.

\n

\"Grace\nHopper\"

" + "body": "

Objetivos de Aprendizagem

\n
    \n
  • Entender o que é CSS e como funciona
  • \n
  • Conhecer as diferentes maneiras de adicionar estilos à sua web
  • \n
  • Aprender a sintaxe CSS
  • \n
  • Aprender o que são os seletores e quais são os seletores mais usados
  • \n
  • Entender como funcionam as regras de cascata e herança do CSS
  • \n
  • Aprender os valores usuais de CSS e suas unidades
  • \n
\n

O que é CSS e como funciona?

\n

CSS significa Cascading Style Sheets (em português: folhas de estilo em\ncascata). É uma linguagem usada para definir e criar a apresentação de um\ndocumento escrito em HTML. CSS descreve como os elementos na estrutura do\ndocumento devem ser apresentados na tela. Com CSS, damos estilo e design à\npáginas da web. Nós mudamos cores, tamanhos, espaços, adicionamos animações,\netc.

\n

Existem três opções para incluir CSS em um documento HTML:

\n

1. CSS Inline

\n

Já vimos como adicionar estilos aos nossos elementos HTML com o atributo\nstyle. Por exemplo:

\n
<h1 style=\"color: blue;\nbackground-color: yellow;\nborder: 1px solid black;\">Olá Mundo!</h1>\n
\n

No navegador, o título anterior ficaria assim:

\n

\"Estilo

\n

Esta maneira de adicionar CSS é chamada de CSS Inline, mas não é muito\nrecomendada. Sua manutenção é complicada, já que poderíamos ter que atualizar as\nmesmas informações várias vezes ao longo do documento. Além disso, estamos\nmisturando informações de estilo com informações HTML estruturais, tornando o\nCSS difícil de ler e entender. Manter os diferentes tipos de código separados e\npuros facilitará a tarefa para aqueles que posteriormente trabalharão no código.\nLembre-se de que você deve sempre pensar em organizar seu código de uma maneira\nque torne mais fácil para os outros entenderem o que você está fazendo.

\n

2. CSS no head

\n

Outra opção é colocar os estilos dentro de um elemento html <style> que\ncolocamos no head. Por exemplo, para representar os mesmos estilos do h1\nanterior, teríamos o seguinte:

\n
<!DOCTYPE html>\n<html>\n  <head>\n    <title>Entendendo CSS</title>\n    <style>\n      h1 {\n        color: blue;\n        background-color: yellow;\n        border: 1px solid black;\n      }\n    </style>\n  </head>\n  <body>\n    <h1>Olá Mundo!</h1>\n  </body>\n</html>\n
\n

Este método também é ineficiente. O que acontece se tivermos estilos semelhantes\nem outras páginas do meu site? Eu teria que repetir os estilos em cada página. E\nlembre-se que não gostamos de nos repetir: DRY! :)

\n

3. Folha de estilos externa CSS

\n

A maneira ideal de adicionar estilos ao seu sítio da Web é ter um arquivo CSS\nseparado do arquivo HTML. Todos os estilos estão incluídos neste arquivo CSS\nexterno, que as páginas HTML vinculam usando a tag html <link>.

\n

Vale ressaltar que este link externo pode ser um arquivo que está no seu\ncomputador ou um link de um arquivo externo da Internet (um endereço HTTP).

\n

No caso do nosso exemplo anterior com os estilos para ele h1, teríamos dois\narquivos:

\n

Arquivo index.html

\n
<!DOCTYPE html>\n<html>\n  <head>\n    <title>Entendendo CSS</title>\n    <!--Link para o arquivo que está no mesmo computador-->\n    <link rel=\"stylesheet\" href=\"style.css\">\n    <!--Link para o arquivo que está na internet-->\n    <link rel=\"stylesheet\" href=\"https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css\" integrity=\"sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T\" crossorigin=\"anonymous\">\n  </head>\n  <body>\n    <h1>Olá, Mundo!</h1>\n  </body>\n</html>\n
\n

Arquivo style.css

\n
h1 {\n  color: blue;\n  background-color: yellow;\n  border: 1px solid black;\n}\n
\n

A tag <link> tem o atributo rel para indicar o relacionamento do documento\nvinculado ao atual. O uso mais comum desse atributo é especificar o link para\numa folha de estilos externa: o atributo rel é definido com o valor\nstylesheet. O atributo href é definido com o caminho para a folha de estilo\nexterna para formatar a página. No exemplo acima, uma vez que o arquivo para\nligação está em nosso próprio ambiente, nós simplesmente colocar o nome do\narquivo: style.css.

\n

Sintaxe CSS

\n

Como vimos na lição anterior, para especificar o estilo, usamos os pares\npropriedades : valores.

\n
    \n
  • Propriedades: são identificadores que indicam às pessoas qual recurso de\nestilo (largura, cor de fundo, fonte) queremos alterar.
  • \n
  • Valores: cada propriedade recebe um valor, que indica como queremos alterar\nessa característica (por exemplo, qual fonte, qual largura ou qual cor\nusar).
  • \n
\n

O par formado por uma propriedade e um valor é chamado de instrução CSS.\nVárias instruções juntas formam um bloco de instruções. Para definir para\nqual elemento da página da web o estilo especificado pelo bloco de declaração\ndeve ser aplicado, usamos um seletor. O seletor informa ao navegador para\nqual elemento (ou elementos) de uma Web deve aplicar um determinado estilo.\nPor exemplo, um seletor pode ser um título, um parágrafo, uma imagem etc. Blocos\nde declaração CSS combinados com seletores formam regras CSS.

\n

Por exemplo, uma regra de css seria:

\n
seletor\n|\np { color:red; font-size:15px ; }\n      |    |       |      |\n     prop  valor  prop   valor\n     ___________  ______________\n          |             |\n      declaração    declaração\n     ___________________________\n                 |\n         bloco de instruções\n\n/ * exemplo de uma regra css * /\n
\n

A convenção para representar o exemplo anterior é a seguinte (é mais fácil ler\nquando colocamos as instruções uma abaixo da outra):

\n
p {\n   color: red;\n   font-size: 15px ;\n}\n
\n

Em resumo, o bloco de instruções indica o que precisa ser feito e o seletor\nindica a quem deve ser aplicado. Portanto, os seletores são essenciais para\naplicar corretamente estilos CSS em uma página. Várias regras CSS podem ser\naplicadas ao mesmo elemento HTML e cada regra CSS pode ser aplicada a um número\nilimitado de elementos.

\n

Seletores

\n

Existem vários seletores. Leia a documentação a seguir para aprender mais sobre\nseletores:

\n\n

No final da sua pesquisa, você deve saber o que é e como usar:

\n
    \n
  • Seletor universal
  • \n
  • Seletor de elementos (de tipo)
  • \n
  • Seletores de classe
  • \n
  • Seletores ID
  • \n
  • Seletor descendente
  • \n
  • Seletor filho
  • \n
  • Seletores de atributo
  • \n
\n

Pseudo-seletores

\n

Os pseudo seletores são palavras chaves que alteram o estado de um elemento. Os\npseudo seletores não são encontrados sozinhos. Estão sempre acompanhados de um\nseletor e são precedidos por :. Os pseudo seletores ou pseudo classes\napresentam a seguinte sintaxe:

\n
button:hover {\n  color: red;\n}\n
\n

:hover

\n

O :hover é um pseudo seletor que altera o estilo de um elemento quando passamos\no mouse em cima dele. O uso desse pseudo seletor é bastante comum. Não\nprecisamos ir muito longe para ver ele sendo usado na prática. Aqui mesmo no LMS\nao realizarmos o login nos deparamos com o seguinte:

\n

\"hover\"

\n

Note que ao passar do mouse os elementos adquirem estilos novos. Isso é feito\natravés do :hover.

\n

:active

\n

Esse pseudo seletor é utilizado para alterar o estado de links ativos. Mas o que\nseriam links ativos? Os links se tornam ativos no momento do clique.

\n
button {\n  color: black;\n  background-color: yellow;\n}\n\nbutton:active {\n  color: white;\n  background-color: #ff008f;\n}\n
\n

\"active\"

\n

Perceba que no exemplo, o estilo do botão é apenas alterado quando estamos\nclicando. Quando não está mais ocorrendo o evento de clique o botão assume o\nestilo aplicado sem o pseudo seletor :active.

\n

:focus

\n

O :focus é um pseudo seletor que se aplica particularmente aos elementos que\nrecebem eventos como entrada de texto, ou outros inputs de usuário, como por\nexemplo, os inputs e textareas.

\n
input:focus {\n  background-color: yellow;\n}\n
\n

\"focus\"

\n

Regras de cascata e herança

\n

Como vimos, regras CSS diferentes podem ser aplicadas a um número ilimitado de\nelementos. Isso pode gerar estilos que entram em conflito: instruções com\ndiferentes estilos afetando o mesmo elemento. Felizmente O CSS possui um\nmecanismo conhecido como cascata que rege como os estilos interagem e quais\nestilos têm preferência quando há um conflito. Na verdade, esse mecanismo em\ncascata é a razão pela qual o CSS tem o seu nome: Cascading Style Sheets (em\nportuguês: folhas de estilo em cascata).

\n

Outra característica do CSS é a herança de estilos. Herança é o processo\npelo qual algumas instruções CSS aplicadas a um elemento passam automaticamente\npara os elementos que estão aninhados (seus descendentes).

\n

Leia o artigo a seguir para entender os conceitos de cascata e herança em CSS:

\n\n

Quando você terminar sua pesquisa, você deve ser capaz de entender os 3 fatores\nque determinam o mecanismo de cascata. Em particular, responda o seguinte:

\n
    \n
  • Qual ordem prevalece para atribuir um estilo? a última? a primeira?
  • \n
  • O que significa que um seletor é mais específico que outro? Dê um exemplo;
  • \n
  • O estilo se aplica com mais ou menos especificidade?
  • \n
  • Como a especificidade é calculada?
  • \n
  • O que isso significa !important? Por que não devemos usá-lo a menos que\nseja estritamente necessário?
  • \n
  • Todos os estilos em CSS são herdados? Por quê?
  • \n
  • O que é e para que serve inherit?
  • \n
\n

Valores e unidades

\n

Existe uma grande variedade de valores de CSS, que podem ser expressos com\ndiferentes unidades. Por exemplo: a altura, largura e margem de um elemento\npodem ser definidas em milímetros, centímetros, polegadas ou pixels. A cor pode\nser definida com palavras-chave (como red), com valores ou com o padrão RGB.

\n

Faça sua pesquisa dos recursos a seguir e aprenda as várias maneiras de\nrepresentar valores em CSS:

\n\n

No final desta leitura, você deve saber como responder às seguintes perguntas:

\n
    \n
  • Dê um exemplo de uma unidade absoluta e uma relativa
  • \n
  • Para que serve line-height?
  • \n
  • Para que servem valores em porcentagens? Dê um exemplo
  • \n
  • O tamanho de fonte padrão que os navegadores usam antes de aplicar CSS é...
  • \n
  • Que unidade é #ff0000? Que cor representa?
  • \n
  • RGB é uma função?
  • \n
  • Que cor representa rgb(0,0,255)?
  • \n
  • Como damos opacidade à cor?
  • \n
  • Quando os valores são usados sem unidades?
  • \n
  • Quais são as recomendações gerais para o uso de unidades?
  • \n
\n

Comentários em CSS

\n

Como é uma boa prática comentar seu código html e seu código js, é\nrecomendável comentar seu CSS. Comentários em CSS são feitos da seguinte forma:

\n
    \n
  • O começo é indicado pelos caracteres /*. O fim do comentário é indicado por\n*/
  • \n
\n

Vejamos um exemplo:

\n
/ * Comentário no CSS * /\n
\n

Continuando a página de Grace Hopper da wikipedia

\n

Agora que você sabe mais sobre a profundidade CSS você pode acompanhar a\nPalomita no vídeo a seguir no qual ela termina de desenvolver a página de Grace\nHopper, usando uma estrutura semântica e todos os benefícios do CSS para\nrepresentar o projeto o mais fiel possível.

\n

" } } }, @@ -91,7 +91,7 @@ }, "pt": { "title": "Exercícios Livres", - "body": "

Objetivos

\n
    \n
  • Praticar, pratica e praticar
  • \n
\n

Enunciados

\n

Aqui estão alguns exercícios práticos que serão resolvidos, passo a passo, pela\nsua equipe de professores em uma sessão presencial (oficina). Sugerimos que\nvocê tente resolver os exercícios sozinho (ou em equipe) antes da sessão\npresencial. Assim, você já virá com dúvidas específicas e estará familiarizada\ncom os desafios. Talvez você possa apresentar sua solução para a turma e assim\najudar o restante de suas colegas :)

\n

Você deve fazer o upload de todos os seus exercícios no GitHub e publicá-los\nem gh-pages.

\n

1. CSS Diner

\n

Pratique seletores CSS por meio deste jogo.

\n

2. Sinalizadores de Exibição

\n

Replique as seguintes visualizações, utilizando seu conhecimento de display.\nVocê deve utilizar apenas display, sem usar positioning nem floats.

\n

\"Box1\"

\n

\"Box2\"

\n

\"Box3\"

\n

\"Box4\"

\n

Solução

\n

Assista ao vídeo do Rafa para e veja uma possível solução para esse exercício:

\n

\"Solução

" + "body": "

Objetivos

\n
    \n
  • Praticar, pratica e praticar
  • \n
\n

Enunciados

\n

Aqui estão alguns exercícios práticos que serão resolvidos, passo a passo, pela\nsua equipe de professores em uma sessão presencial (oficina). Sugerimos que\nvocê tente resolver os exercícios sozinho (ou em equipe) antes da sessão\npresencial. Assim, você já virá com dúvidas específicas e estará familiarizada\ncom os desafios. Talvez você possa apresentar sua solução para a turma e assim\najudar o restante de suas colegas :)

\n

Você deve fazer o upload de todos os seus exercícios no GitHub e publicá-los\nem gh-pages.

\n

1. CSS Diner

\n

Pratique seletores CSS por meio deste jogo.

\n

2. Sinalizadores de Exibição

\n

Replique as seguintes visualizações, utilizando seu conhecimento de display.\nVocê deve utilizar apenas display, sem usar positioning nem floats.

\n

\"Box1\"

\n

\"Box2\"

\n

\"Box3\"

\n

\"Box4\"

\n

Solução

\n

Assista ao vídeo do Rafa para e veja uma possível solução para esse exercício:

\n

" } }, "challenges": [] @@ -120,11 +120,11 @@ "intl": { "es": { "title": "Positioning & Floats", - "body": "

Objetivos de Aprendizaje

\n
    \n
  • Aprender a maquetar en html/css utilizando positioning
  • \n
  • Aprender a maquetar en html/css utilizando floats
  • \n
  • Reconocer cuándo es mejor usar cada uno
  • \n
\n
\n

1. Flujo del Documento

\n
\n

A continuación, la traducción a Español del artículo MDN - Positioning:

\n
\n

Positioning es un tema bastante complejo, por lo que antes de sumergirnos en el\ncódigo vamos a repasar un par de cosas sobre el flujo del documento que hemos\nvisto hasta ahora.

\n

En primer lugar, hemos visto que los elementos individuales son como \"cajas\" que\nse presentan tomando su contenido y añadiéndoles relleno, borde y margen a su\nalrededor - el modelo de la caja que vimos en la lección anterior.

\n

También hemos visto que, por defecto, el contenido de un elemento de tipo\nbloque es 100% del ancho del elemento padre y tan alto como su contenido.\nPor el contrario, elementos de tipo inline son tan altos y tan amplios como\nsu contenido. No se puede establecer el ancho o la altura para elementos inline

\n
    \n
  • Los elementos inline simplemente se sitúan dentro del contenido de los\nelementos de nivel de bloque. Si deseas controlar el tamaño de un elemento\ninline debes configurarlo para comportarse como un elemento de tipo bloque con\ndisplay: block;.
  • \n
\n

Eso explica los elementos individuales, pero ¿cómo interactúan los elementos\nentre sí? Hasta ahora hemos visto que el flujo normal (por defecto o de\nmanera predeterminada) es que los elementos de tipo bloque están dispuestos\nverticalmente, uno de debajo del otro: es decir, cada uno aparecerá en una nueva\nlínea debajo de la última y se separarán por cualquier margen que se establezca\nen ellos.

\n

Los elementos en línea se comportan de manera diferente: no aparecen en líneas\nnuevas; en su lugar, se sientan en la misma línea que el otro y cualquier\ncontenido de texto adyacente (o envuelto), siempre y cuando haya espacio para\nque lo hagan dentro del ancho del elemento de nivel de bloque padre. Si no hay\nespacio, entonces el texto o los elementos que se desbordan se moverán hacia\nabajo hasta una nueva línea.

\n

Si dos elementos adyacentes tienen margen aplicado y los dos márgenes se tocan,\nel más grande de los dos permanece, y el más pequeño desaparece - esto se llama\ncolapso de margen.

\n

Veamos un ejemplo:

\n
<h1>Basic document flow</h1>\n\n<p>I am a basic block level element. My adjacent block level elements sit on\nnew lines below me.</p>\n\n<p>By default we span 100% of the width of our parent element, and we are as\ntall as our child content. Our total width and height is our content + padding\n+ border width/height.</p>\n\n<p>We are separated by our margins. Because of margin collapsing, we are\nseparated by the width of one of our margins, not both.</p>\n\n<p>inline elements <span>like this one</span> and <span>this one</span> sit on\nthe same line as one another, and adjacent text nodes, if there is space on\nthe same line. Overflowing inline elements will <span>wrap onto a new line if\npossible (like this one containing text)</span>, or just go on to a new line\nif not, much like this image will do: <img\nsrc=\"https://mdn.mozillademos.org/files/13360/long.jpg\"></p>\n\n
\n
body {\n  width: 500px;\n  margin: 0 auto;\n}\n\np {\n  background: aqua;\n  border: 3px solid blue;\n  padding: 10px;\n  margin: 10px;\n}\n\nspan {\n  background: red;\n  border: 1px solid black;\n}\n
\n

\"Basic

\n

2. Positioning

\n

El propósito de positioning es permitirnos sobrescribir el comportamiento\nnormal del flujo del documento descrito anteriormente, para producir efectos\ninteresantes. ¿Qué pasa si quieres alterar ligeramente la posición de algunas\ncajas dentro de un diseño para dar una sensación ligeramente peculiar y\nangustiada? El posicionamiento es tu herramienta. ¿O si deseas crear una\ninterfaz de usuario donde un elemento flota sobre la parte superior de otras\npartes de la página y/o siempre se sienta en el mismo lugar dentro de la ventana\ndel navegador sin importar cuánto se despliegue la página? El posicionamiento\nhace posible este trabajo de estructura (layout).

\n

La propiedad position de CSS es de las más utilizadas cuando queremos definir\nla ubicación de un elemento dentro de nuestro documento. Ésta especifica el\ntipo de posicionamiento que tendrá el elemento al que afectaremos. Cabe\ndestacar que todo esto varía según las características que tenga el valor de\nposition que pongamos. Es decir, usaremos un valor distinto según cómo\nqueramos posicionar dicho elemento.

\n

El significado de cada uno de los posibles valores de la propiedad position\nes el siguiente:

\n

Static

\n

Es el posicionamiento normal o estático, el cual es aplicado por el navegador\nde forma predefinida a todos los elementos de una página. Esto quiere decir,\nque aparecen según su orden en HTML, y para mostrar cada elemento sólo se\ntiene en cuenta su display (o sea, si está en linea, en bloque, etc).\nNada nuevo :)

\n

Relative

\n

Esto es muy similar al posicionamiento estático, excepto que una vez que el\nelemento posicionado ha tomado su lugar en el flujo de disposición normal,\npodemos modificar su posición final (incluso haciendo que se superponga a otros\nelementos en la página) por medio de las propiedades: top, bottom, left y\nright.

\n

Lee más de position relative aquí:

\n\n

Absolute

\n

Un elemento de posición absoluta ya no existe en el flujo normal del documento.\nEl elemento se sienta en su propia capa separada de todo lo demás. Su posición\nse define en relación a los bordes del primer ancestro no-static que tenga.\nSi no tiene ancestros no-static, su posición se define en relación a los\nbordes del body. Al igual que position relative, podemos modificar la\nposición final del elemento por medio de las propiedades: top, bottom,\nleft y right.

\n

Lee más de position absolute aquí:

\n\n

Fixed

\n

Este valor deja fijo al elemento en el documento. Su eje de coordenadas es en\nrelación a la ventana del navegador. Al hacer scroll el elemento siempre se verá\nen el mismo lugar.

\n

Fixed funciona de la misma manera que el posicionamiento absoluto, con una\ndiferencia clave: mientras que el posicionamiento absoluto fija un elemento en\nsu lugar con respecto al elemento < html > o su antecesor posicionado más cercano\n, el posicionamiento fijo fija un elemento en relación con la propia ventana\ndel navegador.

\n

Lee más de position fixed aquí:

\n\n

3. Floats

\n

Float es una propiedad de posicionamiento en CSS, es decir, el cómo se ubican\nlos elementos dentro de un documento HTML. Float hace que los elementos se\najusten alrededor ya sea a la derecha o la izquierda. Está inspirado en las\nrevistas donde los textos se ajustan alrededor de las imágenes.

\n

Los elementos flotantes siguen siendo parte del flujo del documento. Esto es\nclaramente distinto a los elementos que utilizan posicionamiento absoluto. Los\nelementos de página con posición absoluta se quitan del flujo de la página web.\nLos elementos de página con posición absoluta no afectarán la posición de otros\nelementos y otros elementos no los afectarán, se toquen o no.

\n

Lee sobre floats aquí

\n
" + "body": "

Objetivos de Aprendizaje

\n
    \n
  • Aprender a maquetar en html/css utilizando positioning
  • \n
  • Aprender a maquetar en html/css utilizando floats
  • \n
  • Reconocer cuándo es mejor usar cada uno
  • \n
\n
\n

1. Flujo del Documento

\n
\n

A continuación, la traducción a Español del artículo MDN - Positioning:

\n
\n

Positioning es un tema bastante complejo, por lo que antes de sumergirnos en el\ncódigo vamos a repasar un par de cosas sobre el flujo del documento que hemos\nvisto hasta ahora.

\n

En primer lugar, hemos visto que los elementos individuales son como \"cajas\" que\nse presentan tomando su contenido y añadiéndoles relleno, borde y margen a su\nalrededor - el modelo de la caja que vimos en la lección anterior.

\n

También hemos visto que, por defecto, el contenido de un elemento de tipo\nbloque es 100% del ancho del elemento padre y tan alto como su contenido.\nPor el contrario, elementos de tipo inline son tan altos y tan amplios como\nsu contenido. No se puede establecer el ancho o la altura para elementos inline

\n
    \n
  • Los elementos inline simplemente se sitúan dentro del contenido de los\nelementos de nivel de bloque. Si deseas controlar el tamaño de un elemento\ninline debes configurarlo para comportarse como un elemento de tipo bloque con\ndisplay: block;.
  • \n
\n

Eso explica los elementos individuales, pero ¿cómo interactúan los elementos\nentre sí? Hasta ahora hemos visto que el flujo normal (por defecto o de\nmanera predeterminada) es que los elementos de tipo bloque están dispuestos\nverticalmente, uno de debajo del otro: es decir, cada uno aparecerá en una nueva\nlínea debajo de la última y se separarán por cualquier margen que se establezca\nen ellos.

\n

Los elementos en línea se comportan de manera diferente: no aparecen en líneas\nnuevas; en su lugar, se sientan en la misma línea que el otro y cualquier\ncontenido de texto adyacente (o envuelto), siempre y cuando haya espacio para\nque lo hagan dentro del ancho del elemento de nivel de bloque padre. Si no hay\nespacio, entonces el texto o los elementos que se desbordan se moverán hacia\nabajo hasta una nueva línea.

\n

Si dos elementos adyacentes tienen margen aplicado y los dos márgenes se tocan,\nel más grande de los dos permanece, y el más pequeño desaparece - esto se llama\ncolapso de margen.

\n

Veamos un ejemplo:

\n
<h1>Basic document flow</h1>\n\n<p>I am a basic block level element. My adjacent block level elements sit on\nnew lines below me.</p>\n\n<p>By default we span 100% of the width of our parent element, and we are as\ntall as our child content. Our total width and height is our content + padding\n+ border width/height.</p>\n\n<p>We are separated by our margins. Because of margin collapsing, we are\nseparated by the width of one of our margins, not both.</p>\n\n<p>inline elements <span>like this one</span> and <span>this one</span> sit on\nthe same line as one another, and adjacent text nodes, if there is space on\nthe same line. Overflowing inline elements will <span>wrap onto a new line if\npossible (like this one containing text)</span>, or just go on to a new line\nif not, much like this image will do: <img\nsrc=\"https://mdn.mozillademos.org/files/13360/long.jpg\"></p>\n\n
\n
body {\n  width: 500px;\n  margin: 0 auto;\n}\n\np {\n  background: aqua;\n  border: 3px solid blue;\n  padding: 10px;\n  margin: 10px;\n}\n\nspan {\n  background: red;\n  border: 1px solid black;\n}\n
\n

\"Basic

\n

2. Positioning

\n

El propósito de positioning es permitirnos sobrescribir el comportamiento\nnormal del flujo del documento descrito anteriormente, para producir efectos\ninteresantes. ¿Qué pasa si quieres alterar ligeramente la posición de algunas\ncajas dentro de un diseño para dar una sensación ligeramente peculiar y\nangustiada? El posicionamiento es tu herramienta. ¿O si deseas crear una\ninterfaz de usuario donde un elemento flota sobre la parte superior de otras\npartes de la página y/o siempre se sienta en el mismo lugar dentro de la ventana\ndel navegador sin importar cuánto se despliegue la página? El posicionamiento\nhace posible este trabajo de estructura (layout).

\n

La propiedad position de CSS es de las más utilizadas cuando queremos definir\nla ubicación de un elemento dentro de nuestro documento. Ésta especifica el\ntipo de posicionamiento que tendrá el elemento al que afectaremos. Cabe\ndestacar que todo esto varía según las características que tenga el valor de\nposition que pongamos. Es decir, usaremos un valor distinto según cómo\nqueramos posicionar dicho elemento.

\n

El significado de cada uno de los posibles valores de la propiedad position\nes el siguiente:

\n

Static

\n

Es el posicionamiento normal o estático, el cual es aplicado por el navegador\nde forma predefinida a todos los elementos de una página. Esto quiere decir,\nque aparecen según su orden en HTML, y para mostrar cada elemento sólo se\ntiene en cuenta su display (o sea, si está en linea, en bloque, etc).\nNada nuevo :)

\n\n

Relative

\n

Esto es muy similar al posicionamiento estático, excepto que una vez que el\nelemento posicionado ha tomado su lugar en el flujo de disposición normal,\npodemos modificar su posición final (incluso haciendo que se superponga a otros\nelementos en la página) por medio de las propiedades: top, bottom, left y\nright.

\n

Lee más de position relative aquí:

\n\n

Absolute

\n

Un elemento de posición absoluta ya no existe en el flujo normal del documento.\nEl elemento se sienta en su propia capa separada de todo lo demás. Su posición\nse define en relación a los bordes del primer ancestro no-static que tenga.\nSi no tiene ancestros no-static, su posición se define en relación a los\nbordes del body. Al igual que position relative, podemos modificar la\nposición final del elemento por medio de las propiedades: top, bottom,\nleft y right.

\n\n

Lee más de position absolute aquí:

\n\n

Fixed

\n

Este valor deja fijo al elemento en el documento. Su eje de coordenadas es en\nrelación a la ventana del navegador. Al hacer scroll el elemento siempre se verá\nen el mismo lugar.

\n

Fixed funciona de la misma manera que el posicionamiento absoluto, con una\ndiferencia clave: mientras que el posicionamiento absoluto fija un elemento en\nsu lugar con respecto al elemento < html > o su antecesor posicionado más cercano\n, el posicionamiento fijo fija un elemento en relación con la propia ventana\ndel navegador.

\n

Lee más de position fixed aquí:

\n\n\n

3. Floats

\n

Float es una propiedad de posicionamiento en CSS, es decir, el cómo se ubican\nlos elementos dentro de un documento HTML. Float hace que los elementos se\najusten alrededor ya sea a la derecha o la izquierda. Está inspirado en las\nrevistas donde los textos se ajustan alrededor de las imágenes.

\n\n

Los elementos flotantes siguen siendo parte del flujo del documento. Esto es\nclaramente distinto a los elementos que utilizan posicionamiento absoluto. Los\nelementos de página con posición absoluta se quitan del flujo de la página web.\nLos elementos de página con posición absoluta no afectarán la posición de otros\nelementos y otros elementos no los afectarán, se toquen o no.

\n

Lee sobre floats aquí

\n\n
" }, "pt": { "title": "Positioning e Floats", - "body": "

Objetivos de Aprendizagem

\n
    \n
  • Aprender como fazer layout em html/css usando positioning
  • \n
  • Aprender como fazer layout em html/css usando floats
  • \n
  • Reconhecer quando é melhor usar cada um
  • \n
\n
\n

1. Fluxo do Documento

\n
\n

Em seguida, a tradução para o português do artigo MDN -\nPosicionamento:

\n
\n

Positioning é um tema muito complexo, portanto, antes de mergulhar no\ncódigo, analisaremos algumas coisas sobre o fluxo do documento que vimos até\nagora.

\n

Em primeiro lugar, vimos que os elementos individuais são como \"caixas\" que são\napresentadas tomando seu conteúdo e adicionando preenchimento, borda e margem em\ntorno deles - o modelo da caixa que vimos na lição anterior.

\n

Também vimos que, por padrão, o conteúdo de um elemento de tipo de bloco é\n100% da largura do elemento pai e tão alto quanto seu conteúdo. Pelo contrário,\nos elementos do tipo inline são tão altos e tão amplos quanto seu conteúdo.\nNão é possível definir a largura ou a altura dos elementos inline

\n
    \n
  • Os elementos inline são simplesmente colocados dentro do conteúdo dos\nelementos de nível de bloco. Se você quiser controlar o tamanho de um elemento\ninline você deve configurá-lo para se comportar como um elemento de tipo de\nbloco com display: block;.
  • \n
\n

Isso explica os elementos individuais, mas como os elementos interagem uns\ncom os outros? Até agora vimos que o fluxo normal (por padrão ou\nconfigurado) é que o tipo de elementos de bloco são dispostos verticalmente, um\nabaixo do outro, isto é, cada um aparecerá em uma nova linha abaixo da última e\nseparados por qualquer margem estabelecida neles.

\n

Os elementos em linha se comportam de maneira diferente: eles não aparecem em\nnovas linhas; em vez disso, eles ficam na mesma linha que o outro e qualquer\nconteúdo de texto adjacente (ou encapsulado), desde que haja espaço para eles\nfazerem isso na largura do elemento de nível de bloco pai. Se não houver espaço,\no texto ou os elementos que transbordarão serão movidos para uma nova linha.

\n

Se dois elementos adjacentes tiverem margem aplicada e as duas margens estiverem\nem contato, o maior dos dois permanecerá e o menor desaparecerá - isso é chamado\nde colapso da margem.

\n

Vejamos um exemplo:

\n
<h1>Basic document flow</h1>\n\n<p>I am a basic block level element. My adjacent block level elements sit on\nnew lines below me.</p>\n\n<p>By default we span 100% of the width of our parent element, and we are as\ntall as our child content. Our total width and height is our content + padding\n+ border width/height.</p>\n\n<p>We are separated by our margins. Because of margin collapsing, we are\nseparated by the width of one of our margins, not both.</p>\n\n<p>inline elements <span>like this one</span> and <span>this one</span> sit on\nthe same line as one another, and adjacent text nodes, if there is space on\nthe same line. Overflowing inline elements will <span>wrap onto a new line if\npossible (like this one containing text)</span>, or just go on to a new line\nif not, much like this image will do: <img\nsrc=\"https://mdn.mozillademos.org/files/13360/long.jpg\"></p>\n
\n
body {\n  width: 500px;\n  margin: 0 auto;\n}\n\np {\n  background: aqua;\n  border: 3px solid blue;\n  padding: 10px;\n  margin: 10px;\n}\n\nspan {\n  background: red;\n  border: 1px solid black;\n}\n
\n

\"Fluxo

\n

2. Positioning

\n

O propósito do positioning é nos permitir sobrescrever o comportamento normal\ndo fluxo do documento descrito acima, para produzir efeitos interessantes. E se\nvocê quiser alterar ligeiramente a posição de algumas caixas dentro de um\ndesenho para dar uma sensação um pouco peculiar e angustiada? Positioning é\nsua ferramenta. Ou se você quiser criar uma interface de usuário, na qual um\nelemento flutua em cima de outras partes da página e/ou sempre fica no mesmo\nlugar dentro da janela do navegador, não importa como a página é exibida? O\npositioning faz com que essa estrutura funcione (layout).

\n

A propriedade position do CSS é a mais usada quando queremos definir a\nlocalização de um elemento em nosso documento. Ela especifica o tipo de\nposicionamento que o elemento terá. Deve-se notar que tudo isso varia\ndependendo das características que têm o valor position que colocamos. Ou\nseja, usaremos um valor diferente dependendo de como queremos posicionar esse\nelemento.

\n

O significado de cada um dos valores possíveis da propriedade position é o\nseguinte:

\n

Static

\n

É o posicionamento normal ou estático, que é aplicado pelo navegador de uma\nmaneira predefinida a todos os elementos de uma página. Isto significa que eles\naparecem de acordo com a sua ordem em HTML, e para mostrar cada elemento\nconsidera apenas o seu display (ou seja, em linha, bloco, etc.). Nada novo\n:)

\n

Relative

\n

É muito semelhante ao posicionamento estático, exceto que uma vez que o elemento\nposicionado tomou o seu lugar no arranjo de fluxo normal, pode modificar a sua\nposição final (inclusive causando sobreposições com outros elementos da\npágina) por meio das propriedades: top, bottom, left e right.

\n

Leia mais sobre a posição relativa aqui:

\n\n

Absolute

\n

Um elemento de posição absoluta não existe mais no fluxo normal do documento. O\nelemento fica em sua própria camada separada de todo o resto. Sua posição é\ndefinida em relação às arestas do primeiro ancestral no-static que ele\npossui. Se você não tiver ancestrais no-static, sua posição será definida em\nrelação às arestas do body. Como posição relative, podemos modificar a\nposição final do elemento por meio das propriedades: top, bottom, left e\nright.

\n

Leia mais da posição absoluta aqui:

\n\n

Fixed

\n

Esse valor deixa o elemento fixo no documento. Seu eixo de coordenadas está\nrelacionado à janela do navegador. Quando você rola, o elemento estará sempre no\nmesmo lugar.

\n

Fixed funciona da mesma maneira como o posicionamento absolute, com uma\ndiferença fundamental: enquanto o posicionamento absolute fixa um elemento no\nlugar com relação ao <html> ou seu antecessor posicionado mais próximo, o\nelemento fixed fixa em relação à janela do navegador em si.

\n

Leia mais da posição fixed aqui:

\n\n

3. Floats

\n

Float é uma propriedade de posicionamento em CSS, ou seja, como os elementos\nestão localizados em um documento HTML. O float faz os elementos se ajustarem à\ndireita ou à esquerda. É inspirado em revistas nas quais os textos se encaixam\nem torno das imagens.

\n

Elementos flutuantes ainda fazem parte do fluxo de documentos. Isso é claramente\ndiferente dos elementos que usam posicionamento absoluto. Elementos de página\ncom posição absoluta são removidos do fluxo da página da web. Elementos de\npágina com posição absoluta não afetarão a posição de outros elementos e outros\nelementos não os afetarão, sejam eles tocados ou não.

\n

Leia sobre os floats\naqui !

" + "body": "

Objetivos de Aprendizagem

\n
    \n
  • Aprender como fazer layout em html/css usando positioning
  • \n
  • Aprender como fazer layout em html/css usando floats
  • \n
  • Reconhecer quando é melhor usar cada um
  • \n
\n
\n

1. Fluxo do Documento

\n
\n

Em seguida, a tradução para o português do artigo MDN -\nPosicionamento:

\n
\n

Positioning é um tema muito complexo, portanto, antes de mergulhar no\ncódigo, analisaremos algumas coisas sobre o fluxo do documento que vimos até\nagora.

\n

Em primeiro lugar, vimos que os elementos individuais são como \"caixas\" que são\napresentadas tomando seu conteúdo e adicionando preenchimento, borda e margem em\ntorno deles - o modelo da caixa que vimos na lição anterior.

\n

Também vimos que, por padrão, o conteúdo de um elemento de tipo de bloco é\n100% da largura do elemento pai e tão alto quanto seu conteúdo. Pelo contrário,\nos elementos do tipo inline são tão altos e tão amplos quanto seu conteúdo.\nNão é possível definir a largura ou a altura dos elementos inline

\n
    \n
  • Os elementos inline são simplesmente colocados dentro do conteúdo dos\nelementos de nível de bloco. Se você quiser controlar o tamanho de um elemento\ninline você deve configurá-lo para se comportar como um elemento de tipo de\nbloco com display: block;.
  • \n
\n

Isso explica os elementos individuais, mas como os elementos interagem uns\ncom os outros? Até agora vimos que o fluxo normal (por padrão ou\nconfigurado) é que o tipo de elementos de bloco são dispostos verticalmente, um\nabaixo do outro, isto é, cada um aparecerá em uma nova linha abaixo da última e\nseparados por qualquer margem estabelecida neles.

\n

Os elementos em linha se comportam de maneira diferente: eles não aparecem em\nnovas linhas; em vez disso, eles ficam na mesma linha que o outro e qualquer\nconteúdo de texto adjacente (ou encapsulado), desde que haja espaço para eles\nfazerem isso na largura do elemento de nível de bloco pai. Se não houver espaço,\no texto ou os elementos que transbordarão serão movidos para uma nova linha.

\n

Se dois elementos adjacentes tiverem margem aplicada e as duas margens estiverem\nem contato, o maior dos dois permanecerá e o menor desaparecerá - isso é chamado\nde colapso da margem.

\n

Vejamos um exemplo:

\n
<h1>Basic document flow</h1>\n\n<p>I am a basic block level element. My adjacent block level elements sit on\nnew lines below me.</p>\n\n<p>By default we span 100% of the width of our parent element, and we are as\ntall as our child content. Our total width and height is our content + padding\n+ border width/height.</p>\n\n<p>We are separated by our margins. Because of margin collapsing, we are\nseparated by the width of one of our margins, not both.</p>\n\n<p>inline elements <span>like this one</span> and <span>this one</span> sit on\nthe same line as one another, and adjacent text nodes, if there is space on\nthe same line. Overflowing inline elements will <span>wrap onto a new line if\npossible (like this one containing text)</span>, or just go on to a new line\nif not, much like this image will do: <img\nsrc=\"https://mdn.mozillademos.org/files/13360/long.jpg\"></p>\n
\n
body {\n  width: 500px;\n  margin: 0 auto;\n}\n\np {\n  background: aqua;\n  border: 3px solid blue;\n  padding: 10px;\n  margin: 10px;\n}\n\nspan {\n  background: red;\n  border: 1px solid black;\n}\n
\n

\"Fluxo

\n

2. Positioning

\n

O propósito do positioning é nos permitir sobrescrever o comportamento normal\ndo fluxo do documento descrito acima, para produzir efeitos interessantes. E se\nvocê quiser alterar ligeiramente a posição de algumas caixas dentro de um\ndesenho para dar uma sensação um pouco peculiar e angustiada? Positioning é\nsua ferramenta. Ou se você quiser criar uma interface de usuário, na qual um\nelemento flutua em cima de outras partes da página e/ou sempre fica no mesmo\nlugar dentro da janela do navegador, não importa como a página é exibida? O\npositioning faz com que essa estrutura funcione (layout).

\n

A propriedade position do CSS é a mais usada quando queremos definir a\nlocalização de um elemento em nosso documento. Ela especifica o tipo de\nposicionamento que o elemento terá. Deve-se notar que tudo isso varia\ndependendo das características que têm o valor position que colocamos. Ou\nseja, usaremos um valor diferente dependendo de como queremos posicionar esse\nelemento.

\n

O significado de cada um dos valores possíveis da propriedade position é o\nseguinte:

\n

Static

\n

É o posicionamento normal ou estático, que é aplicado pelo navegador de uma\nmaneira predefinida a todos os elementos de uma página. Isto significa que eles\naparecem de acordo com a sua ordem em HTML, e para mostrar cada elemento\nconsidera apenas o seu display (ou seja, em linha, bloco, etc.). Nada novo\n:)

\n

Relative

\n

É muito semelhante ao posicionamento estático, exceto que uma vez que o elemento\nposicionado tomou o seu lugar no arranjo de fluxo normal, pode modificar a sua\nposição final (inclusive causando sobreposições com outros elementos da\npágina) por meio das propriedades: top, bottom, left e right.

\n

Leia mais sobre a posição relativa aqui:

\n\n

Absolute

\n

Um elemento de posição absoluta não existe mais no fluxo normal do documento. O\nelemento fica em sua própria camada separada de todo o resto. Sua posição é\ndefinida em relação às arestas do primeiro ancestral no-static que ele\npossui. Se você não tiver ancestrais no-static, sua posição será definida em\nrelação às arestas do body. Como posição relative, podemos modificar a\nposição final do elemento por meio das propriedades: top, bottom, left e\nright.

\n

Leia mais da posição absoluta aqui:

\n\n

Fixed

\n

Esse valor deixa o elemento fixo no documento. Seu eixo de coordenadas está\nrelacionado à janela do navegador. Quando você rola, o elemento estará sempre no\nmesmo lugar.

\n

Fixed funciona da mesma maneira como o posicionamento absolute, com uma\ndiferença fundamental: enquanto o posicionamento absolute fixa um elemento no\nlugar com relação ao <html> ou seu antecessor posicionado mais próximo, o\nelemento fixed fixa em relação à janela do navegador em si.

\n

Leia mais da posição fixed aqui:

\n\n

3. Floats

\n

Float é uma propriedade de posicionamento em CSS, ou seja, como os elementos\nestão localizados em um documento HTML. O float faz os elementos se ajustarem à\ndireita ou à esquerda. É inspirado em revistas nas quais os textos se encaixam\nem torno das imagens.

\n

Elementos flutuantes ainda fazem parte do fluxo de documentos. Isso é claramente\ndiferente dos elementos que usam posicionamento absoluto. Elementos de página\ncom posição absoluta são removidos do fluxo da página da web. Elementos de\npágina com posição absoluta não afetarão a posição de outros elementos e outros\nelementos não os afetarão, sejam eles tocados ou não.

\n

Leia sobre os floats\naqui !

\n\n" } } }, @@ -136,11 +136,11 @@ "intl": { "es": { "title": "Tipografías, íconos y sprites", - "body": "

Objetivos de Aprendizaje

\n
    \n
  • Aprender a cambiar la fuente de tu página web
  • \n
  • Conocer cuáles son las fuentes por defecto de los navegadores
  • \n
  • Aprender a agregar fuentes de proveedores externos
  • \n
  • Usar fuentes como íconos
  • \n
  • Usar la técnica de CSS sprites
  • \n
\n
\n

Tipografías

\n

Es hora de aprender a alterar la fuente (tipografía) de nuestra página web,\nconocer las que el navegador nos trae por defecto y sobretodo ver cómo podemos\nagregar fuentes externas como las de Google Fonts. Para comenzar puedes leer\nel siguiente artículo:

\n

https://lenguajecss.com/p/css/propiedades/fuentes-y-tipografias

\n

Ahora que ya sabes más sobre el tema, puedes ver los pasos a seguir para agregar\nfuentes externas desde Google Fonts en el siguiente video:

\n

\"modificando-tipografía-desde-Google-Fonts\"

\n

Íconos

\n

¿No te ha llamado la atención agregar íconos a tu sitio web? En el siguiente\nenlace aprende cómo agregar íconos como fuentes usando IcoMoon.

\n

http://www.falconmasters.com/tutoriales/como-utilizar-iconos-sitio-web-css/

\n

Si te gustó la idea de añadir íconos, debes de tener en cuenta que IcoMoon no es\nla única opción, puedes encontrar más como:

\n\n

¿Qué otras has encontrado y te gustaría agregar a tu página web?

\n

Sprites

\n

En ciertas ocasiones, quieres agregar muchas imágenes relacionadas (por ejemplo,\nun menú con banderas de diferentes países); sin embargo, ¿te has puesto a pensar\nqué tedioso sería estar agregando cada imagen de la bandera de cada país? Para\nesto, hay una técnica llamada CSS sprites que te permitirá manejar de una\nmanera más eficiente este tipo de casos. A continuación puedes conocer un poco\nmás del tema en el siguiente enlace:

\n

http://www.pensandoenweb.es/usar-css-sprites-para-crear-un-boton/

\n

Referencias

\n

¿Te quedaron dudas sobre alguno de estos temas? Tal vez algunos de estos posts\nte pueden ayudar a entenderlos mejor:

\n" + "body": "

Objetivos de Aprendizaje

\n
    \n
  • Aprender a cambiar la fuente de tu página web
  • \n
  • Conocer cuáles son las fuentes por defecto de los navegadores
  • \n
  • Aprender a agregar fuentes de proveedores externos
  • \n
  • Usar fuentes como íconos
  • \n
  • Usar la técnica de CSS sprites
  • \n
\n
\n

Tipografías

\n

Es hora de aprender a alterar la fuente (tipografía) de nuestra página web,\nconocer las que el navegador nos trae por defecto y sobretodo ver cómo podemos\nagregar fuentes externas como las de Google Fonts. Para comenzar puedes leer\nel siguiente artículo:

\n

https://lenguajecss.com/p/css/propiedades/fuentes-y-tipografias

\n

Ahora que ya sabes más sobre el tema, puedes ver los pasos a seguir para agregar\nfuentes externas desde Google Fonts en el siguiente video:

\n

\n

Íconos

\n

¿No te ha llamado la atención agregar íconos a tu sitio web? En el siguiente\nenlace aprende cómo agregar íconos como fuentes usando IcoMoon.

\n

http://www.falconmasters.com/tutoriales/como-utilizar-iconos-sitio-web-css/

\n

Si te gustó la idea de añadir íconos, debes de tener en cuenta que IcoMoon no es\nla única opción, puedes encontrar más como:

\n\n

¿Qué otras has encontrado y te gustaría agregar a tu página web?

\n

Sprites

\n

En ciertas ocasiones, quieres agregar muchas imágenes relacionadas (por ejemplo,\nun menú con banderas de diferentes países); sin embargo, ¿te has puesto a pensar\nqué tedioso sería estar agregando cada imagen de la bandera de cada país? Para\nesto, hay una técnica llamada CSS sprites que te permitirá manejar de una\nmanera más eficiente este tipo de casos. A continuación puedes conocer un poco\nmás del tema en el siguiente enlace:

\n

http://www.pensandoenweb.es/usar-css-sprites-para-crear-un-boton/

\n

Referencias

\n

¿Te quedaron dudas sobre alguno de estos temas? Tal vez algunos de estos posts\nte pueden ayudar a entenderlos mejor:

\n" }, "pt": { "title": "Tipografia, ícones e sprites", - "body": "

Objetivos de Aprendizagem

\n
    \n
  • Aprender a mudar a fonte da sua página web
  • \n
  • Saber quais são as fontes padrão dos navegadores
  • \n
  • Aprender a adicionar fontes de provedores externos
  • \n
  • Usar fontes como ícones
  • \n
\n
\n

Tipografias

\n

É hora de aprender a alterar a fonte (tipografia) do nosso site, saber o que o\nnavegador nos traz por padrão e ver como podemos adicionar fontes externas, como\no Google Fonts. Para começar, você pode ler os seguintes artigos:

\n\n

Agora que você sabe mais sobre o assunto, é possível ver as etapas a seguir para\nadicionar fontes externas do Google Fonts no seguinte vídeo:

\n

\"modificando-tipografia-de-Google-Fonts\"

\n

Ícones

\n

Já não lhe ocorreu adicionar ícones ao seu site? No vídeo a baixo, você irá\naprender a transformar ícones em fontes com o IconMoon.

\n

\"Icon

\n

Se você gostou da idéia de adicionar ícones, você deve ter em mente que IcoMoon\nnão é a única opção, você pode encontrar mais como:

\n\n

Quais outros você encontrou e gostaria de adicionar à sua página da web?

\n

Sprites

\n

Em certas ocasiões, você vai querer agregar muitas imagens relacionadas (por\nexemplo, um menu com bandeiras de diferentes países). No entanto, já chegou a\npensar que entediante e trabalhoso seria colocar as imagens uma por uma? Para\nisso, existe uma técnica chamada CSS sprites que te permite lidar de uma\nmaneira mais eficiente este tipo de caso.

\n

Aprenda mais sobre CSS sprites nesse\nlink!

\n

Link extra

\n" + "body": "

Objetivos de Aprendizagem

\n
    \n
  • Aprender a mudar a fonte da sua página web
  • \n
  • Saber quais são as fontes padrão dos navegadores
  • \n
  • Aprender a adicionar fontes de provedores externos
  • \n
  • Usar fontes como ícones
  • \n
\n
\n

Tipografias

\n

É hora de aprender a alterar a fonte (tipografia) do nosso site, saber o que o\nnavegador nos traz por padrão e ver como podemos adicionar fontes externas, como\no Google Fonts. Para começar, você pode ler os seguintes artigos:

\n\n

Agora que você sabe mais sobre o assunto, é possível ver as etapas a seguir para\nadicionar fontes externas do Google Fonts no seguinte vídeo:

\n

\n

Ícones

\n

Já não lhe ocorreu adicionar ícones ao seu site? No vídeo a baixo, você irá\naprender a transformar ícones em fontes com o IconMoon.

\n

\n

Se você gostou da idéia de adicionar ícones, você deve ter em mente que IcoMoon\nnão é a única opção, você pode encontrar mais como:

\n\n

Quais outros você encontrou e gostaria de adicionar à sua página da web?

\n

Sprites

\n

Em certas ocasiões, você vai querer agregar muitas imagens relacionadas (por\nexemplo, um menu com bandeiras de diferentes países). No entanto, já chegou a\npensar que entediante e trabalhoso seria colocar as imagens uma por uma? Para\nisso, existe uma técnica chamada CSS sprites que te permite lidar de uma\nmaneira mais eficiente este tipo de caso.

\n

Aprenda mais sobre CSS sprites nesse\nlink!

\n

Link extra

\n" } } }, @@ -169,11 +169,11 @@ "intl": { "es": { "title": "Caso práctico (video)", - "body": "

Objetivos

\n
    \n
  • Entender, a través de un caso práctico, cómo crear estructuras en la web con\nhtml y a darle estilos con css
  • \n
\n

Enunciado

\n

Al igual que hemos hecho antes, es hora de aplicar los conceptos aprendidos\npara resolver problemas reales.

\n

Imagina que estás creando tu primera web interactiva y quieres hacerle un menú\nde navegación. Tu equipo de diseño te ha pasado estos demos para que repliques:

\n

1. Menú Vertical

\n

\"Demo

\n

2. Menú Horizontal

\n

\"Demo

\n

Solucionario

\n

A continuación, Lulu te explica cómo resolvió este reto:

\n

1. Solución Menú Vertical

\n

\"Vertical\"

\n

2. Solución Menú Horizontal

\n

\"Horizontal\"

" + "body": "

Objetivos

\n
    \n
  • Entender, a través de un caso práctico, cómo crear estructuras en la web con\nhtml y a darle estilos con css
  • \n
\n

Enunciado

\n

Al igual que hemos hecho antes, es hora de aplicar los conceptos aprendidos\npara resolver problemas reales.

\n

Imagina que estás creando tu primera web interactiva y quieres hacerle un menú\nde navegación. Tu equipo de diseño te ha pasado estos demos para que repliques:

\n

1. Menú Vertical

\n

\"Demo

\n

2. Menú Horizontal

\n

\"Demo

\n

Solucionario

\n

A continuación, Lulu te explica cómo resolvió este reto:

\n

1. Solución Menú Vertical

\n

\n

2. Solución Menú Horizontal

\n

" }, "pt": { "title": "Casos Prático (vídeo)", - "body": "

Objetivos

\n
    \n
  • Entender, por meio de um estudo de caso, como criar estruturas na web com\nhtml e dar estilos com css
  • \n
\n

Enunciado

\n

Como já fizemos antes, é hora de aplicar os conceitos aprendidos para resolver\nproblemas reais.

\n

Imagine que você está criando seu primeiro site interativo e deseja fazer um\nmenu de navegação. Sua equipe de projeto passou essas demonstrações para você\nreplicar:

\n

1. Menu Vertical

\n

\"Menu

\n

2. Menu horizontal

\n

\"Menu

\n

Soluções

\n

Em seguida, o Rafa explica como resolveu esse desafio:

\n

1. Menu Vertical da Solução

\n

\"Vertical\"

\n

2. Menu Horizontal da Solução

\n

\"Horizontal\"

" + "body": "

Objetivos

\n
    \n
  • Entender, por meio de um estudo de caso, como criar estruturas na web com\nhtml e dar estilos com css
  • \n
\n

Enunciado

\n

Como já fizemos antes, é hora de aplicar os conceitos aprendidos para resolver\nproblemas reais.

\n

Imagine que você está criando seu primeiro site interativo e deseja fazer um\nmenu de navegação. Sua equipe de projeto passou essas demonstrações para você\nreplicar:

\n

1. Menu Vertical

\n

\"Menu

\n

2. Menu horizontal

\n

\"Menu

\n

Soluções

\n

Em seguida, o Rafa explica como resolveu esse desafio:

\n

1. Menu Vertical da Solução

\n

\n

2. Menu Horizontal da Solução

\n

" } } }, @@ -265,7 +265,7 @@ "intl": { "es": { "title": "Media Queries y Viewport", - "body": "

Objetivos de Aprendizaje

\n
    \n
  • Conocer y entender el uso de media queries dentro del Responsive Web Design
  • \n
\n

¿Qué son los Media Queries?

\n

Es una técnica introducida en CSS3, que usa la regla @media para incluir un\nbloque de propiedades CSS que se ejecutarán en nuestro sitio solo si las\ncondiciones dadas al @media son verdaderas.

\n

\"Sintaxis

\n

\"Sintaxis

\n

Los Media Queries están conformadas por Media Types, Media Features\ny el bloque de código a ejecutar si las condiciones entregadas en el media\ntype y el media feature son verdaderas. Todo esto se conecta gracias a los\noperadores lógicos correspondientes.

\n

\"Media

\n

Los media types corresponden a los distintos dispositivos donde se puede\nvisualizar nuestro sitio web. En la siguiente imagen, se pueden ver los\ndistintos media types que pueden ocuparse.

\n

\"Media

\n

Los media features corresponden a la condición que debe cumplir el\ndispositivo y la cual debe ser verdadera para que se aplique el código contenido\nen nuestra media query.

\n

Los media features más comunes son los referidos a las dimensiones de pantalla de\ndispositivo, pudiendo establecer el alto y ancho en el que se aplicarán (con height\ny width), o lo que es más interesante, a partir de qué ancho o alto se aplicarán\n(con min/max-width y min/max-height).

\n

\"Media

\n

Los operadores lógicos son and, not, only y lista separada por comas\n(que funciona como el operador lógico or de Javascript) y se encargan de unir\nnuestros media types a los media features.

\n

El operador and es usado para combinar múltiples media en un solo Media Query,\nrequiriendo que cada función devuelve true para que el media query también lo\nsea. El operador not se utiliza para negar un media query completo y el\noperador only se usa para aplicar un estilo sólo si el query completo es\ncorrecto.

\n

Viewport

\n

Un elemento que es muy importante y que debemos añadir siempre a nuestro sitio\nsi queremos que sea responsive es la etiqueta meta viewport.

\n

La etiqueta viewport nos permite definir el ancho, alto y escala del área usada\npor el navegador para mostrar contenido.

\n

Al fijar el ancho o alto del viewport, podemos usar un número fijo de píxeles o\nusar dos constantes, device-width y device-height respectivamente. Se considera\nuna buena práctica configurar el viewport con algunas de estas dos constantes,\nen lugar de utilizar un ancho o alto fijo.

\n

La configuración más común de viewport es la siguiente:

\n
<meta name=\"viewport\" content=\"width=device-width, initial-scale=1,\nmaximum-scale=1\">\n
\n

Sus propiedades son las siguientes:

\n
    \n
  • \n

    width: controla el ancho del área de visualización. Puede ser inicializado\na un número concreto de pixels o con el valor especial device-width, que\nindica el ancho total del dispositivo, en píxeles en una escala del 100%.

    \n
  • \n
  • \n

    initial-scale: controla el nivel de zoom inicial al cargarse la página.\nLas propiedades maximum-scale, minimum-scale, y user-scalable controlan cómo\nel usuario puede realizar zoom sobre la página.

    \n
  • \n
\n

Puedes profundizar un poco más en Media Queries y Viewport en:

\n\n

Material adicional

\n

Además, en tu tiempo libre puedes leer un poco sobre Device Pixel Ratio o\nDPR cómo también se le conoce ;). Aquí la información.

" + "body": "

Objetivos de Aprendizaje

\n
    \n
  • Conocer y entender el uso de media queries dentro del Responsive Web Design
  • \n
\n

¿Qué son los Media Queries?

\n

Es una técnica introducida en CSS3, que usa la regla @media para incluir un\nbloque de propiedades CSS que se ejecutarán en nuestro sitio solo si las\ncondiciones dadas al @media son verdaderas.

\n

\"Sintaxis

\n

\"Sintaxis

\n

Los Media Queries están conformadas por Media Types, Media Features\ny el bloque de código a ejecutar si las condiciones entregadas en el media\ntype y el media feature son verdaderas. Todo esto se conecta gracias a los\noperadores lógicos correspondientes.

\n

\"Media

\n

Los media types corresponden a los distintos dispositivos donde se puede\nvisualizar nuestro sitio web. En la siguiente imagen, se pueden ver los\ndistintos media types que pueden ocuparse.

\n

\"Media

\n

Los media features corresponden a la condición que debe cumplir el\ndispositivo y la cual debe ser verdadera para que se aplique el código contenido\nen nuestra media query.

\n

Los media features más comunes son los referidos a las dimensiones de pantalla de\ndispositivo, pudiendo establecer el alto y ancho en el que se aplicarán (con height\ny width), o lo que es más interesante, a partir de qué ancho o alto se aplicarán\n(con min/max-width y min/max-height).

\n

\"Media

\n

Los operadores lógicos son and, not, only y lista separada por comas\n(que funciona como el operador lógico or de Javascript) y se encargan de unir\nnuestros media types a los media features.

\n

El operador and es usado para combinar múltiples media en un solo Media Query,\nrequiriendo que cada función devuelve true para que el media query también lo\nsea. El operador not se utiliza para negar un media query completo y el\noperador only se usa para aplicar un estilo sólo si el query completo es\ncorrecto.

\n

Viewport

\n

Un elemento que es muy importante y que debemos añadir siempre a nuestro sitio\nsi queremos que sea responsive es la etiqueta meta viewport.

\n

La etiqueta viewport nos permite definir el ancho, alto y escala del área usada\npor el navegador para mostrar contenido.

\n

Al fijar el ancho o alto del viewport, podemos usar un número fijo de píxeles o\nusar dos constantes, device-width y device-height respectivamente. Se considera\nuna buena práctica configurar el viewport con algunas de estas dos constantes,\nen lugar de utilizar un ancho o alto fijo.

\n

La configuración más común de viewport es la siguiente:

\n
<meta name=\"viewport\" content=\"width=device-width, initial-scale=1,\nmaximum-scale=1\">\n
\n

Sus propiedades son las siguientes:

\n
    \n
  • \n

    width: controla el ancho del área de visualización. Puede ser inicializado\na un número concreto de pixels o con el valor especial device-width, que\nindica el ancho total del dispositivo, en píxeles en una escala del 100%.

    \n
  • \n
  • \n

    initial-scale: controla el nivel de zoom inicial al cargarse la página.\nLas propiedades maximum-scale, minimum-scale, y user-scalable controlan cómo\nel usuario puede realizar zoom sobre la página.

    \n
  • \n
\n

Puedes profundizar un poco más en Media Queries y Viewport en:

\n\n

Material adicional

\n

Además, en tu tiempo libre puedes leer un poco sobre Device Pixel Ratio o\nDPR cómo también se le conoce ;). Aquí la información.

" }, "pt": { "title": "Media Queries e Viewport", @@ -281,11 +281,11 @@ "intl": { "es": { "title": "Responsive Web Design", - "body": "

Objetivos de Aprendizaje

\n
    \n
  • Conocer Responsive Web Design
  • \n
  • Entender las ventajas del uso de Responsive Web Design en nuestro sitio web
  • \n
\n

¿Qué es Responsive Web Design?

\n

Responsive Web Design se trata de una técnica de diseño y desarrollo web por\nel que se consigue que un único sitio se adapte perfectamente a todos los\ndispositivos desde ordenadores de escritorio a tablets, teléfonos móviles, etc.

\n

¿Cómo hace esto? Utilizando HTML y CSS para cambiar el tamaño, ocultar, reducir,\nampliar o mover el contenido para que se vea bien en cualquier pantalla.

\n

\"Ejemplo

\n

Los elementos básicos necesarios para contruir una página con Responsive Web\nDesign, son al menos los tres siguientes:

\n
    \n
  • Una estructura flexible, basada en Grid System.
  • \n
  • Imágenes y multimedia flexible.
  • \n
  • Media queries.
  • \n
\n

Las ventajas de utilizar Responsive Web Design son:

\n
    \n
  • \n

    Con una sola versión en HTML y CSS se cubren todas las resoluciones de\npantalla, es decir, el sitio web creado estará optimizado para todo tipo de\ndispositivos. Esto mejora la experiencia de usuario a diferencia de lo que\nocurre, por ejemplo, con sitios web de ancho fijo cuando se acceden desde\ndispositivos móviles.

    \n
  • \n
  • \n

    Eficiencia en la actualización. El sitio solo se debe actualizar una vez y se\nve reflejado en todas las plataformas. Cuando tenemos los portales\nindependientes para Web y Mobile se debe realizar la actualización dos veces\nlo que crea la necesidad de mayor cantidad de recursos y posibilidad de error.

    \n
  • \n
\n

Puedes conocer un poco más sobre Responsive Web Design en los siguientes links:

\n" + "body": "

Objetivos de Aprendizaje

\n
    \n
  • Conocer Responsive Web Design
  • \n
  • Entender las ventajas del uso de Responsive Web Design en nuestro sitio web
  • \n
\n

¿Qué es Responsive Web Design?

\n

Responsive Web Design se trata de una técnica de diseño y desarrollo web por\nel que se consigue que un único sitio se adapte perfectamente a todos los\ndispositivos desde ordenadores de escritorio a tablets, teléfonos móviles, etc.

\n

¿Cómo hace esto? Utilizando HTML y CSS para cambiar el tamaño, ocultar, reducir,\nampliar o mover el contenido para que se vea bien en cualquier pantalla.

\n

\"Ejemplo

\n

Los elementos básicos necesarios para contruir una página con Responsive Web\nDesign, son al menos los tres siguientes:

\n
    \n
  • Una estructura flexible, basada en Grid System.
  • \n
  • Imágenes y multimedia flexible.
  • \n
  • Media queries.
  • \n
\n

Las ventajas de utilizar Responsive Web Design son:

\n
    \n
  • \n

    Con una sola versión en HTML y CSS se cubren todas las resoluciones de\npantalla, es decir, el sitio web creado estará optimizado para todo tipo de\ndispositivos. Esto mejora la experiencia de usuario a diferencia de lo que\nocurre, por ejemplo, con sitios web de ancho fijo cuando se acceden desde\ndispositivos móviles.

    \n
  • \n
  • \n

    Eficiencia en la actualización. El sitio solo se debe actualizar una vez y se\nve reflejado en todas las plataformas. Cuando tenemos los portales\nindependientes para Web y Mobile se debe realizar la actualización dos veces\nlo que crea la necesidad de mayor cantidad de recursos y posibilidad de error.

    \n
  • \n
\n

Puedes conocer un poco más sobre Responsive Web Design en los siguientes links:

\n" }, "pt": { "title": "Web Design Responsivo", - "body": "

Objetivos de Aprendizagem

\n
    \n
  • Conhecer o Web Design Responsivo.
  • \n
  • Entender as vantagens do uso de Web Design Responsivo nos sites.
  • \n
\n

O que é Web Design Responsivo?

\n

Web Design Responsivo se trata de uma técnica de projeto e desenvolvimento web\npelo qual se consegue que um único site se adapte perfeitamente a todos os\ndispositivos como computadores de mesa, tablets, smartphones, etc.

\n

Como se faz isto? Utilizando HTML e CSS para trocar o tamanho, ocultar, reduzir,\nampliar ou mover o conteúdo para que se veja corretamente em qualquer tela.

\n

\"Exemplo

\n

Os elementos básicos necessários para construir uma página com Web Design\nResponsivo são ao menos os três a seguir:

\n
    \n
  • Uma estrutura flexível, baseada em Grid System.
  • \n
  • Imagens e multimídias flexíveis.
  • \n
  • Media queries.
  • \n
\n

As vantagens de utilizar um Web Design Responsivo são:

\n
    \n
  • \n

    Com só uma versão em HTML e CSS são atendidas todas as resoluções de tela, ou\nseja, o site criado estará otimizado para todo tipo de dispositivo. Isso\nmelhora a experiência do usuário que acessa sites com largura fixa, por\ndispositivos móveis.

    \n
  • \n
  • \n

    Eficiência na atualização, o site só precisa ser atualizado uma vez e\nfuncionará em todas as plataformas. Quando temos os portais independentes para\nWeb e Mobile é necessária a atualização duas vezes, o que cria uma necessidade\nmaior de recursos e maior possibilidade de erros.

    \n
  • \n
\n

Você pode conhecer um pouco mais sobre Web Design Responsivo nos links a seguir:

\n" + "body": "

Objetivos de Aprendizagem

\n
    \n
  • Conhecer o Web Design Responsivo.
  • \n
  • Entender as vantagens do uso de Web Design Responsivo nos sites.
  • \n
\n

O que é Web Design Responsivo?

\n

Web Design Responsivo se trata de uma técnica de projeto e desenvolvimento web\npelo qual se consegue que um único site se adapte perfeitamente a todos os\ndispositivos como computadores de mesa, tablets, smartphones, etc.

\n

Como se faz isto? Utilizando HTML e CSS para trocar o tamanho, ocultar, reduzir,\nampliar ou mover o conteúdo para que se veja corretamente em qualquer tela.

\n

\"Exemplo

\n

Os elementos básicos necessários para construir uma página com Web Design\nResponsivo são ao menos os três a seguir:

\n
    \n
  • Uma estrutura flexível, baseada em Grid System.
  • \n
  • Imagens e multimídias flexíveis.
  • \n
  • Media queries.
  • \n
\n

As vantagens de utilizar um Web Design Responsivo são:

\n
    \n
  • \n

    Com só uma versão em HTML e CSS são atendidas todas as resoluções de tela, ou\nseja, o site criado estará otimizado para todo tipo de dispositivo. Isso\nmelhora a experiência do usuário que acessa sites com largura fixa, por\ndispositivos móveis.

    \n
  • \n
  • \n

    Eficiência na atualização, o site só precisa ser atualizado uma vez e\nfuncionará em todas as plataformas. Quando temos os portais independentes para\nWeb e Mobile é necessária a atualização duas vezes, o que cria uma necessidade\nmaior de recursos e maior possibilidade de erros.

    \n
  • \n
\n

Você pode conhecer um pouco mais sobre Web Design Responsivo nos links a seguir:

\n" } } }, @@ -297,11 +297,11 @@ "intl": { "es": { "title": "Ejercicios libres", - "body": "

Objetivos

\n
    \n
  • Practicar, practicar y practicar
  • \n
\n

Enunciados

\n

A continuación tienes algunos ejercicios para practicar, te sugerimos\nque intentes resolver los ejercicios por tu cuenta (o en equipo). Así, ya\nestarás familiarizada con los retos. Quizás, puedas tú presentar tu solución\nante la clase y así ayudar al resto de tus compañeras :)

\n

Debes subir todos tus ejercicios a GitHub y publicarlos en gh-pages.

\n

1. Replica la siguiente grid

\n

Tomando como base la imagen de abajo, replíca la estructura de grid usando las\ndiferentes columnas que nos da un framework.

\n

\"grid\"

\n

2. De desktop a mobile

\n

Ahora que ya sabes hacer una grid en desktop, vamos a hacer un reto más\ndivertido. Te damos tres retos, en cada imagen vas a ver dos versiones: desktop\n(a la izquierda ) y mobile (a la derecha).

\n

Replica la estructura desktop y modifícala a mobile como la imagen te lo dice,\n¡tú puedes!

\n

\"desktop

\n

\"desktop

\n

\"desktop

\n

3. Love Love Panda Desu

\n

Crea una página web para amantes de los pandas. Puedes obtener las imágenes en\neste enlace.

\n
    \n
  • Versión 1: Crea tu página utilizando un grid system de tu elección (que no\npertenezca a un framework como Bootstrap o Materialize).
  • \n
  • Versión 2: Crea tu propia versión móvil de la página.
  • \n
\n

\"Love

\n

4. Rock Site

\n

Replica las siguientes vistas poniendo en práctica tus conocimientos de grid system. Puedes obtener las fotografías en este enlace

\n

\"Rock

\n

\"Rock

\n
\n

Puedes ver el siguiente video para saber cómo crear y utilizar un grid system:

\n

\"Creando

" + "body": "

Objetivos

\n
    \n
  • Practicar, practicar y practicar
  • \n
\n

Enunciados

\n

A continuación tienes algunos ejercicios para practicar, te sugerimos\nque intentes resolver los ejercicios por tu cuenta (o en equipo). Así, ya\nestarás familiarizada con los retos. Quizás, puedas tú presentar tu solución\nante la clase y así ayudar al resto de tus compañeras :)

\n

Debes subir todos tus ejercicios a GitHub y publicarlos en gh-pages.

\n

1. Replica la siguiente grid

\n

Tomando como base la imagen de abajo, replíca la estructura de grid usando las\ndiferentes columnas que nos da un framework.

\n

\"grid\"

\n

2. De desktop a mobile

\n

Ahora que ya sabes hacer una grid en desktop, vamos a hacer un reto más\ndivertido. Te damos tres retos, en cada imagen vas a ver dos versiones: desktop\n(a la izquierda ) y mobile (a la derecha).

\n

Replica la estructura desktop y modifícala a mobile como la imagen te lo dice,\n¡tú puedes!

\n

\"desktop

\n

\"desktop

\n

\"desktop

\n

3. Love Love Panda Desu

\n

Crea una página web para amantes de los pandas. Puedes obtener las imágenes en\neste enlace.

\n
    \n
  • Versión 1: Crea tu página utilizando un grid system de tu elección (que no\npertenezca a un framework como Bootstrap o Materialize).
  • \n
  • Versión 2: Crea tu propia versión móvil de la página.
  • \n
\n

\"Love

\n

4. Rock Site

\n

Replica las siguientes vistas poniendo en práctica tus conocimientos de grid system. Puedes obtener las fotografías en este enlace

\n

\"Rock

\n

\"Rock

\n
\n

Puedes ver el siguiente video para saber cómo crear y utilizar un grid system:

\n

" }, "pt": { "title": "Exercícios Livres", - "body": "

Objetivos

\n
    \n
  • Praticar, praticar e praticar
  • \n
\n

Enunciados

\n

Aqui estão alguns exercícios para você praticar, sugerimos que tenta resolver\neles sozinha ou em grupo. Assim, você ficará familiarizada com os desafios. E\nse quiser pode apresentar a sua solução para a sala e ajudar as suas\ncompanheiras 😁

\n

Você deve super o seu exercício para o GitHub e publicar no gh-pages.

\n

1. Replicar o grid a seguir

\n

Tomando como base a imagem abaixo, replique a estrutura de grid.

\n

\"grid\"

\n

2. De desktop para mobile

\n

Agora que você sabe fazer uma grid no desktop, vamos fazer um desafio mais\ndivertido. Apresentamos três desafios. Em cada imagem, verá duas versões:\ndesktop (à esquerda) e mobile (à direita).

\n

Replique a estrutura desktop e modifique-a para mobile como a imagem indica. Você\nconsegue!

\n

\"desktop

\n

\"desktop

\n

\"desktop

\n

3. Love Love Panda Desu

\n

Crie uma página web para os amantes dos pandas. Para obter as imagens use este\nlink.

\n
    \n
  • Versão 1: Crie sua página utilizando grid.
  • \n
  • Versão 2: Crie sua própria versão móvel da página.
  • \n
\n

\"Love

\n

4. Rock Site

\n

Replique as imagens a seguir colocando em prática seus conhecimentos de grid system. Para obter as imagens este\nlink

\n

\"Rock\nDesktop\"

\n

\"Rock\nMovil\"

\n
\n

No vídeo abaixo você irá ver como usar o CSS grid:

\n

\"CSS\ngrid\"

" + "body": "

Objetivos

\n
    \n
  • Praticar, praticar e praticar
  • \n
\n

Enunciados

\n

Aqui estão alguns exercícios para você praticar, sugerimos que tenta resolver\neles sozinha ou em grupo. Assim, você ficará familiarizada com os desafios. E\nse quiser pode apresentar a sua solução para a sala e ajudar as suas\ncompanheiras 😁

\n

Você deve super o seu exercício para o GitHub e publicar no gh-pages.

\n

1. Replicar o grid a seguir

\n

Tomando como base a imagem abaixo, replique a estrutura de grid.

\n

\"grid\"

\n

2. De desktop para mobile

\n

Agora que você sabe fazer uma grid no desktop, vamos fazer um desafio mais\ndivertido. Apresentamos três desafios. Em cada imagem, verá duas versões:\ndesktop (à esquerda) e mobile (à direita).

\n

Replique a estrutura desktop e modifique-a para mobile como a imagem indica. Você\nconsegue!

\n

\"desktop

\n

\"desktop

\n

\"desktop

\n

3. Love Love Panda Desu

\n

Crie uma página web para os amantes dos pandas. Para obter as imagens use este\nlink.

\n
    \n
  • Versão 1: Crie sua página utilizando grid.
  • \n
  • Versão 2: Crie sua própria versão móvel da página.
  • \n
\n

\"Love

\n

4. Rock Site

\n

Replique as imagens a seguir colocando em prática seus conhecimentos de grid system. Para obter as imagens este\nlink

\n

\"Rock\nDesktop\"

\n

\"Rock\nMovil\"

\n
\n

No vídeo abaixo você irá ver como usar o CSS grid:

\n

" } }, "challenges": [] @@ -361,11 +361,11 @@ "intl": { "es": { "title": "Frameworks", - "body": "

Objetivos de Aprendizaje

\n
    \n
  • Conocer y entender lo que son los frameworks y cómo nos sirven en nuestro\ntrabajo a la hora de crear un sitio web.
  • \n
\n

¿Qué es un Framework?

\n

Antes que nada debemos tener claro que existen frameworks tan variados como\nsabores de helados. Hay frameworks para JavaScript, para CSS, para PHP, etc.

\n

Los frameworks se definen como un conjunto estandarizado de conceptos, prácticas\ny criterios (marco de trabajo); que sirven de referencia para resolver problemas\nsemejantes(¡como los popups que avisan cuando una compra es exitosa!).

\n

Los frameworks sirven como esqueletos que puedes modificar para obtener los\nresultados que deseas. Te dan las herramientas y también te dicen la forma\ncorrecta de utilizarlas.

\n

Por ahora nos vamos a enfocar en los frameworks CSS, que son un conjunto de\nherramientas preprogramadas de estilos genéricos que podemos usar para\ndesarrollar nuestros sitios de una manera más sencilla, rápida y responsive.

\n

¿Por qué usamos frameworks?

\n

Porque a veces hacer estructuras con CSS puede ser algo complicado y toma mucho\ntiempo trabajar sus estilos, los frameworks aparecen allí para acortar un poco\nel tiempo y esfuerzo de creación, después de todo ¿Por qué reinventar la rueda,\nsi puedes diseñar un mejor auto?

\n

Eso no significa que son un sustituto para entender CSS o que ya no\nocuparemos CSS en nuestros proyectos, al contrario, ¡nos sobrará más\ntiempo para tener diseños y estilos increíbles y totalmente personalizados\ny conocer mucho mejor CSS!

\n

Aquí te dejamos unos vídeos introductorios a algunos frameworks:

\n\n

Algunas de las herramientas que podemos encontrar en los frameworks de CSS son:

\n
    \n
  • “Resetear” los estilos por defecto que aplican los navegadores.
  • \n
  • Manipular correctamente los textos, logrando así que todos los contenidos se\nvean exactamente igual en los distintos navegadores y que se adapten a éstos.
  • \n
  • Crear layouts de manera sencilla asegurándonos que funcionará y visualizará\ncorrectamente en cualquier versión de cualquier navegador existente.
  • \n
\n

\"componentes

\n
\n

Usar un framework es solo una buena idea si hace lo que quieres que tu sitio\nhaga.

\n
\n

Algunos de los frameworks más conocidos son:

\n\n
\n

Lee la documentación de estos frameworks y practica los componentes que\nprefieras,así te volverás una master en frameworks CSS y crearás increíbles\nproductos en poco tiempo.

\n
" + "body": "

Objetivos de Aprendizaje

\n
    \n
  • Conocer y entender lo que son los frameworks y cómo nos sirven en nuestro\ntrabajo a la hora de crear un sitio web.
  • \n
\n

¿Qué es un Framework?

\n

Antes que nada debemos tener claro que existen frameworks tan variados como\nsabores de helados. Hay frameworks para JavaScript, para CSS, para PHP, etc.

\n

Los frameworks se definen como un conjunto estandarizado de conceptos, prácticas\ny criterios (marco de trabajo); que sirven de referencia para resolver problemas\nsemejantes(¡como los popups que avisan cuando una compra es exitosa!).

\n

Los frameworks sirven como esqueletos que puedes modificar para obtener los\nresultados que deseas. Te dan las herramientas y también te dicen la forma\ncorrecta de utilizarlas.

\n

Por ahora nos vamos a enfocar en los frameworks CSS, que son un conjunto de\nherramientas preprogramadas de estilos genéricos que podemos usar para\ndesarrollar nuestros sitios de una manera más sencilla, rápida y responsive.

\n

¿Por qué usamos frameworks?

\n

Porque a veces hacer estructuras con CSS puede ser algo complicado y toma mucho\ntiempo trabajar sus estilos, los frameworks aparecen allí para acortar un poco\nel tiempo y esfuerzo de creación, después de todo ¿Por qué reinventar la rueda,\nsi puedes diseñar un mejor auto?

\n

Eso no significa que son un sustituto para entender CSS o que ya no\nocuparemos CSS en nuestros proyectos, al contrario, ¡nos sobrará más\ntiempo para tener diseños y estilos increíbles y totalmente personalizados\ny conocer mucho mejor CSS!

\n

Aquí te dejamos unos vídeos introductorios a algunos frameworks:

\n
    \n
  • \n
  • \n
\n

Algunas de las herramientas que podemos encontrar en los frameworks de CSS son:

\n
    \n
  • “Resetear” los estilos por defecto que aplican los navegadores.
  • \n
  • Manipular correctamente los textos, logrando así que todos los contenidos se\nvean exactamente igual en los distintos navegadores y que se adapten a éstos.
  • \n
  • Crear layouts de manera sencilla asegurándonos que funcionará y visualizará\ncorrectamente en cualquier versión de cualquier navegador existente.
  • \n
\n

\"componentes

\n
\n

Usar un framework es solo una buena idea si hace lo que quieres que tu sitio\nhaga.

\n
\n

Algunos de los frameworks más conocidos son:

\n\n
\n

Lee la documentación de estos frameworks y practica los componentes que\nprefieras,así te volverás una master en frameworks CSS y crearás increíbles\nproductos en poco tiempo.

\n
" }, "pt": { "title": "Frameworks", - "body": "

Objetivos de Aprendizagem

\n
    \n
  • Conhecer e entender o que são os frameworks e como são úteis em nosso trabalho\nquando vamos criar um site.
  • \n
\n

O que é Framework?

\n

Primeiramente devemos ter claro que existem frameworks tão variados como\nsabores de sorvete. Existem frameworks para JavaScript, para CSS, para PHP, etc.

\n

Os frameworks são definidos como um conjunto padrão de conceitos, práticas e\ncritérios (quadro de trabalho) que servem de referência para resolver problemas\nsemelhantes (como os popups que avisam quando uma compra foi feita com\nsucesso!).

\n

Os frameworks servem como esqueletos que você pode modificar para obter os\nresultados que deseja. Eles fornecem ferramentas e também dizem a forma correta\nde utilizá-las.

\n

Por enquanto vamos nos focar nos frameworks CSS, que são um conjunto de\nferramentas pré-programadas de estilos genéricos que podemos implementar\npara desenvolver nossos sítios web de uma maneira mais simples, rápida e\nresponsiva.

\n

Por que usamos frameworks?

\n

Porque às vezes fazer estruturas com CSS pode ser algo complicado e toma muito\ntempo trabalhar seus estilos. Os frameworks surgem então para reduzir o tempo e\nesforço de criação e responder à pergunta _Por que reinventar a roda se você\npode projetar um carro melhor?

\n

Isso não significa que são substitutos para entender CSS ou que não mexeremos\ncom CSS em nosso projetos. Ao contrário, sobrará mais tempo para termos projetos\ne estilos incríveis e totalmente personalizados, e conhecer muito melhor CSS!

\n

Aqui deixamos alguns vídeos introdutórios a alguns frameworks.

\n\n

Algumas das ferramentas que podemos encontrar nos frameworks de CSS são:

\n
    \n
  • \n

    “Resetar” os estilos padrão que os navegadores aplicam.

    \n
  • \n
  • \n

    Manipular corretamente os textos, conseguindo assim que todos os conteúdos se\nvisualizem exatamente iguais em navegadores diferentes e que se adaptem a\neles.

    \n
  • \n
  • \n

    Criar leiautes de maneira simples garantindo que funcionará e será visualizado\ncorretamente em qualquer versão de qualquer navegador existente.

    \n
  • \n
\n
\n

Utilizar um framework só é uma boa ideia se ele faz o que você quer no sítio\nque você fizer.

\n
\n

Alguns dos frameworks mais conhecidos são:

\n\n
\n

Leia a documentação desses frameworks e pratique os componentes que preferir.\nDessa maneira, você será uma mestre em frameworks CSS e criará produtos\nincríveis em pouco tempo.

\n
" + "body": "

Objetivos de Aprendizagem

\n
    \n
  • Conhecer e entender o que são os frameworks e como são úteis em nosso trabalho\nquando vamos criar um site.
  • \n
\n

O que é Framework?

\n

Primeiramente devemos ter claro que existem frameworks tão variados como\nsabores de sorvete. Existem frameworks para JavaScript, para CSS, para PHP, etc.

\n

Os frameworks são definidos como um conjunto padrão de conceitos, práticas e\ncritérios (quadro de trabalho) que servem de referência para resolver problemas\nsemelhantes (como os popups que avisam quando uma compra foi feita com\nsucesso!).

\n

Os frameworks servem como esqueletos que você pode modificar para obter os\nresultados que deseja. Eles fornecem ferramentas e também dizem a forma correta\nde utilizá-las.

\n

Por enquanto vamos nos focar nos frameworks CSS, que são um conjunto de\nferramentas pré-programadas de estilos genéricos que podemos implementar\npara desenvolver nossos sítios web de uma maneira mais simples, rápida e\nresponsiva.

\n

Por que usamos frameworks?

\n

Porque às vezes fazer estruturas com CSS pode ser algo complicado e toma muito\ntempo trabalhar seus estilos. Os frameworks surgem então para reduzir o tempo e\nesforço de criação e responder à pergunta _Por que reinventar a roda se você\npode projetar um carro melhor?

\n

Isso não significa que são substitutos para entender CSS ou que não mexeremos\ncom CSS em nosso projetos. Ao contrário, sobrará mais tempo para termos projetos\ne estilos incríveis e totalmente personalizados, e conhecer muito melhor CSS!

\n

Aqui deixamos alguns vídeos introdutórios a alguns frameworks.

\n
    \n
  • \n

    \n
  • \n
  • \n

    \n
  • \n
\n

Algumas das ferramentas que podemos encontrar nos frameworks de CSS são:

\n
    \n
  • \n

    “Resetar” os estilos padrão que os navegadores aplicam.

    \n
  • \n
  • \n

    Manipular corretamente os textos, conseguindo assim que todos os conteúdos se\nvisualizem exatamente iguais em navegadores diferentes e que se adaptem a\neles.

    \n
  • \n
  • \n

    Criar leiautes de maneira simples garantindo que funcionará e será visualizado\ncorretamente em qualquer versão de qualquer navegador existente.

    \n
  • \n
\n
\n

Utilizar um framework só é uma boa ideia se ele faz o que você quer no sítio\nque você fizer.

\n
\n

Alguns dos frameworks mais conhecidos são:

\n\n
\n

Leia a documentação desses frameworks e pratique os componentes que preferir.\nDessa maneira, você será uma mestre em frameworks CSS e criará produtos\nincríveis em pouco tempo.

\n
" } } }, @@ -381,7 +381,7 @@ }, "pt": { "title": "Bootstrap", - "body": "

Objetivos de Aprendizagem

\n
    \n
  • Conhecer e entender o que é o Bootstrap.
  • \n
\n

O que é Bootstrap?

\n

Bootstrap é um incrível framework que torna o desenvolvimento web front-end muito\nmais rápido e mais fácil.

\n

Inicialmente foi criado como uma solução interna para o Twitter e posteriormente\nfoi liberado ao público em agosto de 2011 como um projeto open source no\nGitHub.

\n

\"Bootstrap\"

\n

Foi feito para que possa ser utilizado por pessoas de todos os níveis, por\ndispositivos de todas as formas e projetos de todos os tamanhos.

\n

Bootstrap tem várias versões. A mais popular é a versão 4 e é a que\naprenderemos. Podemos encontrar o Bootstrap aqui.

\n

Podemos utilizar o Bootstrap em nossos projetos de diferentes formas, seja\nadicionando o código CDN ao nosso HTML para usá-lo de maneira remota ou baixando\no Bootstrap na sua página web.

\n

\"Bootstrap\"

\n

Se utilizarmos as opções de baixar o Bootstrap, devemos descompactar e adicionar\nos arquivos do framework ao projeto. Além disso, devemos linkar todos no HTML\npara que funcione.

\n

\"Bootstrap\"

\n

Falando em CDN, precisamos entender: O que é CDN?

\n

Imagine que você queira usar o CSS de Bootstrap ou de alguma outra biblioteca.\nPoderíamos simplesmente baixar o arquivo .css ou .js e adicioná-lo a nosso HTML.\nMas, o que acontece se esse arquivo NÃO está no nosso computador e sim em\nalgum lugar da internet?

\n

Quando temos o arquivo em algum lugar da internet, na verdade está em outro\ncomputador em algum lugar do mundo.

\n

O que acontecerá se este computador estiver no outro lado do mundo? Na China?\nCoreia?

\n

Você acha que a distância do nosso computador (que vai utilizar o arquivo) e o\ncomputador que tem o arquivo afeta o carregamento da página?

\n

Sim, afeta muito.

\n

Isto é porque conectar-se a um computador do outro lado do mundo é mais demorado\nque conectar-se ao computador que está ao nosso lado.

\n

CDN significa Content Delivery Network (Rede de distribuição de conteúdo).

\n

Imaginemos que o computador que tem o arquivo bootstrap.css está inicialmente na\nChina.

\n

Utilizando a CDN você não vai se conectar à China.

\n

Você se conecta a algum lugar mais próximo. Como os Estado Unidos.

\n

Analise a imagem a seguir:

\n

\"cdn-example\"

\n

Se estiver na África, não se conecta à Europa. Conecta-se à África.

\n

Se estiver na Austrália, não se conecta à Europa. Conecta-se à Austrália.

\n

Isto faz com que os arquivos demorem menos para carregar (e sua página\ntambém).

\n

Sigamos com Bootstrap.

\n

Agora sim, já que está adicionado ao nosso projeto, podemos começar a testar um\npouco de tudo o que nos oferece:

\n

Uma grid, ícones, botões, barras de navegação, etc.

\n

\"Bootstrap\"

\n

A grid de Bootstrap é composta por 12 colunas e conta com os elementos típicos\nde um grid system (como rows e columns). Também possui tipos de\ncontêineres (container-fluid e container) e colunas para diferentes tamanhos\nde telas.

\n

| Classe | Dispositivo | Medida |\n| :-------: | :------: | :-----: |\n| col-xs- | móvel | < 768 px |\n| col-sm- | tablets | >= 768 px|\n| col-md- | desktop | >= 992 px |\n| col-lg- | Desktop maior| >= 1200 px |

\n

Além da grid e do que mencionamos antes, Bootstrap conta com muitos componentes\nque podemos reutilizar todas as vezes que sejam necessários.

\n

Como fazemos uso deste grande poder?

\n

Para utilizar o que já nos oferece nosso framework, só necessitamos ir à sua\npágina, procurar o componente que queremos utilizar e copiar e colar em nosso\nHTML o código.

\n

\"Bootstrap-btn\"

\n

E assim fácil e maravilhosamente já temos nossos botões.

\n

Se quisermos saber um pouco mais sobre Bootstrap e como funciona\naqui\nhá uma série de vídeos, mas sempre é mais divertido testá-lo nós mesmas.

" + "body": "

Objetivos de Aprendizagem

\n
    \n
  • Conhecer e entender o que é o Bootstrap.
  • \n
\n

O que é Bootstrap?

\n

Bootstrap é um incrível framework que torna o desenvolvimento web front-end muito\nmais rápido e mais fácil.

\n

Inicialmente foi criado como uma solução interna para o Twitter e posteriormente\nfoi liberado ao público em agosto de 2011 como um projeto open source no\nGitHub.

\n

\"Bootstrap\"

\n

Foi feito para que possa ser utilizado por pessoas de todos os níveis, por\ndispositivos de todas as formas e projetos de todos os tamanhos.

\n

Bootstrap tem várias versões. A mais popular é a versão 4 e é a que\naprenderemos. Podemos encontrar o Bootstrap aqui.

\n

Podemos utilizar o Bootstrap em nossos projetos de diferentes formas, seja\nadicionando o código CDN ao nosso HTML para usá-lo de maneira remota ou baixando\no Bootstrap na sua página web.

\n

\"Bootstrap\"

\n

Se utilizarmos as opções de baixar o Bootstrap, devemos descompactar e adicionar\nos arquivos do framework ao projeto. Além disso, devemos linkar todos no HTML\npara que funcione.

\n

\"Bootstrap\"

\n

Falando em CDN, precisamos entender: O que é CDN?

\n

Imagine que você queira usar o CSS de Bootstrap ou de alguma outra biblioteca.\nPoderíamos simplesmente baixar o arquivo .css ou .js e adicioná-lo a nosso HTML.\nMas, o que acontece se esse arquivo NÃO está no nosso computador e sim em\nalgum lugar da internet?

\n

Quando temos o arquivo em algum lugar da internet, na verdade está em outro\ncomputador em algum lugar do mundo.

\n

O que acontecerá se este computador estiver no outro lado do mundo? Na China?\nCoreia?

\n

Você acha que a distância do nosso computador (que vai utilizar o arquivo) e o\ncomputador que tem o arquivo afeta o carregamento da página?

\n

Sim, afeta muito.

\n

Isto é porque conectar-se a um computador do outro lado do mundo é mais demorado\nque conectar-se ao computador que está ao nosso lado.

\n

CDN significa Content Delivery Network (Rede de distribuição de conteúdo).

\n

Imaginemos que o computador que tem o arquivo bootstrap.css está inicialmente na\nChina.

\n

Utilizando a CDN você não vai se conectar à China.

\n

Você se conecta a algum lugar mais próximo. Como os Estado Unidos.

\n

Analise a imagem a seguir:

\n

\"cdn-example\"

\n

Se estiver na África, não se conecta à Europa. Conecta-se à África.

\n

Se estiver na Austrália, não se conecta à Europa. Conecta-se à Austrália.

\n

Isto faz com que os arquivos demorem menos para carregar (e sua página\ntambém).

\n

Sigamos com Bootstrap.

\n

Agora sim, já que está adicionado ao nosso projeto, podemos começar a testar um\npouco de tudo o que nos oferece:

\n

Uma grid, ícones, botões, barras de navegação, etc.

\n

\"Bootstrap\"

\n

A grid de Bootstrap é composta por 12 colunas e conta com os elementos típicos\nde um grid system (como rows e columns). Também possui tipos de\ncontêineres (container-fluid e container) e colunas para diferentes tamanhos\nde telas.

\n

| Classe | Dispositivo | Medida |\n| :-------: | :------: | :-----: |\n| col-xs- | móvel | < 768 px |\n| col-sm- | tablets | >= 768 px|\n| col-md- | desktop | >= 992 px |\n| col-lg- | Desktop maior| >= 1200 px |

\n

Além da grid e do que mencionamos antes, Bootstrap conta com muitos componentes\nque podemos reutilizar todas as vezes que sejam necessários.

\n

Como fazemos uso deste grande poder?

\n

Para utilizar o que já nos oferece nosso framework, só necessitamos ir à sua\npágina, procurar o componente que queremos utilizar e copiar e colar em nosso\nHTML o código.

\n

\"Bootstrap-btn\"

\n

E assim fácil e maravilhosamente já temos nossos botões.

\n

Se quisermos saber um pouco mais sobre Bootstrap e como funciona\n\nhá uma série de vídeos, mas sempre é mais divertido testá-lo nós mesmas.

" } } }, @@ -393,11 +393,11 @@ "intl": { "es": { "title": "Materialize y otros", - "body": "

Objetivos de Aprendizaje

\n
    \n
  • Conocer y manipular otros frameworks.
  • \n
\n

Materialize y otros frameworks

\n

Bootstrap no podía ser el único framework en existir. Aquí veremos otros que\nson bastante populares y fuertes competidores de Bootstrap:

\n

\"Materializecss\"

\n

Materialize es un framework de CSS basado en Material Design. Cuenta con\nuna serie de herramientas y componentes predefinidos como modales, botones,\nmenús, formularios, preloaders entre otros. Además posee un sistema de grillas\nque facilita el desarrollo para distintos tamaños y dispositivos e integra la\nfuente Roboto propuesta por Google en su estilo de diseño.

\n

Materialize también posee cuatro tipos diferentes\nde columnas: s, m, l y xl.

\n

\"Foundation\"

\n

Foundation es un framework responsive que incluye componentes de\ntipografía, formularios, botones, barras de navegación y otros, así como\nextensiones de Javascript opcionales. Foundation\nestá mantenida por zurb.com y es un proyecto de código abierto.\nFoundation también posee un framework para email responsive.

\n

Y entonces, ¿cuál usamos?, ¿cuál es mejor?

\n

Aquí es a consideración de cada una y la única manera de saber cuál nos\nfunciona o gusta más es haciendo uso de ellos. Probar y variar, a prueba y\nerror!

\n

Material adicional

\n

Si quieres practicar un poco sobre como funcionan estos 2 frameworks, acá te\ndejamos unos pequeños cursos que podrás hacer en tu tiempo libre ;)

\n
    \n
  1. Materialize
  2. \n
  3. Foundation
  4. \n
" + "body": "

Objetivos de Aprendizaje

\n
    \n
  • Conocer y manipular otros frameworks.
  • \n
\n

Materialize y otros frameworks

\n

Bootstrap no podía ser el único framework en existir. Aquí veremos otros que\nson bastante populares y fuertes competidores de Bootstrap:

\n

\"Materializecss\"

\n

Materialize es un framework de CSS basado en Material Design. Cuenta con\nuna serie de herramientas y componentes predefinidos como modales, botones,\nmenús, formularios, preloaders entre otros. Además posee un sistema de grillas\nque facilita el desarrollo para distintos tamaños y dispositivos e integra la\nfuente Roboto propuesta por Google en su estilo de diseño.

\n

Materialize también posee cuatro tipos diferentes\nde columnas: s, m, l y xl.

\n

\"Foundation\"

\n

Foundation es un framework responsive que incluye componentes de\ntipografía, formularios, botones, barras de navegación y otros, así como\nextensiones de Javascript opcionales. Foundation\nestá mantenida por zurb.com y es un proyecto de código abierto.\nFoundation también posee un framework para email responsive.

\n

Y entonces, ¿cuál usamos?, ¿cuál es mejor?

\n

Aquí es a consideración de cada una y la única manera de saber cuál nos\nfunciona o gusta más es haciendo uso de ellos. Probar y variar, a prueba y\nerror!

\n

Material adicional

\n

Si quieres practicar un poco sobre como funcionan estos 2 frameworks, acá te\ndejamos unos pequeños cursos que podrás hacer en tu tiempo libre ;)

\n
    \n
  1. Materialize
  2. \n
  3. \n
" }, "pt": { "title": "Materialize e outros", - "body": "

Objetivos de Aprendizagem

\n
    \n
  • Conhecer e manipular outros frameworks.
  • \n
\n

Materialize e outros frameworks

\n

Bootstrap não poderia ser o único framework a existir. Aqui veremos outros que\nsão bastante populares e fortes competidores de Bootstrap:

\n

\"Materializecss\"

\n

Materialize é um framework de CSS baseado em Material Design. Com uma\nsérie de ferramentas e componentes predefinidos como boas práticas, botões,\nmenus, formulários entre outros. Ele também tem um sistema de grid que\nfacilita o desenvolvimento para diferentes tamanhos e dispositivos e integra o\nfonte Roboto proposto pelo Google em seu estilo de projeto.

\n

Materialize também possui quatro tipos diferentes\nde colunas: s, m, l y, xl.

\n

\"Foundation\"

\n

Foundation é um framework responsivo que inclui componentes de tipografia,\nformulários, botões, barras de navegação e outros, assim como extensões\nJavascript opcionais. Foundation é mantida por\nzurb.com e é um projeto de código aberto. Foundation também possui um framework\npara e-mail responsivo.

\n

E então, qual usamos? Qual é melhor?

\n

Aqui é uma escolha de cada uma e a única maneira de saber qual nos funciona ou\ngostamos mais é fazendo uso deles. Testar e variar, testar e errar!

\n

Material adicional

\n

Se quiser praticar um pouco sobre como funcionam esses dois frameworks, aqui\ndeixamos pequenos cursos que poderá fazer em seu tempo livre

\n
    \n
  1. Materialize
  2. \n
  3. Foundation
  4. \n
" + "body": "

Objetivos de Aprendizagem

\n
    \n
  • Conhecer e manipular outros frameworks.
  • \n
\n

Materialize e outros frameworks

\n

Bootstrap não poderia ser o único framework a existir. Aqui veremos outros que\nsão bastante populares e fortes competidores de Bootstrap:

\n

\"Materializecss\"

\n

Materialize é um framework de CSS baseado em Material Design. Com uma\nsérie de ferramentas e componentes predefinidos como boas práticas, botões,\nmenus, formulários entre outros. Ele também tem um sistema de grid que\nfacilita o desenvolvimento para diferentes tamanhos e dispositivos e integra o\nfonte Roboto proposto pelo Google em seu estilo de projeto.

\n

Materialize também possui quatro tipos diferentes\nde colunas: s, m, l y, xl.

\n

\"Foundation\"

\n

Foundation é um framework responsivo que inclui componentes de tipografia,\nformulários, botões, barras de navegação e outros, assim como extensões\nJavascript opcionais. Foundation é mantida por\nzurb.com e é um projeto de código aberto. Foundation também possui um framework\npara e-mail responsivo.

\n

E então, qual usamos? Qual é melhor?

\n

Aqui é uma escolha de cada uma e a única maneira de saber qual nos funciona ou\ngostamos mais é fazendo uso deles. Testar e variar, testar e errar!

\n

Material adicional

\n

Se quiser praticar um pouco sobre como funcionam esses dois frameworks, aqui\ndeixamos pequenos cursos que poderá fazer em seu tempo livre

\n
    \n
  1. Materialize
  2. \n
  3. \n
" } } }, diff --git a/dist/topics/functional.json b/dist/topics/functional.json index 2d0b3ab08..bbfacfc3b 100644 --- a/dist/topics/functional.json +++ b/dist/topics/functional.json @@ -2,9 +2,9 @@ "slug": "functional", "repo": "Laboratoria/bootcamp", "path": "topics/functional", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:34.714Z", + "createdAt": "2023-05-17T20:37:15.352Z", "track": "web-dev", "intl": { "es": { @@ -44,7 +44,7 @@ "intl": { "es": { "title": "Funciones puras", - "body": "

Las funciones puras tienen aplicaciones en muchos ámbitos, entre ellos la\nprogramación funcional. También facilitan la concurrencia, y como veremos en\nsiguientes etapas serán muy empleadas en aplicaciones basadas en React+Redux.

\n

Anteriormente mencionamos que una función es básicamente un proceso que toma una\nentrada o argumentos, y produce una salida o valor de retorno. También hemos\nvisto que las funciones se emplean con ciertos propósitos:

\n
    \n
  • Manipulación de datos: Transforma una serie de argumentos o entrada en un\nvalor de retorno. Un ejemplo de esto sería hacer flattening1 de\nun objeto muy anidado.
  • \n
  • Procedimientos: Una función puede ser llamada para realizar una serie de\npasos (receta). La secuencia es conocida como procedimiento (primero haz\nesto, luego haz aquello), el estilo de programación bajo este estilo se\ndenomina programación por procedimientos, la cual está enmarcada en la\nprogramación imperativa, donde se usan sentencias que modifican o mutan el\nestado del programa, de la misma forma en la que mandatos imperativos expresan\ncomandos en nuestro lenguaje natural, un programa imperativo consiste en\ncomandos que la computadora debe realizar. La programación imperativa se\nenfoca en describir cómo un programa opera, mientras que en la programación\nfuncional nos enfocamos en qué debe realizar un programa sin especificar\ncómo dicho programa debe alcanzar el resultado.
  • \n
  • Entrada/Salida: Algunas funciones existen para comunicarse con otras partes\no subsistemas, por ejemplo: la pantalla, almacenamiento, registro de\noperaciones en disco, operaciones a través de la red.
  • \n
\n

Una vez vistas las diversas aplicaciones de las funciones procedamos a dejar\nclaro que significa una función pura.

\n
\n

Toda función que dados los mismos inputs siempre retorna lo mismo, y sin\nefectos secundarios, es una función pura.

\n
\n

En programación funcional, el comportamiento de las funciones depende de una\ny solo una cosa: los argumentos pasados explícitamente a la función. Esto quiere\ndecir que si proporcionas los mismos datos como argumentos o entrada, la función\nsiempre debe producir el mismo valor de retorno. A esta propiedad se le conoce\ncomo transparencia referencial.

\n

Lo mencionado en el párrafo anterior, hace que en las funciones puras sea más\nfácil apreciar todas las circunstancias que pueden presentarse, incluyendo\naquellos escenarios que resultan en errores. Escribir funciones que solo\ndependen de sus argumentos para definir su comportamiento también facilita\nreplicar bugs o poner en práctica Test-Driven Development (TDD por sus\nsiglas en inglés).

\n

Comencemos desarrollando nuestros casos de pruebas:

\n

lowercaser.test.js.

\n
const lowerCaser = require('./lowercaser')\n\ntest('Should take an input string and returns it lowercased', () => {\n  expect(lowerCaser('LOREM IPSUM')).toBe('lorem ipsum')\n})\n
\n
\n

NOTA:

\n

A lo largo del curso usaremos Jest como framework para la ejecución de\npruebas unitarias. Puedes instalar Jest por medio de npm al ejecutar el\nsiguiente comando:

\n
npm install --save-dev jest\n
\n

O también puedes usar yarn al ejecutar:

\n
yarn add --dev jest\n
\n

Para correr las pruebas haremos:

\n
yarn run jest -- fichero.test.js\n
\n
\n

Ahora, pasemos a implementar lo especificado en nuestros casos de pruebas:

\n

lowercaser.js.

\n
const lowerCaser = input => input.toString().toLowerCase()\n\nmodule.exports = lowerCaser\n
\n

Una vez completada nuestra implementación inicial, corroboremos nuestro trabajo\npor medio de la ejecución de las pruebas:

\n
$ yarn run jest -- lowercaser.test.js\n\nPASS  ./lowercaser.test.js\n   ✓ Should take an input string and returns it lowercased (15ms)\n\n   Test Suites: 1 passed, 1 total\n   Tests:       1 passed, 1 total\n   Snapshots:   0 total\n   Time:        0.859s, estimated 1s\n   Ran all test suites matching \"lowercaser.test.js\".\n
\n

Parece que todo funciona como se espera. Continuemos.

\n

Dada la misma entrada, devuelve siempre la misma salida

\n

Con nuestra función lowerCaser(), podemos reemplazar la llamada de la función\npor el resultado, y el código tendrá el mismo significado lowerCaser('LOREM IPSUM') siempre será lo mismo que lorem ipsum en su programa, sin importar el\ncontexto, cuántas veces lo llame o cuándo lo llame.

\n

Pero no se puede decir lo mismo de todas las funciones. Algunas funciones se\nbasan en información distinta de los argumentos que se transmiten para producir\nresultados. Considera este ejemplo:

\n
Math.random() // => 0.4011148700956255\nMath.random() // => 0.8533405303023756\nMath.random() // => 0.3550692005082965\n
\n

A pesar de que no pasamos ningún argumento en ninguna de las llamadas a la\nfunción, todos produjeron resultados diferentes, lo que significa que\nMath.random() no es una función pura. Math.random() produce un nuevo\nnúmero aleatorio entre 0 y 1 cada vez que lo ejecutas, entonces es obvio que no\nse podría simplemente reemplazarlo por 0.4011148700956255 sin cambiar el\nsignificado del programa.

\n

Eso produciría el mismo resultado cada vez que se ejecute el programa. Cuando le\npedimos a la computadora un número aleatorio, por lo general significa que\nqueremos un resultado diferente al que obtuvimos la última vez. ¿Cuál es el\nsentido de un par de dados con los mismos números impresos en todas las caras? A\nveces tenemos que preguntarle a la computadora por la hora actual. No vamos a\nentrar en detalles de cómo funcionan las funciones de tiempo. Por ahora,\nsimplemente copia este código:

\n
const time = () => new Date().toLocaleTimeString()\ntime() // => \"5:15:45 PM\"\n
\n

¿Qué sucedería si reemplazo la llamada de la función time() con la hora\nactual? Siempre diría que es la misma hora: la hora con la cual la llamada a la\nfunción se reemplazó. En otras palabras, solo podría producir la salida correcta\nuna vez al día, y solo si se ejecuta el programa en el momento exacto en que la\nhora se reemplazó por la función.

\n

Entonces, claramente, time() no es como la función lowerCaser().

\n

Una función solo es pura si, dada la misma entrada, siempre producirá la misma\nsalida. Tal vez recuerdes esta regla de la clase de álgebra: los mismos valores\nde entrada se asignarán siempre al mismo valor de salida. Sin embargo, muchos\nvalores de entrada se pueden asignar al mismo valor de salida. Por ejemplo, la\nsiguiente función es pura:

\n
const highpass = (cutoff, value) => value >= cutoff;\n
\n

Los mismos valores de entrada se asignarán siempre al mismo valor de salida:

\n
highpass(5, 5) // => true\nhighpass(5, 5) // => true\nhighpass(5, 5) // => true\n
\n

Muchos valores de entrada tal vez se pueden asignar al mismo valor de salida:

\n
highpass(5, 123) // true\nhighpass(5, 6)   // true\nhighpass(5, 18)  // true\nhighpass(5, 1)   // false\nhighpass(5, 3)   // false\nhighpass(5, 4)   // false\n
\n

Efectos colaterales

\n

En este punto cabe aclarar que las funciones puras no producen efectos\ncolaterales o side-effects, pues el propósito de vida de una función pura es\núnicamente calcular el valor de retorno, solo eso y nada más.

\n

En las ciencias de la computación, una función o expresión se dice que tiene\nefectos colaterales si modifica algún estado fuera de su ámbito (scope), o si\ntiene interacciones observables con la función que la invocó, o si modifica el\nmundo exterior aparte de retornar el valor esperado. Por ejemplo, una función\nparticular podría modificar una variable global (estado fuera de su ámbito),\nmodificar uno de los argumentos mutables (interactuar con la función la invocó),\nlevantar una excepción, escribir datos a un fichero o llamar a otra función que\nsi tiene efectos colaterales. Ten en cuenta que ante la presencia de funciones\ncon efectos colaterales, el comportamiento de un programa podría depender de su\nhistoria, esto quiere decir que el orden de evaluación importa. Por lo tanto, la\ncomprensión y análisis de una función con efectos colaterales requiere\nconocimientos acerca de su contexto y su posible historia, lo cual hace más\ndifícil la corrección de errores. En la programación funcional, los efectos\ncolaterales se usan con moderación.

\n

Veamos un ejemplo de efecto colateral y cómo podemos evitarlo.

\n

Supongamos que deseamos crear una función que concatene dos arrays que pueden\ncontener elementos anidados, tratemos de emular el siguiente comportamiento:

\n

concat.test.js.

\n
const concat = require('./concat')\n\ntest('should concatenate array on the right with array on the left', () => {\n  const left = [1, [2], 3]\n  const right = [[4], 5, [6, 7], 8]\n  const expected = [1, [2], 3, [4], 5, [6, 7], 8]\n\n  expect(concat(left, right)).toEqual(expected)\n})\n
\n

Una implementación inicial puede ser la siguiente:

\n

concat.js.

\n
const concat = (left, right) => {\n  const result = left\n\n  right.map(item => {\n    result.push(item)\n  })\n\n  return result\n}\n\nmodule.exports = concat\n
\n
\n

Nota

\n

Ten en cuenta que esta implementación es a modo de ejemplo, en realidad\npodríamos usar Array.prototype.concat() directamente.

\n
\n

Comprobemos nuestro trabajo:

\n
$ yarn run jest -- concat.test.js\n\n PASS  ./concat.test.js\n   ✓ should concatenate the array on the right with the array on the left (3ms)\n\n   Test Suites: 1 passed, 1 total\n   Tests:       1 passed, 1 total\n   Snapshots:   0 total\n   Time:        0.67s, estimated 1s\n   Ran all test suites matching \"concat.test.js\".\n
\n

Todo parece indicar que nuestra función tiene un comportamiento correcto, ahora\nagreguemos un caso de prueba para comprobar que no estamos alterando el contexto\nexterno:

\n

concat.test.js.

\n
const concat = require('./concat')\n\ntest('should concatenate array on the right with array on the left', () => {\n  const left = [1, [2], 3]\n  const right = [[4], 5, [6, 7], 8]\n  const expected = [1, [2], 3, [4], 5, [6, 7], 8]\n\n  expect(concat(left, right)).toEqual(expected)\n})\n\ntest('should not mutate external context', () => {\n  const left = [1, [2], 3]\n  const right = [[4], 5, [6, 7], 8]\n  const backup = Object.assign([], left)\n\n  concat(left, right)\n\n  expect(left).toEqual(backup)\n})\n
\n

Al ejecutar las pruebas obtenemos lo siguiente:

\n
$ yarn run jest -- concat.test.js\n FAIL  ./concat.test.js\n  ● should not mutate external context\n\n    expect(received).toEqual(expected)\n\n    Expected value to equal:\n      [1, [2], 3]\n    Received:\n      [1, [2], 3, [4], 5, [6, 7], 8]\n\n  ...\n\n  ✓ should concatenate the array on the right with the array on the left (4ms)\n  ✕ should not mutate external context (6ms)\n\nTest Suites: 1 failed, 1 total\nTests:       1 failed, 1 passed, 2 total\nSnapshots:   0 total\nTime:        1.011s\nRan all test suites matching \"concat.test.js\".\n
\n

Ouch!, con esto se demuestra que nuestra función no es pura, pues\nestamos alterando el contexto externo, lo cual es un tipo de efecto colateral.

\n

El comportamiento anterior sucede porque los objetos o arreglos pasados a las\nfunciones como argumento se pasan por referencia, no por copia, lo que significa\nque si una función muta una propiedad en un objeto o arreglo, supondría que\ndicha mutación sería accesible desde afuera de la función. Las funciones puras\nno deben alterar el estado externo.

\n

Si bien el valor de retorno de nuestra función es el esperado, el problema con\nla implementación actual es que hemos mutado un estado compartido. Imagina por\nun momento que otras funciones pueden depender del estado del arreglo u objeto\nasumiendo que su estado es el original (antes de llamar a nuestra función\nconcat), y ahora que hemos mutado ese estado compartido, tenemos que\npreocuparnos por el impacto que tendrá dicho cambio en la lógica del programa si\ncambiamos el orden en que se han llamado las funciones. Refactorizar el código\npodría resultar en errores apareciendo aquí y allá, lo que podría arruinar la\nlógica general de nuestra aplicación, y como resultado muchos clientes\ndisgustados.

\n

Veamos ahora cómo podemos corregir esta situación:

\n

concat.js.

\n
const concat = (left, right) => {\n  const result = Object.assign([], left)\n\n  right.map(item => {\n    result.push(item)\n  })\n\n  return result\n}\n\nmodule.exports = concat\n
\n

Ahora al ejecutar las pruebas obtenemos lo siguiente:

\n
$ yarn run jest -- concat.test.js\n PASS  ./concat.test.js\n  ✓ should concatenate the array on the right with the array on the left (5ms)\n  ✓ should not mutate external context (1ms)\n\nTest Suites: 1 passed, 1 total\nTests:       2 passed, 2 total\nSnapshots:   0 total\nTime:        0.977s\nRan all test suites matching \"concat.test.js\".\n
\n

¿Recuerdas que antes habíamos mencionado que podíamos haber usado\nArray.prototype.concat directamente?, pues veamos una simplificación del\ncódigo:

\n

concat.js.

\n
const concat = (left, right) => {\n  return left.concat(right)\n}\n\nmodule.exports = concat\n
\n

Si ejecutas de nuevo las pruebas unitarias verás que cumplimos con todas las\ncondiciones.

\n
\n

NOTA: Es común usar métodos como Array#slice, Array#map o Array#filter\nademás de Array#concat para crear copias de arreglos. En ES6 también\ntenemos el spread operator que nos permite copiar las propiedades enumerables\nde un arreglo u objeto de esta forma:

\n
const array = [1, 2, 3];\nconst arrayCopy = [...a]; // `b` es un nuevo arreglo con los elementos de `a`.\n\nconst obj = { foo: 'bar' };\nconst objCopy = {...obj};\n
\n
\n

Beneficios

\n

Una vez analizadas las funciones puras, volvamos a repasar los beneficios que\nofrecen, tal como vimos en la apertura de esta unidad:

\n
    \n
  • Toman ciertos argumentos como entrada y generan un valor de retorno que\nexclusivamente depende de los argumentos dados.
  • \n
  • Representan bloques de código reusable dentro de un programa.
  • \n
  • Promueven buenas prácticas de desarrollo como DRY\n(Don’t Repeat Yourself) y KISS (Keep It Simple, Stupid).
  • \n
  • Al no depender del contexto externo, son inmunes a toda clase de errores o\nbugs que tienen que ver con el estado mutable compartido.
  • \n
  • Su naturaleza independiente las hace excelentes candidatos para procesamiento\nconcurrente a lo largo de muchos CPUs e incluso para la computación\ndistribuida, lo cual las hace esenciales para la ejecución de tareas de\ncálculo científico y de uso intensivo de recursos.
  • \n
  • Su aislamiento facilita la refactorización y reorganización del código,\nhaciendo tú código más adaptable y flexible a futuros cambios.
  • \n
  • Es mucho más sencillo el desarrollo de pruebas unitarias contra funciones\npuras.
  • \n
  • Las funciones puras representan la base de la programación funcional.
  • \n
\n

Por las razones antes mencionadas, recomendamos favorecer la implementación de\nfunciones puras. Por lo tanto, siempre que sea práctico implementar los\nrequerimientos de un programa usando funciones puras, debes darle preferencia\nsobre otras opciones.

\n

Referencias

\n\n

Notas al pie

\n
    \n
  1. Algunas veces necesitamos aplanar árboles u objetos muy anidados que son\nresultado de una consulta o query, un patrón común es convertirlos en\narreglos o arrays para luego poder aplicar operaciones como filter() o\nmap() sobre ellos.
  2. \n
" + "body": "

Las funciones puras tienen aplicaciones en muchos ámbitos, entre ellos la\nprogramación funcional. También facilitan la concurrencia, y como veremos en\nsiguientes etapas serán muy empleadas en aplicaciones basadas en React+Redux.

\n

Anteriormente mencionamos que una función es básicamente un proceso que toma una\nentrada o argumentos, y produce una salida o valor de retorno. También hemos\nvisto que las funciones se emplean con ciertos propósitos:

\n
    \n
  • Manipulación de datos: Transforma una serie de argumentos o entrada en un\nvalor de retorno. Un ejemplo de esto sería hacer flattening1 de\nun objeto muy anidado.
  • \n
  • Procedimientos: Una función puede ser llamada para realizar una serie de\npasos (receta). La secuencia es conocida como procedimiento (primero haz\nesto, luego haz aquello), el estilo de programación bajo este estilo se\ndenomina programación por procedimientos, la cual está enmarcada en la\nprogramación imperativa, donde se usan sentencias que modifican o mutan el\nestado del programa, de la misma forma en la que mandatos imperativos expresan\ncomandos en nuestro lenguaje natural, un programa imperativo consiste en\ncomandos que la computadora debe realizar. La programación imperativa se\nenfoca en describir cómo un programa opera, mientras que en la programación\nfuncional nos enfocamos en qué debe realizar un programa sin especificar\ncómo dicho programa debe alcanzar el resultado.
  • \n
  • Entrada/Salida: Algunas funciones existen para comunicarse con otras partes\no subsistemas, por ejemplo: la pantalla, almacenamiento, registro de\noperaciones en disco, operaciones a través de la red.
  • \n
\n

Una vez vistas las diversas aplicaciones de las funciones procedamos a dejar\nclaro que significa una función pura.

\n
\n

Toda función que dados los mismos inputs siempre retorna lo mismo, y sin\nefectos secundarios, es una función pura.

\n
\n

En programación funcional, el comportamiento de las funciones depende de una\ny solo una cosa: los argumentos pasados explícitamente a la función. Esto quiere\ndecir que si proporcionas los mismos datos como argumentos o entrada, la función\nsiempre debe producir el mismo valor de retorno. A esta propiedad se le conoce\ncomo transparencia referencial.

\n

Lo mencionado en el párrafo anterior, hace que en las funciones puras sea más\nfácil apreciar todas las circunstancias que pueden presentarse, incluyendo\naquellos escenarios que resultan en errores. Escribir funciones que solo\ndependen de sus argumentos para definir su comportamiento también facilita\nreplicar bugs o poner en práctica Test-Driven Development (TDD por sus\nsiglas en inglés).

\n

Comencemos desarrollando nuestros casos de pruebas:

\n

lowercaser.test.js.

\n
const lowerCaser = require('./lowercaser')\n\ntest('Should take an input string and returns it lowercased', () => {\n  expect(lowerCaser('LOREM IPSUM')).toBe('lorem ipsum')\n})\n
\n
\n

NOTA:

\n

A lo largo del curso usaremos Jest como framework para la ejecución de\npruebas unitarias. Puedes instalar Jest por medio de npm al ejecutar el\nsiguiente comando:

\n
npm install --save-dev jest\n
\n

O también puedes usar yarn al ejecutar:

\n
yarn add --dev jest\n
\n

Para correr las pruebas haremos:

\n
yarn run jest -- fichero.test.js\n
\n
\n

Ahora, pasemos a implementar lo especificado en nuestros casos de pruebas:

\n

lowercaser.js.

\n
const lowerCaser = input => input.toString().toLowerCase()\n\nmodule.exports = lowerCaser\n
\n

Una vez completada nuestra implementación inicial, corroboremos nuestro trabajo\npor medio de la ejecución de las pruebas:

\n
$ yarn run jest -- lowercaser.test.js\n\nPASS  ./lowercaser.test.js\n   ✓ Should take an input string and returns it lowercased (15ms)\n\n   Test Suites: 1 passed, 1 total\n   Tests:       1 passed, 1 total\n   Snapshots:   0 total\n   Time:        0.859s, estimated 1s\n   Ran all test suites matching \"lowercaser.test.js\".\n
\n

Parece que todo funciona como se espera. Continuemos.

\n

Dada la misma entrada, devuelve siempre la misma salida

\n

Con nuestra función lowerCaser(), podemos reemplazar la llamada de la función\npor el resultado, y el código tendrá el mismo significado lowerCaser('LOREM IPSUM') siempre será lo mismo que lorem ipsum en su programa, sin importar el\ncontexto, cuántas veces lo llame o cuándo lo llame.

\n

Pero no se puede decir lo mismo de todas las funciones. Algunas funciones se\nbasan en información distinta de los argumentos que se transmiten para producir\nresultados. Considera este ejemplo:

\n
Math.random() // => 0.4011148700956255\nMath.random() // => 0.8533405303023756\nMath.random() // => 0.3550692005082965\n
\n

A pesar de que no pasamos ningún argumento en ninguna de las llamadas a la\nfunción, todos produjeron resultados diferentes, lo que significa que\nMath.random() no es una función pura. Math.random() produce un nuevo\nnúmero aleatorio entre 0 y 1 cada vez que lo ejecutas, entonces es obvio que no\nse podría simplemente reemplazarlo por 0.4011148700956255 sin cambiar el\nsignificado del programa.

\n

Eso produciría el mismo resultado cada vez que se ejecute el programa. Cuando le\npedimos a la computadora un número aleatorio, por lo general significa que\nqueremos un resultado diferente al que obtuvimos la última vez. ¿Cuál es el\nsentido de un par de dados con los mismos números impresos en todas las caras? A\nveces tenemos que preguntarle a la computadora por la hora actual. No vamos a\nentrar en detalles de cómo funcionan las funciones de tiempo. Por ahora,\nsimplemente copia este código:

\n
const time = () => new Date().toLocaleTimeString()\ntime() // => \"5:15:45 PM\"\n
\n

¿Qué sucedería si reemplazo la llamada de la función time() con la hora\nactual? Siempre diría que es la misma hora: la hora con la cual la llamada a la\nfunción se reemplazó. En otras palabras, solo podría producir la salida correcta\nuna vez al día, y solo si se ejecuta el programa en el momento exacto en que la\nhora se reemplazó por la función.

\n

Entonces, claramente, time() no es como la función lowerCaser().

\n

Una función solo es pura si, dada la misma entrada, siempre producirá la misma\nsalida. Tal vez recuerdes esta regla de la clase de álgebra: los mismos valores\nde entrada se asignarán siempre al mismo valor de salida. Sin embargo, muchos\nvalores de entrada se pueden asignar al mismo valor de salida. Por ejemplo, la\nsiguiente función es pura:

\n
const highpass = (cutoff, value) => value >= cutoff;\n
\n

Los mismos valores de entrada se asignarán siempre al mismo valor de salida:

\n
highpass(5, 5) // => true\nhighpass(5, 5) // => true\nhighpass(5, 5) // => true\n
\n

Muchos valores de entrada tal vez se pueden asignar al mismo valor de salida:

\n
highpass(5, 123) // true\nhighpass(5, 6)   // true\nhighpass(5, 18)  // true\nhighpass(5, 1)   // false\nhighpass(5, 3)   // false\nhighpass(5, 4)   // false\n
\n

Efectos colaterales

\n

En este punto cabe aclarar que las funciones puras no producen efectos\ncolaterales o side-effects, pues el propósito de vida de una función pura es\núnicamente calcular el valor de retorno, solo eso y nada más.

\n

En las ciencias de la computación, una función o expresión se dice que tiene\nefectos colaterales si modifica algún estado fuera de su ámbito (scope), o si\ntiene interacciones observables con la función que la invocó, o si modifica el\nmundo exterior aparte de retornar el valor esperado. Por ejemplo, una función\nparticular podría modificar una variable global (estado fuera de su ámbito),\nmodificar uno de los argumentos mutables (interactuar con la función la invocó),\nlevantar una excepción, escribir datos a un fichero o llamar a otra función que\nsi tiene efectos colaterales. Ten en cuenta que ante la presencia de funciones\ncon efectos colaterales, el comportamiento de un programa podría depender de su\nhistoria, esto quiere decir que el orden de evaluación importa. Por lo tanto, la\ncomprensión y análisis de una función con efectos colaterales requiere\nconocimientos acerca de su contexto y su posible historia, lo cual hace más\ndifícil la corrección de errores. En la programación funcional, los efectos\ncolaterales se usan con moderación.

\n

Veamos un ejemplo de efecto colateral y cómo podemos evitarlo.

\n

Supongamos que deseamos crear una función que concatene dos arrays que pueden\ncontener elementos anidados, tratemos de emular el siguiente comportamiento:

\n

concat.test.js.

\n
const concat = require('./concat')\n\ntest('should concatenate array on the right with array on the left', () => {\n  const left = [1, [2], 3]\n  const right = [[4], 5, [6, 7], 8]\n  const expected = [1, [2], 3, [4], 5, [6, 7], 8]\n\n  expect(concat(left, right)).toEqual(expected)\n})\n
\n

Una implementación inicial puede ser la siguiente:

\n

concat.js.

\n
const concat = (left, right) => {\n  const result = left\n\n  right.map(item => {\n    result.push(item)\n  })\n\n  return result\n}\n\nmodule.exports = concat\n
\n
\n

Nota

\n

Ten en cuenta que esta implementación es a modo de ejemplo, en realidad\npodríamos usar Array.prototype.concat() directamente.

\n
\n

Comprobemos nuestro trabajo:

\n
$ yarn run jest -- concat.test.js\n\n PASS  ./concat.test.js\n   ✓ should concatenate the array on the right with the array on the left (3ms)\n\n   Test Suites: 1 passed, 1 total\n   Tests:       1 passed, 1 total\n   Snapshots:   0 total\n   Time:        0.67s, estimated 1s\n   Ran all test suites matching \"concat.test.js\".\n
\n

Todo parece indicar que nuestra función tiene un comportamiento correcto, ahora\nagreguemos un caso de prueba para comprobar que no estamos alterando el contexto\nexterno:

\n

concat.test.js.

\n
const concat = require('./concat')\n\ntest('should concatenate array on the right with array on the left', () => {\n  const left = [1, [2], 3]\n  const right = [[4], 5, [6, 7], 8]\n  const expected = [1, [2], 3, [4], 5, [6, 7], 8]\n\n  expect(concat(left, right)).toEqual(expected)\n})\n\ntest('should not mutate external context', () => {\n  const left = [1, [2], 3]\n  const right = [[4], 5, [6, 7], 8]\n  const backup = Object.assign([], left)\n\n  concat(left, right)\n\n  expect(left).toEqual(backup)\n})\n
\n

Al ejecutar las pruebas obtenemos lo siguiente:

\n
$ yarn run jest -- concat.test.js\n FAIL  ./concat.test.js\n  ● should not mutate external context\n\n    expect(received).toEqual(expected)\n\n    Expected value to equal:\n      [1, [2], 3]\n    Received:\n      [1, [2], 3, [4], 5, [6, 7], 8]\n\n  ...\n\n  ✓ should concatenate the array on the right with the array on the left (4ms)\n  ✕ should not mutate external context (6ms)\n\nTest Suites: 1 failed, 1 total\nTests:       1 failed, 1 passed, 2 total\nSnapshots:   0 total\nTime:        1.011s\nRan all test suites matching \"concat.test.js\".\n
\n

Ouch!, con esto se demuestra que nuestra función no es pura, pues\nestamos alterando el contexto externo, lo cual es un tipo de efecto colateral.

\n

El comportamiento anterior sucede porque los objetos o arreglos pasados a las\nfunciones como argumento se pasan por referencia, no por copia, lo que significa\nque si una función muta una propiedad en un objeto o arreglo, supondría que\ndicha mutación sería accesible desde afuera de la función. Las funciones puras\nno deben alterar el estado externo.

\n

Si bien el valor de retorno de nuestra función es el esperado, el problema con\nla implementación actual es que hemos mutado un estado compartido. Imagina por\nun momento que otras funciones pueden depender del estado del arreglo u objeto\nasumiendo que su estado es el original (antes de llamar a nuestra función\nconcat), y ahora que hemos mutado ese estado compartido, tenemos que\npreocuparnos por el impacto que tendrá dicho cambio en la lógica del programa si\ncambiamos el orden en que se han llamado las funciones. Refactorizar el código\npodría resultar en errores apareciendo aquí y allá, lo que podría arruinar la\nlógica general de nuestra aplicación, y como resultado muchos clientes\ndisgustados.

\n

Veamos ahora cómo podemos corregir esta situación:

\n

concat.js.

\n
const concat = (left, right) => {\n  const result = Object.assign([], left)\n\n  right.map(item => {\n    result.push(item)\n  })\n\n  return result\n}\n\nmodule.exports = concat\n
\n

Ahora al ejecutar las pruebas obtenemos lo siguiente:

\n
$ yarn run jest -- concat.test.js\n PASS  ./concat.test.js\n  ✓ should concatenate the array on the right with the array on the left (5ms)\n  ✓ should not mutate external context (1ms)\n\nTest Suites: 1 passed, 1 total\nTests:       2 passed, 2 total\nSnapshots:   0 total\nTime:        0.977s\nRan all test suites matching \"concat.test.js\".\n
\n

¿Recuerdas que antes habíamos mencionado que podíamos haber usado\nArray.prototype.concat directamente?, pues veamos una simplificación del\ncódigo:

\n

concat.js.

\n
const concat = (left, right) => {\n  return left.concat(right)\n}\n\nmodule.exports = concat\n
\n

Si ejecutas de nuevo las pruebas unitarias verás que cumplimos con todas las\ncondiciones.

\n
\n

NOTA: Es común usar métodos como Array#slice, Array#map o Array#filter\nademás de Array#concat para crear copias de arreglos. En ES6 también\ntenemos el spread operator que nos permite copiar las propiedades enumerables\nde un arreglo u objeto de esta forma:

\n
const array = [1, 2, 3];\nconst arrayCopy = [...a]; // `b` es un nuevo arreglo con los elementos de `a`.\n\nconst obj = { foo: 'bar' };\nconst objCopy = {...obj};\n
\n
\n

Beneficios

\n

Una vez analizadas las funciones puras, volvamos a repasar los beneficios que\nofrecen, tal como vimos en la apertura de esta unidad:

\n
    \n
  • Toman ciertos argumentos como entrada y generan un valor de retorno que\nexclusivamente depende de los argumentos dados.
  • \n
  • Representan bloques de código reusable dentro de un programa.
  • \n
  • Promueven buenas prácticas de desarrollo como DRY\n(Don’t Repeat Yourself) y KISS (Keep It Simple, Stupid).
  • \n
  • Al no depender del contexto externo, son inmunes a toda clase de errores o\nbugs que tienen que ver con el estado mutable compartido.
  • \n
  • Su naturaleza independiente las hace excelentes candidatos para procesamiento\nconcurrente a lo largo de muchos CPUs e incluso para la computación\ndistribuida, lo cual las hace esenciales para la ejecución de tareas de\ncálculo científico y de uso intensivo de recursos.
  • \n
  • Su aislamiento facilita la refactorización y reorganización del código,\nhaciendo tú código más adaptable y flexible a futuros cambios.
  • \n
  • Es mucho más sencillo el desarrollo de pruebas unitarias contra funciones\npuras.
  • \n
  • Las funciones puras representan la base de la programación funcional.
  • \n
\n

Por las razones antes mencionadas, recomendamos favorecer la implementación de\nfunciones puras. Por lo tanto, siempre que sea práctico implementar los\nrequerimientos de un programa usando funciones puras, debes darle preferencia\nsobre otras opciones.

\n

Referencias

\n\n

Notas al pie

\n
    \n
  1. Algunas veces necesitamos aplanar árboles u objetos muy anidados que son\nresultado de una consulta o query, un patrón común es convertirlos en\narreglos o arrays para luego poder aplicar operaciones como filter() o\nmap() sobre ellos.
  2. \n
" } } }, @@ -64,7 +64,7 @@ "slug": "discount", "prefix": "01", "path": "topics/functional/01-state/02-practice/01-discount", - "createdAt": "2023-04-04T20:28:34.713Z", + "createdAt": "2023-05-17T20:37:15.349Z", "env": "cjs", "intl": { "es": { @@ -82,7 +82,7 @@ "slug": "serialize-user", "prefix": "02", "path": "topics/functional/01-state/02-practice/02-serialize-user", - "createdAt": "2023-04-04T20:28:34.713Z", + "createdAt": "2023-05-17T20:37:15.349Z", "env": "cjs", "intl": { "es": { @@ -126,7 +126,7 @@ "slug": "parse-items", "prefix": "01", "path": "topics/functional/01-state/04-practice-2/01-parse-items", - "createdAt": "2023-04-04T20:28:34.713Z", + "createdAt": "2023-05-17T20:37:15.349Z", "env": "cjs", "intl": { "es": { @@ -205,7 +205,7 @@ "slug": "repeat", "prefix": "01", "path": "topics/functional/03-hof/02-practice/01-repeat", - "createdAt": "2023-04-04T20:28:34.714Z", + "createdAt": "2023-05-17T20:37:15.350Z", "env": "cjs", "intl": { "es": { @@ -249,7 +249,7 @@ "slug": "bound-logger", "prefix": "01", "path": "topics/functional/03-hof/04-practice-2/01-bound-logger", - "createdAt": "2023-04-04T20:28:34.714Z", + "createdAt": "2023-05-17T20:37:15.350Z", "env": "cjs", "intl": { "es": { @@ -267,7 +267,7 @@ "slug": "logger", "prefix": "02", "path": "topics/functional/03-hof/04-practice-2/02-logger", - "createdAt": "2023-04-04T20:28:34.714Z", + "createdAt": "2023-05-17T20:37:15.350Z", "env": "cjs", "intl": { "es": { @@ -291,7 +291,7 @@ "intl": { "es": { "title": "Aplicando curry en JavaScript funcional", - "body": "

La técnica de definir funciones atadas a múltiples parámetros como una serie de\nfunciones anidadas que solo esperan un parámetro fue popularizada por el\nmatemático Haskell Curry, aunque inicialmente observada por Frege en\n1893, a dicha cadena de funciones anidadas se les llama funciones curry o\ncurried functions.

\n

¿Qué es currying?

\n

En pocas palabras, currying es una técnica que traduce la evaluación de una\nfunción que toma múltiples argumentos en una evaluación de una secuencia de\nfunciones, cada una de funciones de la secuencia espera un único argumento.\nCurrying está relacionado con el concepto de aplicación\nparcial, pero no es lo mismo.

\n

Una función curry es una que retorna progresivamente una función más específica\npor cada uno de los argumentos dados hasta que ya no sean necesarios más\nparámetros. Una función parcialmente aplicada, por otra parte, es una función\nque es \"parcialmente\" ejecutada y está lista para su inmediata ejecución una vez\ndado el resto de los parámetros esperados.

\n

El currying es elemental en la mayoría de los lenguajes de programación\nfuncional, por ejemplo Haskell o Scala. A pesar que JavaScript ofrece soporte\npara algunas características funcionales, al menos en las versiones actuales, el\ncurrying no es una de ellas. Sin embargo, podemos emular este patrón con las\ncaracterísticas actuales del lenguaje.

\n

Para darte una idea de cómo este concepto podría funcionar, vamos a crear\nnuestra primera función curry en JavaScript, utilizando la sintaxis familiar\npara construir la funcionalidad currying que queremos. Como ejemplo,\nimaginemos una función que salude a alguien por su nombre. Todos sabemos cómo\ncrear una función simple de saludo que toma un nombre y un saludo, y registra el\nsaludo con el nombre:

\n
const greet = (greeting, name) => `${greeting}, ${name}`\n\ntest('Should say Hello', () => {\n  expect(greet('Hello', 'Heidi')).toBe('Hello, Heidi')\n})\n
\n

Esta función requiere que el nombre y el saludo se pasen como argumentos para\nque funcione correctamente. Pero podríamos reescribir la función usando\ncurrying anidado simple, de modo que la función básica sólo requiera un\nsaludo, y devuelve otra función que toma el nombre de la persona que queremos\nsaludar.

\n

Nuestro primer curry

\n
const greetCurried = greeting => name => `${greeting}, ${name}`\n
\n

Este pequeño ajuste a la forma en que escribimos la función anterior nos permite\ncrear una nueva función para cualquier tipo de saludo, y pasar a esa nueva\nfunción el nombre de la persona que queremos saludar:

\n
test('Should allow to reuse functions', () => {\n  const greetHello = greetCurried('Hello')\n\n  expect(greetHello('Heidi')).toBe('Hello, Heidi')\n  expect(greetHello('Eddie')).toBe('Hello, Eddie')\n})\n
\n

También podemos llamar a la función en modo curry original directamente,\nsimplemente pasando cada uno de los parámetros en un conjunto separado de\nparéntesis, uno después del otro:

\n
test('Should work with all the parameters', () => {\n  expect(greetCurried('Hi there')('Howard')).toBe('Hi there, Howard')\n})\n
\n

Apliquemos curry a todo

\n

Lo bueno es que ahora que hemos aprendido a modificar nuestra función\ntradicional para usar este enfoque para manejar los argumentos, podemos hacerlo\ncon tantos argumentos como queramos:

\n
const greetDeeplyCurried = greeting =>\n  separator =>\n    emphasis =>\n      name =>\n        `${greeting}${separator}${name}${emphasis}`\n
\n

Tenemos la misma flexibilidad con cuatro argumentos que con dos. No importa lo\nlejos que vaya el anidamiento, podemos crear nuevas funciones personalizadas\npara saludar a tantas personas como escojamos de tantas maneras como nos\nconvenga:

\n
test('Should allow nested calls', () => {\n  const greetAwkwardly = greetDeeplyCurried('Hello')('...')('?')\n\n  expect(greetAwkwardly('Heidi')).toBe('Hello...Heidi?')\n  expect(greetAwkwardly('Eddie')).toBe('Hello...Eddie?')\n})\n
\n

Además, podemos pasar tantos parámetros como quisiéramos al crear variaciones\npersonalizadas de nuestra función curry original, creando nuevas funciones que\nson capaces de tomar el número apropiado de parámetros adicionales, cada uno se\npasa por separado en su propio conjunto de paréntesis:

\n
test('Other variations', () => {\n  const sayHello = greetDeeplyCurried('Hello')(', ')\n\n  expect(sayHello('.')('Heidi')).toBe('Hello, Heidi.')\n  expect(sayHello('.')('Eddie')).toBe('Hello, Eddie.')\n
\n

Y se pueden definir variaciones subordinadas:

\n
  const askHello = sayHello('?')\n\n  expect(askHello('Heidi')).toBe('Hello, Heidi?')\n  expect(askHello('Eddie')).toBe('Hello, Eddie?')\n})\n
\n

Aplicando curry a funciones tradicionales

\n

Puedes ver lo poderoso que es este enfoque, especialmente si necesitas crear\nmuchas funciones personalizadas muy detalladas. El único problema es la\nsintaxis, pues a medida que construyes estas funciones con curry, debes\nmantener las funciones devueltas anidadas, y llamarlas con nuevas funciones que\nrequieran varios conjuntos de paréntesis, cada uno conteniendo su propio\nargumento aislado. Se puede poner difícil y enredado.

\n

Antes de abordar la implementación de nuestra función curry, consideremos por\nejemplo que para toda función f(x, y), existe una función f' tal que\nf'(x) es una función que puede ser aplicada a y que obtenga\n(f'(x))(y) = f(x, y).

\n

La función f' del ejemplo anterior es llamada forma curried de la función.\nDesde una perspectiva de programación funcional, currying puede ser descrita\npor la función: curry : ((a, b) -> c) -> (a -> b -> c)

\n

Ahora bien, un enfoque es crear una función de orden superior (Higher\nOrder Function en inglés) que tome como argumento una función existente que\nfue escrita sin todas las devoluciones anidadas (uncurried form). Nuestra\nfunción de orden superior debe retornar otra función que espera un solo\nargumento,...

\n
const curryIt = f => x => {\n  // ...\n}\n
\n

Luego que se suministra dicho argumento se procede a verificar si el número de\nargumentos esperados (Function.length) por la función uncurried es igual o\nmenor a 1, de ser así ejecuta dicha función, esta condición particular también\nnos servirá como condición de parada en nuestra llamada recursiva.

\n
const curryIt = f => x => {\n  if (f.length <= 1) {\n    f(x)\n  } else {\n    // ...\n  }\n}\n
\n

En cambio, si el número de parámetros esperados es mayor a 1 debemos recurrir a\nla recursión y aplicar de nuevo nuestra función de orden superior, en este\núltimo caso pasaremos como argumento una nueva función equivalente, por medio\nde Function.prototype.bind(), a la función uncurried excepto por su\nparámetro inicial. Algo similar a los siguiente:

\n
// función uncurried\nconst greet = (greeting, name) => `${greeting}, ${name}`\n// función equivalente a excepción del argumento inicial\nconst greetWithGreeting = greet.bind(null, 'Hello') // [Function: bound greet]\ngreetWithGreeting('Heidi')\n// => 'Hello, Heidi'\n
\n

Sin mayor preámbulo veamos el resultado final de nuestra función curryIt:

\n
const curryIt = f => x => f.length <= 1 ? f(x) : curryIt(f.bind(null, x))\n
\n

Para usar esto, le pasamos una referencia a una función que toma cualquier\nnúmero de argumentos, junto con tantos de los argumentos como queremos\npre-poblar. Lo que recuperamos es una función que está a la espera de los\nargumentos restantes:

\n
const greeter = (greeting, separator, emphasis, name) =>\n  `${greeting}${separator}${name}${emphasis}`\n\ntest('should return a curried equivalent of the provided function', () => {\n  const greetHello = curryIt(greeter)('Hello')(', ')('.')\n\n  expect(greetHello('Heidi')).toBe('Hello, Heidi.')\n  expect(greetHello('Eddie')).toBe('Hello, Eddie.')\n
\n

Y al igual que antes, no estamos limitados en términos del número de argumentos\nque queremos utilizar al construir funciones derivadas de nuestra función\noriginal que usa curry:

\n
  const greetGoodbye = curryIt(greeter)('Goodbye')(', ')\n\n  expect(greetGoodbye('.')('Joe')).toBe('Goodbye, Joe.')\n})\n
\n

Siendo serios sobre curry

\n

Nuestra pequeña función curryIt no puede manejar todos los casos de borde,\ncomo los parámetros faltantes u opcionales, pero hace un trabajo razonable\nsiempre y cuando permanezcamos estrictos sobre la sintaxis para pasar\nargumentos.

\n

Algunas bibliotecas funcionales de JavaScript como Ramda tienen funciones de\ncurry más flexibles que pueden dividir los parámetros requeridos para una\nfunción y permiten pasarlos individualmente o en grupos para crear variaciones\ncurry personalizadas. Si deseas aplicar curry extensivamente, este es\nprobablemente el camino a seguir.

\n

Independientemente de cómo elijas añadir curry a tu programación, ya sea que\ndesee utilizar paréntesis anidados o prefieras incluir una función de transporte\nmás robusta, llegar a una convención de nomenclatura coherente para sus\nfunciones curry ayudará a hacer tu código más legible. Te recomiendo que cada\nvariación derivada de una función tenga un nombre que deje claro cómo se\ncomporta, y qué argumentos está esperando.

\n

Orden de los argumentos

\n

Una cosa que es importante tener en cuenta al momento de implementar curry es\nel orden de los argumentos. Usando el enfoque que hemos descrito, obviamente lo\nque tú deseas es que el argumento que es más probable que sea reemplazado de\nuna variación a la siguiente sea el último argumento pasado a la función\noriginal.

\n

Pensar con antelación sobre el orden de los argumentos hará que sea más fácil\ndiseñar un algoritmo para ser implementado con curry y aplicarlo a tu\ntrabajo. Tener en cuenta el orden de tus argumentos en términos de menor a mayor\nprobabilidades de cambiar es un buen hábito al momento de diseñar funciones.

\n

Conclusión

\n

Curry es una técnica increíblemente útil en JavaScript funcional. Te permitirá\ngenerar una biblioteca de funciones pequeñas y fácilmente configuradas que se\ncomportan consistentemente, son rápidas de usar y que se pueden entender al leer\nsu código. Agregar curry a tu práctica de codificación alentará el uso de\nfunciones parcialmente aplicadas a través de tu código, evitando una gran\ncantidad de repeticiones, y puede ayudarte a obtener mejores hábitos sobre cómo\nnombrar y manejar los argumentos de la función.

\n

Referencias

\n" + "body": "

La técnica de definir funciones atadas a múltiples parámetros como una serie de\nfunciones anidadas que solo esperan un parámetro fue popularizada por el\nmatemático Haskell Curry, aunque inicialmente observada por Frege en\n1893, a dicha cadena de funciones anidadas se les llama funciones curry o\ncurried functions.

\n

¿Qué es currying?

\n

En pocas palabras, currying es una técnica que traduce la evaluación de una\nfunción que toma múltiples argumentos en una evaluación de una secuencia de\nfunciones, cada una de funciones de la secuencia espera un único argumento.\nCurrying está relacionado con el concepto de aplicación\nparcial, pero no es lo mismo.

\n

Una función curry es una que retorna progresivamente una función más específica\npor cada uno de los argumentos dados hasta que ya no sean necesarios más\nparámetros. Una función parcialmente aplicada, por otra parte, es una función\nque es \"parcialmente\" ejecutada y está lista para su inmediata ejecución una vez\ndado el resto de los parámetros esperados.

\n

El currying es elemental en la mayoría de los lenguajes de programación\nfuncional, por ejemplo Haskell o Scala. A pesar que JavaScript ofrece soporte\npara algunas características funcionales, al menos en las versiones actuales, el\ncurrying no es una de ellas. Sin embargo, podemos emular este patrón con las\ncaracterísticas actuales del lenguaje.

\n

Para darte una idea de cómo este concepto podría funcionar, vamos a crear\nnuestra primera función curry en JavaScript, utilizando la sintaxis familiar\npara construir la funcionalidad currying que queremos. Como ejemplo,\nimaginemos una función que salude a alguien por su nombre. Todos sabemos cómo\ncrear una función simple de saludo que toma un nombre y un saludo, y registra el\nsaludo con el nombre:

\n
const greet = (greeting, name) => `${greeting}, ${name}`\n\ntest('Should say Hello', () => {\n  expect(greet('Hello', 'Heidi')).toBe('Hello, Heidi')\n})\n
\n

Esta función requiere que el nombre y el saludo se pasen como argumentos para\nque funcione correctamente. Pero podríamos reescribir la función usando\ncurrying anidado simple, de modo que la función básica sólo requiera un\nsaludo, y devuelve otra función que toma el nombre de la persona que queremos\nsaludar.

\n

Nuestro primer curry

\n
const greetCurried = greeting => name => `${greeting}, ${name}`\n
\n

Este pequeño ajuste a la forma en que escribimos la función anterior nos permite\ncrear una nueva función para cualquier tipo de saludo, y pasar a esa nueva\nfunción el nombre de la persona que queremos saludar:

\n
test('Should allow to reuse functions', () => {\n  const greetHello = greetCurried('Hello')\n\n  expect(greetHello('Heidi')).toBe('Hello, Heidi')\n  expect(greetHello('Eddie')).toBe('Hello, Eddie')\n})\n
\n

También podemos llamar a la función en modo curry original directamente,\nsimplemente pasando cada uno de los parámetros en un conjunto separado de\nparéntesis, uno después del otro:

\n
test('Should work with all the parameters', () => {\n  expect(greetCurried('Hi there')('Howard')).toBe('Hi there, Howard')\n})\n
\n

Apliquemos curry a todo

\n

Lo bueno es que ahora que hemos aprendido a modificar nuestra función\ntradicional para usar este enfoque para manejar los argumentos, podemos hacerlo\ncon tantos argumentos como queramos:

\n
const greetDeeplyCurried = greeting =>\n  separator =>\n    emphasis =>\n      name =>\n        `${greeting}${separator}${name}${emphasis}`\n
\n

Tenemos la misma flexibilidad con cuatro argumentos que con dos. No importa lo\nlejos que vaya el anidamiento, podemos crear nuevas funciones personalizadas\npara saludar a tantas personas como escojamos de tantas maneras como nos\nconvenga:

\n
test('Should allow nested calls', () => {\n  const greetAwkwardly = greetDeeplyCurried('Hello')('...')('?')\n\n  expect(greetAwkwardly('Heidi')).toBe('Hello...Heidi?')\n  expect(greetAwkwardly('Eddie')).toBe('Hello...Eddie?')\n})\n
\n

Además, podemos pasar tantos parámetros como quisiéramos al crear variaciones\npersonalizadas de nuestra función curry original, creando nuevas funciones que\nson capaces de tomar el número apropiado de parámetros adicionales, cada uno se\npasa por separado en su propio conjunto de paréntesis:

\n
test('Other variations', () => {\n  const sayHello = greetDeeplyCurried('Hello')(', ')\n\n  expect(sayHello('.')('Heidi')).toBe('Hello, Heidi.')\n  expect(sayHello('.')('Eddie')).toBe('Hello, Eddie.')\n
\n

Y se pueden definir variaciones subordinadas:

\n
  const askHello = sayHello('?')\n\n  expect(askHello('Heidi')).toBe('Hello, Heidi?')\n  expect(askHello('Eddie')).toBe('Hello, Eddie?')\n})\n
\n

Aplicando curry a funciones tradicionales

\n

Puedes ver lo poderoso que es este enfoque, especialmente si necesitas crear\nmuchas funciones personalizadas muy detalladas. El único problema es la\nsintaxis, pues a medida que construyes estas funciones con curry, debes\nmantener las funciones devueltas anidadas, y llamarlas con nuevas funciones que\nrequieran varios conjuntos de paréntesis, cada uno conteniendo su propio\nargumento aislado. Se puede poner difícil y enredado.

\n

Antes de abordar la implementación de nuestra función curry, consideremos por\nejemplo que para toda función f(x, y), existe una función f' tal que\nf'(x) es una función que puede ser aplicada a y que obtenga\n(f'(x))(y) = f(x, y).

\n

La función f' del ejemplo anterior es llamada forma curried de la función.\nDesde una perspectiva de programación funcional, currying puede ser descrita\npor la función: curry : ((a, b) -> c) -> (a -> b -> c)

\n

Ahora bien, un enfoque es crear una función de orden superior (Higher\nOrder Function en inglés) que tome como argumento una función existente que\nfue escrita sin todas las devoluciones anidadas (uncurried form). Nuestra\nfunción de orden superior debe retornar otra función que espera un solo\nargumento,...

\n
const curryIt = f => x => {\n  // ...\n}\n
\n

Luego que se suministra dicho argumento se procede a verificar si el número de\nargumentos esperados (Function.length) por la función uncurried es igual o\nmenor a 1, de ser así ejecuta dicha función, esta condición particular también\nnos servirá como condición de parada en nuestra llamada recursiva.

\n
const curryIt = f => x => {\n  if (f.length <= 1) {\n    f(x)\n  } else {\n    // ...\n  }\n}\n
\n

En cambio, si el número de parámetros esperados es mayor a 1 debemos recurrir a\nla recursión y aplicar de nuevo nuestra función de orden superior, en este\núltimo caso pasaremos como argumento una nueva función equivalente, por medio\nde Function.prototype.bind(), a la función uncurried excepto por su\nparámetro inicial. Algo similar a los siguiente:

\n
// función uncurried\nconst greet = (greeting, name) => `${greeting}, ${name}`\n// función equivalente a excepción del argumento inicial\nconst greetWithGreeting = greet.bind(null, 'Hello') // [Function: bound greet]\ngreetWithGreeting('Heidi')\n// => 'Hello, Heidi'\n
\n

Sin mayor preámbulo veamos el resultado final de nuestra función curryIt:

\n
const curryIt = f => x => f.length <= 1 ? f(x) : curryIt(f.bind(null, x))\n
\n

Para usar esto, le pasamos una referencia a una función que toma cualquier\nnúmero de argumentos, junto con tantos de los argumentos como queremos\npre-poblar. Lo que recuperamos es una función que está a la espera de los\nargumentos restantes:

\n
const greeter = (greeting, separator, emphasis, name) =>\n  `${greeting}${separator}${name}${emphasis}`\n\ntest('should return a curried equivalent of the provided function', () => {\n  const greetHello = curryIt(greeter)('Hello')(', ')('.')\n\n  expect(greetHello('Heidi')).toBe('Hello, Heidi.')\n  expect(greetHello('Eddie')).toBe('Hello, Eddie.')\n
\n

Y al igual que antes, no estamos limitados en términos del número de argumentos\nque queremos utilizar al construir funciones derivadas de nuestra función\noriginal que usa curry:

\n
  const greetGoodbye = curryIt(greeter)('Goodbye')(', ')\n\n  expect(greetGoodbye('.')('Joe')).toBe('Goodbye, Joe.')\n})\n
\n

Siendo serios sobre curry

\n

Nuestra pequeña función curryIt no puede manejar todos los casos de borde,\ncomo los parámetros faltantes u opcionales, pero hace un trabajo razonable\nsiempre y cuando permanezcamos estrictos sobre la sintaxis para pasar\nargumentos.

\n

Algunas bibliotecas funcionales de JavaScript como Ramda tienen funciones de\ncurry más flexibles que pueden dividir los parámetros requeridos para una\nfunción y permiten pasarlos individualmente o en grupos para crear variaciones\ncurry personalizadas. Si deseas aplicar curry extensivamente, este es\nprobablemente el camino a seguir.

\n

Independientemente de cómo elijas añadir curry a tu programación, ya sea que\ndesee utilizar paréntesis anidados o prefieras incluir una función de transporte\nmás robusta, llegar a una convención de nomenclatura coherente para sus\nfunciones curry ayudará a hacer tu código más legible. Te recomiendo que cada\nvariación derivada de una función tenga un nombre que deje claro cómo se\ncomporta, y qué argumentos está esperando.

\n

Orden de los argumentos

\n

Una cosa que es importante tener en cuenta al momento de implementar curry es\nel orden de los argumentos. Usando el enfoque que hemos descrito, obviamente lo\nque tú deseas es que el argumento que es más probable que sea reemplazado de\nuna variación a la siguiente sea el último argumento pasado a la función\noriginal.

\n

Pensar con antelación sobre el orden de los argumentos hará que sea más fácil\ndiseñar un algoritmo para ser implementado con curry y aplicarlo a tu\ntrabajo. Tener en cuenta el orden de tus argumentos en términos de menor a mayor\nprobabilidades de cambiar es un buen hábito al momento de diseñar funciones.

\n

Conclusión

\n

Curry es una técnica increíblemente útil en JavaScript funcional. Te permitirá\ngenerar una biblioteca de funciones pequeñas y fácilmente configuradas que se\ncomportan consistentemente, son rápidas de usar y que se pueden entender al leer\nsu código. Agregar curry a tu práctica de codificación alentará el uso de\nfunciones parcialmente aplicadas a través de tu código, evitando una gran\ncantidad de repeticiones, y puede ayudarte a obtener mejores hábitos sobre cómo\nnombrar y manejar los argumentos de la función.

\n

Referencias

\n" } } }, @@ -311,7 +311,7 @@ "slug": "curry-n", "prefix": "01", "path": "topics/functional/03-hof/06-practice-3/01-curry-n", - "createdAt": "2023-04-04T20:28:34.714Z", + "createdAt": "2023-05-17T20:37:15.351Z", "env": "cjs", "intl": { "es": { @@ -390,7 +390,7 @@ "slug": "apply-discount", "prefix": "01", "path": "topics/functional/05-flow-control/02-practice/01-apply-discount", - "createdAt": "2023-04-04T20:28:34.714Z", + "createdAt": "2023-05-17T20:37:15.351Z", "env": "cjs", "intl": { "es": { @@ -408,7 +408,7 @@ "slug": "reduce", "prefix": "02", "path": "topics/functional/05-flow-control/02-practice/02-reduce", - "createdAt": "2023-04-04T20:28:34.714Z", + "createdAt": "2023-05-17T20:37:15.351Z", "env": "cjs", "intl": { "es": { @@ -426,7 +426,7 @@ "slug": "get-dependencies", "prefix": "03", "path": "topics/functional/05-flow-control/02-practice/03-get-dependencies", - "createdAt": "2023-04-04T20:28:34.714Z", + "createdAt": "2023-05-17T20:37:15.351Z", "env": "cjs", "intl": { "es": { @@ -470,7 +470,7 @@ "slug": "load-users", "prefix": "01", "path": "topics/functional/05-flow-control/04-practice-2/01-load-users", - "createdAt": "2023-04-04T20:28:34.714Z", + "createdAt": "2023-05-17T20:37:15.351Z", "env": "cjs", "intl": { "es": { diff --git a/dist/topics/html.json b/dist/topics/html.json index 2aa01829d..664b0b770 100644 --- a/dist/topics/html.json +++ b/dist/topics/html.json @@ -2,9 +2,9 @@ "slug": "html", "repo": "Laboratoria/bootcamp", "path": "topics/html", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:34.336Z", + "createdAt": "2023-05-17T20:37:20.943Z", "track": "web-dev", "intl": { "es": { @@ -55,11 +55,11 @@ "intl": { "es": { "title": "Tu primer sitio web", - "body": "

Objetivos de aprendizaje

\n
    \n
  • Entender como construir la estructura básica de una página web usando HTML.
  • \n
  • Conocer los principales elementos y etiquetas HTML.
  • \n
  • Aprender a darle dinamismo a una web utilizando JavaScript.
  • \n
  • Tener un primer acercamiento al mundo del código, creando tu primer sitio\nweb.
  • \n
\n
\n

El texto a continuación es una traducción al español, con ciertos ajustes, del\ncapítulo 5 de JavaScript for kids,\nNick Morgan, 2015; y de Eloquent JavaScript,\nde Marijn Haverbeke, 2014.

\n

HTML: HyperText Markup Language

\n

HTML (HyperText Markup Language) es el lenguaje utilizado para crear la\nestructura de un sitio web. Para crear este sitio, se empieza creando un\ndocumento en formato HTML. Esto es muy parecido a crear un documento con formato\nword, excel o powerpoint.

\n

Un documento HTML simple se ve así (no te asustes si no entiendes todo lo que\ndice, te lo explicaremos paso a paso más abajo):

\n
<!DOCTYPE html>\n<html>\n  <head>\n    <title>Mi primera web</title>\n  </head>\n  <body>\n    <h1>¡Hola Mundo!</h1>\n    <p>Esta es mi primera web</p>\n  </body>\n</html>\n
\n

Al abrir este mismo documento HTML en un navegador (como Chrome), se ve lo\nsiguiente:

\n

\"Vista

\n

El navegador \"lee\" el archivo HTML (el texto y las etiquetas que están adentro)\ny las presenta según las reglas del lenguaje. Por ejemplo, los textos que están\ndentro de las etiquetas <h1> </h1> son considerados encabezados o titulares,\nmientras que los textos dentro de las etiquetas <p> </p> son considerados\npárrafos. Por eso, el texto ¡Hola Mundo! se visualiza mucho más grande que el\ntexto Esta es mi primera web.

\n

Crea tu primera web

\n

Como ya lo dijimos, la mejor manera de aprender es haciendo. Por eso, es\nhora de que tú misma crees una web y aprendas HTML.

\n

Michelle te explica por qué necesitarás un editor de texto para los ejercicios:

\n

\"Editor

\n

En el siguiente video, Michelle te guiará a través de los siguientes pasos para\nque crees tu primera web:

\n
    \n
  1. Descarga Atom, un editor de texto: Descargar, hay versión\npara Mac y Windows. Si deseas puedes descargar otro editor de texto llamado\nVisual Studio Code, ten en cuenta que las explicaciones que te dará Michelle\nestarán en Atom pero tú podrás hacer lo mismo en Visual Studio Code.\nDescarga VSCode aquí
  2. \n
  3. Crea un documento HTML llamado index.html
  4. \n
  5. Agrega algunos elementos al documento HTML (por ejemplo: un título y un\npárrafo)
  6. \n
  7. Guarda el documento HTML
  8. \n
  9. Abre el documento HTML en un navegador como Chrome
  10. \n
\n

Aquí el video:

\n

\"Mi

\n

Etiquetas y elementos HTML

\n

Los documentos HTML se componen de elementos. Salvo algunas excepciones (por\nejemplo <!DOCTYPE html>), los elementos comienzan con una etiqueta de inicio\ny terminan con una etiqueta de fin. Por ejemplo, en nuestro documento tenemos\nel elemento p, que comienza con la etiqueta de inicio <p> y termina con la\netiqueta de finalización </p>. El texto que se encuentra entre las etiquetas\nde apertura y de cierre es el contenido del elemento.

\n
\n

El elemento p (párrafo) como ejemplo:\n\"Ejemplo

\n
\n

Hagamos un recorrido por todos los elementos de nuestro documento:

\n
    \n
  1. El documento empieza con la etiqueta <!DOCTYPE html> (que como vimos, no\ntiene inicio o cierre). Su función es hacerle saber al navegador que\ninterprete el documento como HTML moderno, en contraposición a varios\ndialectos que estaban en uso en el pasado.
  2. \n
  3. Luego viene la etiqueta de apertura <html> (la etiqueta de cierre\n</ html> está al final). Por estándar, todos los documentos HTML deben\ntener un elemento html que \"englobe\" todo lo demás.
  4. \n
  5. Dentro del elemento html hay dos elementos: el head (cabeza en Español) y\nel body (cuerpo en Español). El head contiene información sobre el\ndocumento, y el body contiene el documento en sí.
  6. \n
  7. Dentro del elemento head está el elemento title (con su etiqueta de\ninicio y de cierre), que contiene el título del documento. Es por eso que al\nvisualizar el archivo en el navegador, el título en la pestaña del navegador\ndice: \"Mi primera web\". Es importante que notemos que el elemento title\nestá contenido dentro del elemento head; el cual, a su vez, está\ncontenido dentro del elemento html.
  8. \n
  9. Finalmente, tenemos el elemento body (entre su etiqueta de inicio y de\ncierre) que contiene el contenido que se mostrará en el navegador. En este\ncaso, dentro del body tenemos dos elementos adicionales: el h1 (encabezado)\ny el p (párrafo).
  10. \n
\n

Existen muchos más elementos y etiquetas HTML, que aprenderás en su momento. Por\nel momento, es hora de regresar a JavaScript.

\n

HTML y JavaScript

\n

Es importante que entiendas que HTML no es un lenguaje de programación;\nes un lenguaje de marcado de texto. Como hemos visto, con HTML le damos una\nestructura a nuestra página. Sin embargo, si queremos darle comportamiento o\ninteracción a nuestra web, necesitamos usar un lenguaje de programación. Y\nel único lenguaje de programación para correr en los navegadores web es\nJavaScript. Con JavaScript logramos que las páginas web puedan responder a las\nacciones de usuario, volviéndolas interactivas.

\n

Para incluir JavaScript en un documento HTML puedes utilizar el elemento\nscript y colocar tu código JavaScript entre sus etiquetas de inicio\n(<script>) y cierre (</script>), tal como lo muestra\nel siguiente ejemplo:

\n
<!DOCTYPE html>\n<html>\n  <head>\n    <title>Mi primera web</title>\n  </head>\n  <body>\n    <h1>¡Hola Mundo!</h1>\n    <p>Esta es mi primera web</p>\n\n    <script>\n      alert('¡Hola Mundo!');\n    </script>\n\n  </body>\n</html>\n
\n

Muchas veces tu código JavaScript es tan extenso que no quieres que esté ubicado\nen el mismo documento HTML. Para eso, la solución es crear un nuevo documento,\nesta vez de formato JavaScript - utilizando la extensión .js - y \"linkear\"\nambos documentos a través del mismo elemento script, de la siguiente manera:

\n
<script src=\"nombre-del-documento.js\"></script>\n
\n

El mismo elemento script tiene un \"atributo\" llamado src (de source, que\nsignifica fuente en inglés), al cual se le puede asignar la ruta de tu\ndocumento JavaScript.

\n

Añádele interacción a tu web

\n

¡Ahora te toca a tí! Continúa con Michelle siguiendo los pasos para agregarle\ninteracción a tu sitio web:

\n

Los pasos a seguir son:

\n
    \n
  1. Agrega el elemento script al final del body de tu documento HTML
  2. \n
  3. Dentro del mismo HTML, entre las etiquetas de inicio y cierre del elemento\nscript, escribe una línea de código JavaScript (por ejemplo, algo con\nalert(), document.write() o prompt())
  4. \n
  5. Guarda tu documento HTML
  6. \n
  7. Refresca la página de tu navegador donde estás viendo tu documento HTML
  8. \n
  9. Ahora crea un nuevo documento llamado app.js en la misma carpeta donde está\ntu HTML
  10. \n
  11. Añádele el atributo src al elemento script con la ruta de tu archivo\napp.js
  12. \n
  13. Pasa todo el código JavaScript del documento HTML al documento JS
  14. \n
  15. Refresca la página del navegador y confirma que todo funciona exactamente\nigual que antes
  16. \n
\n

Aquí el video de Michelle:

\n

\"Mi

" + "body": "

Objetivos de aprendizaje

\n
    \n
  • Entender como construir la estructura básica de una página web usando HTML.
  • \n
  • Conocer los principales elementos y etiquetas HTML.
  • \n
  • Aprender a darle dinamismo a una web utilizando JavaScript.
  • \n
  • Tener un primer acercamiento al mundo del código, creando tu primer sitio\nweb.
  • \n
\n
\n

El texto a continuación es una traducción al español, con ciertos ajustes, del\ncapítulo 5 de JavaScript for kids,\nNick Morgan, 2015; y de Eloquent JavaScript,\nde Marijn Haverbeke, 2014.

\n

HTML: HyperText Markup Language

\n

HTML (HyperText Markup Language) es el lenguaje utilizado para crear la\nestructura de un sitio web. Para crear este sitio, se empieza creando un\ndocumento en formato HTML. Esto es muy parecido a crear un documento con formato\nword, excel o powerpoint.

\n

Un documento HTML simple se ve así (no te asustes si no entiendes todo lo que\ndice, te lo explicaremos paso a paso más abajo):

\n
<!DOCTYPE html>\n<html>\n  <head>\n    <title>Mi primera web</title>\n  </head>\n  <body>\n    <h1>¡Hola Mundo!</h1>\n    <p>Esta es mi primera web</p>\n  </body>\n</html>\n
\n

Al abrir este mismo documento HTML en un navegador (como Chrome), se ve lo\nsiguiente:

\n

\"Vista

\n

El navegador \"lee\" el archivo HTML (el texto y las etiquetas que están adentro)\ny las presenta según las reglas del lenguaje. Por ejemplo, los textos que están\ndentro de las etiquetas <h1> </h1> son considerados encabezados o titulares,\nmientras que los textos dentro de las etiquetas <p> </p> son considerados\npárrafos. Por eso, el texto ¡Hola Mundo! se visualiza mucho más grande que el\ntexto Esta es mi primera web.

\n

Crea tu primera web

\n

Como ya lo dijimos, la mejor manera de aprender es haciendo. Por eso, es\nhora de que tú misma crees una web y aprendas HTML.

\n

Michelle te explica por qué necesitarás un editor de texto para los ejercicios:

\n

\n

En el siguiente video, Michelle te guiará a través de los siguientes pasos para\nque crees tu primera web:

\n
    \n
  1. Descarga Atom, un editor de texto: Descargar, hay versión\npara Mac y Windows. Si deseas puedes descargar otro editor de texto llamado\nVisual Studio Code, ten en cuenta que las explicaciones que te dará Michelle\nestarán en Atom pero tú podrás hacer lo mismo en Visual Studio Code.\nDescarga VSCode aquí
  2. \n
  3. Crea un documento HTML llamado index.html
  4. \n
  5. Agrega algunos elementos al documento HTML (por ejemplo: un título y un\npárrafo)
  6. \n
  7. Guarda el documento HTML
  8. \n
  9. Abre el documento HTML en un navegador como Chrome
  10. \n
\n

Aquí el video:

\n

\n

Etiquetas y elementos HTML

\n

Los documentos HTML se componen de elementos. Salvo algunas excepciones (por\nejemplo <!DOCTYPE html>), los elementos comienzan con una etiqueta de inicio\ny terminan con una etiqueta de fin. Por ejemplo, en nuestro documento tenemos\nel elemento p, que comienza con la etiqueta de inicio <p> y termina con la\netiqueta de finalización </p>. El texto que se encuentra entre las etiquetas\nde apertura y de cierre es el contenido del elemento.

\n
\n

El elemento p (párrafo) como ejemplo:\n\"Ejemplo

\n
\n

Hagamos un recorrido por todos los elementos de nuestro documento:

\n
    \n
  1. El documento empieza con la etiqueta <!DOCTYPE html> (que como vimos, no\ntiene inicio o cierre). Su función es hacerle saber al navegador que\ninterprete el documento como HTML moderno, en contraposición a varios\ndialectos que estaban en uso en el pasado.
  2. \n
  3. Luego viene la etiqueta de apertura <html> (la etiqueta de cierre\n</ html> está al final). Por estándar, todos los documentos HTML deben\ntener un elemento html que \"englobe\" todo lo demás.
  4. \n
  5. Dentro del elemento html hay dos elementos: el head (cabeza en Español) y\nel body (cuerpo en Español). El head contiene información sobre el\ndocumento, y el body contiene el documento en sí.
  6. \n
  7. Dentro del elemento head está el elemento title (con su etiqueta de\ninicio y de cierre), que contiene el título del documento. Es por eso que al\nvisualizar el archivo en el navegador, el título en la pestaña del navegador\ndice: \"Mi primera web\". Es importante que notemos que el elemento title\nestá contenido dentro del elemento head; el cual, a su vez, está\ncontenido dentro del elemento html.
  8. \n
  9. Finalmente, tenemos el elemento body (entre su etiqueta de inicio y de\ncierre) que contiene el contenido que se mostrará en el navegador. En este\ncaso, dentro del body tenemos dos elementos adicionales: el h1 (encabezado)\ny el p (párrafo).
  10. \n
\n\n

Existen muchos más elementos y etiquetas HTML, que aprenderás en su momento. Por\nel momento, es hora de regresar a JavaScript.

\n\n

HTML y JavaScript

\n

Es importante que entiendas que HTML no es un lenguaje de programación;\nes un lenguaje de marcado de texto. Como hemos visto, con HTML le damos una\nestructura a nuestra página. Sin embargo, si queremos darle comportamiento o\ninteracción a nuestra web, necesitamos usar un lenguaje de programación. Y\nel único lenguaje de programación para correr en los navegadores web es\nJavaScript. Con JavaScript logramos que las páginas web puedan responder a las\nacciones de usuario, volviéndolas interactivas.

\n

Para incluir JavaScript en un documento HTML puedes utilizar el elemento\nscript y colocar tu código JavaScript entre sus etiquetas de inicio\n(<script>) y cierre (</script>), tal como lo muestra\nel siguiente ejemplo:

\n
<!DOCTYPE html>\n<html>\n  <head>\n    <title>Mi primera web</title>\n  </head>\n  <body>\n    <h1>¡Hola Mundo!</h1>\n    <p>Esta es mi primera web</p>\n\n    <script>\n      alert('¡Hola Mundo!');\n    </script>\n\n  </body>\n</html>\n
\n

Muchas veces tu código JavaScript es tan extenso que no quieres que esté ubicado\nen el mismo documento HTML. Para eso, la solución es crear un nuevo documento,\nesta vez de formato JavaScript - utilizando la extensión .js - y \"linkear\"\nambos documentos a través del mismo elemento script, de la siguiente manera:

\n
<script src=\"nombre-del-documento.js\"></script>\n
\n

El mismo elemento script tiene un \"atributo\" llamado src (de source, que\nsignifica fuente en inglés), al cual se le puede asignar la ruta de tu\ndocumento JavaScript.

\n

Añádele interacción a tu web

\n

¡Ahora te toca a tí! Continúa con Michelle siguiendo los pasos para agregarle\ninteracción a tu sitio web:

\n

Los pasos a seguir son:

\n
    \n
  1. Agrega el elemento script al final del body de tu documento HTML
  2. \n
  3. Dentro del mismo HTML, entre las etiquetas de inicio y cierre del elemento\nscript, escribe una línea de código JavaScript (por ejemplo, algo con\nalert(), document.write() o prompt())
  4. \n
  5. Guarda tu documento HTML
  6. \n
  7. Refresca la página de tu navegador donde estás viendo tu documento HTML
  8. \n
  9. Ahora crea un nuevo documento llamado app.js en la misma carpeta donde está\ntu HTML
  10. \n
  11. Añádele el atributo src al elemento script con la ruta de tu archivo\napp.js
  12. \n
  13. Pasa todo el código JavaScript del documento HTML al documento JS
  14. \n
  15. Refresca la página del navegador y confirma que todo funciona exactamente\nigual que antes
  16. \n
\n

Aquí el video de Michelle:

\n

\n" }, "pt": { "title": "Sua primeira página Web", - "body": "

Objetivos de aprendizagem

\n
    \n
  • Entender o papel que o tem HTML de criar a estrutura básica de uma página web.
  • \n
  • Conhecer os principais elementos e tags HTML
  • \n
  • Aprender a dar dinamismo a uma página web usando JavaScript
  • \n
  • Ter uma aproximação ao mundo do código, criando seu primeiro site web
  • \n
\n
\n

O texto abaixo é uma tradução para o português, com alguns ajustes, do capítulo\n5 de JavaScript for\nkids,\nNick Morgan, 2015; e de Eloquent JavaScript,\nde Marijn Haverbeke, 2014.

\n

HTML: HyperText Markup Language

\n

HTML (HyperText Markup Language) é uma linguagem utilizada para criar a\nestrutura de um site web. Para criar esse site, começamos criando um arquivo em\nformato HTML. Isto é muito parecido com criar um arquivo com formato word, excel\nou powerpoint.

\n

Um arquivo HTML simples se vê a seguir (não se assuste se não entender tudo, te\nexplicaremos passo a passo mais abaixo):

\n
<!DOCTYPE html>\n<html>\n  <head>\n    <title>Minha primeira página Web</title>\n  </head>\n  <body>\n    <h1>Olá Mundo!</h1>\n    <p>Esta é minha primeira página Web</p>\n  </body>\n</html>\n
\n

Ao abrir este mesmo arquivo HTML em um navegador (como Chrome), se vê o\nseguinte:

\n

\"Visualização

\n

O navegador \"lê\" o arquivo HTML (o texto e as tags que estão dentro) e o\napresenta segundo as regras da linguagem. Por exemplo, os textos que estão\ndentro das tags <h1> </h1> são considerados cabeçalhos ou títulos, enquanto os\ntextos que dentro da etiqueta <p> </p> são considerados parágrafos. Por isso,\no texto Olá Mundo! é visualizado muito maior que o texto Esta é minha\nprimeira página Web.

\n

Crie sua primeira página Web

\n

Como já dissemos, a melhor maneira de aprender é fazendo. Por isso, é hora\nde você mesma criar uma página web e aprender HTML.

\n

A seguir um vídeo que explica o porquê você precisa de um editor de texto para\nos exercícios:

\n

\"Editor

\n

No próximo vídeo, você será guiada através dos seguintes passos para criar sua\nprimeira página web:

\n
    \n
  1. Baixar o Visual Studio Code, um editor de texto: Baixe VSC\naqui. Existem versões para Mac e Windows. Se\ndesejar pode também baixar um editor de texto chamado Atom:\nBaixar
  2. \n
  3. Crie um arquivo HTML chamado index.html
  4. \n
  5. Escreva alguns elementos no arquivo HTML (por exemplo: um título <h1> e um\nparágrafo <p>)
  6. \n
  7. Salve o arquivo HTML
  8. \n
  9. Abra o arquivo HTML em um navegador como o Chrome
  10. \n
\n

Aqui o vídeo:

\n

\"Minha

\n

Tags e elementos HTML

\n

Os arquivo HTML são compostos por elementos. Salvo algumas exceções (por\nexemplo <!DOCTYPE html>), os elementos começam com uma tag de abertura e\nterminam com uma tag de fechamento. Por exemplo, no nosso documento teremos o\nelemento p, que começa com a tag de abertura <p>e termina com uma tag de\nfechamento </p>. O texto que se encontra entre as etiquetas de abertura e de\nfechamento é chamado de conteúdo do elemento.

\n
\n

o elemento p (parágrafo) como exemplo: \"Exemplo

\n
\n

Vamos dar uma passada por todos os elementos do nosso arquivo:

\n
    \n
  1. O arquivo começa com a tag <!DOCTYPE html> (que como vimos, não tem\nabertura e fechamento). Sua função é fazer com que o navegador interprete o\narquivo como a última versão do HTML, em contraposição a várias versões\nque estavam em uso no passado.
  2. \n
  3. Logo após vem a tag de abertura <html> (a tag de fechamento </ html>\nestá ao final). Por convenção, todos os arquivos HTML devem ter o elemento\nhtml que englobe todos os demais.
  4. \n
  5. Dentro do elemento html estão dois elementos: o head (cabeça, em\nportuguês) e o body (corpo, em português). O head contem informações\nsobre o arquivo e o body contem o arquivo em si.
  6. \n
  7. Dentro do elemento head está o elemento title (com sua tag de abertura e\nfechamento), que contem o título do arquivo. É por isso que ao visualizar o\naquivo em um navegador, o título que aparece na aba do navegador é: \"Minha\nprimeira página Web\". É importante que notemos que o elemento title está\ncontido dentro do elemento head, o qual, por sua vez, está contido\ndentro do elemento html.
  8. \n
  9. Finalmente temos o elemento body que contem o conteúdo que se mostrará no\nnavegador. Neste caso, dentro do body temos dois elementos adicionais: o h1\n(cabeçalho) e o p (parágrafo).
  10. \n
\n

Existem muito mais elementos e tags HTML que você vai aprender. Por agora, é\nhora de regressar ao JavaScript.

\n

HTML e JavaScript

\n

É importante que você entenda que HTML não é uma linguagem de programação, mas sim uma linguagem de marcação. Como já vimos, com HTML\ndamos uma estrutura a nosso site. No entanto, se queremos dar a ele\ncomportamento ou interação, necessitamos usar uma linguagem de programação. E a única linguagem de programação que roda nos navegadores web\né o JavaScript. Com JavaScript conseguimos que os sites possam responder as\nações dos usuários, tornado-os interativos.

\n

Para incluir JavaScript em um arquivo HTML você pode utilizar o elemento\nscript e colocar seu código JavaScript entre as tags de abertura e fechamento,\ntal como mostra o seguinte exemplo:

\n
<!DOCTYPE html>\n<html>\n  <head>\n    <title>Minha primeira página Web</title>\n  </head>\n  <body>\n    <h1>Olá Mundo!</h1>\n    <p>Esta é minha primeira página Web</p>\n\n    <script type=\"text/javascript\">\n      alert('Olá Mundo!');\n    </script>\n\n  </body>\n</html>\n
\n

Muitas vezes o código JavaScript é tão extenso que você vai querer que ele não\nesteja escrito no mesmo arquivo HTML. Para isso, a solução é criar um novo\narquivo, em formato JavaScript - usando a extensão .js - e \"linkar\" ambos\narquivos por meio do elemento script da seguinte maneira:

\n
<script src=\"nome-do-arquivo.js\"></script>\n
\n

O elemento script tem um \"atributo\" chamado src (de source, que significa\nfonte em inglês), no qual você pode colocar a caminho do seu arquivo JavaScript.

\n

Adicionando interação à sua página

\n

Agora é sua vez! Continue assistindo os vídeos e seguindo os passos para agregar\ninteração ao seu site.

\n

Os passos são os seguintes:

\n
    \n
  1. Inclua o elemento script ao final do body de teu arquivo HTML
  2. \n
  3. Dentro do HTML, entre as etiquetas de íncio e fechamento do elemento\nscript, escreva uma linha de código JavaScript (por exemplo, algo com\nalert(), document.write() ou prompt())
  4. \n
  5. Salve o arquivo HTML
  6. \n
  7. Atualize a página de seu navegador onde está carregado o arquivo HTML
  8. \n
  9. Crie um novo arquivo chamado app.js na mesma pasta onde está o seu\nHTML
  10. \n
  11. Inclua no atributo src ao elemento script com o caminho do arquivo\napp.js
  12. \n
  13. Passe todo o código JavaScript do arquivo HTML para o arquivo JS
  14. \n
  15. Atualize a página do navegador e confirme se tudo funciona exatamente como\nantes.
  16. \n
\n

A seguir o vídeo:

\n

\"Minha

" + "body": "

Objetivos de aprendizagem

\n
    \n
  • Entender o papel que o tem HTML de criar a estrutura básica de uma página web.
  • \n
  • Conhecer os principais elementos e tags HTML
  • \n
  • Aprender a dar dinamismo a uma página web usando JavaScript
  • \n
  • Ter uma aproximação ao mundo do código, criando seu primeiro site web
  • \n
\n
\n

O texto abaixo é uma tradução para o português, com alguns ajustes, do capítulo\n5 de JavaScript for\nkids,\nNick Morgan, 2015; e de Eloquent JavaScript,\nde Marijn Haverbeke, 2014.

\n

HTML: HyperText Markup Language

\n

HTML (HyperText Markup Language) é uma linguagem utilizada para criar a\nestrutura de um site web. Para criar esse site, começamos criando um arquivo em\nformato HTML. Isto é muito parecido com criar um arquivo com formato word, excel\nou powerpoint.

\n

Um arquivo HTML simples se vê a seguir (não se assuste se não entender tudo, te\nexplicaremos passo a passo mais abaixo):

\n
<!DOCTYPE html>\n<html>\n  <head>\n    <title>Minha primeira página Web</title>\n  </head>\n  <body>\n    <h1>Olá Mundo!</h1>\n    <p>Esta é minha primeira página Web</p>\n  </body>\n</html>\n
\n

Ao abrir este mesmo arquivo HTML em um navegador (como Chrome), se vê o\nseguinte:

\n

\"Visualização

\n

O navegador \"lê\" o arquivo HTML (o texto e as tags que estão dentro) e o\napresenta segundo as regras da linguagem. Por exemplo, os textos que estão\ndentro das tags <h1> </h1> são considerados cabeçalhos ou títulos, enquanto os\ntextos que dentro da etiqueta <p> </p> são considerados parágrafos. Por isso,\no texto Olá Mundo! é visualizado muito maior que o texto Esta é minha\nprimeira página Web.

\n

Crie sua primeira página Web

\n

Como já dissemos, a melhor maneira de aprender é fazendo. Por isso, é hora\nde você mesma criar uma página web e aprender HTML.

\n

A seguir um vídeo que explica o porquê você precisa de um editor de texto para\nos exercícios:

\n

\n

No próximo vídeo, você será guiada através dos seguintes passos para criar sua\nprimeira página web:

\n
    \n
  1. Baixar o Visual Studio Code, um editor de texto: Baixe VSC\naqui. Existem versões para Mac e Windows. Se\ndesejar pode também baixar um editor de texto chamado Atom:\nBaixar
  2. \n
  3. Crie um arquivo HTML chamado index.html
  4. \n
  5. Escreva alguns elementos no arquivo HTML (por exemplo: um título <h1> e um\nparágrafo <p>)
  6. \n
  7. Salve o arquivo HTML
  8. \n
  9. Abra o arquivo HTML em um navegador como o Chrome
  10. \n
\n

Aqui o vídeo:

\n

\n

Tags e elementos HTML

\n

Os arquivo HTML são compostos por elementos. Salvo algumas exceções (por\nexemplo <!DOCTYPE html>), os elementos começam com uma tag de abertura e\nterminam com uma tag de fechamento. Por exemplo, no nosso documento teremos o\nelemento p, que começa com a tag de abertura <p>e termina com uma tag de\nfechamento </p>. O texto que se encontra entre as etiquetas de abertura e de\nfechamento é chamado de conteúdo do elemento.

\n
\n

o elemento p (parágrafo) como exemplo: \"Exemplo

\n
\n

Vamos dar uma passada por todos os elementos do nosso arquivo:

\n
    \n
  1. O arquivo começa com a tag <!DOCTYPE html> (que como vimos, não tem\nabertura e fechamento). Sua função é fazer com que o navegador interprete o\narquivo como a última versão do HTML, em contraposição a várias versões\nque estavam em uso no passado.
  2. \n
  3. Logo após vem a tag de abertura <html> (a tag de fechamento </ html>\nestá ao final). Por convenção, todos os arquivos HTML devem ter o elemento\nhtml que englobe todos os demais.
  4. \n
  5. Dentro do elemento html estão dois elementos: o head (cabeça, em\nportuguês) e o body (corpo, em português). O head contem informações\nsobre o arquivo e o body contem o arquivo em si.
  6. \n
  7. Dentro do elemento head está o elemento title (com sua tag de abertura e\nfechamento), que contem o título do arquivo. É por isso que ao visualizar o\naquivo em um navegador, o título que aparece na aba do navegador é: \"Minha\nprimeira página Web\". É importante que notemos que o elemento title está\ncontido dentro do elemento head, o qual, por sua vez, está contido\ndentro do elemento html.
  8. \n
  9. Finalmente temos o elemento body que contem o conteúdo que se mostrará no\nnavegador. Neste caso, dentro do body temos dois elementos adicionais: o h1\n(cabeçalho) e o p (parágrafo).
  10. \n
\n

Existem muito mais elementos e tags HTML que você vai aprender. Por agora, é\nhora de regressar ao JavaScript.

\n

HTML e JavaScript

\n

É importante que você entenda que HTML não é uma linguagem de programação, mas sim uma linguagem de marcação. Como já vimos, com HTML\ndamos uma estrutura a nosso site. No entanto, se queremos dar a ele\ncomportamento ou interação, necessitamos usar uma linguagem de programação. E a única linguagem de programação que roda nos navegadores web\né o JavaScript. Com JavaScript conseguimos que os sites possam responder as\nações dos usuários, tornado-os interativos.

\n

Para incluir JavaScript em um arquivo HTML você pode utilizar o elemento\nscript e colocar seu código JavaScript entre as tags de abertura e fechamento,\ntal como mostra o seguinte exemplo:

\n
<!DOCTYPE html>\n<html>\n  <head>\n    <title>Minha primeira página Web</title>\n  </head>\n  <body>\n    <h1>Olá Mundo!</h1>\n    <p>Esta é minha primeira página Web</p>\n\n    <script type=\"text/javascript\">\n      alert('Olá Mundo!');\n    </script>\n\n  </body>\n</html>\n
\n

Muitas vezes o código JavaScript é tão extenso que você vai querer que ele não\nesteja escrito no mesmo arquivo HTML. Para isso, a solução é criar um novo\narquivo, em formato JavaScript - usando a extensão .js - e \"linkar\" ambos\narquivos por meio do elemento script da seguinte maneira:

\n
<script src=\"nome-do-arquivo.js\"></script>\n
\n

O elemento script tem um \"atributo\" chamado src (de source, que significa\nfonte em inglês), no qual você pode colocar a caminho do seu arquivo JavaScript.

\n

Adicionando interação à sua página

\n

Agora é sua vez! Continue assistindo os vídeos e seguindo os passos para agregar\ninteração ao seu site.

\n

Os passos são os seguintes:

\n
    \n
  1. Inclua o elemento script ao final do body de teu arquivo HTML
  2. \n
  3. Dentro do HTML, entre as etiquetas de íncio e fechamento do elemento\nscript, escreva uma linha de código JavaScript (por exemplo, algo com\nalert(), document.write() ou prompt())
  4. \n
  5. Salve o arquivo HTML
  6. \n
  7. Atualize a página de seu navegador onde está carregado o arquivo HTML
  8. \n
  9. Crie um novo arquivo chamado app.js na mesma pasta onde está o seu\nHTML
  10. \n
  11. Inclua no atributo src ao elemento script com o caminho do arquivo\napp.js
  12. \n
  13. Passe todo o código JavaScript do arquivo HTML para o arquivo JS
  14. \n
  15. Atualize a página do navegador e confirme se tudo funciona exatamente como\nantes.
  16. \n
\n

A seguir o vídeo:

\n

" } } }, @@ -117,11 +117,11 @@ "intl": { "es": { "title": "HTML", - "body": "

Objetivos de Aprendizaje

\n
    \n
  • Conocer los elementos HTML más comunes
  • \n
  • Entender el concepto de anidamiento HTML
  • \n
  • Conocer las diferencias en el comportamiento bloque y en línea de elementos\nHTML
  • \n
  • Conocer qué son y para qué sirven los atributos de elementos HTML
  • \n
\n

Veamos qué es HTML

\n

Anteriormente aprendiste a crear un archivo HTML y a vincularlo con tu archivo\nJavaScript. En esta lectura profundizaremos más en HTML.

\n

Revisando directamente la documentación del Mozilla Developer Network\ntenemos lo siguiente:

\n
\n

HTML (HyperText Markup Language) no es un lenguaje de programación, es un\nlenguaje de marcado, usado para decirle a tu navegador cómo estructurar las\npáginas que visitas. Puede ser tan complejo o tan simple como desee el\ndesarollador web.

\n

HTML consiste en una serie de elementos, que puedes utilizar para encerrar,\nenvolver, o marcar partes diferentes del contenido para hacer que aparezcan de\nuna cierta manera, o actúen de determinada forma. Las etiquetas que envuelven\nun trozo de contenido pueden hacer que dicho contenido enlace con otra página,\nponga una palabra en cursiva, etcétera.

\n
\n

HTML5

\n

HTML5 es la última versión de HTML. El término representa dos conceptos\ndiferentes:

\n
    \n
  • Se trata de una nueva versión de HTML, con nuevos elementos, atributos y\ncomportamientos.
  • \n
  • Contiene un conjunto más amplio de tecnologías que permite a los sitios Web\ny a las aplicaciones ser más diversas y de gran alcance. A este conjunto se\nle llama HTML5 y amigos, a menudo reducido a HTML5.
  • \n
\n

Diseñado para ser utilizable por todos los desarrolladores de Open Web, esta\npágina referencía numerosos recursos sobre las tecnologías de HTML5,\nclasificados en varios grupos según su función.

\n
    \n
  • Semántica: Permite describir con mayor precisión cual es su contenido.
  • \n
  • Conectividad: Permite comunicarse con el servidor de formas nuevas e\ninnovadoras.
  • \n
  • Sin conexión y almacenamiento: Permite a las páginas web almacenar datos\nlocalmente en el lado del cliente y operar sin conexión de manera más eficiente.
  • \n
  • Multimedia: Nos otorga un excelente soporte para utilizar contenido\nmultimedia como lo son audio y video nativamente.
  • \n
  • Gráficos y efectos 2D/3D: Proporciona una amplia gama de nuevas\ncaracterísticas que se ocupan de los gráficos en la web como lo son canvas\n2D, WebGL, SVG, etc.
  • \n
  • Rendimiento e Integración: Proporciona una mayor optimización de la\nvelocidad y un mejor uso del hardware.
  • \n
  • Acceso al dispositivo: Proporciona APIs para el uso de varios\ncompomentes internos de entrada y salida de nuestro dispositivo.
  • \n
  • CSS3: Nos ofrece una nueva gran variedad de opciones para hacer diseños\nmás sofisticados.
  • \n
\n
\n

Este es un extracto de la documentación de MDN\nque podemos encontrar sobre HTML5.

\n
\n

Anatomía de un elemento HTML

\n

Recordemos que salvo algunas excepciones (por ejemplo <!DOCTYPE html>), los\nelementos html comienzan con una etiqueta de apertura (o inicio) y terminan\ncon una etiqueta de cierre (o fin). Por ejemplo, el elemento p comienza\ncon la etiqueta de inicio <p> y termina con la etiqueta de cierre </p>. El\ntexto que se encuentra entre las etiquetas de apertura y de cierre es el\ncontenido del elemento.

\n

\"Ejemplo

\n

Anidamiento HTML

\n

Un elemento puede contener en su contenido otros elementos o etiquetas HTML.\nEsto se llama anidamiento.

\n

Recordemos la estructura básica de un documento html que hemos venido usando\nen la mayoría de nuestros ejercicios y agreguemos un par de elementos\nadicionales:

\n
<!DOCTYPE html>\n<html>\n  <head>\n    <title>HTML anidado</title>\n  </head>\n  <body>\n    <h1>Laboratoria</h1>\n    <p>Código <em>que</em> <strong>transforma</strong></p>\n  </body>\n</html>\n
\n

Fíjate cómo ciertos elementos \"anidan\" otros. Es decir, algunos\nelementos están \"contenidos\" dentro de otros. Por ejemplo, el elemento body\ntiene dos elementos anidados (o hijos) que son el título h1 y el\npárrafo p. A su vez, el párrafo p contiene dos elementos adicionales\n(otros hijos): em y strong.

\n

Podemos visualizar este concepto de anidamiento html de la siguiente manera:

\n

\"Anidamiento

\n

En este ejemplo vemos elementos que ya deberían ser familiares para ti. Ya\nconoces sobre la etiqueta DOCTYPE, los elementos head, body, title, h1\ny p. Un par de elementos adicionales que hemos añandido son: em que hace que\nsu contenido se visualice como texto en cursiva y strong que hace que su\ncontenido se visualice como texto en negrita.

\n

Al abrir este documento en el navegador tendremos lo siguiente:

\n

\"HTML

\n

Elementos bloque vs. en línea

\n

Regresemos a la lectura de HTML del Mozilla Developer Network.\nNos dice:

\n
\n

Existen dos importantes categorías de elementos en HTML: elementos a nivel de\nbloque y elementos en línea.

\n

Los elementos a nivel de bloque forman un bloque visible en una página —\naparecerán en una nueva línea de cualquier contenido que haya venido antes,\ny cualquier contenido que venga después también aparecerá en una nueva línea.\nLos elementos a nivel de bloque tienden a ser elementos estructurales en la\npágina que representan por ejemplo párrafos, listas, menús de navegación,\npies de página, etc. Un elemento a nivel de bloque no estaría anidado dentro\nde un elemento en línea, pero podría estar anidado dentro de otro elemento\na nivel de bloque.

\n

Los elementos en línea son aquellos que están contenidos dentro de\nelementos a nivel de bloque y rodean solo pequeñas partes del contenido\ndel documento, no párrafos enteros ni agrupaciones de contenido. Un elemento\nen línea no causará que una nueva línea aparezca en el documento:\nnormalmente aparecen dentro de un párrafo o texto, por ejemplo elementos de\nénfasis como em o strong.

\n
\n

Veamos un ejemplo:

\n
<!DOCTYPE html>\n<html>\n  <head>\n    <title>HTML anidado</title>\n  </head>\n  <body>\n    <em>primero</em><strong>segundo</strong><em>tercero</em>\n    <p>cuarto</p><p>quinto</p><p>sexto</p>\n  </body>\n</html>\n
\n

Al visualizar el documento anterior en el navegador tendremos:

\n

\"Block

\n

Tanto em como strong son elementos en línea. Por lo tanto, los tres\nprimeros elementos se sitúan en la misma línea uno tras otros sin espacio\nentre ellos. Por otro lado, p es un elemento a nivel de bloque, así que\ncada elemento aparece en una nueva línea, con espacio sobre y debajo de\ncada p.

\n

Elementos HTML

\n

Tienes a tu disposición múltiples elementos HTML para construir productos en\nla web. Investiga por tu cuenta (utilizando tu gran aliado Google) y aprende\ncómo agregar lo siguiente a una web:

\n
    \n
  1. Encabezados para títulos y subtítulos (tip: headings)
  2. \n
  3. Un link
  4. \n
  5. Una tabla
  6. \n
  7. Una lista
  8. \n
  9. Una imagen
  10. \n
  11. Una línea divisoria (tip: horizontal rule)
  12. \n
  13. Una cita
  14. \n
  15. Resaltar un texto (tip: mark)
  16. \n
\n

Para cada elemento anterior entiende si se comporta como inline o como\nblock.

\n

Atributos

\n

En tu investigación seguro te topaste con\nel elemento a para agregar un link a tu web:\ny habrás notado que en la etiqueta de apertura aparece una serie de información:

\n
<a href=\"http://laboratoria.la/\" target=\"_blank\" title=\"Página de inicio de Laboratoria\">Ir a Laboratoria</a>\n
\n

Esa información son atributos. Los atributos nos dan información adicional\nsobre el contenido de un elemento que no queremos que aparezca en el\ncontenido actual. En algunos casos agregan características\ny/o comportamiento a tu elemento HTML. Los atributos aparencen en la\netiqueta de apertura del elemento y consisten de dos partes: un nombre\ny un valor, separados por un signo de igual (=).

\n

En el caso del ejemplo anterior, podemos visualizar tres\natributos: el atributo href, el atributo target y el atributo title.

\n
    \n
  • \n

    El atributo href especifica la dirección web que quieres que el enlace\napunte; es decir, donde el navegador navega cuando se le hace clic. En este\nejemplo vemos que apunta a la página de inicio de Laboratoria:\nhttp://laboratoria.la/

    \n
  • \n
  • \n

    El atributo target especifica el contexto de navegación que será usado\npara mostrar el enlace. Por ejemplo, target=\"_blank\" mostrará el enlace en\nuna nueva pestaña. Si quieres mostrar el enlace en la pestaña actual solo\nomite este atributo.

    \n
  • \n
  • \n

    El atributo title especifica información extra sobre el enlace, como qué\npágina es la que estás enlazando. En nuestro ejemplo dice \"Página de inicio\nde Laboratoria\". Esto aparecera como información cuando se pase el mouse\npor encima del link.

    \n
  • \n
\n

Atributo style

\n

Existen muchos atributos comunes a todos los elementos html y existen atributos\nespecíficos que son asociados a un elemento en particular. Un atributo que\naplica a casi todos los elementos html es el atributo style lo cual\npermite darle estilos a tu elemento. Por ejemplo, si queremos que el contenido\ndentro de un elemento p sea de color rojo sobre fondo amarillo y con un borde\nnegro, hacemos:

\n
<p style=\"color:red; background-color: yellow; border: 1px solid black;\">Código\n  <em>que</em>\n  <strong>transforma</strong>\n</p>\n
\n

Al visualizar el documento anterior en el navegador tendremos:

\n

\"Style

\n

Un atributo de estilo puede contener una o más declaraciones. Cada declaración\nestá compuesta por una\npropiedad (como el color) seguida de dos puntos y un valor\n(como rojo). Cuando tenemos más de una declaración, cada una debe estar\nseparada por punto y coma (;). Por ejemplo: \"color:red; background-color: yellow;\".

\n

Hay un montón de aspectos que pueden ser influenciados por el estilo. Por\nejemplo, la propiedad display controla si un elemento se muestra como un\nbloque o en línea, o inclusive no mostrarlo:

\n
<p>\n  Un texto se puede mostrar <strong>en línea</strong>,\n  <strong style=\"display: block\">como bloque</strong>, y\n  <strong style=\"display: none\">no visualizarse</strong>.\n</p>\n
\n

La vista en el navegador de esto sería:

\n

\"Style

\n

El texto \"en línea\" se muestra inline (es decir, en la misma línea del texto\nanterior \"Un texto se puede mostrar\") porque recordemos que el elemento strong\nes de tipo inline. El texto \"como bloque\" terminará en su propia línea, ya que\nlos elementos de tipo bloque no se muestran en línea con el texto que los\nrodea. Recuerda que cuando un elemento es de tipo bloque aparecerá en una\nnueva línea de cualquier contenido que haya venido antes,\ny cualquier contenido que venga después también aparecerá en una nueva\nlínea. El texto \"no visualizarse\" no se muestra porque al asignar el valor de\nnone para display impide que un elemento aparezca en la pantalla. Esta es\nuna forma de ocultar elementos.

\n

Etiquetas vacías

\n

En tu investigación seguro también te topaste con\nel elemento <img> para agregar una imagen a tu web\ny habrás notado que no tiene una etiqueta de cierre y, por lo tanto, no tiene\n\"contenido\":

\n
<img src=\"http://cde.2.trome.pe/ima/0/1/1/8/5/1185397.jpg\">\n
\n

Algunas etiquetas no tienen directamente contenido; más bien reciben una fuente\nde la cual obtener el contenido. Esto es lo que sucede con\nel elemento img. El atributo src brinda la ruta del contenido. En este caso,\nal ir a la ruta http://cde.2.trome.pe/ima/0/1/1/8/5/1185397.jpg encontraremos\nla foto de Mariana con Mark y Barack :)

\n

\"Foto

\n

Otro elemento que no tiene etiqueta de cierre es br. Lee la documentación\nde MDN sobre br.\n¿Para qué sirve br?

\n

Comentarios en HTML

\n

Así como podemos comentar nuestro código javascript para hacerlo más\nentendible, también podemos agregar comentarios a nuestro código html.\nPara definir un comentario en un archivo html, usamos las etiquetas <!-- para\narbrir el comentario y --> para cerrarlo.

\n
<!-- Esto es un comentario. No se verá en la web, pero sí en mi código. -->\n
\n

Replicando la página de Grace Hopper de wikipedia

\n

Ahora que tienes una idea de los elementos html más comunes, su\ncomportamiento (inline vs block) y sus atributos principales, Michelle te\nexplicará cómo construir una réplica de la página de Grace Hopper de wikipedia:

\n

\"Grace

\n

Los elementos div y span

\n

Muchas veces al crear nuestra estructura HTML se vuelve necesario \"agrupar\"\nelementos para dividir nuestra web en secciones o partes lógicas. Por ejemplo,\nsi en el footer (o pie de página) de nuestra web queremos mostrar los íconos\nde nuestras redes sociales junto a links de contacto, es útil agrupar todos\nlos íconos en una sección y los links en otra sección, y que ambos grupos estén\ncontenidos dentro del footer.

\n

Para realizar estas agrupaciones, podemos utilizar los elementos div y\nspan. Los elementos div y span son como \"contenedores\" vacíos que\nllenamos de otros elementos y contenido.

\n
    \n
  • \n

    El elemento div define una división o una sección en un documento\nHTML. Se utiliza para agrupar elementos de bloque. Frecuentemente se\nutiliza como un contenedor para otros elementos. Un div es un bloque, lo\nque significa que tiene un salto de línea antes y después.

    \n
  • \n
  • \n

    El elemento span se utiliza como un contenedor para textos. Es de\ntipo inline; es decir, aparece entre líneas, como parte de un párrafo.

    \n
  • \n
\n

Veamos un ejemplo:

\n
<!DOCTYPE html>\n<html>\n  <body>\n    <div style=\"background-color: green; color: white\">\n      <h2>Ciudad de México</h2>\n      <p>La Ciudad de México, anteriormente conocida como el Distrito Federal,\n        es una de las 32 entidades federativas de México, así como la capital\n        de los <span style =\"color: yellow\">Estados Unidos Mexicanos</span>.\n      </p>\n    </div>\n    <div style=\"background-color: red; color: white\">\n      <h2>Lima</h2>\n      <p>Lima es la capital de la <span style =\"color: yellow\">República del\n        Perú</span> y de la provincia homónima. Se sitúa en la costa central\n        del país, a orillas del océano Pacífico, conformando una extensa y\n        populosa área urbana conocida como Lima Metropolitana, flanqueada por\n        el desierto costero y extendida sobre los valles de los ríos Chillón,\n        Rímac y Lurín.\n      </p>\n    </div>\n    <div style=\"background-color: blue; color: white\">\n      <h2>Santiago</h2>\n      <p>Santiago, llamada también Santiago de Chile, es la capital de\n        <span style =\"color: yellow\">Chile</span> y de la región Metropolitana\n        de Santiago. Es el principal núcleo urbano del país y su área\n        metropolitana se conoce también con el nombre de Gran Santiago.\n      </p>\n    </div>\n  </body>\n</html>\n
\n

Al visualizar el ejemplo anterior en el navegador tenemos:

\n

\"Div

\n

Fíjate cómo hemos agrupado todo lo relacionado a un país en un div. Esto es\nútil porque crea secciones que siguen un orden lógico. Pero, más importante\naún, tener estas secciones separadas permite darle estilos diferentes a cada\nsección: el color de fondo y el color de la fuente varían para cada\npaís. Lo mismo sucede con las palabras que mostramos en amarillo. Gracias a span\npodemos hacer que ciertos pedazos de texto tengan un estilo diferente.

" + "body": "

Objetivos de Aprendizaje

\n
    \n
  • Conocer los elementos HTML más comunes
  • \n
  • Entender el concepto de anidamiento HTML
  • \n
  • Conocer las diferencias en el comportamiento bloque y en línea de elementos\nHTML
  • \n
  • Conocer qué son y para qué sirven los atributos de elementos HTML
  • \n
\n

Veamos qué es HTML

\n

Anteriormente aprendiste a crear un archivo HTML y a vincularlo con tu archivo\nJavaScript. En esta lectura profundizaremos más en HTML.

\n

Revisando directamente la documentación del Mozilla Developer Network\ntenemos lo siguiente:

\n
\n

HTML (HyperText Markup Language) no es un lenguaje de programación, es un\nlenguaje de marcado, usado para decirle a tu navegador cómo estructurar las\npáginas que visitas. Puede ser tan complejo o tan simple como desee el\ndesarollador web.

\n

HTML consiste en una serie de elementos, que puedes utilizar para encerrar,\nenvolver, o marcar partes diferentes del contenido para hacer que aparezcan de\nuna cierta manera, o actúen de determinada forma. Las etiquetas que envuelven\nun trozo de contenido pueden hacer que dicho contenido enlace con otra página,\nponga una palabra en cursiva, etcétera.

\n
\n

HTML5

\n

HTML5 es la última versión de HTML. El término representa dos conceptos\ndiferentes:

\n
    \n
  • Se trata de una nueva versión de HTML, con nuevos elementos, atributos y\ncomportamientos.
  • \n
  • Contiene un conjunto más amplio de tecnologías que permite a los sitios Web\ny a las aplicaciones ser más diversas y de gran alcance. A este conjunto se\nle llama HTML5 y amigos, a menudo reducido a HTML5.
  • \n
\n

Diseñado para ser utilizable por todos los desarrolladores de Open Web, esta\npágina referencía numerosos recursos sobre las tecnologías de HTML5,\nclasificados en varios grupos según su función.

\n
    \n
  • Semántica: Permite describir con mayor precisión cual es su contenido.
  • \n
  • Conectividad: Permite comunicarse con el servidor de formas nuevas e\ninnovadoras.
  • \n
  • Sin conexión y almacenamiento: Permite a las páginas web almacenar datos\nlocalmente en el lado del cliente y operar sin conexión de manera más eficiente.
  • \n
  • Multimedia: Nos otorga un excelente soporte para utilizar contenido\nmultimedia como lo son audio y video nativamente.
  • \n
  • Gráficos y efectos 2D/3D: Proporciona una amplia gama de nuevas\ncaracterísticas que se ocupan de los gráficos en la web como lo son canvas\n2D, WebGL, SVG, etc.
  • \n
  • Rendimiento e Integración: Proporciona una mayor optimización de la\nvelocidad y un mejor uso del hardware.
  • \n
  • Acceso al dispositivo: Proporciona APIs para el uso de varios\ncompomentes internos de entrada y salida de nuestro dispositivo.
  • \n
  • CSS3: Nos ofrece una nueva gran variedad de opciones para hacer diseños\nmás sofisticados.
  • \n
\n
\n

Este es un extracto de la documentación de MDN\nque podemos encontrar sobre HTML5.

\n
\n

Anatomía de un elemento HTML

\n

Recordemos que salvo algunas excepciones (por ejemplo <!DOCTYPE html>), los\nelementos html comienzan con una etiqueta de apertura (o inicio) y terminan\ncon una etiqueta de cierre (o fin). Por ejemplo, el elemento p comienza\ncon la etiqueta de inicio <p> y termina con la etiqueta de cierre </p>. El\ntexto que se encuentra entre las etiquetas de apertura y de cierre es el\ncontenido del elemento.

\n

\"Ejemplo

\n

Anidamiento HTML

\n

Un elemento puede contener en su contenido otros elementos o etiquetas HTML.\nEsto se llama anidamiento.

\n

Recordemos la estructura básica de un documento html que hemos venido usando\nen la mayoría de nuestros ejercicios y agreguemos un par de elementos\nadicionales:

\n
<!DOCTYPE html>\n<html>\n  <head>\n    <title>HTML anidado</title>\n  </head>\n  <body>\n    <h1>Laboratoria</h1>\n    <p>Código <em>que</em> <strong>transforma</strong></p>\n  </body>\n</html>\n
\n

Fíjate cómo ciertos elementos \"anidan\" otros. Es decir, algunos\nelementos están \"contenidos\" dentro de otros. Por ejemplo, el elemento body\ntiene dos elementos anidados (o hijos) que son el título h1 y el\npárrafo p. A su vez, el párrafo p contiene dos elementos adicionales\n(otros hijos): em y strong.

\n

Podemos visualizar este concepto de anidamiento html de la siguiente manera:

\n

\"Anidamiento

\n

En este ejemplo vemos elementos que ya deberían ser familiares para ti. Ya\nconoces sobre la etiqueta DOCTYPE, los elementos head, body, title, h1\ny p. Un par de elementos adicionales que hemos añandido son: em que hace que\nsu contenido se visualice como texto en cursiva y strong que hace que su\ncontenido se visualice como texto en negrita.

\n

Al abrir este documento en el navegador tendremos lo siguiente:

\n

\"HTML

\n

Elementos bloque vs. en línea

\n

Regresemos a la lectura de HTML del Mozilla Developer Network.\nNos dice:

\n
\n

Existen dos importantes categorías de elementos en HTML: elementos a nivel de\nbloque y elementos en línea.

\n

Los elementos a nivel de bloque forman un bloque visible en una página —\naparecerán en una nueva línea de cualquier contenido que haya venido antes,\ny cualquier contenido que venga después también aparecerá en una nueva línea.\nLos elementos a nivel de bloque tienden a ser elementos estructurales en la\npágina que representan por ejemplo párrafos, listas, menús de navegación,\npies de página, etc. Un elemento a nivel de bloque no estaría anidado dentro\nde un elemento en línea, pero podría estar anidado dentro de otro elemento\na nivel de bloque.

\n

Los elementos en línea son aquellos que están contenidos dentro de\nelementos a nivel de bloque y rodean solo pequeñas partes del contenido\ndel documento, no párrafos enteros ni agrupaciones de contenido. Un elemento\nen línea no causará que una nueva línea aparezca en el documento:\nnormalmente aparecen dentro de un párrafo o texto, por ejemplo elementos de\nénfasis como em o strong.

\n
\n

Veamos un ejemplo:

\n
<!DOCTYPE html>\n<html>\n  <head>\n    <title>HTML anidado</title>\n  </head>\n  <body>\n    <em>primero</em><strong>segundo</strong><em>tercero</em>\n    <p>cuarto</p><p>quinto</p><p>sexto</p>\n  </body>\n</html>\n
\n

Al visualizar el documento anterior en el navegador tendremos:

\n

\"Block

\n

Tanto em como strong son elementos en línea. Por lo tanto, los tres\nprimeros elementos se sitúan en la misma línea uno tras otros sin espacio\nentre ellos. Por otro lado, p es un elemento a nivel de bloque, así que\ncada elemento aparece en una nueva línea, con espacio sobre y debajo de\ncada p.

\n

Elementos HTML

\n

Tienes a tu disposición múltiples elementos HTML para construir productos en\nla web. Investiga por tu cuenta (utilizando tu gran aliado Google) y aprende\ncómo agregar lo siguiente a una web:

\n
    \n
  1. Encabezados para títulos y subtítulos (tip: headings)
  2. \n
  3. Un link
  4. \n
  5. Una tabla
  6. \n
  7. Una lista
  8. \n
  9. Una imagen
  10. \n
  11. Una línea divisoria (tip: horizontal rule)
  12. \n
  13. Una cita
  14. \n
  15. Resaltar un texto (tip: mark)
  16. \n
\n

Para cada elemento anterior entiende si se comporta como inline o como\nblock.

\n

Atributos

\n

En tu investigación seguro te topaste con\nel elemento a para agregar un link a tu web:\ny habrás notado que en la etiqueta de apertura aparece una serie de información:

\n
<a href=\"http://laboratoria.la/\" target=\"_blank\" title=\"Página de inicio de Laboratoria\">Ir a Laboratoria</a>\n
\n

Esa información son atributos. Los atributos nos dan información adicional\nsobre el contenido de un elemento que no queremos que aparezca en el\ncontenido actual. En algunos casos agregan características\ny/o comportamiento a tu elemento HTML. Los atributos aparencen en la\netiqueta de apertura del elemento y consisten de dos partes: un nombre\ny un valor, separados por un signo de igual (=).

\n

En el caso del ejemplo anterior, podemos visualizar tres\natributos: el atributo href, el atributo target y el atributo title.

\n
    \n
  • \n

    El atributo href especifica la dirección web que quieres que el enlace\napunte; es decir, donde el navegador navega cuando se le hace clic. En este\nejemplo vemos que apunta a la página de inicio de Laboratoria:\nhttp://laboratoria.la/

    \n
  • \n
  • \n

    El atributo target especifica el contexto de navegación que será usado\npara mostrar el enlace. Por ejemplo, target=\"_blank\" mostrará el enlace en\nuna nueva pestaña. Si quieres mostrar el enlace en la pestaña actual solo\nomite este atributo.

    \n
  • \n
  • \n

    El atributo title especifica información extra sobre el enlace, como qué\npágina es la que estás enlazando. En nuestro ejemplo dice \"Página de inicio\nde Laboratoria\". Esto aparecera como información cuando se pase el mouse\npor encima del link.

    \n
  • \n
\n

Atributo style

\n

Existen muchos atributos comunes a todos los elementos html y existen atributos\nespecíficos que son asociados a un elemento en particular. Un atributo que\naplica a casi todos los elementos html es el atributo style lo cual\npermite darle estilos a tu elemento. Por ejemplo, si queremos que el contenido\ndentro de un elemento p sea de color rojo sobre fondo amarillo y con un borde\nnegro, hacemos:

\n
<p style=\"color:red; background-color: yellow; border: 1px solid black;\">Código\n  <em>que</em>\n  <strong>transforma</strong>\n</p>\n
\n

Al visualizar el documento anterior en el navegador tendremos:

\n

\"Style

\n

Un atributo de estilo puede contener una o más declaraciones. Cada declaración\nestá compuesta por una\npropiedad (como el color) seguida de dos puntos y un valor\n(como rojo). Cuando tenemos más de una declaración, cada una debe estar\nseparada por punto y coma (;). Por ejemplo: \"color:red; background-color: yellow;\".

\n

Hay un montón de aspectos que pueden ser influenciados por el estilo. Por\nejemplo, la propiedad display controla si un elemento se muestra como un\nbloque o en línea, o inclusive no mostrarlo:

\n
<p>\n  Un texto se puede mostrar <strong>en línea</strong>,\n  <strong style=\"display: block\">como bloque</strong>, y\n  <strong style=\"display: none\">no visualizarse</strong>.\n</p>\n
\n

La vista en el navegador de esto sería:

\n

\"Style

\n

El texto \"en línea\" se muestra inline (es decir, en la misma línea del texto\nanterior \"Un texto se puede mostrar\") porque recordemos que el elemento strong\nes de tipo inline. El texto \"como bloque\" terminará en su propia línea, ya que\nlos elementos de tipo bloque no se muestran en línea con el texto que los\nrodea. Recuerda que cuando un elemento es de tipo bloque aparecerá en una\nnueva línea de cualquier contenido que haya venido antes,\ny cualquier contenido que venga después también aparecerá en una nueva\nlínea. El texto \"no visualizarse\" no se muestra porque al asignar el valor de\nnone para display impide que un elemento aparezca en la pantalla. Esta es\nuna forma de ocultar elementos.

\n

Etiquetas vacías

\n

En tu investigación seguro también te topaste con\nel elemento <img> para agregar una imagen a tu web\ny habrás notado que no tiene una etiqueta de cierre y, por lo tanto, no tiene\n\"contenido\":

\n
<img src=\"http://cde.2.trome.pe/ima/0/1/1/8/5/1185397.jpg\">\n
\n

Algunas etiquetas no tienen directamente contenido; más bien reciben una fuente\nde la cual obtener el contenido. Esto es lo que sucede con\nel elemento img. El atributo src brinda la ruta del contenido. En este caso,\nal ir a la ruta http://cde.2.trome.pe/ima/0/1/1/8/5/1185397.jpg encontraremos\nla foto de Mariana con Mark y Barack :)

\n

\"Foto

\n

Otro elemento que no tiene etiqueta de cierre es br. Lee la documentación\nde MDN sobre br.\n¿Para qué sirve br?

\n

Comentarios en HTML

\n

Así como podemos comentar nuestro código javascript para hacerlo más\nentendible, también podemos agregar comentarios a nuestro código html.\nPara definir un comentario en un archivo html, usamos las etiquetas <!-- para\narbrir el comentario y --> para cerrarlo.

\n
<!-- Esto es un comentario. No se verá en la web, pero sí en mi código. -->\n
\n

Replicando la página de Grace Hopper de wikipedia

\n

Ahora que tienes una idea de los elementos html más comunes, su\ncomportamiento (inline vs block) y sus atributos principales, Michelle te\nexplicará cómo construir una réplica de la página de Grace Hopper de wikipedia:

\n

\n

Los elementos div y span

\n

Muchas veces al crear nuestra estructura HTML se vuelve necesario \"agrupar\"\nelementos para dividir nuestra web en secciones o partes lógicas. Por ejemplo,\nsi en el footer (o pie de página) de nuestra web queremos mostrar los íconos\nde nuestras redes sociales junto a links de contacto, es útil agrupar todos\nlos íconos en una sección y los links en otra sección, y que ambos grupos estén\ncontenidos dentro del footer.

\n

Para realizar estas agrupaciones, podemos utilizar los elementos div y\nspan. Los elementos div y span son como \"contenedores\" vacíos que\nllenamos de otros elementos y contenido.

\n
    \n
  • \n

    El elemento div define una división o una sección en un documento\nHTML. Se utiliza para agrupar elementos de bloque. Frecuentemente se\nutiliza como un contenedor para otros elementos. Un div es un bloque, lo\nque significa que tiene un salto de línea antes y después.

    \n
  • \n
  • \n

    El elemento span se utiliza como un contenedor para textos. Es de\ntipo inline; es decir, aparece entre líneas, como parte de un párrafo.

    \n
  • \n
\n

Veamos un ejemplo:

\n
<!DOCTYPE html>\n<html>\n  <body>\n    <div style=\"background-color: green; color: white\">\n      <h2>Ciudad de México</h2>\n      <p>La Ciudad de México, anteriormente conocida como el Distrito Federal,\n        es una de las 32 entidades federativas de México, así como la capital\n        de los <span style =\"color: yellow\">Estados Unidos Mexicanos</span>.\n      </p>\n    </div>\n    <div style=\"background-color: red; color: white\">\n      <h2>Lima</h2>\n      <p>Lima es la capital de la <span style =\"color: yellow\">República del\n        Perú</span> y de la provincia homónima. Se sitúa en la costa central\n        del país, a orillas del océano Pacífico, conformando una extensa y\n        populosa área urbana conocida como Lima Metropolitana, flanqueada por\n        el desierto costero y extendida sobre los valles de los ríos Chillón,\n        Rímac y Lurín.\n      </p>\n    </div>\n    <div style=\"background-color: blue; color: white\">\n      <h2>Santiago</h2>\n      <p>Santiago, llamada también Santiago de Chile, es la capital de\n        <span style =\"color: yellow\">Chile</span> y de la región Metropolitana\n        de Santiago. Es el principal núcleo urbano del país y su área\n        metropolitana se conoce también con el nombre de Gran Santiago.\n      </p>\n    </div>\n  </body>\n</html>\n
\n

Al visualizar el ejemplo anterior en el navegador tenemos:

\n

\"Div

\n

Fíjate cómo hemos agrupado todo lo relacionado a un país en un div. Esto es\nútil porque crea secciones que siguen un orden lógico. Pero, más importante\naún, tener estas secciones separadas permite darle estilos diferentes a cada\nsección: el color de fondo y el color de la fuente varían para cada\npaís. Lo mismo sucede con las palabras que mostramos en amarillo. Gracias a span\npodemos hacer que ciertos pedazos de texto tengan un estilo diferente.

" }, "pt": { "title": "HTML", - "body": "

Objetivos de Aprendizagem

\n
    \n
  • Conhecer os elementos HTML mais comuns
  • \n
  • Entenda o conceito de aninhamento de HTML
  • \n
  • Conheça as diferenças no comportamento bloco e inline de elementos HTML
  • \n
  • Saiba quais são os atributos dos elementos HTML e para que servem
  • \n
  • Conheça elementos HTML semânticos
  • \n
\n

O que é HTML?

\n

Anteriormente você aprendeu a criar um arquivo HTML e vinculá-lo ao seu arquivo\nJavaScript. Nesta lição, nos aprofundaremos no HTML.

\n

Analisando diretamente a documentação da Mozilla Developer\nNetwork,\ntemos o seguinte:

\n
\n

HTML (HyperText Markup Language) não é uma linguagem de programação, é uma\nlinguagem de marcação utilizada para dizer ao seu navegador como estruturar a\npágina web que você visita. A página pode ser tão complicada ou tão simples\nquanto o desenvolvedor web desejar que seja.

\n

O HTML consiste em uma série de elementos que você usa para anexar, envolver ou\nmarcar diferentes partes do conteúdo para que apareça ou aja de uma certa\nmaneira. O fechamento das tags pode transformar uma parte do conteúdo dentro do\nelemento em um link para direcionar à uma outra página web, colocar as palavras\nem itálico, e assim por diante.

\n
\n

HTML5

\n

HTML5 é a última versão do HTML. Ele apresenta dois conceitos diferentes:

\n
    \n
  • Se trata de uma nova versão de HTML, com novos elementos, atributos e\ncomportamentos.
  • \n
  • Contém um conjunto mais amplo de tecnologias que permite aos sites e apps\nserem mais diversos e de maior alcance. A este conjunto damos o nome de:\nHTML5.
  • \n
\n

Desenhado de forma a ser utilizado por todos os desenvolvedores de Open Web,\nesta página referencia numerosos recursos sobre as tecnologias de HTML5,\nclassificados em grupos segundo sua função.

\n
    \n
  • Semântica: permitindo que descreva mais precisamente o que é o seu\nconteúdo
  • \n
  • Conectividade: permitindo que comunique com o servidor de maneiras novas e\ninovadoras
  • \n
  • Off-line e armazenamento permitindo webpages armazenem dados localmente no\nclient-side (lado do cliente) e operem offline de forma mais eficiente
  • \n
  • Multimédia tornando o vídeo e áudio de primeira classe cidadãos na Open\nWeb
  • \n
  • Gráficos e efeitos 2D/3D: permitindo uma gama muito mais diversificada de\nopções de apresentação
  • \n
  • Desempenho e integração: proporcionando maior otimização de velocidade e\nmelhor uso do hardware do computador
  • \n
  • Acesso ao dispositivo: permitindo o uso de vários dispositivos de entrada\ne saída
  • \n
  • Estilização: permitindo que os autores escrevam temas mais sofisticados
  • \n
\n
\n

Este é um extrato da documentação do\nMDN que podemos encontrar\nsobre HTML5.

\n
\n

Anatomia de um elemento HTML

\n

Lembre-se de que, com algumas exceções (por exemplo <!DOCTYPE html>), os\nelementos html começam com um tag de abertura ou início e terminam com um\ntag de fechamento (ou fim). Por exemplo, o elemento p começa com a tag\ninicial <p> e termina com a tag final </p>. O texto entre as tags de\nabertura e fechamento é o conteúdo do elemento.

\n

\"Tag

\n

Aninhamento de HTML

\n

Um elemento pode conter outros elementos ou tags HTML em seu conteúdo. Isso é\nchamado de aninhamento.

\n

Lembre-se da estrutura básica de um documento HTML que estamos usando na maioria\ndos nossos exercícios e inclua alguns elementos adicionais:

\n
<!DOCTYPE html>\n<html>\n  <head>\n    <title>HTML Aninhado</title>\n  </head>\n  <body>\n    <h1>Laboratoria</h1>\n    <p>Código <em>que</em> <strong>transforma</strong></p>\n  </body>\n</html>\n
\n

Observe como certos elementos \"aninham\" outros. Ou seja, alguns elementos estão\n\"contidos\" nos outros. Por exemplo, o elemento body tem dois elementos\naninhados (ou filhos) que são o título h1 e o parágrafo p. Por sua vez, o\nparágrafo p contém dois elementos adicionais (outras crianças): em ou\nstrong.

\n

Podemos visualizar esse conceito de aninhamento de html da seguinte maneira:

\n

\"Aninhamento\nHTML\"

\n

Neste exemplo, vemos elementos que já devem ser familiares para você. Você sabe\nsobre a tag DOCTYPE, elementos head, body, title, h1 e p. Alguns\nelementos adicionais que adicionamos são: o em que faz com que seu conteúdo\nseja exibido como texto em itálico e strong que faz com que seu conteúdo\nseja exibido como texto em negrito.

\n

Ao abrir este documento no navegador, teremos o seguinte:

\n

\"HTML

\n

Elementos em bloco vs. inline

\n

Vamos voltar para a leitura sobre HTML da Mozilla Developer\nNetwork:

\n
\n

Há duas categorias importantes no HTML, que você precisa conhecer — elementos\nem bloco e elementos inline.

\n

Elementos em bloco formam um bloco visível na página. Eles aparecerão em\numa nova linha logo após qualquer elemento que venha antes dele, e qualquer\nconteúdo depois de um elemento em bloco também aparecerá em uma nova linha.\nElementos em bloco geralmente são elementos estruturais na página que\nrepresentam, por exemplo: parágrafos, listas, menus de navegação, rodapés etc.\nUm elemento em bloco não seria aninhado dentro de um elemento inline, mas pode\nser aninhado dentro de outro elemento em bloco.

\n

Elementos inline (na linha) são aqueles que estão contidos dentro de\nelementos em bloco, envolvem apenas pequenas partes do conteúdo do documento e\nnão parágrafos inteiros ou agrupamentos de conteúdo. Um elemento inline não\nfará com que uma nova linha apareça no documento: os elementos inline\ngeralmente aparecem dentro de um parágrafo de texto, por exemplo: um elemento\n<a> (hyperlink) ou elementos de ênfase como <em> ou <strong>.

\n
\n

Vamos ver um exemplo:

\n
<!DOCTYPE html>\n<html>\n  <head>\n    <title>HTML Aninhado</title>\n  </head>\n  <body>\n    <em>primeiro</em><strong>segundo</strong><em>terceiro</em>\n    <p>quarto</p><p>quinto</p><p>sexto</p>\n  </body>\n</html>\n
\n

Ao visualizar o documento anterior no navegador, teremos:

\n

\"Bloco

\n

Tanto em quanto eles strong são elementos inline. Portanto, os primeiros\ntrês elementos são colocados na mesma linha, um após o outro, sem espaço entre\neles. Por outro lado, p é um elemento no nível do bloco, então cada elemento\naparece em uma nova linha, com espaço acima e abaixo de cada um p.

\n

Elementos HTML

\n

Você tem à sua disposição vários elementos HTML para criar sites na web.\nInvestigue você mesmo (usando seu excelente parceiro do Google) e saiba como\nadicionar o seguinte a um website:

\n
    \n
  1. Cabeçalhos de títulos e legendas (dica: headings)
  2. \n
  3. Um link
  4. \n
  5. Uma tabela
  6. \n
  7. Uma lista
  8. \n
  9. Uma imagem
  10. \n
  11. Uma linha divisória (dica: horizontal rule)
  12. \n
  13. Uma data
  14. \n
  15. Realçar um texto (dica: mark)
  16. \n
\n

Para cada elemento anterior, entenda se ele se comporta como inline ou como\nblock.

\n

Atributos

\n

Em sua pesquisa, você certamente se deparou com o elemento a para adicionar\num link ao seu\nsite: e você deve\nter notado que uma série de informações aparece na tag de abertura:

\n
<a href=\"http://laboratoria.la/\" target=\"_blank\" title=\"Página inicial da Laboratoria\">Ir para Laboratoria</a>\n
\n

Essas informações são atributos. Os atributos nos fornecem informações\nadicionais sobre o conteúdo de um elemento que não queremos que apareça no\nconteúdo atual. Em alguns casos, eles adicionam recursos e/ou comportamento ao\nseu elemento HTML. Os atributos aparecem na tag de abertura do elemento e\nconsistem em duas partes: um nome e um valor, separados por um sinal de igual\n(=).

\n

No caso do exemplo anterior, podemos visualizar três atributos: o atributo\nhref, o atributo target e o atributo title.

\n
    \n
  • \n

    O atributo href especifica o endereço da web para o qual você deseja que o\nlink aponte; isto é, aonde o navegador navega quando é clicado. Neste exemplo,\nvemos que aponta para a página inicial da Laboratoria:\nhttp://laboratoria.la/

    \n
  • \n
  • \n

    O atributo target especifica o contexto de navegação que será usado para\nexibir o link. Por exemplo, target=\"_blank\" mostrará o link em uma nova\nguia. Se você quiser mostrar o link na aba atual, apenas omita este atributo.

    \n
  • \n
  • \n

    O atributo title especifica informações extras sobre o link, como qual\npágina você está vinculando. No nosso exemplo, diz \"Página inicial da\nLaboratoria\". Isso aparecerá como informação quando o mouse estiver sobre o\nlink.

    \n
  • \n
\n

Atributo style

\n

Existem muitos atributos comuns a todos os elementos html e existem atributos\nespecíficos associados a um determinado elemento. Um atributo que se aplica a\nquase todos os elementos html é o atributo style que permite dar estilos ao\nseu elemento. Por exemplo, se quisermos que o conteúdo dentro de um elemento p\nseja vermelho em um fundo amarelo e com uma borda preta, fazemos:

\n
<p style=\"color:red; background-color: yellow; border: 1px solid black;\">\n  Código <em>que</em> <strong>transforma</strong>\n</p>\n
\n

Ao visualizar o documento anterior no navegador, teremos:

\n

\"Exemplo

\n

Um atributo de estilo pode conter uma ou mais instruções. Cada instrução é\ncomposta de uma propriedade (como cor) seguida por dois pontos e um\nvalor (como vermelho). Quando temos mais de uma declaração, cada uma deve\nser separada por ponto e vírgula (;). Por exemplo: \"color:red; background-color: yellow;\".

\n

Há muitos aspectos que podem ser influenciados pelo estilo. Por exemplo, a\npropriedade display controla se um item é exibido como um bloco ou em linha,\nou até mesmo não exibido:

\n
<p>\n  Um texto pode ser <strong>em linha</strong>,\n  <strong style=\"display: block\">como bloco</strong>,\n  <strong style=\"display: none\">ou oculto</strong>.\n</p>\n
\n

A visão no navegador disto seria:

\n

\"Exemplo

\n

O texto \"em linha\" é exibido em linha (ou seja, na mesma linha do texto\nanterior \"Um texto pode ser exibido\" ) porque lembramos que o elemento\nstrong é do tipo em linha. O texto \"como um bloco\" terminará em sua própria\nlinha, uma vez que os elementos do tipo bloco não são mostrados de acordo com o\ntexto ao redor. Lembre-se de que quando um item é do tipo bloco, ele aparecerá\nem uma nova linha de qualquer conteúdo que tenha vindo antes, e qualquer\nconteúdo que vier depois também aparecerá em uma nova linha. O texto \"ou\noculto\" não é exibido porque é atribuído o valor de none para display\nimpedir que um item apareça na tela. Esta é uma maneira de esconder elementos.

\n

Na próxima lição sobre css aprofundaremos o conceito de estilizar seus\nelementos html.

\n

Tags vazias

\n

Em sua pesquisa, você certamente se deparou com o elemento <img> para\nadicionar uma imagem ao seu\nsite e você\nnotou que ele não tem uma tag de fechamento e, portanto, não tem \"conteúdo\":

\n
<img src=\"http://cde.2.trome.pe/ima/0/1/1/8/5/1185397.jpg\">\n
\n

Algumas tags não contêm conteúdo diretamente; em vez disso, eles recebem uma\nfonte da qual obter o conteúdo. Isto é o que acontece com o elemento img. O\natributo src fornece o caminho do conteúdo. Neste caso, ao ir para o endereço\nhttp://cde.2.trome.pe/ima/0/1/1/8/5/1185397.jpg\nvamos encontrar a foto de Mariana com Mark e Barack 😀

\n

\"Foto

\n

Outro item que não tem uma tag de fechamento é br. Leia a documentação do MDN\nsobre br. Para\nque serve br?

\n

Comentários em HTML

\n

Assim como podemos comentar nosso código javascript para torná-lo mais\ncompreensível, também podemos adicionar comentários ao nosso código HTML. Para\ndefinir um comentário em um arquivo HTML, usamos os marcadores <!-- para abrir\no comentário e --> para fechá-lo.

\n
<!-- Isto é um comentário. Não será visto na página, mas sim em meu código. -->\n
\n

Recriando a página de Grace Hopper da Wikipédia

\n

Agora que você tem uma ideia dos elementos html mais comuns, seu comportamento\n(em linha ou em bloco) e seus principais atributos, a Paloma explicará como\nconstruir uma réplica da página da Wikipédia de Grace\nHopper :

\n

\"Grace\nHopper\"

\n

Os elementos divespan

\n

Muitas vezes, ao criar nossa estrutura HTML, torna-se necessário \"agrupar\"\nelementos para dividir nossa página web em seções ou partes lógicas. Por\nexemplo, se no footer (ou rodapé) do nosso site, queremos mostrar os ícones de\nnossas redes sociais com links de contato, é útil agrupar todos os ícones em uma\nseção e os links em outra seção, e que ambos os grupos estejam contidos no\nfooter.

\n

Para fazer esses agrupamentos, podemos usar os elementos div e span. Os\nelementos div e span são como \"contêineres\" vazios que preenchemos com\noutros elementos e conteúdo.

\n
    \n
  • O elemento div define uma divisão ou uma seção em um documento HTML. É usado\npara agrupar elementos de bloco. É frequentemente usado como um contêiner\npara outros elementos. A div é um bloco, o que significa que há uma quebra\nde linha antes e depois.
  • \n
  • O elemento span é usado como um contêiner para textos. É do tipo em\nlinha; isto é, aparece entre as linhas, como parte de um parágrafo.
  • \n
\n

Vejamos um exemplo:

\n
<!DOCTYPE html>\n<html>\n  <body>\n    <div style=\"background-color: green; color: white\">\n      <h2>Cidade do México</h2>\n      <p>A Cidade do México, anteriormente conhecida como Distrito Federal,\n        é uma das 32 unidades federativas do México, assim como a capital\n        dos <span style=\"color: yellow\">Estados Unidos Mexicanos</span>.\n      </p>\n    </div>\n    <div style=\"background-color: red; color: white\">\n      <h2>Lima</h2>\n      <p>Lima é a capital da <span style=\"color: yellow\">República do\n        Perú</span> e da província homônima. Situa-se na costa central do país,\n        às magens do Oceano Pacífico, contendo uma extensa e populosa\n        área urbana conhecida como Lima Metropolitana, cercada pelo\n        deserto costeiro e extendida sobre os vales dos rios Chillón,\n        Rímac e Lurín.\n      </p>\n    </div>\n    <div style=\"background-color: blue; color: white\">\n      <h2>Santiago</h2>\n      <p>Santiago, chamada também de Santiago do Chile, é a capidal do\n        <span style=\"color: yellow\">Chile</span> e da região Metropolitana\n        de Santiago. É o principal núcleo urbano do país e sua área\n        metropolitana também é conhecida pelo nome de Grande Santiago.\n      </p>\n    </div>\n  </body>\n</html>\n
\n

Ao visualizar o exemplo anterior no navegador, temos:

\n

\"Div

\n

Veja como agrupamos tudo relacionado a um país em um div. Isso é útil porque\nele cria seções que seguem uma ordem lógica. Mas, mais importante, ter essas\nseções separadas permite que você forneça estilos diferentes para cada seção: a\ncor do plano de fundo e a cor da fonte variam para cada país. O mesmo acontece\ncom as palavras que mostramos em amarelo. Graças a span nós podemos fazer com\nque certas partes do texto tenham um estilo diferente.

" + "body": "

Objetivos de Aprendizagem

\n
    \n
  • Conhecer os elementos HTML mais comuns
  • \n
  • Entenda o conceito de aninhamento de HTML
  • \n
  • Conheça as diferenças no comportamento bloco e inline de elementos HTML
  • \n
  • Saiba quais são os atributos dos elementos HTML e para que servem
  • \n
  • Conheça elementos HTML semânticos
  • \n
\n

O que é HTML?

\n

Anteriormente você aprendeu a criar um arquivo HTML e vinculá-lo ao seu arquivo\nJavaScript. Nesta lição, nos aprofundaremos no HTML.

\n

Analisando diretamente a documentação da Mozilla Developer\nNetwork,\ntemos o seguinte:

\n
\n

HTML (HyperText Markup Language) não é uma linguagem de programação, é uma\nlinguagem de marcação utilizada para dizer ao seu navegador como estruturar a\npágina web que você visita. A página pode ser tão complicada ou tão simples\nquanto o desenvolvedor web desejar que seja.

\n

O HTML consiste em uma série de elementos que você usa para anexar, envolver ou\nmarcar diferentes partes do conteúdo para que apareça ou aja de uma certa\nmaneira. O fechamento das tags pode transformar uma parte do conteúdo dentro do\nelemento em um link para direcionar à uma outra página web, colocar as palavras\nem itálico, e assim por diante.

\n
\n

HTML5

\n

HTML5 é a última versão do HTML. Ele apresenta dois conceitos diferentes:

\n
    \n
  • Se trata de uma nova versão de HTML, com novos elementos, atributos e\ncomportamentos.
  • \n
  • Contém um conjunto mais amplo de tecnologias que permite aos sites e apps\nserem mais diversos e de maior alcance. A este conjunto damos o nome de:\nHTML5.
  • \n
\n

Desenhado de forma a ser utilizado por todos os desenvolvedores de Open Web,\nesta página referencia numerosos recursos sobre as tecnologias de HTML5,\nclassificados em grupos segundo sua função.

\n
    \n
  • Semântica: permitindo que descreva mais precisamente o que é o seu\nconteúdo
  • \n
  • Conectividade: permitindo que comunique com o servidor de maneiras novas e\ninovadoras
  • \n
  • Off-line e armazenamento permitindo webpages armazenem dados localmente no\nclient-side (lado do cliente) e operem offline de forma mais eficiente
  • \n
  • Multimédia tornando o vídeo e áudio de primeira classe cidadãos na Open\nWeb
  • \n
  • Gráficos e efeitos 2D/3D: permitindo uma gama muito mais diversificada de\nopções de apresentação
  • \n
  • Desempenho e integração: proporcionando maior otimização de velocidade e\nmelhor uso do hardware do computador
  • \n
  • Acesso ao dispositivo: permitindo o uso de vários dispositivos de entrada\ne saída
  • \n
  • Estilização: permitindo que os autores escrevam temas mais sofisticados
  • \n
\n
\n

Este é um extrato da documentação do\nMDN que podemos encontrar\nsobre HTML5.

\n
\n

Anatomia de um elemento HTML

\n

Lembre-se de que, com algumas exceções (por exemplo <!DOCTYPE html>), os\nelementos html começam com um tag de abertura ou início e terminam com um\ntag de fechamento (ou fim). Por exemplo, o elemento p começa com a tag\ninicial <p> e termina com a tag final </p>. O texto entre as tags de\nabertura e fechamento é o conteúdo do elemento.

\n

\"Tag

\n

Aninhamento de HTML

\n

Um elemento pode conter outros elementos ou tags HTML em seu conteúdo. Isso é\nchamado de aninhamento.

\n

Lembre-se da estrutura básica de um documento HTML que estamos usando na maioria\ndos nossos exercícios e inclua alguns elementos adicionais:

\n
<!DOCTYPE html>\n<html>\n  <head>\n    <title>HTML Aninhado</title>\n  </head>\n  <body>\n    <h1>Laboratoria</h1>\n    <p>Código <em>que</em> <strong>transforma</strong></p>\n  </body>\n</html>\n
\n

Observe como certos elementos \"aninham\" outros. Ou seja, alguns elementos estão\n\"contidos\" nos outros. Por exemplo, o elemento body tem dois elementos\naninhados (ou filhos) que são o título h1 e o parágrafo p. Por sua vez, o\nparágrafo p contém dois elementos adicionais (outras crianças): em ou\nstrong.

\n

Podemos visualizar esse conceito de aninhamento de html da seguinte maneira:

\n

\"Aninhamento\nHTML\"

\n

Neste exemplo, vemos elementos que já devem ser familiares para você. Você sabe\nsobre a tag DOCTYPE, elementos head, body, title, h1 e p. Alguns\nelementos adicionais que adicionamos são: o em que faz com que seu conteúdo\nseja exibido como texto em itálico e strong que faz com que seu conteúdo\nseja exibido como texto em negrito.

\n

Ao abrir este documento no navegador, teremos o seguinte:

\n

\"HTML

\n

Elementos em bloco vs. inline

\n

Vamos voltar para a leitura sobre HTML da Mozilla Developer\nNetwork:

\n
\n

Há duas categorias importantes no HTML, que você precisa conhecer — elementos\nem bloco e elementos inline.

\n

Elementos em bloco formam um bloco visível na página. Eles aparecerão em\numa nova linha logo após qualquer elemento que venha antes dele, e qualquer\nconteúdo depois de um elemento em bloco também aparecerá em uma nova linha.\nElementos em bloco geralmente são elementos estruturais na página que\nrepresentam, por exemplo: parágrafos, listas, menus de navegação, rodapés etc.\nUm elemento em bloco não seria aninhado dentro de um elemento inline, mas pode\nser aninhado dentro de outro elemento em bloco.

\n

Elementos inline (na linha) são aqueles que estão contidos dentro de\nelementos em bloco, envolvem apenas pequenas partes do conteúdo do documento e\nnão parágrafos inteiros ou agrupamentos de conteúdo. Um elemento inline não\nfará com que uma nova linha apareça no documento: os elementos inline\ngeralmente aparecem dentro de um parágrafo de texto, por exemplo: um elemento\n<a> (hyperlink) ou elementos de ênfase como <em> ou <strong>.

\n
\n

Vamos ver um exemplo:

\n
<!DOCTYPE html>\n<html>\n  <head>\n    <title>HTML Aninhado</title>\n  </head>\n  <body>\n    <em>primeiro</em><strong>segundo</strong><em>terceiro</em>\n    <p>quarto</p><p>quinto</p><p>sexto</p>\n  </body>\n</html>\n
\n

Ao visualizar o documento anterior no navegador, teremos:

\n

\"Bloco

\n

Tanto em quanto eles strong são elementos inline. Portanto, os primeiros\ntrês elementos são colocados na mesma linha, um após o outro, sem espaço entre\neles. Por outro lado, p é um elemento no nível do bloco, então cada elemento\naparece em uma nova linha, com espaço acima e abaixo de cada um p.

\n

Elementos HTML

\n

Você tem à sua disposição vários elementos HTML para criar sites na web.\nInvestigue você mesmo (usando seu excelente parceiro do Google) e saiba como\nadicionar o seguinte a um website:

\n
    \n
  1. Cabeçalhos de títulos e legendas (dica: headings)
  2. \n
  3. Um link
  4. \n
  5. Uma tabela
  6. \n
  7. Uma lista
  8. \n
  9. Uma imagem
  10. \n
  11. Uma linha divisória (dica: horizontal rule)
  12. \n
  13. Uma data
  14. \n
  15. Realçar um texto (dica: mark)
  16. \n
\n

Para cada elemento anterior, entenda se ele se comporta como inline ou como\nblock.

\n

Atributos

\n

Em sua pesquisa, você certamente se deparou com o elemento a para adicionar\num link ao seu\nsite: e você deve\nter notado que uma série de informações aparece na tag de abertura:

\n
<a href=\"http://laboratoria.la/\" target=\"_blank\" title=\"Página inicial da Laboratoria\">Ir para Laboratoria</a>\n
\n

Essas informações são atributos. Os atributos nos fornecem informações\nadicionais sobre o conteúdo de um elemento que não queremos que apareça no\nconteúdo atual. Em alguns casos, eles adicionam recursos e/ou comportamento ao\nseu elemento HTML. Os atributos aparecem na tag de abertura do elemento e\nconsistem em duas partes: um nome e um valor, separados por um sinal de igual\n(=).

\n

No caso do exemplo anterior, podemos visualizar três atributos: o atributo\nhref, o atributo target e o atributo title.

\n
    \n
  • \n

    O atributo href especifica o endereço da web para o qual você deseja que o\nlink aponte; isto é, aonde o navegador navega quando é clicado. Neste exemplo,\nvemos que aponta para a página inicial da Laboratoria:\nhttp://laboratoria.la/

    \n
  • \n
  • \n

    O atributo target especifica o contexto de navegação que será usado para\nexibir o link. Por exemplo, target=\"_blank\" mostrará o link em uma nova\nguia. Se você quiser mostrar o link na aba atual, apenas omita este atributo.

    \n
  • \n
  • \n

    O atributo title especifica informações extras sobre o link, como qual\npágina você está vinculando. No nosso exemplo, diz \"Página inicial da\nLaboratoria\". Isso aparecerá como informação quando o mouse estiver sobre o\nlink.

    \n
  • \n
\n

Atributo style

\n

Existem muitos atributos comuns a todos os elementos html e existem atributos\nespecíficos associados a um determinado elemento. Um atributo que se aplica a\nquase todos os elementos html é o atributo style que permite dar estilos ao\nseu elemento. Por exemplo, se quisermos que o conteúdo dentro de um elemento p\nseja vermelho em um fundo amarelo e com uma borda preta, fazemos:

\n
<p style=\"color:red; background-color: yellow; border: 1px solid black;\">\n  Código <em>que</em> <strong>transforma</strong>\n</p>\n
\n

Ao visualizar o documento anterior no navegador, teremos:

\n

\"Exemplo

\n

Um atributo de estilo pode conter uma ou mais instruções. Cada instrução é\ncomposta de uma propriedade (como cor) seguida por dois pontos e um\nvalor (como vermelho). Quando temos mais de uma declaração, cada uma deve\nser separada por ponto e vírgula (;). Por exemplo: \"color:red; background-color: yellow;\".

\n

Há muitos aspectos que podem ser influenciados pelo estilo. Por exemplo, a\npropriedade display controla se um item é exibido como um bloco ou em linha,\nou até mesmo não exibido:

\n
<p>\n  Um texto pode ser <strong>em linha</strong>,\n  <strong style=\"display: block\">como bloco</strong>,\n  <strong style=\"display: none\">ou oculto</strong>.\n</p>\n
\n

A visão no navegador disto seria:

\n

\"Exemplo

\n

O texto \"em linha\" é exibido em linha (ou seja, na mesma linha do texto\nanterior \"Um texto pode ser exibido\" ) porque lembramos que o elemento\nstrong é do tipo em linha. O texto \"como um bloco\" terminará em sua própria\nlinha, uma vez que os elementos do tipo bloco não são mostrados de acordo com o\ntexto ao redor. Lembre-se de que quando um item é do tipo bloco, ele aparecerá\nem uma nova linha de qualquer conteúdo que tenha vindo antes, e qualquer\nconteúdo que vier depois também aparecerá em uma nova linha. O texto \"ou\noculto\" não é exibido porque é atribuído o valor de none para display\nimpedir que um item apareça na tela. Esta é uma maneira de esconder elementos.

\n

Na próxima lição sobre css aprofundaremos o conceito de estilizar seus\nelementos html.

\n

Tags vazias

\n

Em sua pesquisa, você certamente se deparou com o elemento <img> para\nadicionar uma imagem ao seu\nsite e você\nnotou que ele não tem uma tag de fechamento e, portanto, não tem \"conteúdo\":

\n
<img src=\"http://cde.2.trome.pe/ima/0/1/1/8/5/1185397.jpg\">\n
\n

Algumas tags não contêm conteúdo diretamente; em vez disso, eles recebem uma\nfonte da qual obter o conteúdo. Isto é o que acontece com o elemento img. O\natributo src fornece o caminho do conteúdo. Neste caso, ao ir para o endereço\nhttp://cde.2.trome.pe/ima/0/1/1/8/5/1185397.jpg\nvamos encontrar a foto de Mariana com Mark e Barack 😀

\n

\"Foto

\n

Outro item que não tem uma tag de fechamento é br. Leia a documentação do MDN\nsobre br. Para\nque serve br?

\n

Comentários em HTML

\n

Assim como podemos comentar nosso código javascript para torná-lo mais\ncompreensível, também podemos adicionar comentários ao nosso código HTML. Para\ndefinir um comentário em um arquivo HTML, usamos os marcadores <!-- para abrir\no comentário e --> para fechá-lo.

\n
<!-- Isto é um comentário. Não será visto na página, mas sim em meu código. -->\n
\n

Recriando a página de Grace Hopper da Wikipédia

\n

Agora que você tem uma ideia dos elementos html mais comuns, seu comportamento\n(em linha ou em bloco) e seus principais atributos, a Paloma explicará como\nconstruir uma réplica da página da Wikipédia de Grace\nHopper :

\n

\n

Os elementos divespan

\n

Muitas vezes, ao criar nossa estrutura HTML, torna-se necessário \"agrupar\"\nelementos para dividir nossa página web em seções ou partes lógicas. Por\nexemplo, se no footer (ou rodapé) do nosso site, queremos mostrar os ícones de\nnossas redes sociais com links de contato, é útil agrupar todos os ícones em uma\nseção e os links em outra seção, e que ambos os grupos estejam contidos no\nfooter.

\n

Para fazer esses agrupamentos, podemos usar os elementos div e span. Os\nelementos div e span são como \"contêineres\" vazios que preenchemos com\noutros elementos e conteúdo.

\n
    \n
  • O elemento div define uma divisão ou uma seção em um documento HTML. É usado\npara agrupar elementos de bloco. É frequentemente usado como um contêiner\npara outros elementos. A div é um bloco, o que significa que há uma quebra\nde linha antes e depois.
  • \n
  • O elemento span é usado como um contêiner para textos. É do tipo em\nlinha; isto é, aparece entre as linhas, como parte de um parágrafo.
  • \n
\n

Vejamos um exemplo:

\n
<!DOCTYPE html>\n<html>\n  <body>\n    <div style=\"background-color: green; color: white\">\n      <h2>Cidade do México</h2>\n      <p>A Cidade do México, anteriormente conhecida como Distrito Federal,\n        é uma das 32 unidades federativas do México, assim como a capital\n        dos <span style=\"color: yellow\">Estados Unidos Mexicanos</span>.\n      </p>\n    </div>\n    <div style=\"background-color: red; color: white\">\n      <h2>Lima</h2>\n      <p>Lima é a capital da <span style=\"color: yellow\">República do\n        Perú</span> e da província homônima. Situa-se na costa central do país,\n        às magens do Oceano Pacífico, contendo uma extensa e populosa\n        área urbana conhecida como Lima Metropolitana, cercada pelo\n        deserto costeiro e extendida sobre os vales dos rios Chillón,\n        Rímac e Lurín.\n      </p>\n    </div>\n    <div style=\"background-color: blue; color: white\">\n      <h2>Santiago</h2>\n      <p>Santiago, chamada também de Santiago do Chile, é a capidal do\n        <span style=\"color: yellow\">Chile</span> e da região Metropolitana\n        de Santiago. É o principal núcleo urbano do país e sua área\n        metropolitana também é conhecida pelo nome de Grande Santiago.\n      </p>\n    </div>\n  </body>\n</html>\n
\n

Ao visualizar o exemplo anterior no navegador, temos:

\n

\"Div

\n

Veja como agrupamos tudo relacionado a um país em um div. Isso é útil porque\nele cria seções que seguem uma ordem lógica. Mas, mais importante, ter essas\nseções separadas permite que você forneça estilos diferentes para cada seção: a\ncor do plano de fundo e a cor da fonte variam para cada país. O mesmo acontece\ncom as palavras que mostramos em amarelo. Graças a span nós podemos fazer com\nque certas partes do texto tenham um estilo diferente.

" } } }, @@ -165,7 +165,7 @@ "intl": { "es": { "title": "Closing", - "body": "

¿HTML5 es la última versión de HTML? Veamos

\n

Sí y no. Es cierto que HTML5 es la última versión de HTML, pero además engloba\nun conjunto de tecnologías que define el estándar en relación a la web, tales\ncomo CSS3 y un término que ahora escucharás muy seguido: APIs. Este último\nnos dará a conocer los superpoderes del navegador y entenderemos porqué el\nnavegador se ha potenciado mucho desde sus inicios.

\n

Dato curioso

\n

En realidad ya se está trabajando en el primer borrador de la revisión del\nestándar HTML5.3 :scream:. En este blog de la W3C\npuedes encontrar información al respecto.

\n

Además, si quieres ir conociendo un poco más acerca de lo que HTML5 trae consigo,\npuedes revisar el siguiente video de nuestros amigos de Platzi, que si bien el\nvideo ya tiene varios años en internet, todavía nos puede dar una gran\nperspectiva del impacto que tuvo la llegada de este nuevo estándar.

\n

\"HTML5\"

\n

Respondamos las preguntas del opening

\n
    \n
  • ¿Qué es HTML5?
  • \n
  • ¿Para qué nos ayuda la semántica de HTML5?
  • \n
  • ¿Cuáles son las nuevas etiquetas de HTML5 más comunes?
  • \n
" + "body": "

¿HTML5 es la última versión de HTML? Veamos

\n

Sí y no. Es cierto que HTML5 es la última versión de HTML, pero además engloba\nun conjunto de tecnologías que define el estándar en relación a la web, tales\ncomo CSS3 y un término que ahora escucharás muy seguido: APIs. Este último\nnos dará a conocer los superpoderes del navegador y entenderemos porqué el\nnavegador se ha potenciado mucho desde sus inicios.

\n

Dato curioso

\n

En realidad ya se está trabajando en el primer borrador de la revisión del\nestándar HTML5.3 :scream:. En este blog de la W3C\npuedes encontrar información al respecto.

\n

Además, si quieres ir conociendo un poco más acerca de lo que HTML5 trae consigo,\npuedes revisar el siguiente video de nuestros amigos de Platzi, que si bien el\nvideo ya tiene varios años en internet, todavía nos puede dar una gran\nperspectiva del impacto que tuvo la llegada de este nuevo estándar.

\n

\n

Respondamos las preguntas del opening

\n
    \n
  • ¿Qué es HTML5?
  • \n
  • ¿Para qué nos ayuda la semántica de HTML5?
  • \n
  • ¿Cuáles son las nuevas etiquetas de HTML5 más comunes?
  • \n
" }, "pt": { "title": "Closing", diff --git a/dist/topics/interaction-design.json b/dist/topics/interaction-design.json index 8f760eb78..5b8892264 100644 --- a/dist/topics/interaction-design.json +++ b/dist/topics/interaction-design.json @@ -2,9 +2,9 @@ "slug": "interaction-design", "repo": "Laboratoria/bootcamp", "path": "topics/interaction-design", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:36.798Z", + "createdAt": "2023-05-17T20:37:20.975Z", "track": "ux", "intl": { "es": { @@ -32,7 +32,7 @@ "intl": { "es": { "title": "Sketching", - "body": "

Objetivos de aprendizaje

\n

Entender la importancia del proceso de sketch durante la creación de un proyecto\ndigital.

\n
\n

Qué es un Sketch

\n

Es un dibujo o esbozo de la solución del proyecto que queremos realizar de una\nmanera simple y ordenada. En él se encuentran todos los elementos necesarios\npara la planeación de un proyecto/plataforma digital.

\n

\"Sketch\"

\n

¿Por qué hacerlo?

\n

Cuando te dan un proyecto a realizar ¿no te ha pasado que en automático tu\ncerebro comienza a trabajar e idear? Y no ves la hora de comenzar a trabajar, ya\nsea en el diseño o el desarrollo. Pero ¡alto! Te estás saltando varios pasos\nimportantes en la planeación de un proyecto digital. No te preocupes, es normal,\ntodas nos enfrentamos a eso. Y por eso, ahora te vamos a contar más\ndetalladamente sobre este paso tan importante.

\n

Antes que nada debes tener en cuenta que para comenzar a planear un producto\ndigital hay un flujo de trabajo:

\n
    \n
  1. Tener un problema que resolver
  2. \n
  3. Pensar diversas soluciones que puedan resolver las necesidades del cliente y\ndel usuario en armonía
  4. \n
  5. Hacer listas de los contenidos necesarios a mostrar
  6. \n
  7. Comenzar a materializar esas ideas en un sketch, tomando en cuenta los\ncontenidos y elementos gráficos
  8. \n
  9. Probar y experimentar hasta que llegues a la mejor solución
  10. \n
  11. Y cuando este punto te haya satisfecho, puedes comenzar a pensar en visual\ndesign para empezar a hacer tu prototipo
  12. \n
\n

Cuando estás en ese momento entre lo que quieres proponer y el cómo lo vas a\nhacer, la mejor estrategia es hacer uno o varios sketches.

\n

\"Sketching\"

\n

Este es el momento para aterrizar tus ideas ya que es un método flexible,\nportable, accesible y fácil de testear. Al ser fácil de testear, te permite\nhacer cambios en un corto tiempo y a bajo costo. Incluso te permite distribuir\nelementos gráficos sin el uso directo de ellos, utilizando ‘‘the big ‘x’\nimage’’.

\n

Por lo anterior mencionado, sin duda el proceso de sketching te va a ahorrar\nmuchos recursos a la hora de desarrollo y te va a dar una idea clara de cómo y\nhacia dónde ir. Además de que son tus primeras ideas materializadas en búsqueda\nde la mejor solución, con esa flexibilidad en prueba y error puedes comenzar a\nidear.

\n

‘No hay nada más simple que papel y lápiz para aterrizar ideas’.

\n

Herramientas necesarias: Dos herramientas indispensables: papel y lápiz.

\n

Preguntas necesarias que debes hacerte antes de practicar sketching

\n

¿Cuento con todos los elementos necesarios para comenzar? Debes pensar en\ntodo: la información a transmitir (en este punto te recomiendo hacer listas de\nlos contenidos necesarios por transmitir en cada punto de tu vista de página o\ntarea), para quién lo vas a hacer (usuarios), de parte de quién (clientes) y\ncon qué recursos lo vas a lograr(Landing Page, formulario, etc).

\n

¿Cómo lo voy a hacer? Aquí es donde comienza la magia. Debes planear una\nestrategia para comunicarle a tu usuario lo que tu cliente necesita transmitir.\nDebes pensar cómo lo harás y de qué manera, pensando en que tu usuario\ninteractúa con tu plataforma y que al entrar a un sitio necesita informarse o\nrealizar una tarea, entonces va a necesitar seguir un flujo dentro de la\naplicación. También es importante comenzar a pensar en la priorización de\nelementos o información que queremos incluir y pensar en dónde lo vamos a\nhacer. Cuando estés haciendo las listas de contenidos, te recomiendo\nacomodarlas según el orden de importancia con la respectiva información interna\na cada punto de información.

\n

\"sketch

\n

Como has podido ver, el hacer un sketch es un proceso totalmente creativo que\nrequiere de un momento de mucho análisis para transmitir lo que queremos y de la\nmejor forma posible. Y sobre todo, para tener el esqueleto de lo que vamos a\ndesarrollar antes de hacerlo, y no tener que ir improvisando.

\n

Recuerda: En este proceso no es importante el grado de fidelidad. Lo\nimportante es comenzar a pensar en el contenido a transmitir, la distribución de\néste y de los elementos que van a ir dentro de tu propuesta de solución.

\n

Consejo: Practica, practica y practica.

\n

Mira el siguiente video para ejemplificar mejor este proceso:

\n

video

" + "body": "

Objetivos de aprendizaje

\n

Entender la importancia del proceso de sketch durante la creación de un proyecto\ndigital.

\n
\n

Qué es un Sketch

\n

Es un dibujo o esbozo de la solución del proyecto que queremos realizar de una\nmanera simple y ordenada. En él se encuentran todos los elementos necesarios\npara la planeación de un proyecto/plataforma digital.

\n

\"Sketch\"

\n

¿Por qué hacerlo?

\n

Cuando te dan un proyecto a realizar ¿no te ha pasado que en automático tu\ncerebro comienza a trabajar e idear? Y no ves la hora de comenzar a trabajar, ya\nsea en el diseño o el desarrollo. Pero ¡alto! Te estás saltando varios pasos\nimportantes en la planeación de un proyecto digital. No te preocupes, es normal,\ntodas nos enfrentamos a eso. Y por eso, ahora te vamos a contar más\ndetalladamente sobre este paso tan importante.

\n

Antes que nada debes tener en cuenta que para comenzar a planear un producto\ndigital hay un flujo de trabajo:

\n
    \n
  1. Tener un problema que resolver
  2. \n
  3. Pensar diversas soluciones que puedan resolver las necesidades del cliente y\ndel usuario en armonía
  4. \n
  5. Hacer listas de los contenidos necesarios a mostrar
  6. \n
  7. Comenzar a materializar esas ideas en un sketch, tomando en cuenta los\ncontenidos y elementos gráficos
  8. \n
  9. Probar y experimentar hasta que llegues a la mejor solución
  10. \n
  11. Y cuando este punto te haya satisfecho, puedes comenzar a pensar en visual\ndesign para empezar a hacer tu prototipo
  12. \n
\n

Cuando estás en ese momento entre lo que quieres proponer y el cómo lo vas a\nhacer, la mejor estrategia es hacer uno o varios sketches.

\n

\"Sketching\"

\n

Este es el momento para aterrizar tus ideas ya que es un método flexible,\nportable, accesible y fácil de testear. Al ser fácil de testear, te permite\nhacer cambios en un corto tiempo y a bajo costo. Incluso te permite distribuir\nelementos gráficos sin el uso directo de ellos, utilizando ‘‘the big ‘x’\nimage’’.

\n

Por lo anterior mencionado, sin duda el proceso de sketching te va a ahorrar\nmuchos recursos a la hora de desarrollo y te va a dar una idea clara de cómo y\nhacia dónde ir. Además de que son tus primeras ideas materializadas en búsqueda\nde la mejor solución, con esa flexibilidad en prueba y error puedes comenzar a\nidear.

\n

‘No hay nada más simple que papel y lápiz para aterrizar ideas’.

\n

Herramientas necesarias: Dos herramientas indispensables: papel y lápiz.

\n

Preguntas necesarias que debes hacerte antes de practicar sketching

\n

¿Cuento con todos los elementos necesarios para comenzar? Debes pensar en\ntodo: la información a transmitir (en este punto te recomiendo hacer listas de\nlos contenidos necesarios por transmitir en cada punto de tu vista de página o\ntarea), para quién lo vas a hacer (usuarios), de parte de quién (clientes) y\ncon qué recursos lo vas a lograr(Landing Page, formulario, etc).

\n

¿Cómo lo voy a hacer? Aquí es donde comienza la magia. Debes planear una\nestrategia para comunicarle a tu usuario lo que tu cliente necesita transmitir.\nDebes pensar cómo lo harás y de qué manera, pensando en que tu usuario\ninteractúa con tu plataforma y que al entrar a un sitio necesita informarse o\nrealizar una tarea, entonces va a necesitar seguir un flujo dentro de la\naplicación. También es importante comenzar a pensar en la priorización de\nelementos o información que queremos incluir y pensar en dónde lo vamos a\nhacer. Cuando estés haciendo las listas de contenidos, te recomiendo\nacomodarlas según el orden de importancia con la respectiva información interna\na cada punto de información.

\n

\"sketch

\n

Como has podido ver, el hacer un sketch es un proceso totalmente creativo que\nrequiere de un momento de mucho análisis para transmitir lo que queremos y de la\nmejor forma posible. Y sobre todo, para tener el esqueleto de lo que vamos a\ndesarrollar antes de hacerlo, y no tener que ir improvisando.

\n

Recuerda: En este proceso no es importante el grado de fidelidad. Lo\nimportante es comenzar a pensar en el contenido a transmitir, la distribución de\néste y de los elementos que van a ir dentro de tu propuesta de solución.

\n

Consejo: Practica, practica y practica.

\n

Mira el siguiente video para ejemplificar mejor este proceso:

\n

" } } } @@ -139,7 +139,7 @@ "intl": { "es": { "title": "Clase de Conceptos", - "body": "

Objetivos

\n
    \n
  • Entender cuáles son los principios de diseño según Don Norman.
  • \n
  • Identificar y aplicar los conceptos de affordances, signifiers,\ndiscoverability y feedback.
  • \n
\n
\n

Agenda

\n
    \n
  • En squads parejas vean estos videos y lleguen a un entendimiento común
  • \n
  • Hagan resúmenes y ejemplos de lo que van viendo para que lo puedan presentar\ncon el resto de la clase
  • \n
  • Listen las dudas que les quedan para poder resolverlas al final de la sesión
  • \n
\n

Los principios de diseño

\n

En su libro y curso The Design of Everyday Things\n, Don Norman nos habla de distintos principios de diseño que revisaremos en esta\nlección.

\n

Para empezar miremos estos videos:

\n

video 1\nvideo 2.

\n

Affordances & signifiers

\n

Affordances

\n

Affordances

\n
\n

Affordances (acciones posibles) son las relaciones que existen entre un objeto\ny una entidad (una persona). Los affordances permiten las interacciones entre\nestos objetos y las personas. La presencia de un affordance está determinada\npor las propiedades de un objeto y las habilidades de la persona que está\ninteractuando con la persona.

\n
\n

Ejemplo:

\n

ejemplo affordance

\n
    \n
  • ¿Qué es un affordance y cuál es su relación con un producto digital?
  • \n
  • Si te mostramos esta foto, qué crees que puede estar pasando:
  • \n
\n

\"itau

\n

Signifiers

\n

Signifiers

\n
\n

Signifiers son señales que te indican las posibles acciones que puedes hacer\ncon un objeto y donde o en qué parte. Los signifiers, normalmente, son visibles.

\n
\n

Ejemplo:

\n

1 signifiers\n2 signifiers

\n

Conceptual models & System image

\n

Conceptual models y system images

\n
\n

Los modelos conceptuales son explicaciones de cómo algo debe funcionar. Son\nútiles para que el usuario pueda predecir cómo es que un objeto funcionará y qué\nse puede hacer en caso algo salga mal.\nLas personas forman modelos conceptuales todo el tiempo. Una vez que\ninteractúas con un objeto, formas un modelo conceptual de cómo funciona. Es\nresponsabilidad del diseñador ayudar al usuario a formar un modelo útil. Los\nmejores modelos conceptuales a menudo se pueden deducir de un objeto en sí\nmismo.\nLos diseñadores tienen un modelo conceptual claro al diseñar el producto, pero\nlos usuarios no pueden hablar con el diseñador para comprender su modelo de\ndiseño, por lo que confían en la imagen del sistema del producto para formar\nun modelo de usuario. Una imagen del sistema es cualquier información que\ntransmita el producto. Información como su forma, forma, significantes,\naccesos y documentación en los manuales.\nPara que las personas utilicen un producto con éxito, deben tener el mismo\nmodelo mental (el modelo del usuario) que el del diseñador (el modelo del\ndiseñador). Pero el diseñador solo habla con el usuario a través del producto\nmismo, por lo que toda la comunicación debe tener lugar a través de la \"imagen\ndel sistema\": la información transmitida por el producto en sí.

\n
\n

Discoverability & feedback

\n

Discoverability y feedback

\n
\n

Golfo de ejecución: el estado mental donde los usuarios descubren cómo\nejecutar. Este lleva al concepto de descubribilidad (discoverability) ¿Cómo sé\nlo que puedo hacer? ¿Qué acciones son posibles? ¿Cuáles son mis alternativas?\n¿Qué puedo hacer ahora? ¿Cómo lo hago?\nGolfo de evaluación: el estado mental donde los usuarios averiguan la\nrespuesta a una acción tomada. Lleva al concepto de retroalimentación(feedback\n) ¿Cómo sé lo que pasó? ¿Que pasó? ¿Funcionó? Qué significa eso? ¿Esta bien?\n¿He logrado mi objetivo?

\n
\n

Ejercicio

\n
    \n
  • Revisa esta web e identifica cuáles son los\naffordances y signifiers. Además, análizala en términos de discoverability y\nfeedback.
  • \n
  • Analiza la web de hipmunk en términos de modelos\nconceptuales e imagen del sistema.
  • \n
  • Analiza la web de Virgin América\nbasándote en los 6 principios de diseño.
  • \n
\n

Referencias

\n" + "body": "

Objetivos

\n
    \n
  • Entender cuáles son los principios de diseño según Don Norman.
  • \n
  • Identificar y aplicar los conceptos de affordances, signifiers,\ndiscoverability y feedback.
  • \n
\n
\n

Agenda

\n
    \n
  • En squads parejas vean estos videos y lleguen a un entendimiento común
  • \n
  • Hagan resúmenes y ejemplos de lo que van viendo para que lo puedan presentar\ncon el resto de la clase
  • \n
  • Listen las dudas que les quedan para poder resolverlas al final de la sesión
  • \n
\n

Los principios de diseño

\n

En su libro y curso The Design of Everyday Things\n, Don Norman nos habla de distintos principios de diseño que revisaremos en esta\nlección.

\n

Para empezar miremos estos videos:

\n

\n.

\n

Affordances & signifiers

\n

Affordances

\n

\n
\n

Affordances (acciones posibles) son las relaciones que existen entre un objeto\ny una entidad (una persona). Los affordances permiten las interacciones entre\nestos objetos y las personas. La presencia de un affordance está determinada\npor las propiedades de un objeto y las habilidades de la persona que está\ninteractuando con la persona.

\n
\n

Ejemplo:

\n

\n
    \n
  • ¿Qué es un affordance y cuál es su relación con un producto digital?
  • \n
  • Si te mostramos esta foto, qué crees que puede estar pasando:
  • \n
\n

\"itau

\n

Signifiers

\n

\n
\n

Signifiers son señales que te indican las posibles acciones que puedes hacer\ncon un objeto y donde o en qué parte. Los signifiers, normalmente, son visibles.

\n
\n

Ejemplo:

\n

\n

\n

Conceptual models & System image

\n

\n
\n

Los modelos conceptuales son explicaciones de cómo algo debe funcionar. Son\nútiles para que el usuario pueda predecir cómo es que un objeto funcionará y qué\nse puede hacer en caso algo salga mal.\nLas personas forman modelos conceptuales todo el tiempo. Una vez que\ninteractúas con un objeto, formas un modelo conceptual de cómo funciona. Es\nresponsabilidad del diseñador ayudar al usuario a formar un modelo útil. Los\nmejores modelos conceptuales a menudo se pueden deducir de un objeto en sí\nmismo.\nLos diseñadores tienen un modelo conceptual claro al diseñar el producto, pero\nlos usuarios no pueden hablar con el diseñador para comprender su modelo de\ndiseño, por lo que confían en la imagen del sistema del producto para formar\nun modelo de usuario. Una imagen del sistema es cualquier información que\ntransmita el producto. Información como su forma, forma, significantes,\naccesos y documentación en los manuales.\nPara que las personas utilicen un producto con éxito, deben tener el mismo\nmodelo mental (el modelo del usuario) que el del diseñador (el modelo del\ndiseñador). Pero el diseñador solo habla con el usuario a través del producto\nmismo, por lo que toda la comunicación debe tener lugar a través de la \"imagen\ndel sistema\": la información transmitida por el producto en sí.

\n
\n

Discoverability & feedback

\n

\n
\n

Golfo de ejecución: el estado mental donde los usuarios descubren cómo\nejecutar. Este lleva al concepto de descubribilidad (discoverability) ¿Cómo sé\nlo que puedo hacer? ¿Qué acciones son posibles? ¿Cuáles son mis alternativas?\n¿Qué puedo hacer ahora? ¿Cómo lo hago?\nGolfo de evaluación: el estado mental donde los usuarios averiguan la\nrespuesta a una acción tomada. Lleva al concepto de retroalimentación(feedback\n) ¿Cómo sé lo que pasó? ¿Que pasó? ¿Funcionó? Qué significa eso? ¿Esta bien?\n¿He logrado mi objetivo?

\n
\n

Ejercicio

\n
    \n
  • Revisa esta web e identifica cuáles son los\naffordances y signifiers. Además, análizala en términos de discoverability y\nfeedback.
  • \n
  • Analiza la web de hipmunk en términos de modelos\nconceptuales e imagen del sistema.
  • \n
  • Analiza la web de Virgin América\nbasándote en los 6 principios de diseño.
  • \n
\n

Referencias

\n" } } } @@ -174,7 +174,7 @@ "intl": { "es": { "title": "Accesilidad", - "body": "

Intro

\n

Mira este video y reflexiona sobre el concepto de accesibilidad video

\n

Accesibilidad según la W3org:

\n
\n

La accesibilidad web significa que los sitios web, las herramientas y las\ntecnologías están diseñados y desarrollados para que las personas con\ncapacidades diferentes puedan usarlos. Más específicamente, las personas\npueden:

\n
\n
    \n
  • percibir, comprender, navegar e interactuar con la Web
  • \n
  • contribuir a la web
  • \n
\n

La accesibilidad incluye todas las capacidades diferentes que están relacionadas\ncon la interacción con productos digitales y la web:

\n
    \n
  • Visual: ceguera total o parcial, baja visión o daltonismo.
  • \n
  • Auditiva: sordera parcial, total y otras dificultades para escuchar.
  • \n
  • Motriz: dificultad para usar el mouse, respuesta lenta, control limitado de la\nmovilidad
  • \n
  • Cognitiva: dificultades para aprender,deficiencias de atención, dificultad\npara recordar cosas o enfocarse cuando se está frente a grandes cantidades de\ninformación.
  • \n
\n

Ahora, mira este:

\n

video

\n

Y revisemos algunas consideraciones sobre accesibilidad.

\n

Tips para diseñadores

\n

No uses el color como única manera de dar información al usuario

\n

Recuerda que hay usuarios que no distinguen todos los colores. (En este\nartículo\npuedes ver los distintos problemas de visión que existen.) Un buen ejemplo es no\nusar solo el color rojo para dar a entender que hay un error. Siempre es bueno\nexplicarle al usuario cuál fue el error con un mensaje explícito.

\n

Utiliza colores que tenga el suficiente contraste

\n

Recuerda los conceptos de Visual Design. Siempre revisa el contraste de color\nentre el texto y el fondo. Utiliza esta herramienta\npara asegurarte que el contraste cumpla los estándares mínimos.

\n

Cuando subas un video a la web agrégale subtítulos y ofrece las transcripciones

\n

Los subtítulos y/o transcripciones ayudan a las personas que tienen dificultades\nde audición o cuando no puedes ejecutar un video en un lugar muy silencioso.\nIntenta agregar subtítulo y/o transcripciones cuando tengas videos o audios.

\n

Siempre usa labels (o un sustituto equivalente) en los formularios

\n

Los labels nos ayudan a enfocarnos en los campos que vamos a llenar del\nformulario. Cuando usamos solo placeholders corremos el riesgo de confundir al\nusuario y de hacer su experiencia menos fluida. Puedes leer estos artículos:\nInglés/Español\npara entender un poco más sobre esto.

\n

Utiliza alt=”” en todas las imágenes que subas

\n

Los textos alt en las imágenes ayudan a los screen-readers a decirles a los\nusuarios qué hay en una imagen. Si bien es una tarea que puedas ver relacionada\ncon un programador. Es importante darle las herramientas e instrucciones\nnecesarias a los stakeholders para que incluyan los alt en las imágenes de sus\nposts. Por ejemplo, si en la empresa en que trabajes utilizan un CMS deberías\nasegurarte de que hay la opción de agregar alt cuando los editores estén\ningresando/editando contenido. También, cuando hagas un prototipo y se lo pases\na un developer, podrías darle en un archivo aparte los alt texts que deberá\nutilizar para cada imagen. Adicionalmente, los alt texts te ayudan para el\nSEO también.

\n

Herramientas

\n\n

Ejercicio

\n
    \n
  • Encontrar problemas de accesibilidad en una web financiera, listarlos y\npresentarlos al salón.
  • \n
\n

Referencias

\n" + "body": "

Intro

\n

Mira este video y reflexiona sobre el concepto de accesibilidad

\n

Accesibilidad según la W3org:

\n
\n

La accesibilidad web significa que los sitios web, las herramientas y las\ntecnologías están diseñados y desarrollados para que las personas con\ncapacidades diferentes puedan usarlos. Más específicamente, las personas\npueden:

\n
\n
    \n
  • percibir, comprender, navegar e interactuar con la Web
  • \n
  • contribuir a la web
  • \n
\n

La accesibilidad incluye todas las capacidades diferentes que están relacionadas\ncon la interacción con productos digitales y la web:

\n
    \n
  • Visual: ceguera total o parcial, baja visión o daltonismo.
  • \n
  • Auditiva: sordera parcial, total y otras dificultades para escuchar.
  • \n
  • Motriz: dificultad para usar el mouse, respuesta lenta, control limitado de la\nmovilidad
  • \n
  • Cognitiva: dificultades para aprender,deficiencias de atención, dificultad\npara recordar cosas o enfocarse cuando se está frente a grandes cantidades de\ninformación.
  • \n
\n

Ahora, mira este:

\n

\n

Y revisemos algunas consideraciones sobre accesibilidad.

\n

Tips para diseñadores

\n

No uses el color como única manera de dar información al usuario

\n

Recuerda que hay usuarios que no distinguen todos los colores. (En este\nartículo\npuedes ver los distintos problemas de visión que existen.) Un buen ejemplo es no\nusar solo el color rojo para dar a entender que hay un error. Siempre es bueno\nexplicarle al usuario cuál fue el error con un mensaje explícito.

\n

Utiliza colores que tenga el suficiente contraste

\n

Recuerda los conceptos de Visual Design. Siempre revisa el contraste de color\nentre el texto y el fondo. Utiliza esta herramienta\npara asegurarte que el contraste cumpla los estándares mínimos.

\n

Cuando subas un video a la web agrégale subtítulos y ofrece las transcripciones

\n

Los subtítulos y/o transcripciones ayudan a las personas que tienen dificultades\nde audición o cuando no puedes ejecutar un video en un lugar muy silencioso.\nIntenta agregar subtítulo y/o transcripciones cuando tengas videos o audios.

\n

Siempre usa labels (o un sustituto equivalente) en los formularios

\n

Los labels nos ayudan a enfocarnos en los campos que vamos a llenar del\nformulario. Cuando usamos solo placeholders corremos el riesgo de confundir al\nusuario y de hacer su experiencia menos fluida. Puedes leer estos artículos:\nInglés/Español\npara entender un poco más sobre esto.

\n

Utiliza alt=”” en todas las imágenes que subas

\n

Los textos alt en las imágenes ayudan a los screen-readers a decirles a los\nusuarios qué hay en una imagen. Si bien es una tarea que puedas ver relacionada\ncon un programador. Es importante darle las herramientas e instrucciones\nnecesarias a los stakeholders para que incluyan los alt en las imágenes de sus\nposts. Por ejemplo, si en la empresa en que trabajes utilizan un CMS deberías\nasegurarte de que hay la opción de agregar alt cuando los editores estén\ningresando/editando contenido. También, cuando hagas un prototipo y se lo pases\na un developer, podrías darle en un archivo aparte los alt texts que deberá\nutilizar para cada imagen. Adicionalmente, los alt texts te ayudan para el\nSEO también.

\n

Herramientas

\n\n

Ejercicio

\n
    \n
  • Encontrar problemas de accesibilidad en una web financiera, listarlos y\npresentarlos al salón.
  • \n
\n

Referencias

\n" } } } diff --git a/dist/topics/intro-ux.json b/dist/topics/intro-ux.json index 6e6445eeb..009a446dd 100644 --- a/dist/topics/intro-ux.json +++ b/dist/topics/intro-ux.json @@ -2,9 +2,9 @@ "slug": "intro-ux", "repo": "Laboratoria/bootcamp", "path": "topics/intro-ux", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:36.624Z", + "createdAt": "2023-05-17T20:37:20.375Z", "track": "ux", "intl": { "es": { @@ -32,7 +32,7 @@ "intl": { "es": { "title": "User Experience Design", - "body": "

¿Qué es User Experience Design?

\n

Para empezar, es bueno saber qué entendemos por UX. Para ello mira este video,\nen el que Don Norman, primero en\nusar el término, nos explica qué es UX.

\n

\"UX\"

\n

Qué es UX

\n

UX = User Experience son todas las experiencias que vive/experimenta una persona\nal usar un producto. Una silla, una mesa y un computador, todos tienen una\nexperiencia al usarlos.

\n

Una web, un app o cualquier producto digital también tienen distintas\nexperiencias para el usuario. Estas experiencias no siempre son iguales, en\nmuchos casos pueden variar dependiendo del entorno en el que son usados. Por\nejemplo, la experiencia de uso de Youtube puede variar dependiendo de la\nvelocidad de la conexión a internet que estemos usando, o de las publicidades\nque se nos interpongan antes o durante la ejecución del contenido que queremos\nver.

\n

Qué es UX Design

\n
\n

UX Design es el trabajo de los profesionales \"UX Designers\". Es el proceso\nmediante el cual se diseñan las experiencias que vivirá un usuario al usar un\nproducto.

\n
\n

Definición formal de UX Design

\n

El proceso creativo y analítico para determinar qué y cómo será una web, un app,\nun software o un gadget, teniendo en cuenta siempre las necesidades, deseos y\nmetas de los usuarios. Pero, sin dejar de lado las metas de los negocios.

\n

Para entender un poco más sobre el proceso de UX Design mira este video:

\n

\"User

\n

Por qué estamos aprendiendo UX

\n

Usualmente vamos a querer que los usuarios de nuestros productos (digitales o\nfísicos) estén felices cuando consumen lo que ofrecemos.

\n
    \n
  • ¿Sentarse en una silla ultra comoda o un banco de madera?
  • \n
  • ¿Comprar en un starbucks o en una cafetería local?
  • \n
  • ¿Usar Facebook o Myspace?
  • \n
\n

La experiencia al usar nuestros productos es directamente proporcional a su\nconsumo.

\n

Al tener una mejor UX tenemos más consumo.

\n

Y viceversa.

\n

User Interface Design vs User Experience Design

\n

Para poder entender la diferencia, similitud y relación entre UI y UX, lee el\nsiguiente artículo: UX vs UI.

\n

Luego de leer este artículo, intenta responder las siguientes preguntas:

\n
    \n
  • ¿Qué es UX y qué es UI?
  • \n
  • ¿Cuál es la relación entre UX y UI Design?
  • \n
\n

UX Designer vs UI Designer

\n

Para dedicarnos a ser UX o UI Designer tenemos que tener ciertas características\nque puedes ver en el siguiente video:

\n

\"UX

\n

Ahora, intenta responer estas preguntas:

\n
    \n
  • ¿Cómo es la personalidad de un UX Designer?
  • \n
  • ¿Cómo es la personalidad de un UI Designer?
  • \n
\n

UX != UI

\n

Adicionalmente el autor Golden Krishna en su libro The best interface is not interface\nnos deja estos términos comunes usados en UX y en UI para resaltar que son\ntérminos distintos.

\n

UI

\n
\n

Navegación, subnavegación, menús, desplegables, botones, enlaces / ligas /\nlinks, ventanas, esquinas redondeadas, sombreado, mensajes de error, alertas,\nactualizaciones, checkboxes, campos de contraseña, campos de búsqueda,\nentradas de texto, selectores de radio, áreas de texto, estados de hover,\nestados de selección, estados presionados, información sobre herramientas,\nanuncios de banner, videos incrustados, animaciones de desplazamiento,\ndesplazamiento, clics, iconografía, colores, listas, presentaciones de\ndiapositivas, texto alternativo, insignias, notificaciones, degradados,\nventanas emergentes, carruseles, OK / Cancelar, etc., etc., etc.

\n
\n

UX

\n
\n

Gente, felicidad, resolución de problemas, entender necesidades, amor,\neficiencia, entretenimiento, placer, deleitar, sonrisas, alma, calidez,\npersonalidad, alegría, satisfacción, gratificación, exaltación, euforia,\nconveniencia, eficacia, etc., etc., etc.

\n
\n

¿Qué características tiene un buen UX Designer?

\n
    \n
  • \n

    Empatía: es una de las características principales de UX Designer. Para\npoder crear productos exitosos, es necesario entender a nuestros usuarios, y\npara ello necesitamos empatizar con ellos para poder entender sus problemas\ndesde su perspectiva.

    \n
  • \n
  • \n

    Trabajo en equipo: un UX Designer no solo va a tener relación con sus\nusuarios, sino que también va a trabajar con un equipo de desarrollo de\nproducto que puede incluir product managers, visual designers,\ndesarrolladores, QAs y analistas de negocio. Para ello, trabajar en equipo es\nclave para un UX Designer.

    \n
  • \n
  • \n

    Negociador: el trabajo en equipo trae consigo también mucha negociación,\npor temas de recursos, principalmente.

    \n
  • \n
  • \n

    Problem solver: los UX Designers tienen pasión por resolver problemas, los\nde sus usuarios y los de sus negocios.

    \n
  • \n
  • \n

    Problem checker: muchas veces los UX Designers van a recibir de las áreas\nde negocio o escuchar de sus usuarios 'problemas' que no necesariamente lo\nson. Su curiosidad y pensamiento crítico lo ayudan a poder validar si esos\nproblemas realmente existen. No queremos perder valioso tiempo de desarrollo,\ntrabajando sobre problemas que no existen.

    \n
  • \n
  • \n

    Problem finder: durante la validación de problemas o durante el proceso de\ndiseño en general el UX Designer tiene que ser capaz de indentificar problemas\no necesidades que existen tanto para el usuario como para el negocio.

    \n
  • \n
  • \n

    Diseño, negocios y tecnología: se dice que los product / ux designers más\nexitosos entienden de estos 3 temas. Diseño porque son quienes lideran el\nproceso de diseño y porque esto les ayuda a entender a los usuarios. Negocios\nporque no solo tiene que ayudar a crear productos deseables, sino también\nrentables. Y de tecnología porque tiene que tener cierta idea de la\nfactilbilidad de desarrollo de los productos que propone.

    \n
  • \n
\n

T-shaped skills

\n

Las personas con habilidades en T (en inglés T-shaped people) aquellas que\ntienen conocimiento profundo en una o dos áreas, combinado con una comprensión\nrazonable de una variedad de otras áreas relevantes.

\n

\"T-shaped

\n

Por ejemplo un UX designer pueder ser un experto en UX research y prototipado y\ntener conocimiento no necesariamente tan profundo en UX writing y arquitectura\nde información.

\n

Puestos relacionados al UX

\n

\"Puestos

\n

En las empresas grandes los puestos tienden a ser más especializados y en las\nempresas más pequeñas combinan diferentes especialidades.

" + "body": "

¿Qué es User Experience Design?

\n

Para empezar, es bueno saber qué entendemos por UX. Para ello mira este video,\nen el que Don Norman, primero en\nusar el término, nos explica qué es UX.

\n

\n

Qué es UX

\n

UX = User Experience son todas las experiencias que vive/experimenta una persona\nal usar un producto. Una silla, una mesa y un computador, todos tienen una\nexperiencia al usarlos.

\n

Una web, un app o cualquier producto digital también tienen distintas\nexperiencias para el usuario. Estas experiencias no siempre son iguales, en\nmuchos casos pueden variar dependiendo del entorno en el que son usados. Por\nejemplo, la experiencia de uso de Youtube puede variar dependiendo de la\nvelocidad de la conexión a internet que estemos usando, o de las publicidades\nque se nos interpongan antes o durante la ejecución del contenido que queremos\nver.

\n

Qué es UX Design

\n
\n

UX Design es el trabajo de los profesionales \"UX Designers\". Es el proceso\nmediante el cual se diseñan las experiencias que vivirá un usuario al usar un\nproducto.

\n
\n

Definición formal de UX Design

\n

El proceso creativo y analítico para determinar qué y cómo será una web, un app,\nun software o un gadget, teniendo en cuenta siempre las necesidades, deseos y\nmetas de los usuarios. Pero, sin dejar de lado las metas de los negocios.

\n

Para entender un poco más sobre el proceso de UX Design mira este video:

\n

\n

Por qué estamos aprendiendo UX

\n

Usualmente vamos a querer que los usuarios de nuestros productos (digitales o\nfísicos) estén felices cuando consumen lo que ofrecemos.

\n
    \n
  • ¿Sentarse en una silla ultra comoda o un banco de madera?
  • \n
  • ¿Comprar en un starbucks o en una cafetería local?
  • \n
  • ¿Usar Facebook o Myspace?
  • \n
\n

La experiencia al usar nuestros productos es directamente proporcional a su\nconsumo.

\n

Al tener una mejor UX tenemos más consumo.

\n

Y viceversa.

\n

User Interface Design vs User Experience Design

\n

Para poder entender la diferencia, similitud y relación entre UI y UX, lee el\nsiguiente artículo: UX vs UI.

\n

Luego de leer este artículo, intenta responder las siguientes preguntas:

\n
    \n
  • ¿Qué es UX y qué es UI?
  • \n
  • ¿Cuál es la relación entre UX y UI Design?
  • \n
\n

UX Designer vs UI Designer

\n

Para dedicarnos a ser UX o UI Designer tenemos que tener ciertas características\nque puedes ver en el siguiente video:

\n

\n

Ahora, intenta responer estas preguntas:

\n
    \n
  • ¿Cómo es la personalidad de un UX Designer?
  • \n
  • ¿Cómo es la personalidad de un UI Designer?
  • \n
\n

UX != UI

\n

Adicionalmente el autor Golden Krishna en su libro The best interface is not interface\nnos deja estos términos comunes usados en UX y en UI para resaltar que son\ntérminos distintos.

\n

UI

\n
\n

Navegación, subnavegación, menús, desplegables, botones, enlaces / ligas /\nlinks, ventanas, esquinas redondeadas, sombreado, mensajes de error, alertas,\nactualizaciones, checkboxes, campos de contraseña, campos de búsqueda,\nentradas de texto, selectores de radio, áreas de texto, estados de hover,\nestados de selección, estados presionados, información sobre herramientas,\nanuncios de banner, videos incrustados, animaciones de desplazamiento,\ndesplazamiento, clics, iconografía, colores, listas, presentaciones de\ndiapositivas, texto alternativo, insignias, notificaciones, degradados,\nventanas emergentes, carruseles, OK / Cancelar, etc., etc., etc.

\n
\n

UX

\n
\n

Gente, felicidad, resolución de problemas, entender necesidades, amor,\neficiencia, entretenimiento, placer, deleitar, sonrisas, alma, calidez,\npersonalidad, alegría, satisfacción, gratificación, exaltación, euforia,\nconveniencia, eficacia, etc., etc., etc.

\n
\n

¿Qué características tiene un buen UX Designer?

\n
    \n
  • \n

    Empatía: es una de las características principales de UX Designer. Para\npoder crear productos exitosos, es necesario entender a nuestros usuarios, y\npara ello necesitamos empatizar con ellos para poder entender sus problemas\ndesde su perspectiva.

    \n
  • \n
  • \n

    Trabajo en equipo: un UX Designer no solo va a tener relación con sus\nusuarios, sino que también va a trabajar con un equipo de desarrollo de\nproducto que puede incluir product managers, visual designers,\ndesarrolladores, QAs y analistas de negocio. Para ello, trabajar en equipo es\nclave para un UX Designer.

    \n
  • \n
  • \n

    Negociador: el trabajo en equipo trae consigo también mucha negociación,\npor temas de recursos, principalmente.

    \n
  • \n
  • \n

    Problem solver: los UX Designers tienen pasión por resolver problemas, los\nde sus usuarios y los de sus negocios.

    \n
  • \n
  • \n

    Problem checker: muchas veces los UX Designers van a recibir de las áreas\nde negocio o escuchar de sus usuarios 'problemas' que no necesariamente lo\nson. Su curiosidad y pensamiento crítico lo ayudan a poder validar si esos\nproblemas realmente existen. No queremos perder valioso tiempo de desarrollo,\ntrabajando sobre problemas que no existen.

    \n
  • \n
  • \n

    Problem finder: durante la validación de problemas o durante el proceso de\ndiseño en general el UX Designer tiene que ser capaz de indentificar problemas\no necesidades que existen tanto para el usuario como para el negocio.

    \n
  • \n
  • \n

    Diseño, negocios y tecnología: se dice que los product / ux designers más\nexitosos entienden de estos 3 temas. Diseño porque son quienes lideran el\nproceso de diseño y porque esto les ayuda a entender a los usuarios. Negocios\nporque no solo tiene que ayudar a crear productos deseables, sino también\nrentables. Y de tecnología porque tiene que tener cierta idea de la\nfactilbilidad de desarrollo de los productos que propone.

    \n
  • \n
\n

T-shaped skills

\n

Las personas con habilidades en T (en inglés T-shaped people) aquellas que\ntienen conocimiento profundo en una o dos áreas, combinado con una comprensión\nrazonable de una variedad de otras áreas relevantes.

\n

\"T-shaped

\n

Por ejemplo un UX designer pueder ser un experto en UX research y prototipado y\ntener conocimiento no necesariamente tan profundo en UX writing y arquitectura\nde información.

\n

Puestos relacionados al UX

\n

\"Puestos

\n

En las empresas grandes los puestos tienden a ser más especializados y en las\nempresas más pequeñas combinan diferentes especialidades.

" } } } @@ -78,7 +78,7 @@ "intl": { "es": { "title": "Clase de Conceptos", - "body": "

Metodologías relacionadas

\n

Cuando trabajamos en UX Design, y en tecnologia, hay muchos términos de\nmetodologías y frameworks que vamos a escuchar o leer seguido. Entre ellos\ndesign thinking o human centered design, lean startup, lean UX,\ndesign sprints, entre otros.

\n

En realidad ninguna metodología es independiente a la otra, sino que son\ncomplementarias. Y de hecho, tienen una gran cosa en común: aprender

\n

En estas metodología, aprendemos a través de un experimento, prototipo o MVP,\n“saliendo del edificio” y probando con usuarios reales. En general aprendemos\nde:

\n
    \n
  • los usuarios
  • \n
  • las ideas
  • \n
  • los prototipos
  • \n
  • los MVPs
  • \n
\n

Design Thinking - Human Centered Design

\n

Es una metodología para generar ideas innovadoras que centra su eficacia en\nentender y dar solución a las necesidades reales de los usuarios. Se\nempezó a desarrollar de forma teórica en la Universidad de Stanford en\nCalifornia (EEUU) a partir de los años 70, y su primera aplicabilidad con fines\nlucrativos como \"Design Thinking\" la llevó a cabo la consultora de diseño IDEO,\nsiendo hoy en día su principal precursora.

\n

Fases del proceso:

\n
    \n
  1. Empatizar
  2. \n
  3. Definir
  4. \n
  5. Idear
  6. \n
  7. Prototipar
  8. \n
  9. Testear
  10. \n
\n

\"Design

\n

La experimentación en el design thinking se basa en siempre mostrarle algo\n(un prototipo) al usuario para obtener su feedback.

\n

Adicionalmente, puedes ver este video de cómo IDEO ideó un nuevo carrito de\nsupermercado en una semana.

\n

video

\n

Lean Startup

\n

Esta metodología se enfoca en crear un MVP rápidamente para poder aprender de\nlos usuarios y poder evolucionar o corregir el producto. Su ideal es tener la\nmayor cantidad de “validated learning” con el menor esfuerzo posible.

\n
    \n
  • Minimum: utilizando el menor esfuerzo y recursos
  • \n
  • Viable: el mínimo estado del “producto” que permita coleccionar\ninformación (feedback)
  • \n
  • Product: cualquier cosa que se pueda vender (producto, servicio, app,\nidea) o que quieras que el usuario se inscriba
  • \n
\n

\"Círculo

\n

Puedes ver también, este video sobre Lean Startup de One Month

\n

Lean UX

\n

Lean UX combina ideas de design thinking, lean startup y agile en el campo\ndel UX. Busca hacer el trabajo de UX más rápido, enfocándose más en los\nresultados que en los “entregables”.

\n

Fases:

\n
    \n
  • Declarar supuestos
  • \n
  • Crear un MVP
  • \n
  • Realizar experimentos
  • \n
  • Obtener feedback
  • \n
\n

\"Fases

\n

Design Sprints

\n

Metodología creada en GV (Google Ventures) que busca probar una idea en 5 días.\nDentro del proceso se sugiere que el equipo que participa el design sprint\ntenga como máximo 7 personas y que dentro de este número estén incluidos uno o\ndos decisores. Al final de los 5 días se tiene uno o más prototipos probados con\n5 usuarios reales.

\n

\"Imagen

\n

Etapas del proceso:

\n
    \n
  • Lunes: Mapear
  • \n
  • Martes: Sketchear
  • \n
  • Miércoles: Decidir
  • \n
  • Jueves: Prototipar
  • \n
  • Viernes: Testeara
  • \n
\n

Puedes ver también como en Gimlet Media crearon y validaron un prototipo usando\nesta metodología.\nvideo

\n
\n

Como algo opcional, puedes mirar esta entrevista a Jake Knapp, Tim Brown y\nEric Ries hablando sobre Sprint, Design Thinking y Lean Startup respectivamente.

\n

Video

" + "body": "

Metodologías relacionadas

\n

Cuando trabajamos en UX Design, y en tecnologia, hay muchos términos de\nmetodologías y frameworks que vamos a escuchar o leer seguido. Entre ellos\ndesign thinking o human centered design, lean startup, lean UX,\ndesign sprints, entre otros.

\n

En realidad ninguna metodología es independiente a la otra, sino que son\ncomplementarias. Y de hecho, tienen una gran cosa en común: aprender

\n

En estas metodología, aprendemos a través de un experimento, prototipo o MVP,\n“saliendo del edificio” y probando con usuarios reales. En general aprendemos\nde:

\n
    \n
  • los usuarios
  • \n
  • las ideas
  • \n
  • los prototipos
  • \n
  • los MVPs
  • \n
\n

Design Thinking - Human Centered Design

\n

Es una metodología para generar ideas innovadoras que centra su eficacia en\nentender y dar solución a las necesidades reales de los usuarios. Se\nempezó a desarrollar de forma teórica en la Universidad de Stanford en\nCalifornia (EEUU) a partir de los años 70, y su primera aplicabilidad con fines\nlucrativos como \"Design Thinking\" la llevó a cabo la consultora de diseño IDEO,\nsiendo hoy en día su principal precursora.

\n

Fases del proceso:

\n
    \n
  1. Empatizar
  2. \n
  3. Definir
  4. \n
  5. Idear
  6. \n
  7. Prototipar
  8. \n
  9. Testear
  10. \n
\n

\"Design

\n

La experimentación en el design thinking se basa en siempre mostrarle algo\n(un prototipo) al usuario para obtener su feedback.

\n

Adicionalmente, puedes ver este video de cómo IDEO ideó un nuevo carrito de\nsupermercado en una semana.

\n

\n

Lean Startup

\n

Esta metodología se enfoca en crear un MVP rápidamente para poder aprender de\nlos usuarios y poder evolucionar o corregir el producto. Su ideal es tener la\nmayor cantidad de “validated learning” con el menor esfuerzo posible.

\n
    \n
  • Minimum: utilizando el menor esfuerzo y recursos
  • \n
  • Viable: el mínimo estado del “producto” que permita coleccionar\ninformación (feedback)
  • \n
  • Product: cualquier cosa que se pueda vender (producto, servicio, app,\nidea) o que quieras que el usuario se inscriba
  • \n
\n

\"Círculo

\n

Puedes ver también, este

\n

Lean UX

\n

Lean UX combina ideas de design thinking, lean startup y agile en el campo\ndel UX. Busca hacer el trabajo de UX más rápido, enfocándose más en los\nresultados que en los “entregables”.

\n

Fases:

\n
    \n
  • Declarar supuestos
  • \n
  • Crear un MVP
  • \n
  • Realizar experimentos
  • \n
  • Obtener feedback
  • \n
\n

\"Fases

\n

Design Sprints

\n

Metodología creada en GV (Google Ventures) que busca probar una idea en 5 días.\nDentro del proceso se sugiere que el equipo que participa el design sprint\ntenga como máximo 7 personas y que dentro de este número estén incluidos uno o\ndos decisores. Al final de los 5 días se tiene uno o más prototipos probados con\n5 usuarios reales.

\n

\"Imagen

\n

Etapas del proceso:

\n
    \n
  • Lunes: Mapear
  • \n
  • Martes: Sketchear
  • \n
  • Miércoles: Decidir
  • \n
  • Jueves: Prototipar
  • \n
  • Viernes: Testeara
  • \n
\n

Puedes ver también como en Gimlet Media crearon y validaron un prototipo usando\nesta metodología.\nvideo

\n
\n

Como algo opcional, puedes mirar esta entrevista a Jake Knapp, Tim Brown y\nEric Ries hablando sobre Sprint, Design Thinking y Lean Startup respectivamente.

\n

" } } } @@ -101,7 +101,7 @@ "intl": { "es": { "title": "Clase de Conceptos", - "body": "

Documental Design Disruptors

\n

Documental creado por Invision en el que nos muestran\nel estado actual del diseño de productos y de experiencia de usario en las\ncompañías líderes de tecnología a nivel mundial.

\n

Te recomendamos coordinar con los coaches de tu sede para que puedan emitir el\ndocumental en la sala de clases, ya que el documental está alojado en un link\nespecial con acceso restringido.

\n

\"design

" + "body": "

Documental Design Disruptors

\n

Documental creado por Invision en el que nos muestran\nel estado actual del diseño de productos y de experiencia de usario en las\ncompañías líderes de tecnología a nivel mundial.

\n

Te recomendamos coordinar con los coaches de tu sede para que puedan emitir el\ndocumental en la sala de clases, ya que el documental está alojado en un link\nespecial con acceso restringido.

\n

" } } } diff --git a/dist/topics/javascript.json b/dist/topics/javascript.json index e40d6b866..fb26a2ae0 100644 --- a/dist/topics/javascript.json +++ b/dist/topics/javascript.json @@ -2,9 +2,9 @@ "slug": "javascript", "repo": "Laboratoria/bootcamp", "path": "topics/javascript", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:37.787Z", + "createdAt": "2023-05-17T20:37:28.374Z", "track": "web-dev", "intl": { "es": { @@ -87,7 +87,7 @@ "intl": { "es": { "title": "Ejercicios Guiados", - "body": "

Objetivos de Aprendizaje

\n
    \n
  • Solidificar los conceptos de variables y tipos de datos resolviendo ejercicios\nprácticos.
  • \n
  • Darte una perspectiva de las cosas que puedes crear con lo que acabas de\naprender.
  • \n
\n
\n

Enunciados

\n

Ahora que ya conoces ciertos conceptos base de la programación, es hora de que\nveas las cosas que puedes crear en la práctica.

\n

Los proyectos a crear son:

\n
    \n
  1. Edad en segundos: Crea una web que pida al usuario su edad en años,\nutilizando prompt(), y devuelva su edad en segundos, utilizando\ndocument.write().
  2. \n
  3. Convertidor de temperatura: Crea una página web que pida al usuario la\ntemperatura en grados Celsius (°C), utilizando prompt(), y devuelva, en la\nconsola, la temperatura en grados Farenheit (°F) utilizando console.log().\nLa fórmula matemática para pasar de °C a °F es: T(°F) = ( T(°C) × 1.8 ) + 32.
  4. \n
  5. Ganancias y pérdidas: Crea un programa que pide los ingresos, los costos\ny el % de impuestos, y calcula la ganancia después de impuestos. Debe\nimprimir el resultado en la web con el símbolo $ adelante.
  6. \n
  7. Iniciales: Crea un programa que pide el nombre y apellido al usuario. El\nusuario debe ingresar dos palabras separadas por un espacio, por ejemplo:\n\"Ana Martinez\". El programa debe devolver las iniciales en mayúsculas.\nVeamos unos ejemplos: \"ana martinez\" y \"Ana Martinez\" devuelven las iniciales\n\"AM\". \"Michelle Seguil\" y \"michelle seguil\" devuelven \"MS\".
  8. \n
\n
\n

Solucionarios

\n

A continuación, Michelle te explica cómo resolvió cada uno de los ejercicios\nanteriores.

\n
\n

NOTA: En los siguientes videos Michelle hace uso de var en vez de let y\nconst para declarar variables, así como otras características un poco\nantiguas de JavaScript. Estas son válidas y parte del lenguaje, aunque hoy\nen día preferiríamos usar características/features más modernos y apropiados\ncomo es el caso de let y const. En este caso estos videos se grabaron hace\nya un tiempo... ;-)

\n
\n

1. Edad en segundos

\n

\"Solution

\n

2. Convertidor de temperatura

\n

\"Solution

\n

3. Ganancias y pérdidas

\n

\"Solution

\n

4. Iniciales

\n

\"Solution

" + "body": "

Objetivos de Aprendizaje

\n
    \n
  • Solidificar los conceptos de variables y tipos de datos resolviendo ejercicios\nprácticos.
  • \n
  • Darte una perspectiva de las cosas que puedes crear con lo que acabas de\naprender.
  • \n
\n
\n

Enunciados

\n

Ahora que ya conoces ciertos conceptos base de la programación, es hora de que\nveas las cosas que puedes crear en la práctica.

\n

Los proyectos a crear son:

\n
    \n
  1. Edad en segundos: Crea una web que pida al usuario su edad en años,\nutilizando prompt(), y devuelva su edad en segundos, utilizando\ndocument.write().
  2. \n
  3. Convertidor de temperatura: Crea una página web que pida al usuario la\ntemperatura en grados Celsius (°C), utilizando prompt(), y devuelva, en la\nconsola, la temperatura en grados Farenheit (°F) utilizando console.log().\nLa fórmula matemática para pasar de °C a °F es: T(°F) = ( T(°C) × 1.8 ) + 32.
  4. \n
  5. Ganancias y pérdidas: Crea un programa que pide los ingresos, los costos\ny el % de impuestos, y calcula la ganancia después de impuestos. Debe\nimprimir el resultado en la web con el símbolo $ adelante.
  6. \n
  7. Iniciales: Crea un programa que pide el nombre y apellido al usuario. El\nusuario debe ingresar dos palabras separadas por un espacio, por ejemplo:\n\"Ana Martinez\". El programa debe devolver las iniciales en mayúsculas.\nVeamos unos ejemplos: \"ana martinez\" y \"Ana Martinez\" devuelven las iniciales\n\"AM\". \"Michelle Seguil\" y \"michelle seguil\" devuelven \"MS\".
  8. \n
\n
\n

Solucionarios

\n

A continuación, Michelle te explica cómo resolvió cada uno de los ejercicios\nanteriores.

\n
\n

NOTA: En los siguientes videos Michelle hace uso de var en vez de let y\nconst para declarar variables, así como otras características un poco\nantiguas de JavaScript. Estas son válidas y parte del lenguaje, aunque hoy\nen día preferiríamos usar características/features más modernos y apropiados\ncomo es el caso de let y const. En este caso estos videos se grabaron hace\nya un tiempo... ;-)

\n
\n

1. Edad en segundos

\n

\n

2. Convertidor de temperatura

\n

\n

3. Ganancias y pérdidas

\n

\n

4. Iniciales

\n

" }, "pt": { "title": "Exercícios Livres", @@ -116,7 +116,7 @@ "slug": "coin-convert", "prefix": "01", "path": "topics/javascript/01-basics/06-exercises/01-coin-convert", - "createdAt": "2023-04-04T20:28:37.785Z", + "createdAt": "2023-05-17T20:37:28.370Z", "env": "cjs", "intl": { "es": { @@ -138,7 +138,7 @@ "slug": "restaurant-bill", "prefix": "02", "path": "topics/javascript/01-basics/06-exercises/02-restaurant-bill", - "createdAt": "2023-04-04T20:28:37.784Z", + "createdAt": "2023-05-17T20:37:28.370Z", "env": "cjs", "intl": { "es": { @@ -196,11 +196,11 @@ "intl": { "es": { "title": "Estructuras condicionales y repetitivas", - "body": "

Objetivos

\n
    \n
  • Entender qué es el control de flujo de un programa
  • \n
  • Entender qué son estructuras condicionales y cómo afectan el flujo del\nprograma
  • \n
  • Entender qué son estructuras repetitivas y cómo afectan el flujo del\nprograma
  • \n
\n
\n

El texto a continuación se basa en gran medida, con ciertos ajustes, en el\ncapítulo 2 de Eloquent JavaScript,de Marijn\nHaverbeke, 2014. Traducción en Español\ndisponible gracias a hectorip, y del capítulo 6 de\nJavaScript for kids,\nNick Morgan, 2015;

\n

Control de Flujo

\n

La razón por la cual creamos programas de computación es para resolver\nproblemas. Un programa, hemos visto, es simplemente un conjunto de\n\"instrucciones\" que las computadoras siguen. Ese conjunto de instrucciones\nresuelven un problema. Hasta ahora hemos aprendido a obtener, representar,\nmanipular y almacenar data en variables. Con esto, hemos podido crear\nprogramas que resuleven problemas muy sencillos. Esto es el caso, por ejempo,\ndel programa que hicimos para transformar la temperatura en Celsius (°C) a\nFarenheit (°F). Sin embargo, para crear programas más complejos, es necesario\nexpandir nuestro conocimiento sobre el control de flujo de un programa y las\nestructuras que existen para modificar este flujo.

\n

Para utilizar la terminología correcta de JavaScript, de ahora en adelante,\nsustituiremos la palabra \"instrucciones\" por la palabra \"sentencias\". Una\nsentencia JavaScript es el equivalente a una oración en un leguaje humano.\nEntendemos, por lo tanto, que un programa en JavaScript es una lista de\n\"sentencias JavaScript\"; es decir, un conjunto de oraciones que le dicen al\ncomputador qué hacer.

\n

1. Flujo en línea recta

\n

Cuando un programa contiene más de una sentencia, éstas son ejecutadas de arriba\nhacia abajo, una por una. Por ejemplo, el siguiente programa tiene tres\nsentencias: la primera le declara una variable llamada name con el valor del\nstring 'Michelle'; la segunda, imprime en la consola un mensaje personalizado de\nsaludo 'Hola Michelle'; y la tercera, imprime en la consola un mensaje que dice\n'Qué nombre tan largo tienes!'.

\n
const name = 'Michelle';\nconsole.log('Hola ' + name);\nconsole.log('Qué nombre tan largo tienes!');\n// returns > Hola Michelle\n//           Qué nombre tan largo tienes!\n
\n

Una representación trivial esquemática de un flujo de control recto sería:

\n

\"Flujo

\n

2. Flujo condicional

\n

Ejecutar sentencias en línea recta no es la única opción que tenemos. Una\nalternativa es la ejecución condicional, en donde escogemos entre dos rutas\ndiferentes basados en un valor Boolean, así:

\n

\"Flujo

\n

La ejecución condicional se escribe con el keyword if en JavaScript. La\ninstrucción if es la más simple de las estructuras de control de JavaScript.\nSe utiliza para ejecutar código si y sólo si una condición es verdadera. Un\ncondicional dice: \"Si algo es verdad, haz esto\". Por ejemplo, si hiciste tu\ntarea (true), recibes un helado, pero si no hiciste tu tarea (false),\nno recibes el helado.

\n

Como muestra el ejemplo a continuación, una sentencia if tiene 2 partes\nprincipales: la condición y el cuerpo. La condición debe ser un valor Boolean\nque va entre paréntesis. El cuerpo consiste en una o más sentencias JavaScript\nque se ejecutarán si, y solo si, la condición es verdadera (Boolean igual a\ntrue).

\n
if (condición) {\n  // Conjunto de sentencias a ejecutar\n}\n
\n

Cuando necesitamos ejecutar múltiples sentencias, podemos encerrarlas en llaves\n({ y }). Las llaves agrupan las sentencias, haciéndolos valer por una sola. Una\nsecuencia de sentencias encerradas en llaves es llamada un bloque (de\ncódigo). Muchos programadores de JavaScript encierran cada cuerpo de un if (y\nen los bucles, como verás más adelante), en llaves. Lo hacen en nombre de la\nconsistencia y para evitar tener que añadir o quitar las llaves cuando el número\nde sentencias en el cuerpo cambie. Otros, valoran la brevedad y en el caso del\nif no utilizan las llaves. En este curso, siempre usaremos las llaves para\nayudarnos a organizar nuestro código.

\n

Volvamos al ejemplo anterior y agreguemos una condición antes de la sentencia\nque imprime el segundo mensaje:

\n
const name = 'Michelle';\nconsole.log('Hola ' + name);\nif (name.length > 7) {\n  console.log('Qué nombre tan largo tienes!');\n}\n// imprime > Hola Michelle\n//           Qué nombre tan largo tienes!\n
\n

Con esta modificación, antes de imprimir en la consola el segundo mensaje ('Qué\nnombre tan largo tienes!'), el programa verifica si la longitud del string\nname es mayor a 7. De ser así, se imprime el segundo mensaje. De no ser así,\nno se ejecuta esa sentencia. En este caso, dado que Michelle tiene 8\ncaracteres (letras), la condición es true. Por lo tanto, se imprime el segundo\nmensaje.

\n

Cambiemos un poco este ejemplo, modificando el valor de name a 'Ana'.

\n
const name = 'Ana';\nconsole.log('Hola ' + name);\nif (name.length > 7) {\n  console.log('Qué nombre tan largo tienes!');\n}\n// returns > Hola Ana\n
\n

En esta ocasión, la condición no es true (es false) porque la longitud\ndel nombre es 3, lo cual no es mayor a 7. Por lo tanto, el cuerpo del if\nno se ejecuta. De tal manera, únicamente se ejecuta el primer mensaje 'Hola\nAna'.

\n

Sentencia if... else

\n

A menudo no sólo tendrás código que se ejecute cuando una condición sea\nverdadera, sino también que maneje el otro caso. Este camino alternativo es\nrepresentado por la segunda flecha en el diagrama de flujo. La palabra clave\nelse puede ser usada, junto con if, para crear dos rutas de ejecución\nseparadas y alternativas.

\n

Agregemos una sentencia else a nuestro ejemplo:

\n
const name = 'Ana';\nconsole.log('Hola ' + name);\nif (name.length > 7) {\n  console.log('Qué nombre tan largo tienes!');\n} else {\n  console.log('Tu nombre no es muy largo');\n}\n\n// returns > Hola Ana\n//           Tu nombre no es muy largo\n
\n

Como ves, el resultado de este caso es similar al anterior, solo que si name\nno tiene una logitud mayor a 7, existe un \"mensaje alternativo\" que se\nejecuta.

\n

Como muestra el ejemplo a continuación, las sentencias if ... else son\nsimilares a las sentencias if, pero incluyen 2 cuerpos. Si la condición es\ntrue, se ejecutan las sentencias del primer cuerpo; de lo contrario, se\nejecutan las sentencias del segundo cuerpo.

\n
if (condición) {\n  Sentencias a ejecutar si condición es VERDADERA\n} else {\n  Sentencias a ejecutar si condición es FALSA\n}\n
\n

Si tenemos más de dos caminos a escoger, varios pares de if...else pueden ser\n\"encadenados\". Aquí hay un ejemplo:

\n
const num = parseInt(prompt('Dame un número', '0'));\n\nif (num < 10) {\n  alert('Diste un número Pequeño');\n} else if (num < 100) {\n  alert('Diste un número Mediano');\n} else {\n  alert('Diste un número Grande');\n}\n
\n

El programa primero revisará si num es menor que 10. Si lo es, escoge ese\ncamino, muestra 'Diste un número Pequeño' en un alert box y termina. Si no lo\nes, toma el camino del else, que en sí mismo contiene un segundo if. Si la\nsegunda condición (< 100) se cumple, significa que el número está entre 10 y\n100, y se muestra 'Diste un número Mediano' en un alert box. Si no lo es, el\nsegundo y último else es escogido, mostrando 'Diste un número Grande'.

\n

El diagrama de flujo para este programa es algo así:

\n

\"Flujo

\n

Veamos otro ejemplo de la aplicación de la sentencia if...else. Esta vez, con\nun video de otra profesora estrella de Laboratoria, Alexandra :)

\n

\"ejercicio

\n

Utilizando Switch

\n

Es común ver código así:

\n
if (variable == 'valor1') {\n  accion1();\n} else if (variable == 'valor2') {\n  accion2();\n} else if (variable == 'valor3') {\n  accion3();\n} else {\n  accionDefault();\n}\n
\n

Existe una estructura llamada switch que está hecha para \"despachar\" de un\nmodo más directo. Desafortunadamente, la sintaxis que JavaScript usa para esto\n(que es heredada de la línea de lenguajes de programación de C/Java) es un poco\nincómoda; una cadena de sentencias if a menudo luce mejor. Aquí hay un\nejemplo:

\n
switch (prompt('¿Cómo está el clima?')) {\n  case 'lluvioso':\n    console.log('Recuerda llevar un paraguas.');\n    break;\n  case 'soleado':\n    console.log('Viste ligero.');\n  case 'nublado':\n    console.log('Sal a la calle.');\n    break;\n  default:\n    console.log('Tipo de Clima desconocido.');\n    break;\n}\n
\n

Puedes poner cualquier cantidad de etiquetas case dentro del bloque switch.\nEl programa saltará a la etiqueta que corresponda al valor que se le dio al\nswitch o al default si no se encuentra valor que corresponda. Se empiezan a\nejecutar las sentencias desde ahí, incluso si están bajo otra etiqueta, hasta\nque se llegue a una sentencia break (que en español significa \"detener\").

\n

En algunos casos, como en el caso de 'soleado' en el ejemplo, esto puede ser\nusado para compartir código entre casos (recomienda salir a la calle tanto para\nclima soleado como para nublado). Pero cuidado: es fácil olvidar el break, lo\ncuál causará que el programa ejecute código que no quieres que se ejecute.

\n

A continuación Michelle te ayuda a entender este caso un poco mejor:

\n

\"ejemplo

\n

3. Flujo repetitivo: Bucles

\n

Otra forma de modificar el flujo de un programa es estructuras repetitivas,\ntambién llamadas bucles (\"loops\" en inglés). Tal como hemos visto, los\ncondicionales permiten ejecutar un conjunto de sentencias una vez si una\ncondición es verdadera. Los bucles, permiten ejecutar un código varias\nveces, dependiendo de si una condición sigue siendo verdadera.

\n

Piensa en un programa que imprima todos los números pares del 1 al 12. Una\nmanera de escribirlo sería como sigue:

\n
console.log(0);\nconsole.log(2);\nconsole.log(4);\nconsole.log(6);\nconsole.log(8);\nconsole.log(10);\nconsole.log(12);\n// → 0\n// → 2\n//   … etcetera\n
\n

Eso funciona, pero la idea de escribir un programa es trabajar menos, no más. Si\nnecesitamos todos los números menores que 1,000, lo anterior sería imposible de\ntrabajar. Lo que necesitamos es una forma de repetir algo de código. Esta forma\nde control de flujo es llamada bucle. El control de flujo por bucles nos\npermite regresar a cierto punto en el programa en el que estuvimos antes y\nrepetirlo con nuestro estado actual, tal como lo describe el siguiente diagrama:

\n

\"Flujo

\n

Bucles while

\n

El bucle más sencillo es el bucle while (que significa \"mientras\" en español).\nUn bucle while ejecuta repetidamente una serie de sentencias hasta que una\ncondición particular deja de ser verdadera. Al escribir un bucle while, estás\ndiciendo: \"Sigue haciendo esto mientras esta condición sea verdadera. Detente\ncuando la condición se vuelva falsa.\"

\n

Como muestra el ejemplo a continuación, una sentencia que comienza con el\nkeyword while crea un bucle. Después de while viene una expresión en\nparéntesis que representa la condición y después un conjunto de sentencias (muy\nparecido al caso del if). Sin embargo, a diferencia del if, el bucle ejecuta\nla sentencia mientras la condición produzca un valor que sea true. Por eso es\nmuy importante que el conjunto de sentencias incluya algo que \"cambia\" para\nque la condición eventualmente sea falsa. De lo contrario, terminarás con un\nciclo infinito que nunca se detendrá, y eso usualmente es malo.

\n
while (condición) {\n  // Conjunto de sentencias, donde\n  // se incluye algo que \"cambia\" para\n  // que la condición eventualmente sea FALSA\n}\n
\n

Regresemos al problema de imprimir todos los números pares del 1 al 12, y\ncreemos un programa que utilice un bucle while:

\n
let number = 0;\nwhile (number <= 12) {\n  console.log(number);\n  number = number + 2;\n}\n// → 0\n// → 2\n//   … etcetera hasta 12\n
\n

En este caso, como queremos imprimir los números pares del 1 al 12, creamos una\nvariable number (es importante preguntarse ¿cuántas veces necesitamos\ncrear la variable number?), la inicializamos con el valor 0, y la\nutilizamos en la condición. Queremos que el bloque dentro del while corra\nmientras el valor de number sea igual o menor a 12. El cuerpo del while\nincluye dos sentencias: la primera, imprime el número (con console.log), y la\nsegunda incrementa number en 2 (porque queremos imprimir los pares\núnicamente). La variable number demuestra la forma en que una variable puede\ndar seguimiento al progreso de un programa. Cada vez que el bucle se repite,\nnumber se incrementa en 2. Entonces, al principio de cada repetición, el\nvalor de la variable number es comparado con el número 12 para decidir si el\nprograma ha hecho todo el trabajo que tenía que hacer. Es importante que\nentendamos que si no modificamos el valor de number con la segunda sentencia,\nla condición (number <= 12) siempre será true y tendremos un ciclo infinito\nque nunca se detendrá. Esto puede causar que tu computadora tenga problemas y se\ncongele.

\n

Si creas un bucle infinito en uno de los ejemplos, usualmente se te preguntará\nsi quieres detener el script después de unos cuantos segundos. Si eso falla,\ntendrás que cerrar la pestaña en la que estás trabajando, o, en otros\nnavegadores, cerrar el navegador entero para recuperarte.

\n

Veamos algunas variantes de este mismo problema para asegurarnos que entendemos\nbien cómo funciona el ciclo while:

\n
    \n
  • ¿Cómo hacemos para imprimir los números pares del 1 al 100?: Modificamos\nla condición para que el bucle corra mientras number sea <= 100.
  • \n
\n
let number = 0;\nwhile (number <= 100) {\n  console.log(number);\n  number = number + 2;\n}\n// → 0\n// → 2\n//   … etcetera hasta 100\n
\n
    \n
  • ¿Cómo hacemos para imprimir los números impares del 1 al 12?:\nInicializamos el valor de number con el valor de 1 (en lugar de 0).
  • \n
\n
let number = 1;\nwhile (number <= 12) {\n  console.log(number);\n  number = number + 2;\n}\n// → 1\n// → 3\n//   … etcetera hasta 11\n
\n
    \n
  • ¿Cómo hacemos para imprimir todos los números pares e impares del 1 al\n12?: En la segunda sentencia del while, incrementamos number en 1 (en lugar\nde 2) cada ciclo.
  • \n
\n
let number = 0;\nwhile (number <= 12) {\n  console.log(number);\n  number = number + 1;\n}\n// → 0\n// → 1\n// → 2\n//   … etcetera hasta 12\n
\n

Bucles do

\n

El bucle do es una estructura de control similar al bucle while. Se\ndiferencia en sólo un punto: un bucle do siempre ejecuta su cuerpo por lo\nmenos una vez y empieza a verificar si debería parar sólo después de la\nprimera ejecución. Para reflejar esto, la condición aparece después del cuerpo\ndel bucle. Veamos un ejemplo:

\n
do {\n  const yourName = prompt('¿Quién eres?');\n} while (!yourName);\n\nconsole.log('tu nombre es ' + yourName);\n
\n

Este programa te obligará a introducir un nombre. Preguntará una y otra vez\nhasta que obtenga algo que no sea una cadena vacía. Aplicar el operador !\nconvierte un valor a Boolean negándolo y todas las cadenas excepto '' se\nconvierten a true. Esto significa que el bucle continúa corriendo hasta que\ndes un nombre que no sea una cadena vacía.

\n

Bucles for

\n

Muchos bucles siguen el patrón de los ejemplos previos del while. Primero, una\nvariable “contador” es creada para dar seguimiento al progreso del bucle. Luego\nviene el bucle while, cuya expresión condicional normalmente verifica si el\ncontador ha alcanzado cierto límite. El final del cuerpo del bucle, el contador\nes actualizado para dar seguimiento al progreso.

\n

Debido a que este patrón es tan común, JavaScript y otros lenguajes similares\nproveen una versión un poco más corta y más completa: el bucle for.

\n
for (let number = 0; number <= 12; number = number + 2) {\n  console.log(number);\n}\n// → 0\n// → 2\n//   … etc.\n
\n

Este programa es exactamente equivalente al ejemplo previo de impresión de\nnúmeros pares. El único cambio es que todas las sentencias que están\nrelacionadas con el \"estado\" del bucle están agrupadas.

\n

Los paréntesis después del keyword for tienen que contener dos puntos y coma\n(;). La parte que está antes del primer punto y coma inicializa el bucle,\nnormalmente al definir una variable. La segunda parte es la expresión que\nverifica si el bucle tiene que continuar. La parte final actualiza el estado\ndel bucle antes de cada iteración. En la mayoría de los casos, esto es más corto\ny claro que una construcción con while.

\n

Aquí está un código que calcula 2^10 (2 exponencial 10), usando el bucle for:

\n
let result = 1;\nfor (let counter = 0; counter < 10; counter = counter + 1) {\n  result = result * 2;\n}\nconsole.log(result);\n// → 1024\n
\n

La representación general del bucle for es la siguiente:

\n
for (initial setup; condition; increment){\n  Bloque de código a ejecutar\n}\n
\n

El initial setup (por ejemplo: let counter = 0) se ejecuta antes de que se\ninicie el bucle. Generalmente se usa para crear una variable que rastrea el\nnúmero de veces que se ha ejecutado el bucle. La condition (counter < 10) se\ncomprueba antes de cada ejecución del cuerpo de bucle. Si la condición es\nverdadera, el cuerpo es ejecutado; si es falsa, el bucle se detiene. En este\ncaso, el bucle se detendrá una vez que counter ya no sea inferior a 10. El\nincrement (counter = counter + 1) se ejecuta después de cada ejecución del\ncuerpo de bucle. Generalmente se utiliza para actualizar la variable de bucle.\nEn nuestro ejemplo, lo usamos para agregar 1 a counter cada vez que se ejecuta\nel bucle.

\n

A continuación Alexandra te ayuda a entender el flujo de un bucle for que\nimprime el texto 'Hola mundo!' varias veces:

\n

\"bucle

\n

Forzando la salida de un bucle

\n

Hacer que la condición del bucle produzca false no es la única forma de que un\nbucle termine. Podemos usar la sentencia especial break, utilizada en\nswitch, que tiene el efecto de salir inmediatamente del bucle que la esté\nencerrando.

\n

El siguiente programa ilustra el uso de la sentencia break para salir de un\nbucle. Queremos hacer un programa que encuentre el primer número que es más\ngrande o igual que 20 y divisible por 7.

\n
for (let current = 20; ; current++) {\n  if (current % 7 == 0)\n    break;\n}\nconsole.log(current);\n// → 21\n
\n

Usar el operador de sobrante o módulo (%) es una forma fácil de probar si un\nnúmero es divisible por otro. Si lo es, el sobrante de la división es cero.\nTambién recuerda que current++ es lo mismo que current = current + 1.

\n

El for en este ejemplo no tiene la parte que verifica si el bucle debe\nterminar. Esto significa que el loop nunca terminará hasta que la sentencia\nbreak que está adentro sea ejecutada.

\n

Como, hemos visto, si dejaras afuera esa sentencia break o accidentalmente\nescribieras una condición que siempre produzca true, tu programa se quedaría\natorado en un bucle infinito.

\n

La palabra clave continue es similar a break en que influencia el progreso\ndel bucle. Cuando se encuentra continue en el cuerpo de un bucle, el control\nsale del curpo del bucle inmediatamente y continúa en la próxima iteración del\nbucle.

\n

A continuación Michelle te ayuda explica, con un ejemplo, las aplicaciones de\nbreak y continue dentro de un for:\n\"ejemplo

\n

Diferencias entre for y while

\n

Puntualmente, se usa el for cuando sabes por adelantado cuantas repeticiones\nvas a realizar y el while cuando no lo sabes.

\n

Si decimos, \"gira el ventilador 10 veces\", de ante mano sabes que vamos a girar\nel ventilador 10 veces, por tal, el for seria buena idea.

\n

Si decimos: \"mientras haga calor gira el ventilador\". En realidad no sabemos de\nante mano cuantas veces vamos a girar el ventilador por que no sabemos cuanto\ntiempo tendremos calor, por ende, usar un while sería buena idea.

" + "body": "

Objetivos

\n
    \n
  • Entender qué es el control de flujo de un programa
  • \n
  • Entender qué son estructuras condicionales y cómo afectan el flujo del\nprograma
  • \n
  • Entender qué son estructuras repetitivas y cómo afectan el flujo del\nprograma
  • \n
\n
\n

El texto a continuación se basa en gran medida, con ciertos ajustes, en el\ncapítulo 2 de Eloquent JavaScript,de Marijn\nHaverbeke, 2014. Traducción en Español\ndisponible gracias a hectorip, y del capítulo 6 de\nJavaScript for kids,\nNick Morgan, 2015;

\n

Control de Flujo

\n

La razón por la cual creamos programas de computación es para resolver\nproblemas. Un programa, hemos visto, es simplemente un conjunto de\n\"instrucciones\" que las computadoras siguen. Ese conjunto de instrucciones\nresuelven un problema. Hasta ahora hemos aprendido a obtener, representar,\nmanipular y almacenar data en variables. Con esto, hemos podido crear\nprogramas que resuleven problemas muy sencillos. Esto es el caso, por ejempo,\ndel programa que hicimos para transformar la temperatura en Celsius (°C) a\nFarenheit (°F). Sin embargo, para crear programas más complejos, es necesario\nexpandir nuestro conocimiento sobre el control de flujo de un programa y las\nestructuras que existen para modificar este flujo.

\n

Para utilizar la terminología correcta de JavaScript, de ahora en adelante,\nsustituiremos la palabra \"instrucciones\" por la palabra \"sentencias\". Una\nsentencia JavaScript es el equivalente a una oración en un leguaje humano.\nEntendemos, por lo tanto, que un programa en JavaScript es una lista de\n\"sentencias JavaScript\"; es decir, un conjunto de oraciones que le dicen al\ncomputador qué hacer.

\n

1. Flujo en línea recta

\n

Cuando un programa contiene más de una sentencia, éstas son ejecutadas de arriba\nhacia abajo, una por una. Por ejemplo, el siguiente programa tiene tres\nsentencias: la primera le declara una variable llamada name con el valor del\nstring 'Michelle'; la segunda, imprime en la consola un mensaje personalizado de\nsaludo 'Hola Michelle'; y la tercera, imprime en la consola un mensaje que dice\n'Qué nombre tan largo tienes!'.

\n
const name = 'Michelle';\nconsole.log('Hola ' + name);\nconsole.log('Qué nombre tan largo tienes!');\n// returns > Hola Michelle\n//           Qué nombre tan largo tienes!\n
\n

Una representación trivial esquemática de un flujo de control recto sería:

\n

\"Flujo

\n

2. Flujo condicional

\n

Ejecutar sentencias en línea recta no es la única opción que tenemos. Una\nalternativa es la ejecución condicional, en donde escogemos entre dos rutas\ndiferentes basados en un valor Boolean, así:

\n

\"Flujo

\n

La ejecución condicional se escribe con el keyword if en JavaScript. La\ninstrucción if es la más simple de las estructuras de control de JavaScript.\nSe utiliza para ejecutar código si y sólo si una condición es verdadera. Un\ncondicional dice: \"Si algo es verdad, haz esto\". Por ejemplo, si hiciste tu\ntarea (true), recibes un helado, pero si no hiciste tu tarea (false),\nno recibes el helado.

\n

Como muestra el ejemplo a continuación, una sentencia if tiene 2 partes\nprincipales: la condición y el cuerpo. La condición debe ser un valor Boolean\nque va entre paréntesis. El cuerpo consiste en una o más sentencias JavaScript\nque se ejecutarán si, y solo si, la condición es verdadera (Boolean igual a\ntrue).

\n
if (condición) {\n  // Conjunto de sentencias a ejecutar\n}\n
\n

Cuando necesitamos ejecutar múltiples sentencias, podemos encerrarlas en llaves\n({ y }). Las llaves agrupan las sentencias, haciéndolos valer por una sola. Una\nsecuencia de sentencias encerradas en llaves es llamada un bloque (de\ncódigo). Muchos programadores de JavaScript encierran cada cuerpo de un if (y\nen los bucles, como verás más adelante), en llaves. Lo hacen en nombre de la\nconsistencia y para evitar tener que añadir o quitar las llaves cuando el número\nde sentencias en el cuerpo cambie. Otros, valoran la brevedad y en el caso del\nif no utilizan las llaves. En este curso, siempre usaremos las llaves para\nayudarnos a organizar nuestro código.

\n

Volvamos al ejemplo anterior y agreguemos una condición antes de la sentencia\nque imprime el segundo mensaje:

\n
const name = 'Michelle';\nconsole.log('Hola ' + name);\nif (name.length > 7) {\n  console.log('Qué nombre tan largo tienes!');\n}\n// imprime > Hola Michelle\n//           Qué nombre tan largo tienes!\n
\n

Con esta modificación, antes de imprimir en la consola el segundo mensaje ('Qué\nnombre tan largo tienes!'), el programa verifica si la longitud del string\nname es mayor a 7. De ser así, se imprime el segundo mensaje. De no ser así,\nno se ejecuta esa sentencia. En este caso, dado que Michelle tiene 8\ncaracteres (letras), la condición es true. Por lo tanto, se imprime el segundo\nmensaje.

\n

Cambiemos un poco este ejemplo, modificando el valor de name a 'Ana'.

\n
const name = 'Ana';\nconsole.log('Hola ' + name);\nif (name.length > 7) {\n  console.log('Qué nombre tan largo tienes!');\n}\n// returns > Hola Ana\n
\n

En esta ocasión, la condición no es true (es false) porque la longitud\ndel nombre es 3, lo cual no es mayor a 7. Por lo tanto, el cuerpo del if\nno se ejecuta. De tal manera, únicamente se ejecuta el primer mensaje 'Hola\nAna'.

\n

Sentencia if... else

\n

A menudo no sólo tendrás código que se ejecute cuando una condición sea\nverdadera, sino también que maneje el otro caso. Este camino alternativo es\nrepresentado por la segunda flecha en el diagrama de flujo. La palabra clave\nelse puede ser usada, junto con if, para crear dos rutas de ejecución\nseparadas y alternativas.

\n

Agregemos una sentencia else a nuestro ejemplo:

\n
const name = 'Ana';\nconsole.log('Hola ' + name);\nif (name.length > 7) {\n  console.log('Qué nombre tan largo tienes!');\n} else {\n  console.log('Tu nombre no es muy largo');\n}\n\n// returns > Hola Ana\n//           Tu nombre no es muy largo\n
\n

Como ves, el resultado de este caso es similar al anterior, solo que si name\nno tiene una logitud mayor a 7, existe un \"mensaje alternativo\" que se\nejecuta.

\n

Como muestra el ejemplo a continuación, las sentencias if ... else son\nsimilares a las sentencias if, pero incluyen 2 cuerpos. Si la condición es\ntrue, se ejecutan las sentencias del primer cuerpo; de lo contrario, se\nejecutan las sentencias del segundo cuerpo.

\n
if (condición) {\n  Sentencias a ejecutar si condición es VERDADERA\n} else {\n  Sentencias a ejecutar si condición es FALSA\n}\n
\n

Si tenemos más de dos caminos a escoger, varios pares de if...else pueden ser\n\"encadenados\". Aquí hay un ejemplo:

\n
const num = parseInt(prompt('Dame un número', '0'));\n\nif (num < 10) {\n  alert('Diste un número Pequeño');\n} else if (num < 100) {\n  alert('Diste un número Mediano');\n} else {\n  alert('Diste un número Grande');\n}\n
\n

El programa primero revisará si num es menor que 10. Si lo es, escoge ese\ncamino, muestra 'Diste un número Pequeño' en un alert box y termina. Si no lo\nes, toma el camino del else, que en sí mismo contiene un segundo if. Si la\nsegunda condición (< 100) se cumple, significa que el número está entre 10 y\n100, y se muestra 'Diste un número Mediano' en un alert box. Si no lo es, el\nsegundo y último else es escogido, mostrando 'Diste un número Grande'.

\n

El diagrama de flujo para este programa es algo así:

\n

\"Flujo

\n

Veamos otro ejemplo de la aplicación de la sentencia if...else. Esta vez, con\nun video de otra profesora estrella de Laboratoria, Alexandra :)

\n

\n

Utilizando Switch

\n

Es común ver código así:

\n
if (variable == 'valor1') {\n  accion1();\n} else if (variable == 'valor2') {\n  accion2();\n} else if (variable == 'valor3') {\n  accion3();\n} else {\n  accionDefault();\n}\n
\n

Existe una estructura llamada switch que está hecha para \"despachar\" de un\nmodo más directo. Desafortunadamente, la sintaxis que JavaScript usa para esto\n(que es heredada de la línea de lenguajes de programación de C/Java) es un poco\nincómoda; una cadena de sentencias if a menudo luce mejor. Aquí hay un\nejemplo:

\n
switch (prompt('¿Cómo está el clima?')) {\n  case 'lluvioso':\n    console.log('Recuerda llevar un paraguas.');\n    break;\n  case 'soleado':\n    console.log('Viste ligero.');\n  case 'nublado':\n    console.log('Sal a la calle.');\n    break;\n  default:\n    console.log('Tipo de Clima desconocido.');\n    break;\n}\n
\n

Puedes poner cualquier cantidad de etiquetas case dentro del bloque switch.\nEl programa saltará a la etiqueta que corresponda al valor que se le dio al\nswitch o al default si no se encuentra valor que corresponda. Se empiezan a\nejecutar las sentencias desde ahí, incluso si están bajo otra etiqueta, hasta\nque se llegue a una sentencia break (que en español significa \"detener\").

\n

En algunos casos, como en el caso de 'soleado' en el ejemplo, esto puede ser\nusado para compartir código entre casos (recomienda salir a la calle tanto para\nclima soleado como para nublado). Pero cuidado: es fácil olvidar el break, lo\ncuál causará que el programa ejecute código que no quieres que se ejecute.

\n

A continuación Michelle te ayuda a entender este caso un poco mejor:

\n

\"ejemplo

\n

3. Flujo repetitivo: Bucles

\n

Otra forma de modificar el flujo de un programa es estructuras repetitivas,\ntambién llamadas bucles (\"loops\" en inglés). Tal como hemos visto, los\ncondicionales permiten ejecutar un conjunto de sentencias una vez si una\ncondición es verdadera. Los bucles, permiten ejecutar un código varias\nveces, dependiendo de si una condición sigue siendo verdadera.

\n

Piensa en un programa que imprima todos los números pares del 1 al 12. Una\nmanera de escribirlo sería como sigue:

\n
console.log(0);\nconsole.log(2);\nconsole.log(4);\nconsole.log(6);\nconsole.log(8);\nconsole.log(10);\nconsole.log(12);\n// → 0\n// → 2\n//   … etcetera\n
\n

Eso funciona, pero la idea de escribir un programa es trabajar menos, no más. Si\nnecesitamos todos los números menores que 1,000, lo anterior sería imposible de\ntrabajar. Lo que necesitamos es una forma de repetir algo de código. Esta forma\nde control de flujo es llamada bucle. El control de flujo por bucles nos\npermite regresar a cierto punto en el programa en el que estuvimos antes y\nrepetirlo con nuestro estado actual, tal como lo describe el siguiente diagrama:

\n

\"Flujo

\n

Bucles while

\n

El bucle más sencillo es el bucle while (que significa \"mientras\" en español).\nUn bucle while ejecuta repetidamente una serie de sentencias hasta que una\ncondición particular deja de ser verdadera. Al escribir un bucle while, estás\ndiciendo: \"Sigue haciendo esto mientras esta condición sea verdadera. Detente\ncuando la condición se vuelva falsa.\"

\n

Como muestra el ejemplo a continuación, una sentencia que comienza con el\nkeyword while crea un bucle. Después de while viene una expresión en\nparéntesis que representa la condición y después un conjunto de sentencias (muy\nparecido al caso del if). Sin embargo, a diferencia del if, el bucle ejecuta\nla sentencia mientras la condición produzca un valor que sea true. Por eso es\nmuy importante que el conjunto de sentencias incluya algo que \"cambia\" para\nque la condición eventualmente sea falsa. De lo contrario, terminarás con un\nciclo infinito que nunca se detendrá, y eso usualmente es malo.

\n
while (condición) {\n  // Conjunto de sentencias, donde\n  // se incluye algo que \"cambia\" para\n  // que la condición eventualmente sea FALSA\n}\n
\n

Regresemos al problema de imprimir todos los números pares del 1 al 12, y\ncreemos un programa que utilice un bucle while:

\n
let number = 0;\nwhile (number <= 12) {\n  console.log(number);\n  number = number + 2;\n}\n// → 0\n// → 2\n//   … etcetera hasta 12\n
\n

En este caso, como queremos imprimir los números pares del 1 al 12, creamos una\nvariable number (es importante preguntarse ¿cuántas veces necesitamos\ncrear la variable number?), la inicializamos con el valor 0, y la\nutilizamos en la condición. Queremos que el bloque dentro del while corra\nmientras el valor de number sea igual o menor a 12. El cuerpo del while\nincluye dos sentencias: la primera, imprime el número (con console.log), y la\nsegunda incrementa number en 2 (porque queremos imprimir los pares\núnicamente). La variable number demuestra la forma en que una variable puede\ndar seguimiento al progreso de un programa. Cada vez que el bucle se repite,\nnumber se incrementa en 2. Entonces, al principio de cada repetición, el\nvalor de la variable number es comparado con el número 12 para decidir si el\nprograma ha hecho todo el trabajo que tenía que hacer. Es importante que\nentendamos que si no modificamos el valor de number con la segunda sentencia,\nla condición (number <= 12) siempre será true y tendremos un ciclo infinito\nque nunca se detendrá. Esto puede causar que tu computadora tenga problemas y se\ncongele.

\n

Si creas un bucle infinito en uno de los ejemplos, usualmente se te preguntará\nsi quieres detener el script después de unos cuantos segundos. Si eso falla,\ntendrás que cerrar la pestaña en la que estás trabajando, o, en otros\nnavegadores, cerrar el navegador entero para recuperarte.

\n

Veamos algunas variantes de este mismo problema para asegurarnos que entendemos\nbien cómo funciona el ciclo while:

\n
    \n
  • ¿Cómo hacemos para imprimir los números pares del 1 al 100?: Modificamos\nla condición para que el bucle corra mientras number sea <= 100.
  • \n
\n
let number = 0;\nwhile (number <= 100) {\n  console.log(number);\n  number = number + 2;\n}\n// → 0\n// → 2\n//   … etcetera hasta 100\n
\n
    \n
  • ¿Cómo hacemos para imprimir los números impares del 1 al 12?:\nInicializamos el valor de number con el valor de 1 (en lugar de 0).
  • \n
\n
let number = 1;\nwhile (number <= 12) {\n  console.log(number);\n  number = number + 2;\n}\n// → 1\n// → 3\n//   … etcetera hasta 11\n
\n
    \n
  • ¿Cómo hacemos para imprimir todos los números pares e impares del 1 al\n12?: En la segunda sentencia del while, incrementamos number en 1 (en lugar\nde 2) cada ciclo.
  • \n
\n
let number = 0;\nwhile (number <= 12) {\n  console.log(number);\n  number = number + 1;\n}\n// → 0\n// → 1\n// → 2\n//   … etcetera hasta 12\n
\n

Bucles do

\n

El bucle do es una estructura de control similar al bucle while. Se\ndiferencia en sólo un punto: un bucle do siempre ejecuta su cuerpo por lo\nmenos una vez y empieza a verificar si debería parar sólo después de la\nprimera ejecución. Para reflejar esto, la condición aparece después del cuerpo\ndel bucle. Veamos un ejemplo:

\n
do {\n  const yourName = prompt('¿Quién eres?');\n} while (!yourName);\n\nconsole.log('tu nombre es ' + yourName);\n
\n

Este programa te obligará a introducir un nombre. Preguntará una y otra vez\nhasta que obtenga algo que no sea una cadena vacía. Aplicar el operador !\nconvierte un valor a Boolean negándolo y todas las cadenas excepto '' se\nconvierten a true. Esto significa que el bucle continúa corriendo hasta que\ndes un nombre que no sea una cadena vacía.

\n

Bucles for

\n

Muchos bucles siguen el patrón de los ejemplos previos del while. Primero, una\nvariable “contador” es creada para dar seguimiento al progreso del bucle. Luego\nviene el bucle while, cuya expresión condicional normalmente verifica si el\ncontador ha alcanzado cierto límite. El final del cuerpo del bucle, el contador\nes actualizado para dar seguimiento al progreso.

\n

Debido a que este patrón es tan común, JavaScript y otros lenguajes similares\nproveen una versión un poco más corta y más completa: el bucle for.

\n
for (let number = 0; number <= 12; number = number + 2) {\n  console.log(number);\n}\n// → 0\n// → 2\n//   … etc.\n
\n

Este programa es exactamente equivalente al ejemplo previo de impresión de\nnúmeros pares. El único cambio es que todas las sentencias que están\nrelacionadas con el \"estado\" del bucle están agrupadas.

\n

Los paréntesis después del keyword for tienen que contener dos puntos y coma\n(;). La parte que está antes del primer punto y coma inicializa el bucle,\nnormalmente al definir una variable. La segunda parte es la expresión que\nverifica si el bucle tiene que continuar. La parte final actualiza el estado\ndel bucle antes de cada iteración. En la mayoría de los casos, esto es más corto\ny claro que una construcción con while.

\n

Aquí está un código que calcula 2^10 (2 exponencial 10), usando el bucle for:

\n
let result = 1;\nfor (let counter = 0; counter < 10; counter = counter + 1) {\n  result = result * 2;\n}\nconsole.log(result);\n// → 1024\n
\n

La representación general del bucle for es la siguiente:

\n
for (initial setup; condition; increment){\n  Bloque de código a ejecutar\n}\n
\n

El initial setup (por ejemplo: let counter = 0) se ejecuta antes de que se\ninicie el bucle. Generalmente se usa para crear una variable que rastrea el\nnúmero de veces que se ha ejecutado el bucle. La condition (counter < 10) se\ncomprueba antes de cada ejecución del cuerpo de bucle. Si la condición es\nverdadera, el cuerpo es ejecutado; si es falsa, el bucle se detiene. En este\ncaso, el bucle se detendrá una vez que counter ya no sea inferior a 10. El\nincrement (counter = counter + 1) se ejecuta después de cada ejecución del\ncuerpo de bucle. Generalmente se utiliza para actualizar la variable de bucle.\nEn nuestro ejemplo, lo usamos para agregar 1 a counter cada vez que se ejecuta\nel bucle.

\n

A continuación Alexandra te ayuda a entender el flujo de un bucle for que\nimprime el texto 'Hola mundo!' varias veces:

\n

\n

Forzando la salida de un bucle

\n

Hacer que la condición del bucle produzca false no es la única forma de que un\nbucle termine. Podemos usar la sentencia especial break, utilizada en\nswitch, que tiene el efecto de salir inmediatamente del bucle que la esté\nencerrando.

\n

El siguiente programa ilustra el uso de la sentencia break para salir de un\nbucle. Queremos hacer un programa que encuentre el primer número que es más\ngrande o igual que 20 y divisible por 7.

\n
for (let current = 20; ; current++) {\n  if (current % 7 == 0)\n    break;\n}\nconsole.log(current);\n// → 21\n
\n

Usar el operador de sobrante o módulo (%) es una forma fácil de probar si un\nnúmero es divisible por otro. Si lo es, el sobrante de la división es cero.\nTambién recuerda que current++ es lo mismo que current = current + 1.

\n

El for en este ejemplo no tiene la parte que verifica si el bucle debe\nterminar. Esto significa que el loop nunca terminará hasta que la sentencia\nbreak que está adentro sea ejecutada.

\n

Como, hemos visto, si dejaras afuera esa sentencia break o accidentalmente\nescribieras una condición que siempre produzca true, tu programa se quedaría\natorado en un bucle infinito.

\n

La palabra clave continue es similar a break en que influencia el progreso\ndel bucle. Cuando se encuentra continue en el cuerpo de un bucle, el control\nsale del curpo del bucle inmediatamente y continúa en la próxima iteración del\nbucle.

\n

A continuación Michelle te ayuda explica, con un ejemplo, las aplicaciones de\nbreak y continue dentro de un for:\n

\n

Diferencias entre for y while

\n

Puntualmente, se usa el for cuando sabes por adelantado cuantas repeticiones\nvas a realizar y el while cuando no lo sabes.

\n

Si decimos, \"gira el ventilador 10 veces\", de ante mano sabes que vamos a girar\nel ventilador 10 veces, por tal, el for seria buena idea.

\n

Si decimos: \"mientras haga calor gira el ventilador\". En realidad no sabemos de\nante mano cuantas veces vamos a girar el ventilador por que no sabemos cuanto\ntiempo tendremos calor, por ende, usar un while sería buena idea.

" }, "pt": { "title": "Estruturas condicionais e repetitivas", - "body": "

Objetivos

\n
    \n
  • Entender o que é o controle de fluxo de um programa
  • \n
  • Entender o que são estruturas condicionais e como eles afetam o fluxo do\nprograma
  • \n
  • Entender o que são estruturas repetitivas e como afetam o fluxo do programa
  • \n
\n
\n

O texto a seguir se baseia em grande medida, com alguns ajustes, ao capítulo 2\ndo Eloquent JavaScript,de Marijn Haverbeke,\n2014. Tradução em\nPortuguês,\ne ao capítulo 6 do JavaScript for\nkids,\nNick Morgan, 2015;

\n

Controle de Fluxo

\n

A razão pela qual criamos programas de computador é para resolver problemas.\nUm programa, como vimos, é simplemente um conjunto de \"instruções\" que os\ncomputadores seguem. Esse conjunto de instruções resolve um problema. Até agora,\naprendemos a obter, representar, manipular e armazenar dados em variáveis. Com\nisso, conseguimos criar programas que resolvem problemas muito simples. Este é o\ncaso, por exemplo, do programa que fizemos para transformar a temperatura de\ngraus Celsius (°C) para Farenheit (°F). No entanto, para criar programas mais\ncomplexos, é necessário expandir nosso conhecimento sobre o controle de fluxo\nde um programa e as estruturas existentes para modificar esse fluxo.

\n

Para usar a terminologia correta de JavaScript, a partir de agora,\nsubstituiremos a palavra \"instruções\" pela palavra \"sentenças\". Uma instrução\nJavaScript é o equivalente a uma sentença em linguagem humana. Entendemos,\nportanto, que um programa em JavaScript é uma lista de \"instruções JavaScript\",\nisto é, um conjunto de sentenças que informa ao computador o que fazer.

\n

1. Fluxo em linha reta

\n

Quando um programa contém mais de uma frase, elas são executadas de cima para\nbaixo, uma por uma. Por exemplo, o programa a seguir tem três sentenças: a\nprimeira declara uma variável chamada name com o valor do string 'Samanta'; a\nsegunda exibe no terminal uma mensagem de saudação personalizada: \"Olá\nSamanta\"; e a terceira exibe \"Que nome longo você tem!\".

\n
const name = 'Samanta';\nconsole.log('Olá ' + name);\nconsole.log('Que nome lindo você tem!');\n// returns Olá Samanta\n//         Que nome lindo você tem!\n
\n

Uma representação trivial esquemática de um fluxo de controle direto seria:

\n

\"Fluxo\nreto\"

\n

2. Fluxo condicional

\n

A execução de frases em linha reta não é a única opção que temos. Uma\nalternativa é a execução condicional, em que escolhemos entre duas rotas\ndiferentes com base em um valor Boolean, assim:

\n

\"Fluxo\ncondicional\"

\n

A execução condicional é escrita com a palavra-chave if en JavaScript. A\ninstrução if é a mais simples das estruturas de controle dessa linguagem. Ela\né usada para executar código se, e somente se, uma condição for verdadeira. Uma\ncondicional diz: \"Se algo é verdade, faça isso\". Por exemplo, se você fez sua\nlição de casa, recebe um sorvete, mas se você não fez sua lição, não o recebe.

\n

Como o exemplo abaixo mostra, uma sentença if em duas partes principais: a\ncondição e o corpo. A condição deve ser um valor Boolean entre parênteses. O\ncorpo consiste em uma ou mais instruções JavaScript que serão executadas se, e\nsomente se, a condição for verdadeira (Boolean igual a true).

\n
if (condição) {\n  // Conjunto de sentenças a executar\n}\n
\n

Quando precisamos executar várias instruções, podemos colocá-las entre chaves\n({ e }). As chaves agrupam as sentenças, tornando-as apenas uma. Uma sequência\nde sentenças entre chaves é chamada de bloco (de código). Muitos\nprogramadores JavaScript incluem chaves em todo corpo de if (e nos loops,\ncomo você verá mais adiante). Eles fazem isso em nome da consistência e para não\nter que adicionar ou remover as chaves quando o número de sentenças no corpo\nmudar. Outros, valorizam a brevidade e no caso do if não utilizam as chaves.\nNeste curso, sempre usaremos as chaves para nos ajudar a organizar nosso código.

\n

Vamos voltar ao exemplo anterior e adicionar uma condição antes da frase que\nimprime a segunda mensagem:

\n
const name = 'Samanta';\nconsole.log('Olá ' + name);\nif(name.length > 6) {\n  console.log('Que nome grande você tem!');\n}\n// returns Olá Samanta\n//         Que nome grande você tem!\n
\n

Com esta modificação, antes de imprimir no terminal a segunda mensagem ('Que\nnome longo você tem!'), o programa verifica se o tamanho da string name é\nmaior que 6. Se sim, a segunda mensagem é impressa. Caso contrário, essa\nsentença não é executada. Neste caso, como Samanta tem 7 caracteres, a condição\né true. Portanto, a segunda mensagem é impressa.

\n

Vamos mudar um pouco este exemplo, modificando o valor de name para 'Ana'.

\n
const name = 'Ana';\nconsole.log('Olá ' + name);\nif (name.length > 6) {\n  console.log('Que nome grande você tem!');\n}\n// returns Olá Ana\n
\n

Nesta ocasião, a condição não é truefalse) porque o comprimento do\nnome é 3, que não é maior que 6. Portanto, o corpo do if não se\nexecuta. Desta forma, apenas a primeira mensagem 'Olá Ana' é executada.

\n

Sentença if... else

\n

Muitas vezes, você não só terá o código que é executado quando uma condição é\nverdadeira, mas também quando acontece o outro caso. Esse caminho alternativo é\nrepresentado pela segunda seta no diagrama de fluxo. A palavra-chave else pode\nser usada, junto com if, para criar dois caminhos de execução separados e\nalternativos.

\n

Adicionemos uma sentença else ao nosso exemplo:

\n
const name = 'Ana';\nconsole.log('Olá ' + name);\nif (name.length > 6) {\n  console.log('Que nome grande você tem!');\n} else {\n  console.log('Não nome não é muito grande');\n}\n// returns Olá Ana\n//         Não nome não é muito grande\n
\n

Como você pode ver, o resultado deste caso é similar ao anterior, mas se name\nnão tiver um comprimento maior que 6, existe uma \"mensagem alternativa\" que\né executada.

\n

Como o exemplo abaixo mostra, as sentenças if ... else são semelhantes à\nsentenças if, mas incluem dois corpos. Se a condição é true, as sentenças do\nprimeiro corpo são executadas; caso contrário, as sentenças do segundo corpo são\nexecutadas.

\n
if (condição) {\n  Sentenças para execução se a condição for VERDADEIRA\n} else {\n  Sentenças para execução se a condição for FALSA\n}\n
\n

Se tivermos mais de dois caminhos para escolher, vários pares if... else podem\nser \"encadeados\". Aqui está um exemplo:

\n
const num = parseInt(prompt('Digite um número', '0'));\n\nif (num < 10){\n  alert('Você digitou um número pequeno');\n}\nelse if (num < 100){\n  alert('Você digitou um número médio');\n}\nelse {\n  alert('Você digitou um número grande');\n}\n
\n

O programa primeiro verificará se num é menor que 10. Se for, ele escolhe esse\ncaminho, mostra \"Você digitou um número pequeno\" em uma caixa de alerta e\ntermina. Se não for, toma o caminho do else, que em si mesmo contém um\nsegundo if. Se a segunda condição (< 100) for atendida, significa que o número\nestá entre 10 e 100, e \"Você digitou um número médio\" é exibido em uma caixa de\nalerta. Se não for, o segundo e último else é escolhido, mostrando \"Você\ndigitou um número grande\".

\n

O fluxograma deste programa é algo assim:

\n

\"Flujo\ncondicional\"

\n

Vamos ver outro exemplo de como usar if...else. Dessa vez com um vídeo da Paloma:

\n

\"if

\n

Utilizando Switch

\n

É comum ver o código assim:

\n
if (variable == 'valor1') {\n  accion1();\n}\nelse if (variable == 'valor2') {\n  accion2();\n}\nelse if (variable == 'valor3') {\n  accion3();\n}\nelse {\n  accionDefault();\n}\n
\n

Existe uma estrutura chamada switch que serve para \"decidir\" de maneira mais\ndireta. Infelizmente, a sintaxe que o JavaScript usa para isso (que é herdada da\nlinha da linguagem de programação C/Java) é um pouco estranha. Uma sequência de\nfrases if geralmente parece melhor. Aqui está um exemplo:

\n
switch (prompt('Como está o clima?')) {\n  case 'chuvoso':\n    console.log('Lembre-se de levar um guarda-chuva.');\n    break;\n  case 'ensolarado':\n    console.log('Vista roupas leves.');\n  case 'nublado':\n    console.log('Saia para a rua.');\n    break;\n  default:\n    console.log('Tipo de tempo desconhecido.');\n    break;\n}\n
\n

Você pode colocar qualquer número de etiquetas case dentro do bloco switch.\nO programa irá pular para o rótulo correspondente ao valor que foi dado ao\nswitch ou ao default se não houver nenhum valor igual. Daí, eles começam a\nexecutar as sentenças, incluindo os abaixo de outro rótulo, até que uma sentença\nbreak seja alcançada (o que em português significa \"pare\").

\n

Em alguns casos, como no caso de \"ensolarado\" no exemplo, é possível\ncompartilhar o código entre os casos (é recomendado ir ao ar livre tanto para\ntempo ensolarado quanto nublado). Mas cuidado: é fácil esquecer o break, o que\nfará com que o programa execute um código que você não deseja executar.

\n

A seguir o Daniel te ajudará entender este caso um pouco melhor:

\n

\"Switch\"

\n

3. Fluxo repetitivo: Loops

\n

Outra forma de modificar o fluxo de um programa é por meio de estruturas\nrepetitivas, também chamadas \"loops\" em inglês. Como já estamos vendo, as\ncondicionais permitem executar um conjunto de sentenças uma vez se uma condição\né verdadeira. Os loops permitem executar um código várias vezes,\ndependendo se uma condição continua sendo verdadeira.

\n

Imagine um programa que imprima todos os números pares do 1 ao 12. Uma maneira\nde escrevê-lo seria assim:

\n
console.log(0);\nconsole.log(2);\nconsole.log(4);\nconsole.log(6);\nconsole.log(8);\nconsole.log(10);\nconsole.log(12);\n// → 0\n// → 2\n//   … etcetera\n
\n

Isso funciona, mas a ideia de escrever um programa é trabalhar menos, e não\nmais. Se necessitamos todos os números menores que 1,000, o modo anterior seria\nimpossível de trabalhar. O que necessitamos é uma forma de repetir partes de\ncódigo. Esta forma de controle de fluxo é chamada loop. O controle de fluxo\npor loops nos permite voltar a certo ponto no programa em que estivemos antes e\nrepetí-lo com nosso estado atual, como descreve o seguinte diagrama:

\n

\"Flujo\nbucle\"

\n

Loops while

\n

O loop mais simples é o loop while (que significa \"enquanto\" em português). Um\nloop while executa repetidamente uma série de sentenças até que uma condição\nparticular deixe de ser verdadeira. Ao escrever um loop while, você está\ndizendo: \"Continue fazendo isto enquanto esta condição seja verdadeira. Pare\nquando a condição se tornar falsa.\"

\n

Como revela o exemplo a seguir, uma sentença que começa com a keyword while\ncria um loop. Depois de while vem uma expressão em parênteses que representa a\ncondição e depois um conjunto de sentenças (muito parecido ao caso do if).\nPorém, diferentemente do if, o loop executa a sentença enquanto a condição\nproduza um valor que seja true. Por isso é muito importante que o conjunto de\nsentenças inclua algo que \"muda\" para que a condição eventualmente seja falsa.\nDo contrário, criaria um ciclo infinito que nunca termina, e isto usualmente é\nruim.

\n
while (condição) {\n  // Conjunto de sentenças, onde\n  // se inclui algo que \"muda\" para\n  // que a condição eventualmente seja FALSA\n}\n
\n

Vamos voltar agora ao problema de imprimir todos os números pares do 1 ao 12, e\ncriar um programa que utilize um loop while:

\n
let number = 0;\nwhile (number <= 12) {\n  console.log(number);\n  number = number + 2;\n}\n// → 0\n// → 2\n//   … etcetera até 12\n
\n

Neste caso, como queremos imprimir os números pares do 1 ao 12, criamos uma\nvariável number, inicializamos com o valor 0, e a utilizamos na condição.\nQueremos que o bloco dentro do while funcione enquanto o valor de number\nseja igual ou menor a 12. O corpo do while inclui duas sentenças: a primeira\nimprime o número (com console.log), e a segunda incrementa number em 2 (porque\nqueremos imprimir os pares unicamente). A variável number demonstra a forma em\nque uma variável pode dar seguimento ao progresso de um programa. Cada vez que o\nloop se repete, number se incrementa em 2. Então, no início de cada repetição,\no valor da variável number é comparado com o número 12 para decidir se o\nprograma fez todo o trabalho que deveria fazer. É importante que entendamos que\nse não modificamos o valor de number com a segunda sentença, a condição\n(number <=12) sempre será true e teremos um ciclo infinito que nunca se\ndeterá. Isto pode causar que o seu computador tenha problemas e trave.

\n

Se você cria um loop infinito em um dos exemplos, usualmente será perguntado se\nvocê quer deter o script depois de alguns segundos. Se isso falha, você terá que\nfechar a aba na qual está trabalhando, ou, em outros navegadores, fechar o\nnavegador inteiro para se recuperar.

\n

Vejamos algumas variantes deste mesmo problema para assegurar que entendemos bem\ncomo funciona o ciclo while:

\n
    \n
  • Como fazemos para imprimir os números pares do 1 ao 100?: Modificamos a\n condição para que o loop aconteça enquanto number seja <= 100.
  • \n
\n
let number = 0;\nwhile (number <= 100) {\n  console.log(number);\n  number = number + 2;\n}\n// → 0\n// → 2\n//   … etcetera até 100\n
\n
    \n
  • Como fazemos para imprimir os números ímpares do 1 a 12?: Iniciamos o\n valor de number com o valor de 1 (ao invés de 0).
  • \n
\n
let number = 1;\nwhile (number <= 12) {\n  console.log(number);\n  number = number + 2;\n}\n// → 1\n// → 3\n//   … etcetera até 11\n
\n
    \n
  • Como fazemos para imprimir todos os números pares e ímpares do 1 ao\n 12?: Na segunda sentença do while, incrementamos number em 1 (no lugar de\n 2) a cada ciclo.
  • \n
\n
let number = 0;\nwhile (number <= 12) {\n  console.log(number);\n  number = number + 1;\n}\n// → 0\n// → 1\n// → 2\n//   … etcetera até 12\n
\n

Loops do

\n

O loop do é uma estrutura de controle similar ao loop while. A diferença\nestá em um só ponto: um loop do sempre executa seu corpo pelo menos uma\nvez e começa a verificar se deveria parar somente depois da primeira execução.\nPara refletir isto, a condição aparece depois do corpo do loop. Vejamos um\nexemplo:

\n
let yourName;\ndo {\n yourName = prompt('Qual é seu nome?');\n} while (!yourName);\n\nconsole.log('seu nome é ' + yourName);\n
\n

Este programa te obrigará a introduzir um nome. Perguntará uma e outra vez até\nque obtenha algo que não seja uma cadeia vazia. Aplicar o operador ! converte\num valor a Boolean negando-o e todas as cadeias exceto '' se convertem a\ntrue. Isto significa que ele continua rodando até que você dê um nome que não\nseja uma cadeia vazia.

\n

Loop for

\n

Muitos loops seguem um padrão dos exemplos prévios do while. Primeiro, uma\nvariável “contador” é criada para dar seguimento ao progresso do loop. Logo\ndepois vem o loop while, cuja expressão condicional normalmente verifica se o\ncontador alcançou certo limite. Ao final do corpo do loop, o contador é\natualizado para dar seguimento ao progresso.

\n

Devido ao fato de que este padrão é muito comum, JavaScript e outras linguagens\nsimilares proporcionam uma versão um pouco mais curta e mais completa: o loop\nfor.

\n
for (let number = 0; number <= 12; number = number + 2){\n  console.log(number);\n}\n// → 0\n// → 2\n//   … etc.\n
\n

Este programa é exatamente equivalente ao exemplo prévio de impressão de números\npares. A única mudança é que todas as sentenças que estão relacionadas com o\n\"estado\" do ciclo estão agrupadas.

\n

Os parênteses depois do keyword for devem conter ponto e vírgula (;). A\nparte que está antes do primeiro ponto e vírgula inicia o loop, normalmente ao\ndefinir uma variável. A segunda parte é a expressão que verifica se o loop tem\nque continuar. A parte final atualiza o estado do loop antes de cada iteração.\nNa maioria dos casos, isto é mais curto e claro que uma construção com while.

\n

A seguir mostramos um código que calcula 2^10 (2 exponencial 10), usando o loop\nfor:

\n
let result = 1;\nfor (let counter = 0; counter < 10; counter = counter + 1){\n  result = result * 2\n}\nconsole.log(result);\n// → 1024\n
\n

A representação geral do loop for é a seguinte:

\n
for (initial setup; condition; increment){\n  Bloco de código a executar\n}\n
\n

O initial setup (por exemplo: let counter = 0) se executa antes de que se\ninicie o loop. Geralmente se usa para criar uma variável que rastreia o número\nde vezes que foi executado o loop. A condition (counter < 10) se comprova\nantes de cada execução do corpo do loop. Se a condição é verdadeira, o corpo é\nexecutado; se é falsa, o loop se detém. Neste caso, o loop se deterá uma vez que\ncounter já não seja inferior a 10. O increment (counter = counter + 1) se\nexecuta depois de cada execução do corpo do loop. Geralmente se utiliza para\natualizar a variável do loop. No nosso exemplo, utilizamos para agregar 1 a\ncounter cada vez que se executa o loop.

\n

A seguir Paloma te ajudará a entender o fluxo do loop for:

\n

\"For\"

\n

Forçando a saída de um loop

\n

Fazer com que a condição do loop produza false não é a única forma para que um\nloop termine. Podemos usar a sentença especial break, utilizada en switch,\nque tem o efeito de sair inmediatamente do loop que o esta fechando.

\n

O programa a seguir ilustra o uso da sentença break para sair de um loop.\nQueremos fazer um programa que encontre o primeiro número que é maior ou igual a\n20 e divisível por 7.

\n
for (let current = 20; current++) {\n  if (current % 7 == 0)\n    break;\n}\nconsole.log(current);\n// → 21\n
\n

Usar o operador de resto ou módulo (%) é uma forma fácil de provar se o número é\ndivisível por outro. Se for, o resto da divisão é zero. Também lembre-se que\ncurrent++ é o mesmo que current = current + 1.

\n

O for neste exemplo não tem a parte que verifica se o loop deve terminar. Isto\nsignifica que o loop nunca terminará até que a sentença break que está dentro\nseja executada.

\n

Como já estamos aprendendo, se você deixasse fora essa sentença break ou\nacidentalmente escrevesse uma condição que sempre produza true, o seu programa\nse ficaria travado em um loop infinito.

\n

A palavra chave continue é parecida ao break pois influencia o progresso do\nloop. Quando se encontra continue no corpo de um loop, o controle sai do corpo\ndo loop imediatamente e continua na próxima iteração do loop.

\n

A seguir Rafael te explicará, com um exemplo, as aplicações de break and\ncontinue dentro de um for:

\n

\"Break

\n

Diferenças entre for e while

\n

Pontualmente, se usa o for quando se save quantas repetições vão ser\nrealizadas e o while quando não se sabe.

\n

Se dissermos, \"gire o ventilador 10 vezes\", você já sabe que vamos girar o\nventilador 10 vezes, então seria uma boa ideal usar o for.

\n

Se dissermos, \"enquanto estiver calor gire o ventilador\". Não sabemos quantas\nvezes vamos girar o ventilador até ficar frio, então usar o while nesse caso é\nmelhor.

" + "body": "

Objetivos

\n
    \n
  • Entender o que é o controle de fluxo de um programa
  • \n
  • Entender o que são estruturas condicionais e como eles afetam o fluxo do\nprograma
  • \n
  • Entender o que são estruturas repetitivas e como afetam o fluxo do programa
  • \n
\n
\n

O texto a seguir se baseia em grande medida, com alguns ajustes, ao capítulo 2\ndo Eloquent JavaScript,de Marijn Haverbeke,\n2014. Tradução em\nPortuguês,\ne ao capítulo 6 do JavaScript for\nkids,\nNick Morgan, 2015;

\n

Controle de Fluxo

\n

A razão pela qual criamos programas de computador é para resolver problemas.\nUm programa, como vimos, é simplemente um conjunto de \"instruções\" que os\ncomputadores seguem. Esse conjunto de instruções resolve um problema. Até agora,\naprendemos a obter, representar, manipular e armazenar dados em variáveis. Com\nisso, conseguimos criar programas que resolvem problemas muito simples. Este é o\ncaso, por exemplo, do programa que fizemos para transformar a temperatura de\ngraus Celsius (°C) para Farenheit (°F). No entanto, para criar programas mais\ncomplexos, é necessário expandir nosso conhecimento sobre o controle de fluxo\nde um programa e as estruturas existentes para modificar esse fluxo.

\n

Para usar a terminologia correta de JavaScript, a partir de agora,\nsubstituiremos a palavra \"instruções\" pela palavra \"sentenças\". Uma instrução\nJavaScript é o equivalente a uma sentença em linguagem humana. Entendemos,\nportanto, que um programa em JavaScript é uma lista de \"instruções JavaScript\",\nisto é, um conjunto de sentenças que informa ao computador o que fazer.

\n

1. Fluxo em linha reta

\n

Quando um programa contém mais de uma frase, elas são executadas de cima para\nbaixo, uma por uma. Por exemplo, o programa a seguir tem três sentenças: a\nprimeira declara uma variável chamada name com o valor do string 'Samanta'; a\nsegunda exibe no terminal uma mensagem de saudação personalizada: \"Olá\nSamanta\"; e a terceira exibe \"Que nome longo você tem!\".

\n
const name = 'Samanta';\nconsole.log('Olá ' + name);\nconsole.log('Que nome lindo você tem!');\n// returns Olá Samanta\n//         Que nome lindo você tem!\n
\n

Uma representação trivial esquemática de um fluxo de controle direto seria:

\n

\"Fluxo\nreto\"

\n

2. Fluxo condicional

\n

A execução de frases em linha reta não é a única opção que temos. Uma\nalternativa é a execução condicional, em que escolhemos entre duas rotas\ndiferentes com base em um valor Boolean, assim:

\n

\"Fluxo\ncondicional\"

\n

A execução condicional é escrita com a palavra-chave if en JavaScript. A\ninstrução if é a mais simples das estruturas de controle dessa linguagem. Ela\né usada para executar código se, e somente se, uma condição for verdadeira. Uma\ncondicional diz: \"Se algo é verdade, faça isso\". Por exemplo, se você fez sua\nlição de casa, recebe um sorvete, mas se você não fez sua lição, não o recebe.

\n

Como o exemplo abaixo mostra, uma sentença if em duas partes principais: a\ncondição e o corpo. A condição deve ser um valor Boolean entre parênteses. O\ncorpo consiste em uma ou mais instruções JavaScript que serão executadas se, e\nsomente se, a condição for verdadeira (Boolean igual a true).

\n
if (condição) {\n  // Conjunto de sentenças a executar\n}\n
\n

Quando precisamos executar várias instruções, podemos colocá-las entre chaves\n({ e }). As chaves agrupam as sentenças, tornando-as apenas uma. Uma sequência\nde sentenças entre chaves é chamada de bloco (de código). Muitos\nprogramadores JavaScript incluem chaves em todo corpo de if (e nos loops,\ncomo você verá mais adiante). Eles fazem isso em nome da consistência e para não\nter que adicionar ou remover as chaves quando o número de sentenças no corpo\nmudar. Outros, valorizam a brevidade e no caso do if não utilizam as chaves.\nNeste curso, sempre usaremos as chaves para nos ajudar a organizar nosso código.

\n

Vamos voltar ao exemplo anterior e adicionar uma condição antes da frase que\nimprime a segunda mensagem:

\n
const name = 'Samanta';\nconsole.log('Olá ' + name);\nif(name.length > 6) {\n  console.log('Que nome grande você tem!');\n}\n// returns Olá Samanta\n//         Que nome grande você tem!\n
\n

Com esta modificação, antes de imprimir no terminal a segunda mensagem ('Que\nnome longo você tem!'), o programa verifica se o tamanho da string name é\nmaior que 6. Se sim, a segunda mensagem é impressa. Caso contrário, essa\nsentença não é executada. Neste caso, como Samanta tem 7 caracteres, a condição\né true. Portanto, a segunda mensagem é impressa.

\n

Vamos mudar um pouco este exemplo, modificando o valor de name para 'Ana'.

\n
const name = 'Ana';\nconsole.log('Olá ' + name);\nif (name.length > 6) {\n  console.log('Que nome grande você tem!');\n}\n// returns Olá Ana\n
\n

Nesta ocasião, a condição não é truefalse) porque o comprimento do\nnome é 3, que não é maior que 6. Portanto, o corpo do if não se\nexecuta. Desta forma, apenas a primeira mensagem 'Olá Ana' é executada.

\n

Sentença if... else

\n

Muitas vezes, você não só terá o código que é executado quando uma condição é\nverdadeira, mas também quando acontece o outro caso. Esse caminho alternativo é\nrepresentado pela segunda seta no diagrama de fluxo. A palavra-chave else pode\nser usada, junto com if, para criar dois caminhos de execução separados e\nalternativos.

\n

Adicionemos uma sentença else ao nosso exemplo:

\n
const name = 'Ana';\nconsole.log('Olá ' + name);\nif (name.length > 6) {\n  console.log('Que nome grande você tem!');\n} else {\n  console.log('Não nome não é muito grande');\n}\n// returns Olá Ana\n//         Não nome não é muito grande\n
\n

Como você pode ver, o resultado deste caso é similar ao anterior, mas se name\nnão tiver um comprimento maior que 6, existe uma \"mensagem alternativa\" que\né executada.

\n

Como o exemplo abaixo mostra, as sentenças if ... else são semelhantes à\nsentenças if, mas incluem dois corpos. Se a condição é true, as sentenças do\nprimeiro corpo são executadas; caso contrário, as sentenças do segundo corpo são\nexecutadas.

\n
if (condição) {\n  Sentenças para execução se a condição for VERDADEIRA\n} else {\n  Sentenças para execução se a condição for FALSA\n}\n
\n

Se tivermos mais de dois caminhos para escolher, vários pares if... else podem\nser \"encadeados\". Aqui está um exemplo:

\n
const num = parseInt(prompt('Digite um número', '0'));\n\nif (num < 10){\n  alert('Você digitou um número pequeno');\n}\nelse if (num < 100){\n  alert('Você digitou um número médio');\n}\nelse {\n  alert('Você digitou um número grande');\n}\n
\n

O programa primeiro verificará se num é menor que 10. Se for, ele escolhe esse\ncaminho, mostra \"Você digitou um número pequeno\" em uma caixa de alerta e\ntermina. Se não for, toma o caminho do else, que em si mesmo contém um\nsegundo if. Se a segunda condição (< 100) for atendida, significa que o número\nestá entre 10 e 100, e \"Você digitou um número médio\" é exibido em uma caixa de\nalerta. Se não for, o segundo e último else é escolhido, mostrando \"Você\ndigitou um número grande\".

\n

O fluxograma deste programa é algo assim:

\n

\"Flujo\ncondicional\"

\n

Vamos ver outro exemplo de como usar if...else. Dessa vez com um vídeo da Paloma:

\n

\n

Utilizando Switch

\n

É comum ver o código assim:

\n
if (variable == 'valor1') {\n  accion1();\n}\nelse if (variable == 'valor2') {\n  accion2();\n}\nelse if (variable == 'valor3') {\n  accion3();\n}\nelse {\n  accionDefault();\n}\n
\n

Existe uma estrutura chamada switch que serve para \"decidir\" de maneira mais\ndireta. Infelizmente, a sintaxe que o JavaScript usa para isso (que é herdada da\nlinha da linguagem de programação C/Java) é um pouco estranha. Uma sequência de\nfrases if geralmente parece melhor. Aqui está um exemplo:

\n
switch (prompt('Como está o clima?')) {\n  case 'chuvoso':\n    console.log('Lembre-se de levar um guarda-chuva.');\n    break;\n  case 'ensolarado':\n    console.log('Vista roupas leves.');\n  case 'nublado':\n    console.log('Saia para a rua.');\n    break;\n  default:\n    console.log('Tipo de tempo desconhecido.');\n    break;\n}\n
\n

Você pode colocar qualquer número de etiquetas case dentro do bloco switch.\nO programa irá pular para o rótulo correspondente ao valor que foi dado ao\nswitch ou ao default se não houver nenhum valor igual. Daí, eles começam a\nexecutar as sentenças, incluindo os abaixo de outro rótulo, até que uma sentença\nbreak seja alcançada (o que em português significa \"pare\").

\n

Em alguns casos, como no caso de \"ensolarado\" no exemplo, é possível\ncompartilhar o código entre os casos (é recomendado ir ao ar livre tanto para\ntempo ensolarado quanto nublado). Mas cuidado: é fácil esquecer o break, o que\nfará com que o programa execute um código que você não deseja executar.

\n

A seguir o Daniel te ajudará entender este caso um pouco melhor:

\n

\n

3. Fluxo repetitivo: Loops

\n

Outra forma de modificar o fluxo de um programa é por meio de estruturas\nrepetitivas, também chamadas \"loops\" em inglês. Como já estamos vendo, as\ncondicionais permitem executar um conjunto de sentenças uma vez se uma condição\né verdadeira. Os loops permitem executar um código várias vezes,\ndependendo se uma condição continua sendo verdadeira.

\n

Imagine um programa que imprima todos os números pares do 1 ao 12. Uma maneira\nde escrevê-lo seria assim:

\n
console.log(0);\nconsole.log(2);\nconsole.log(4);\nconsole.log(6);\nconsole.log(8);\nconsole.log(10);\nconsole.log(12);\n// → 0\n// → 2\n//   … etcetera\n
\n

Isso funciona, mas a ideia de escrever um programa é trabalhar menos, e não\nmais. Se necessitamos todos os números menores que 1,000, o modo anterior seria\nimpossível de trabalhar. O que necessitamos é uma forma de repetir partes de\ncódigo. Esta forma de controle de fluxo é chamada loop. O controle de fluxo\npor loops nos permite voltar a certo ponto no programa em que estivemos antes e\nrepetí-lo com nosso estado atual, como descreve o seguinte diagrama:

\n

\"Flujo\nbucle\"

\n

Loops while

\n

O loop mais simples é o loop while (que significa \"enquanto\" em português). Um\nloop while executa repetidamente uma série de sentenças até que uma condição\nparticular deixe de ser verdadeira. Ao escrever um loop while, você está\ndizendo: \"Continue fazendo isto enquanto esta condição seja verdadeira. Pare\nquando a condição se tornar falsa.\"

\n

Como revela o exemplo a seguir, uma sentença que começa com a keyword while\ncria um loop. Depois de while vem uma expressão em parênteses que representa a\ncondição e depois um conjunto de sentenças (muito parecido ao caso do if).\nPorém, diferentemente do if, o loop executa a sentença enquanto a condição\nproduza um valor que seja true. Por isso é muito importante que o conjunto de\nsentenças inclua algo que \"muda\" para que a condição eventualmente seja falsa.\nDo contrário, criaria um ciclo infinito que nunca termina, e isto usualmente é\nruim.

\n
while (condição) {\n  // Conjunto de sentenças, onde\n  // se inclui algo que \"muda\" para\n  // que a condição eventualmente seja FALSA\n}\n
\n

Vamos voltar agora ao problema de imprimir todos os números pares do 1 ao 12, e\ncriar um programa que utilize um loop while:

\n
let number = 0;\nwhile (number <= 12) {\n  console.log(number);\n  number = number + 2;\n}\n// → 0\n// → 2\n//   … etcetera até 12\n
\n

Neste caso, como queremos imprimir os números pares do 1 ao 12, criamos uma\nvariável number, inicializamos com o valor 0, e a utilizamos na condição.\nQueremos que o bloco dentro do while funcione enquanto o valor de number\nseja igual ou menor a 12. O corpo do while inclui duas sentenças: a primeira\nimprime o número (com console.log), e a segunda incrementa number em 2 (porque\nqueremos imprimir os pares unicamente). A variável number demonstra a forma em\nque uma variável pode dar seguimento ao progresso de um programa. Cada vez que o\nloop se repete, number se incrementa em 2. Então, no início de cada repetição,\no valor da variável number é comparado com o número 12 para decidir se o\nprograma fez todo o trabalho que deveria fazer. É importante que entendamos que\nse não modificamos o valor de number com a segunda sentença, a condição\n(number <=12) sempre será true e teremos um ciclo infinito que nunca se\ndeterá. Isto pode causar que o seu computador tenha problemas e trave.

\n

Se você cria um loop infinito em um dos exemplos, usualmente será perguntado se\nvocê quer deter o script depois de alguns segundos. Se isso falha, você terá que\nfechar a aba na qual está trabalhando, ou, em outros navegadores, fechar o\nnavegador inteiro para se recuperar.

\n

Vejamos algumas variantes deste mesmo problema para assegurar que entendemos bem\ncomo funciona o ciclo while:

\n
    \n
  • Como fazemos para imprimir os números pares do 1 ao 100?: Modificamos a\n condição para que o loop aconteça enquanto number seja <= 100.
  • \n
\n
let number = 0;\nwhile (number <= 100) {\n  console.log(number);\n  number = number + 2;\n}\n// → 0\n// → 2\n//   … etcetera até 100\n
\n
    \n
  • Como fazemos para imprimir os números ímpares do 1 a 12?: Iniciamos o\n valor de number com o valor de 1 (ao invés de 0).
  • \n
\n
let number = 1;\nwhile (number <= 12) {\n  console.log(number);\n  number = number + 2;\n}\n// → 1\n// → 3\n//   … etcetera até 11\n
\n
    \n
  • Como fazemos para imprimir todos os números pares e ímpares do 1 ao\n 12?: Na segunda sentença do while, incrementamos number em 1 (no lugar de\n 2) a cada ciclo.
  • \n
\n
let number = 0;\nwhile (number <= 12) {\n  console.log(number);\n  number = number + 1;\n}\n// → 0\n// → 1\n// → 2\n//   … etcetera até 12\n
\n

Loops do

\n

O loop do é uma estrutura de controle similar ao loop while. A diferença\nestá em um só ponto: um loop do sempre executa seu corpo pelo menos uma\nvez e começa a verificar se deveria parar somente depois da primeira execução.\nPara refletir isto, a condição aparece depois do corpo do loop. Vejamos um\nexemplo:

\n
let yourName;\ndo {\n yourName = prompt('Qual é seu nome?');\n} while (!yourName);\n\nconsole.log('seu nome é ' + yourName);\n
\n

Este programa te obrigará a introduzir um nome. Perguntará uma e outra vez até\nque obtenha algo que não seja uma cadeia vazia. Aplicar o operador ! converte\num valor a Boolean negando-o e todas as cadeias exceto '' se convertem a\ntrue. Isto significa que ele continua rodando até que você dê um nome que não\nseja uma cadeia vazia.

\n

Loop for

\n

Muitos loops seguem um padrão dos exemplos prévios do while. Primeiro, uma\nvariável “contador” é criada para dar seguimento ao progresso do loop. Logo\ndepois vem o loop while, cuja expressão condicional normalmente verifica se o\ncontador alcançou certo limite. Ao final do corpo do loop, o contador é\natualizado para dar seguimento ao progresso.

\n

Devido ao fato de que este padrão é muito comum, JavaScript e outras linguagens\nsimilares proporcionam uma versão um pouco mais curta e mais completa: o loop\nfor.

\n
for (let number = 0; number <= 12; number = number + 2){\n  console.log(number);\n}\n// → 0\n// → 2\n//   … etc.\n
\n

Este programa é exatamente equivalente ao exemplo prévio de impressão de números\npares. A única mudança é que todas as sentenças que estão relacionadas com o\n\"estado\" do ciclo estão agrupadas.

\n

Os parênteses depois do keyword for devem conter ponto e vírgula (;). A\nparte que está antes do primeiro ponto e vírgula inicia o loop, normalmente ao\ndefinir uma variável. A segunda parte é a expressão que verifica se o loop tem\nque continuar. A parte final atualiza o estado do loop antes de cada iteração.\nNa maioria dos casos, isto é mais curto e claro que uma construção com while.

\n

A seguir mostramos um código que calcula 2^10 (2 exponencial 10), usando o loop\nfor:

\n
let result = 1;\nfor (let counter = 0; counter < 10; counter = counter + 1){\n  result = result * 2\n}\nconsole.log(result);\n// → 1024\n
\n

A representação geral do loop for é a seguinte:

\n
for (initial setup; condition; increment){\n  Bloco de código a executar\n}\n
\n

O initial setup (por exemplo: let counter = 0) se executa antes de que se\ninicie o loop. Geralmente se usa para criar uma variável que rastreia o número\nde vezes que foi executado o loop. A condition (counter < 10) se comprova\nantes de cada execução do corpo do loop. Se a condição é verdadeira, o corpo é\nexecutado; se é falsa, o loop se detém. Neste caso, o loop se deterá uma vez que\ncounter já não seja inferior a 10. O increment (counter = counter + 1) se\nexecuta depois de cada execução do corpo do loop. Geralmente se utiliza para\natualizar a variável do loop. No nosso exemplo, utilizamos para agregar 1 a\ncounter cada vez que se executa o loop.

\n

A seguir Paloma te ajudará a entender o fluxo do loop for:

\n

\n

Forçando a saída de um loop

\n

Fazer com que a condição do loop produza false não é a única forma para que um\nloop termine. Podemos usar a sentença especial break, utilizada en switch,\nque tem o efeito de sair inmediatamente do loop que o esta fechando.

\n

O programa a seguir ilustra o uso da sentença break para sair de um loop.\nQueremos fazer um programa que encontre o primeiro número que é maior ou igual a\n20 e divisível por 7.

\n
for (let current = 20; current++) {\n  if (current % 7 == 0)\n    break;\n}\nconsole.log(current);\n// → 21\n
\n

Usar o operador de resto ou módulo (%) é uma forma fácil de provar se o número é\ndivisível por outro. Se for, o resto da divisão é zero. Também lembre-se que\ncurrent++ é o mesmo que current = current + 1.

\n

O for neste exemplo não tem a parte que verifica se o loop deve terminar. Isto\nsignifica que o loop nunca terminará até que a sentença break que está dentro\nseja executada.

\n

Como já estamos aprendendo, se você deixasse fora essa sentença break ou\nacidentalmente escrevesse uma condição que sempre produza true, o seu programa\nse ficaria travado em um loop infinito.

\n

A palavra chave continue é parecida ao break pois influencia o progresso do\nloop. Quando se encontra continue no corpo de um loop, o controle sai do corpo\ndo loop imediatamente e continua na próxima iteração do loop.

\n

A seguir Rafael te explicará, com um exemplo, as aplicações de break and\ncontinue dentro de um for:

\n

\n

Diferenças entre for e while

\n

Pontualmente, se usa o for quando se save quantas repetições vão ser\nrealizadas e o while quando não se sabe.

\n

Se dissermos, \"gire o ventilador 10 vezes\", você já sabe que vamos girar o\nventilador 10 vezes, então seria uma boa ideal usar o for.

\n

Se dissermos, \"enquanto estiver calor gire o ventilador\". Não sabemos quantas\nvezes vamos girar o ventilador até ficar frio, então usar o while nesse caso é\nmelhor.

" } } }, @@ -228,11 +228,11 @@ "intl": { "es": { "title": "Casos prácticos", - "body": "

Objetivos

\n
    \n
  • Entender, a través de casos prácticos, cómo aplicar los conceptos de\nestructuras condicionales y estructuras repetitivas para la resolución de\nproblemas
  • \n
\n
\n

Enunciados

\n

Al igual que hemos hecho antes, es hora de aplicar los conceptos aprendidos para\nresolver problemas.

\n

A continuación tendrás varios problemas que debemos resolver. Intenta\nresolverlos primero por tu cuenta. Más abajo encontrarás las soluciones de\nMichelle. Después de haberlo intentado, compara tus soluciones con las de\nMichelle.

\n

1. FizzBuzz

\n

Escribe un programa que use console.log para imprimir todos los números del 1\nal 100, con dos excepciones:

\n
    \n
  • Para números divisibles por 3, imprime \"Fizz\" en vez del número
  • \n
  • Para números divisibles por 5 (pero no por 3), imprime \"Buzz\".
  • \n
\n

Cuando tengas eso funcionando, modifica tu programa para imprimir \"FizzBuzz\"\npara los números que sean divisibles tanto por 3 como por 5 (y que siga\nimprimiendo \"Fizz\" o \"Buzz\" para números divisibles por sólo uno de ellos).

\n

2. Tablero de Ajedrez

\n

Crea un programa que cree un string que represente una cuadrícula de 8x8,\nusando el salto de línea como separador. En cada posición de la cuadrícula debe\nhaber un espacio o un carácter \"#\". Los caracteres deberían formar un tablero de\najedrez.

\n

Pasar ese string a console.log debería mostrar algo como esto:

\n
 # # # #\n# # # #\n # # # #\n# # # #\n # # # #\n# # # #\n # # # #\n# # # #\n
\n

Cuando tengas un programa que genere este patrón, define una variable size = 8\ny cambia el programa de tal manera que trabaje para cualquier tamaño, que sea\nproporcionado por un prompt() produciendo una cuadrícula del ancho y alto\ndado.

\n

Solucionarios

\n

A continuación, Michelle te explica cómo resolvió cada uno de los ejercicios\nanteriores.

\n

1. FizzBuzz: Solucionario

\n

\"FizzBuzz

\n

2. Tablero de Ajedrez: Solucionario

\n

\"Tablero\"

" + "body": "

Objetivos

\n
    \n
  • Entender, a través de casos prácticos, cómo aplicar los conceptos de\nestructuras condicionales y estructuras repetitivas para la resolución de\nproblemas
  • \n
\n
\n

Enunciados

\n

Al igual que hemos hecho antes, es hora de aplicar los conceptos aprendidos para\nresolver problemas.

\n

A continuación tendrás varios problemas que debemos resolver. Intenta\nresolverlos primero por tu cuenta. Más abajo encontrarás las soluciones de\nMichelle. Después de haberlo intentado, compara tus soluciones con las de\nMichelle.

\n

1. FizzBuzz

\n

Escribe un programa que use console.log para imprimir todos los números del 1\nal 100, con dos excepciones:

\n
    \n
  • Para números divisibles por 3, imprime \"Fizz\" en vez del número
  • \n
  • Para números divisibles por 5 (pero no por 3), imprime \"Buzz\".
  • \n
\n

Cuando tengas eso funcionando, modifica tu programa para imprimir \"FizzBuzz\"\npara los números que sean divisibles tanto por 3 como por 5 (y que siga\nimprimiendo \"Fizz\" o \"Buzz\" para números divisibles por sólo uno de ellos).

\n

2. Tablero de Ajedrez

\n

Crea un programa que cree un string que represente una cuadrícula de 8x8,\nusando el salto de línea como separador. En cada posición de la cuadrícula debe\nhaber un espacio o un carácter \"#\". Los caracteres deberían formar un tablero de\najedrez.

\n

Pasar ese string a console.log debería mostrar algo como esto:

\n
 # # # #\n# # # #\n # # # #\n# # # #\n # # # #\n# # # #\n # # # #\n# # # #\n
\n

Cuando tengas un programa que genere este patrón, define una variable size = 8\ny cambia el programa de tal manera que trabaje para cualquier tamaño, que sea\nproporcionado por un prompt() produciendo una cuadrícula del ancho y alto\ndado.

\n

Solucionarios

\n

A continuación, Michelle te explica cómo resolvió cada uno de los ejercicios\nanteriores.

\n

1. FizzBuzz: Solucionario

\n

\n

2. Tablero de Ajedrez: Solucionario

\n

" }, "pt": { "title": "Casos práticos", - "body": "

Objetivos

\n
    \n
  • Entender através de casos prácticos como aplicar os conceitos de estruturas condicionais e estruturas repetitivas para a resolução de problemas
  • \n
\n
\n

Enunciados

\n

Como fizemos antes, é hora de aplicar os conceitos aprendidos para resolver\nproblemas.

\n

1. FizzBuzz

\n

Escreva um programa que use console.log para imprimir todos os números de 1 a\n100, com duas exceções:

\n
    \n
  • Para números divisíveis por 3, imprima \"Fizz\" ao invés de número
  • \n
  • Para números divisíveis por 5 (mas não por 3), imprima \"Buzz\".
  • \n
\n

Quando isto esteja funcionando, modifique o seu programa para imprimir\n\"FizzBuzz\" para os números que sejam divisíveis tanto por 3 como por 5 (e que\ncontinue imprimindo \"Fizz\" ou \"Buzz\" para números divisíveis por somente um\ndeles).

\n

2. Tabuleiro de Xadrez

\n

Elabore um programa que crie um string que represente um quadrado de 8x8,\npulando uma linha como separador. Em cada posição do quadrado deve haver um\nespaço ou um caracter \"#\". Os caracteres devem formar um tabuleiro de xadrez.

\n

Passar este string a console.log deve mostrar algo assim:

\n
 # # # #\n# # # #\n # # # #\n# # # #\n # # # #\n# # # #\n # # # #\n# # # #\n
\n

Quando você tiver um programa que gere este padrão, defina uma variável size =\n8 e mude o programa de tal forma que trabalhe para qualquer tamanho, que seja\nproporcionado por um prompt() produzindo um quadrado com as medidas indicadas.

\n

Gabaritos

\n

A seguir, o Rafael irá te explicar como ele resolveu cada um dos exercícios\nanteriores.

\n

1. FizzBuzz: Gabarito

\n

\"FizzBuzz\"

\n

2. Tabuleiro de Xadrez: Gabarito

\n

\"Tabuleiro\"

" + "body": "

Objetivos

\n
    \n
  • Entender através de casos prácticos como aplicar os conceitos de estruturas condicionais e estruturas repetitivas para a resolução de problemas
  • \n
\n
\n

Enunciados

\n

Como fizemos antes, é hora de aplicar os conceitos aprendidos para resolver\nproblemas.

\n

1. FizzBuzz

\n

Escreva um programa que use console.log para imprimir todos os números de 1 a\n100, com duas exceções:

\n
    \n
  • Para números divisíveis por 3, imprima \"Fizz\" ao invés de número
  • \n
  • Para números divisíveis por 5 (mas não por 3), imprima \"Buzz\".
  • \n
\n

Quando isto esteja funcionando, modifique o seu programa para imprimir\n\"FizzBuzz\" para os números que sejam divisíveis tanto por 3 como por 5 (e que\ncontinue imprimindo \"Fizz\" ou \"Buzz\" para números divisíveis por somente um\ndeles).

\n

2. Tabuleiro de Xadrez

\n

Elabore um programa que crie um string que represente um quadrado de 8x8,\npulando uma linha como separador. Em cada posição do quadrado deve haver um\nespaço ou um caracter \"#\". Os caracteres devem formar um tabuleiro de xadrez.

\n

Passar este string a console.log deve mostrar algo assim:

\n
 # # # #\n# # # #\n # # # #\n# # # #\n # # # #\n# # # #\n # # # #\n# # # #\n
\n

Quando você tiver um programa que gere este padrão, defina uma variável size =\n8 e mude o programa de tal forma que trabalhe para qualquer tamanho, que seja\nproporcionado por um prompt() produzindo um quadrado com as medidas indicadas.

\n

Gabaritos

\n

A seguir, o Rafael irá te explicar como ele resolveu cada um dos exercícios\nanteriores.

\n

1. FizzBuzz: Gabarito

\n

\n

2. Tabuleiro de Xadrez: Gabarito

\n

" } } }, @@ -244,11 +244,11 @@ "intl": { "es": { "title": "Funciones", - "body": "

Objetivos

\n
    \n
  • Conocer el concepto de Don't Repeat Yourself (DRY)
  • \n
  • Entender qué son las funciones y cómo afectan el control de flujo de un\nprograma
  • \n
  • Conocer la estructura de las funciones en JavaScript
  • \n
  • Entender cómo pasarle argumentos a una función
  • \n
  • Entender el concepto de return de las funciones
  • \n
\n
\n

El texto a continuación se basa en gran medida, con ciertos ajustes, en los\ncapítulos 2 y 3 de Eloquent JavaScript,de Marijn\nHaverbeke, 2014. Traducción en Español\ndisponible gracias a hectorip, y del capítulo 8 de\nJavaScript for kids,\nNick Morgan, 2015;

\n

DRY

\n

En la programación existe un concepto que escucharás más de una vez. Dice así:\n\"Don't Repeat Yourself\", y es comunmente conocido como DRY. En español\nsignifica \"no te repitas\". Si estás copiando y pegando pedazos de código, o si\ntienes sentencias de código similares a lo largo de tu programa, significa que\nte estás repitiendo. Ya hemos visto este concepto en práctica con el uso de\nestructuras repetitivas (bucles): en lugar de tener un mismo bloque de código\nrepetido, puedes sustituirlo por un for o un while. Con las funciones puedes\nalcanzar el mismo objetivo. Veamos qué son las funciones, cómo usarlas y por\nqué son importantes.

\n

¿Qué es una función?

\n

Una función es una forma de agrupar código para que pueda ser reutilizado. Las\nfunciones nos permiten ejecutar la misma pieza de código en varios lugares de un\nprograma sin tener que copiar y pegar el código repetidamente. Dicho de otra\nmanera, una función es un pedazo de programa envuelto en un valor. Ese valor\npuede ser \"llamado\" varias veces, en diferentes lugares de tu programa, para que\nejecute el código que tiene dentro.

\n

A lo largo de este curso hemos venido utilizando funciones, solo que las venimos\nllamando \"comandos\". Los comandos como alert(), prompt() y console.log()\nson realmente funciones.

\n

Funciones en JavaScript

\n

Las funciones son el pan de cada día en la programación con JavaScript.

\n

La aplicación más obvia de las funciones es la de definir un nuevo vocabulario.\nCrear nuevas palabras en un lenguaje humano común (como el español o el inglés)\nes típicamente algo de mal gusto. Sin embargo, en la programación es\nindispensable.

\n

Un adulto promedio tiene unas 20,000 palabras en su vocabulario. Pocos lenguajes\nde programación tienen 20,000 comandos incorporados. Y el vocabulario que \nestá disponible tiende a ser definido de forma más precisa, y por ende menos\nflexible, que en un lenguaje humano. En consecuencia, usualmente tenemos que\nañadir algo de nuestro propio vocabulario para evitar repetirnos demasiado.

\n

Agrupando fragmentos de código en una función con un nombre fácil de\nentender (dado que será parte del vocabulario que estás construyendo) podemos\nestructurar mejor nuestro código. Esto porque nos enfocamos en organizar las\nfunciones, en lugar de cada línea de código que las componen. Al dividir nuestro\ncódigo en piezas más pequeñas - y por ende - más manejables, podemos tener una\nmirada más completa de lo que estamos haciendo. Nos permite elevarnos a un nivel\nsuperior de abstracción. Como dicen el refrán: podemos visualizar el bosque\ncompleto, viendo más allá de los árboles.

\n

Definiendo una función

\n

La definición de una función es simplemente una definición regular de una\nvariable, pero donde el valor dado a la variable es una función. Por ejemplo, el\nsiguiente código define la variable square para referirse a la función que\nproduce el cuadrado de un número dado:

\n
const square = function (num) {\n  return num * num;\n};\n
\n

La misma función usando la síntaxis de función flecha (arrow function):

\n
const square = num => num * num;\n
\n

Una función es creada por una expresión que empieza con el keyword function,\no alternativamente usando la síntaxis de función flecha. Las funciones tienen\nun conjunto de parámetros (en el ejemplo anterior solo tenemos un\nparámetro: num) y un cuerpo, que contiene las sentencias a ser ejecutadas.\nLos parámetros sirven para \"pasarle\" valores a la función y por ende, cambiar su\ncomportamiento según los valores brindados. Cuando declaramos una función usando\nel keyword function el cuerpo de la función tiene que estar siempre\nencerrado en llaves, incluso cuando consista de una sola instrucción (como en el\nejemplo previo), mientras que en las funciones flecha podemos hacer retorno\nimplícito cuando el cuerpo consta de solo una expresión (que será\nimplícitamente el valor de retorno).

\n

Llamando una función

\n

Para correr el código dentro de una función, necesitamos \"invocar, llamar, o\naplicar\" la función. Esto se hace escribiendo el nombre de la función\ninmediatamente seguido por unos paréntesis (). Dentro de los paréntesis se\nincluye lo que le quieres \"pasar\" a la función para usar como parámetro. Los\nvalores que se pasan a la función para usar como parámetros son llamados\nargumentos.

\n

Agregando al ejemplo anterior un llamado a la función square pasando como\nargumento el valor 12 vemos que nos devuelve 144 (es decir, 12 al cuadrado).

\n
const square = function (num) {\n  return num * num;\n};\n\nsquare(12);\n// → 144\n
\n

El valor de retorno

\n

Así como los argumentos son los valores de \"entrada\" (input) que utiliza una\nfunción al ser llamada, el valor de retorno es el valor de salida (output) que\ndevuelve la función (el 144 del ejemplo anterior), y que puede ser utilizado\nen cualquier lugar del programa. Si una función no especifica el valor de\nretorno, entonces, la función retorna undefined.

\n

El valor de retorno se especifica con el keyword return. En el ejemplo\nanterior, se especifica que el valor de retorno es el parámetro multiplicado por\nsí mismo; es decir, el parámetro al cuadrado. El keyword return sin una\nexpresión después de él, también hará que la función devuelva undefined.

\n

Agreguemos una sentencia adicional al ejemplo anterior en la que se utilice el\nvalor de retorno de la función square:

\n
const square = function (num) {\n  return num * num;\n};\n\nconsole.log('El cuadrado de 12 es ' + square(12));\n// → El cuadrado de 12 es 144\n
\n

Con esta modificación sucede lo siguiente: el valor de retorno que se obtiene al\nllamar (o invocar) la función square con el valor 12 de argumento es: 144.\nÉste se concatena con el texto 'El cuadrado de 12 es ' para formar\n'El cuadrado de 12 es 144'; lo cual, a su vez, se pasa como argumento a la\nfunción console.log para que lo imprima en la consola.

\n

Múltiples parámetros

\n

Una función puede tener varios parámetros o puede no tener ninguno. En el\nsiguiente ejemplo makeNoise no tiene parámetros, mientras que power tiene\ndos:

\n
const makeNoise = function () {\n  console.log('Pling!');\n};\n\nmakeNoise();\n// → Pling!\n\nconst power = function (base, exponent) {\n  let result = 1;\n  for (let count = 0; count < exponent; count++) {\n    result *= base;\n  }\n  return result;\n};\n\nconsole.log(power(2, 10));\n// → 1024\n
\n

A continuación Michelle te explica funciones con un ejemplo del libro JavaScript\nfor Kids.

\n

\"ejercicio

\n

Saliendo de una función con return

\n

Cuando el intérprete JavaScript se topa con un return dentro de una función,\ninmediatamente salta fuera de la función actual y pasa el valor retornado al\ncódigo que la llamó. Es decir, cualquier sentencia que coloquemos después\ndel return en una función, no será ejecutada.

\n

Una forma común de utilizar return es para salir de la función de manera\ntemprana si alguno de los argumentos brindados no son válidos; es decir, si no\nson el tipo de argumentos que la función necesita para funcionar correctamente.\nPor ejemplo, la siguiente función devuelve una cadena que indica el quinto\ncaracter de tu nombre. Si el nombre pasado a la función tiene menos de cinco\ncaracteres, la función utiliza return para dejar la función inmediatamente.\nEsto significa que la declaración de devolución al final, que te dice la quinta\nletra de tu nombre, nunca se ejecuta.

\n
const fifthLetter = function (name) {\n  if (name.length < 5) {\n    return;\n  }\n  return 'La quinta letra de tu nombre es ' + name[4] + '.';\n};\n
\n

Funciones y control de flujo

\n

Las funciones también afectan el control de flujo de nuestro programa. Con\nfunciones podemos crear estructuras repetitivas (con algo que se llama\nrecursividad) y estructuras condicionales (con, por ejemplo, múltiples valores\nde return). De hecho, las funciones son tan versátiles para armar la\nestructura de un programa que existe todo un paradigma de programación basado\nen funciones. Es decir, existe toda una manera de pensar en la programación\nbasada en funciones. Esto se llama el paradigma de programación funcional.\nMás adelante estudiaremos a mayor profundidad funciones y el paradigma de\nprogramación funcional. Por ahora, lo importante es entender que las funciones\nson una forma de agrupar código para que pueda ser reutilizado.

\n

Veamos un ejemplo de crear una estructura condicional con funciones:

\n

Utilizando múltiples return en lugar de if... else

\n

Podemos usar varios return dentro de diferentes sentencias if en el cuerpo\nde una función para que la función devuelva un valor diferente, dependiendo del\nargumento brindado. Por ejemplo, digamos que estás escribiendo un juego que\notorga medallas a los jugadores basándose en su puntuación. Una puntuación menor\na 3 es una medalla de bronce, una puntuación de 7 o más es oro, y lo que está en\nel medio es plata. Podrías utilizar una función como medalForScore para\nevaluar una puntuación y devolver el tipo de medalla, como se muestra aquí:

\n
const medalForScore = function (score) {\n  if (score < 3) {\n    return 'Bronze';\n  }\n  if (score < 7) {\n    return 'Silver';\n  }\n  return 'Gold';\n};\n
\n

Aunque estamos comprobando múltiples condiciones, no necesitamos usar sentencias\nif ... else encadenadas. Utilizamos las sentencias if ... else para\ngarantizar que sólo una de las sentencias se ejecute. Sin embargo, cuando cada\nuna de las opciones tiene su propia sentencia de return, garantizamos que se\nejecute sólo una de las opciones --- porque, recuerda, las funciones sólo\npueden devolver una vez.

" + "body": "

Objetivos

\n
    \n
  • Conocer el concepto de Don't Repeat Yourself (DRY)
  • \n
  • Entender qué son las funciones y cómo afectan el control de flujo de un\nprograma
  • \n
  • Conocer la estructura de las funciones en JavaScript
  • \n
  • Entender cómo pasarle argumentos a una función
  • \n
  • Entender el concepto de return de las funciones
  • \n
\n
\n

El texto a continuación se basa en gran medida, con ciertos ajustes, en los\ncapítulos 2 y 3 de Eloquent JavaScript,de Marijn\nHaverbeke, 2014. Traducción en Español\ndisponible gracias a hectorip, y del capítulo 8 de\nJavaScript for kids,\nNick Morgan, 2015;

\n

DRY

\n

En la programación existe un concepto que escucharás más de una vez. Dice así:\n\"Don't Repeat Yourself\", y es comunmente conocido como DRY. En español\nsignifica \"no te repitas\". Si estás copiando y pegando pedazos de código, o si\ntienes sentencias de código similares a lo largo de tu programa, significa que\nte estás repitiendo. Ya hemos visto este concepto en práctica con el uso de\nestructuras repetitivas (bucles): en lugar de tener un mismo bloque de código\nrepetido, puedes sustituirlo por un for o un while. Con las funciones puedes\nalcanzar el mismo objetivo. Veamos qué son las funciones, cómo usarlas y por\nqué son importantes.

\n

¿Qué es una función?

\n

Una función es una forma de agrupar código para que pueda ser reutilizado. Las\nfunciones nos permiten ejecutar la misma pieza de código en varios lugares de un\nprograma sin tener que copiar y pegar el código repetidamente. Dicho de otra\nmanera, una función es un pedazo de programa envuelto en un valor. Ese valor\npuede ser \"llamado\" varias veces, en diferentes lugares de tu programa, para que\nejecute el código que tiene dentro.

\n

A lo largo de este curso hemos venido utilizando funciones, solo que las venimos\nllamando \"comandos\". Los comandos como alert(), prompt() y console.log()\nson realmente funciones.

\n

Funciones en JavaScript

\n

Las funciones son el pan de cada día en la programación con JavaScript.

\n

La aplicación más obvia de las funciones es la de definir un nuevo vocabulario.\nCrear nuevas palabras en un lenguaje humano común (como el español o el inglés)\nes típicamente algo de mal gusto. Sin embargo, en la programación es\nindispensable.

\n

Un adulto promedio tiene unas 20,000 palabras en su vocabulario. Pocos lenguajes\nde programación tienen 20,000 comandos incorporados. Y el vocabulario que \nestá disponible tiende a ser definido de forma más precisa, y por ende menos\nflexible, que en un lenguaje humano. En consecuencia, usualmente tenemos que\nañadir algo de nuestro propio vocabulario para evitar repetirnos demasiado.

\n

Agrupando fragmentos de código en una función con un nombre fácil de\nentender (dado que será parte del vocabulario que estás construyendo) podemos\nestructurar mejor nuestro código. Esto porque nos enfocamos en organizar las\nfunciones, en lugar de cada línea de código que las componen. Al dividir nuestro\ncódigo en piezas más pequeñas - y por ende - más manejables, podemos tener una\nmirada más completa de lo que estamos haciendo. Nos permite elevarnos a un nivel\nsuperior de abstracción. Como dicen el refrán: podemos visualizar el bosque\ncompleto, viendo más allá de los árboles.

\n

Definiendo una función

\n

La definición de una función es simplemente una definición regular de una\nvariable, pero donde el valor dado a la variable es una función. Por ejemplo, el\nsiguiente código define la variable square para referirse a la función que\nproduce el cuadrado de un número dado:

\n
const square = function (num) {\n  return num * num;\n};\n
\n

La misma función usando la síntaxis de función flecha (arrow function):

\n
const square = num => num * num;\n
\n

Una función es creada por una expresión que empieza con el keyword function,\no alternativamente usando la síntaxis de función flecha. Las funciones tienen\nun conjunto de parámetros (en el ejemplo anterior solo tenemos un\nparámetro: num) y un cuerpo, que contiene las sentencias a ser ejecutadas.\nLos parámetros sirven para \"pasarle\" valores a la función y por ende, cambiar su\ncomportamiento según los valores brindados. Cuando declaramos una función usando\nel keyword function el cuerpo de la función tiene que estar siempre\nencerrado en llaves, incluso cuando consista de una sola instrucción (como en el\nejemplo previo), mientras que en las funciones flecha podemos hacer retorno\nimplícito cuando el cuerpo consta de solo una expresión (que será\nimplícitamente el valor de retorno).

\n

Llamando una función

\n

Para correr el código dentro de una función, necesitamos \"invocar, llamar, o\naplicar\" la función. Esto se hace escribiendo el nombre de la función\ninmediatamente seguido por unos paréntesis (). Dentro de los paréntesis se\nincluye lo que le quieres \"pasar\" a la función para usar como parámetro. Los\nvalores que se pasan a la función para usar como parámetros son llamados\nargumentos.

\n

Agregando al ejemplo anterior un llamado a la función square pasando como\nargumento el valor 12 vemos que nos devuelve 144 (es decir, 12 al cuadrado).

\n
const square = function (num) {\n  return num * num;\n};\n\nsquare(12);\n// → 144\n
\n

El valor de retorno

\n

Así como los argumentos son los valores de \"entrada\" (input) que utiliza una\nfunción al ser llamada, el valor de retorno es el valor de salida (output) que\ndevuelve la función (el 144 del ejemplo anterior), y que puede ser utilizado\nen cualquier lugar del programa. Si una función no especifica el valor de\nretorno, entonces, la función retorna undefined.

\n

El valor de retorno se especifica con el keyword return. En el ejemplo\nanterior, se especifica que el valor de retorno es el parámetro multiplicado por\nsí mismo; es decir, el parámetro al cuadrado. El keyword return sin una\nexpresión después de él, también hará que la función devuelva undefined.

\n

Agreguemos una sentencia adicional al ejemplo anterior en la que se utilice el\nvalor de retorno de la función square:

\n
const square = function (num) {\n  return num * num;\n};\n\nconsole.log('El cuadrado de 12 es ' + square(12));\n// → El cuadrado de 12 es 144\n
\n

Con esta modificación sucede lo siguiente: el valor de retorno que se obtiene al\nllamar (o invocar) la función square con el valor 12 de argumento es: 144.\nÉste se concatena con el texto 'El cuadrado de 12 es ' para formar\n'El cuadrado de 12 es 144'; lo cual, a su vez, se pasa como argumento a la\nfunción console.log para que lo imprima en la consola.

\n

Múltiples parámetros

\n

Una función puede tener varios parámetros o puede no tener ninguno. En el\nsiguiente ejemplo makeNoise no tiene parámetros, mientras que power tiene\ndos:

\n
const makeNoise = function () {\n  console.log('Pling!');\n};\n\nmakeNoise();\n// → Pling!\n\nconst power = function (base, exponent) {\n  let result = 1;\n  for (let count = 0; count < exponent; count++) {\n    result *= base;\n  }\n  return result;\n};\n\nconsole.log(power(2, 10));\n// → 1024\n
\n

A continuación Michelle te explica funciones con un ejemplo del libro JavaScript\nfor Kids.

\n

\n

Saliendo de una función con return

\n

Cuando el intérprete JavaScript se topa con un return dentro de una función,\ninmediatamente salta fuera de la función actual y pasa el valor retornado al\ncódigo que la llamó. Es decir, cualquier sentencia que coloquemos después\ndel return en una función, no será ejecutada.

\n

Una forma común de utilizar return es para salir de la función de manera\ntemprana si alguno de los argumentos brindados no son válidos; es decir, si no\nson el tipo de argumentos que la función necesita para funcionar correctamente.\nPor ejemplo, la siguiente función devuelve una cadena que indica el quinto\ncaracter de tu nombre. Si el nombre pasado a la función tiene menos de cinco\ncaracteres, la función utiliza return para dejar la función inmediatamente.\nEsto significa que la declaración de devolución al final, que te dice la quinta\nletra de tu nombre, nunca se ejecuta.

\n
const fifthLetter = function (name) {\n  if (name.length < 5) {\n    return;\n  }\n  return 'La quinta letra de tu nombre es ' + name[4] + '.';\n};\n
\n

Funciones y control de flujo

\n

Las funciones también afectan el control de flujo de nuestro programa. Con\nfunciones podemos crear estructuras repetitivas (con algo que se llama\nrecursividad) y estructuras condicionales (con, por ejemplo, múltiples valores\nde return). De hecho, las funciones son tan versátiles para armar la\nestructura de un programa que existe todo un paradigma de programación basado\nen funciones. Es decir, existe toda una manera de pensar en la programación\nbasada en funciones. Esto se llama el paradigma de programación funcional.\nMás adelante estudiaremos a mayor profundidad funciones y el paradigma de\nprogramación funcional. Por ahora, lo importante es entender que las funciones\nson una forma de agrupar código para que pueda ser reutilizado.

\n

Veamos un ejemplo de crear una estructura condicional con funciones:

\n

Utilizando múltiples return en lugar de if... else

\n

Podemos usar varios return dentro de diferentes sentencias if en el cuerpo\nde una función para que la función devuelva un valor diferente, dependiendo del\nargumento brindado. Por ejemplo, digamos que estás escribiendo un juego que\notorga medallas a los jugadores basándose en su puntuación. Una puntuación menor\na 3 es una medalla de bronce, una puntuación de 7 o más es oro, y lo que está en\nel medio es plata. Podrías utilizar una función como medalForScore para\nevaluar una puntuación y devolver el tipo de medalla, como se muestra aquí:

\n
const medalForScore = function (score) {\n  if (score < 3) {\n    return 'Bronze';\n  }\n  if (score < 7) {\n    return 'Silver';\n  }\n  return 'Gold';\n};\n
\n

Aunque estamos comprobando múltiples condiciones, no necesitamos usar sentencias\nif ... else encadenadas. Utilizamos las sentencias if ... else para\ngarantizar que sólo una de las sentencias se ejecute. Sin embargo, cuando cada\nuna de las opciones tiene su propia sentencia de return, garantizamos que se\nejecute sólo una de las opciones --- porque, recuerda, las funciones sólo\npueden devolver una vez.

" }, "pt": { "title": "Funções", - "body": "

Objetivos

\n
    \n
  • Conhecer o conceito de Don't Repeat Yourself (DRY)
  • \n
  • Entender o que são as funções e como afetam o controle de fluxo de um programa
  • \n
  • Conhecer a estrutura das funções em JavaScript
  • \n
  • Entender como transmitir argumentos a uma função
  • \n
  • Entender o conceito de return das funções
  • \n
\n
\n

O texto a seguir se baseia em grande medida, com alguns ajustes, ao capítulo 2 e\n3do Eloquent JavaScript,de Marijn Haverbeke,\n2014. Tradução em\nPortuguês.

\n

DRY

\n

Na programação, existe um conceito que você escutará mais de uma vez. Ele diz o\nseguinte: \"Don't Repeat Yourself\", e é comumente conhecido como DRY. Em\nportuguês significa \"não se repita\". Se você estiver copiando e colando\npedaços de código, ou se tiver sentenças de código similares ao longo do seu\nprograma, significa que você está se repetindo. Já vimos este conceito em\nprática com o uso de estruturas repetitivas (loop): ao invés de ter um mesmo\nbloco de código repetido, você pode sustituí-lo por um for ou um while. Com\nas funções você pode alcançar o mesmo objetivo. Vejamos quais são as funções,\ncomo usá-las e por que são importantes.

\n

O que é uma função?

\n

Uma função é uma forma de agrupar código para que ele possa ser reutilizado. As\nfunções nos permitem executar a mesma peça de código em vários lugares de um\nprograma sem ter que copiar e colar o código repetidamente. Dito de outra\nmaneira, uma função é um pedaço de programa embrulhado em um valor. Esse\nvalor pode ser \"chamado\" várias vezes, em diferentes lugares do teu programa,\npara que execute o código que está ali dentro.

\n

Ao longo deste curso temos utilizado funções, porém temos chamado de\n\"comandos\". Os comandos como alert(), prompt() e console.log() são de\nfato funções.

\n

Funções em JavaScript

\n

As funções são o pão de cada dia na programação com JavaScript.

\n

A aplicação mais óbvia das funções é a de definir um novo vocabulário. Criar\nnovas palavras em uma linguagem humana comum (como o português, inglês ou o\nespanhol) é tipicamente algo de mal gosto. Contudo, na programação isto é\nindispensável.

\n

Um adulto médio possui umas 20.000 palavras em seu vocabulário. Poucas\nlinguagens de programação possuem 20.000 comandos incorporados. E o vocabulário\nque está disponível na programação tende a ser definido de forma mais precisa, e\nportanto menos flexível que em uma linguagem humana. Como consequência,\nusualmente precisamos agregar algo do nosso próprio vocabulário para evitar\nmuitas repetições.

\n

Agrupando fragmentos de código em uma função com um nome fácil de entender\n(dado que será parte do vocabulário que você está construindo) podemos\nestruturar melhor nosso código. Isto porque nos enfocamos em organizar as\nfunções, ao invés de cada linha de código que as compõem. Ao dividir nosso\ncódigo em peças menores e portanto mais fáceis de lidar, podemos ter uma visão\nmais completa do que estamos fazendo. Nos permite elevar-nos a um nível superior\nde abstração. Como diz o ditado: podemos visualizar a floresta completa, vendo\nalém das árvores.

\n

Definindo uma função

\n

A definição de uma função é simplesmente uma definição regular de uma variável,\nmas onde o valor dado à variável é uma função. Por exemplo, o código a seguir\ndefine a variável square para se referir à função que produz o quadrado de\num número dado:

\n
const square = function (num) {\n  return num * num;\n};\n
\n

A mesma função usando a sintaxe de função flecha (arrow function):

\n
const square = num => num * num;\n
\n

Uma função é criada por uma expressão que começa com o keyword function, ou\npode ser usando a sintaxe de arrow function. As funções possuem um conjunto de\nparâmetros (no exemplo anterior só temos um parâmetro: num) e um\ncorpo, que contêm as sentenças a serem executadas. Os parâmetros servem para\n\"transmitir\" valores à função e, assim, mudar seu comportamento segundo os\nvalores oferecidos. O corpo da função, usando a keyword function, precisa\nestar sempre fechado em chaves, inclusive quando houver uma única instrução\n(como no exemplo anterior), enquanto funções usando arrow function podemos\nfazer o retorno implícito quando o corpo possui apenas uma expressão. (que será\nimplícitamente o valor do retorno).

\n

Chamando uma função

\n

Para rodar o código dentro de uma função, necessitamos \"invocar, chamar, ou\naplicar\" a função. Isto se faz escrevendo o nome da função imediatamente\nseguido por parênteses (). Dentro dos parênteses se inclui o que você quer\n\"transmitir\" à função para usar como parâmetro. Os valores que se transmitem à\nfunção para usar como parâmetros são chamados argumentos.

\n

Agregando ao exemplo anterior um chamado à função square transmitindo-lhe como\nargumento o valor 12 vemos que nos devolve 144 (ou seja, 12 ao quadrado).

\n
const square = function (num) {\n  return num * num;\n};\n\nsquare(12);\n// → 144\n
\n

O valor de retorno

\n

Assim como os argumentos são os valores de \"entrada\" (input) que utiliza uma\nfunção ao ser chamada, o valor de retorno é o valor de saída (output) que\ndevolve a função (o 144 do exemplo anterior), e que pode ser utilizado em\nqualquer lugar do programa. Se uma função não especifica o valor de retorno,\nentão a função retorna undefined.

\n

O valor de retorno se especifica com o keyword return. No exemplo anterior,\nse especifica que o valor de retorno é o parâmetro multiplicado por si mesmo;\nisto é, o parâmetro ao quadrado. O keyword return sem uma expressão depois\ndele também fará com que a função devolva undefined.

\n

Adicionemos uma outra sentença ao exemplo anterior na qual se utilize o valor de\nretorno da função square:

\n
const square = function (num) {\n  return num * num;\n};\n\nconsole.log('El cuadrado de 12 es ' + square(12));\n// → El cuadrado de 12 es 144\n
\n

Com esta mudança acontece o seguinte: o valor de retorno que se obtém ao chamar\n(ou invocar) a função square com o valor 12 de argumento é: 144. Este se\nconcatena com o texto 'O quadrado de 12 é ' para formar 'O quadrado de 12 é 144'; o qual, por sua vez, se transmite como argumento à função console.log\npara que o imprima no painel de comando.

\n

Múltiplos parâmetros

\n

Uma função pode ter vários parâmetros ou pode não ter nenhum. No seguinte\nexemplo, makeNoise não tem parâmetros, enquanto power tem dois:

\n
const makeNoise = function () {\n  console.log('Pling!');\n};\n\nmakeNoise();\n// → Pling!\n\nconst power = function (base, exponent) {\n  let result = 1;\n  for (let count = 0; count < exponent; count++) {\n    result *= base;\n  }\n  return result;\n};\n\nconsole.log(power(2, 10));\n// → 1024\n
\n

A seguir Daniel te explica mais sobre funções:\n\"Funções\"

\n

Saindo de uma função com return

\n

Quando o intérprete JavaScript observa um return dentro de uma função,\nimediatamente pula fora da função atual e passa o valor retornado ao código que\na chamou. Isto é, qualquer sentença que coloquemos depois do return em uma\nfunção, não será executada.

\n

Uma forma comum de utilizar return é para sair da função antecipadamente caso\nalgum dos argumentos brindados não seja válido; isto é, se não forem o tipo de\nargumentos que a função necessita para funcionar corretamente. Por exemplo, a\nseguinte função devolve uma cadeia que indica o quinto caracter do seu nome. Se\no nome transmitido à função tem menos de cinco caracteres, a função utiliza\nreturn para deixar a função imediatamente. Isto significa que a declaração de\ndevolução ao final, que te diz a quinta letra do seu nome, nunca se executa.

\n
const fifthLetter = function (name) {\n  if (name.length < 5) {\n    return;\n  }\n  return 'A quinta letra do seu nome é' + name[4] + '.';\n};\n
\n

Funções e controle de fluxo

\n

A funções também afetam o controle de fluxo do nosso programa. Com funções\npodemos criar estruturas repetitivas (com algo que se chama recursividade) e\nestruturas condicionais (com, por exemplo, múltiplos valores de return). De\nfato, as funções são tão versáteis para armar a estrutura de um programa que\nexiste todo um paradigma de programação baseado em funções. Isto é, existe uma\nmaneira de pensar na programação que está baseada em funções. Isto se chama o\nparadigma de programação funcional. Mais adiante estudaremos com mais\nprofundidade funções e o paradigma de programação funcional. Por enquanto, o\nimportante é entender que as funções são uma forma de agrupar código para que\npossa ser reutilizado.

\n

Utilizando múltiplos return no lugar de if... else

\n

Podemos usar vários return dentro de diferentes sentenças if no corpo de uma\nfunção para que a função devolva um valor diferente, dependendo do argumento\noferecido. Por exemplo, digamos que você está escrevendo um jogo que dá medalhas\naos jogadores conforme a sua pontuação. Uma pontuação menor a 3 é uma medalha de\nbronze, uma pontuação de 7 ou mais é ouro, e o que está no meio é prata. Você\npoderia utilizar uma função como medalForScore para avaliar uma pontuação e\ndar o tipo de medalha, como se mostra aqui:

\n
const medalForScore = function (score) {\n  if (score < 3) {\n    return 'Bronze';\n  }\n  if (score < 7) {\n    return 'Silver';\n  }\n  return 'Gold';\n};\n
\n

Embora estejamos comprovando múltiplas condições, não necessitamos usar\nsentenças if ... else encadeadas. Utilizamos as sentenças if ... else para\ngarantir que somente uma das sentenças se execute. Quando cada uma das opções\npossui sua própria sentença de return, garantimos que se execute somente uma\ndas opções --- porque, lembre-se, as funções só podem devolver uma vez.

" + "body": "

Objetivos

\n
    \n
  • Conhecer o conceito de Don't Repeat Yourself (DRY)
  • \n
  • Entender o que são as funções e como afetam o controle de fluxo de um programa
  • \n
  • Conhecer a estrutura das funções em JavaScript
  • \n
  • Entender como transmitir argumentos a uma função
  • \n
  • Entender o conceito de return das funções
  • \n
\n
\n

O texto a seguir se baseia em grande medida, com alguns ajustes, ao capítulo 2 e\n3do Eloquent JavaScript,de Marijn Haverbeke,\n2014. Tradução em\nPortuguês.

\n

DRY

\n

Na programação, existe um conceito que você escutará mais de uma vez. Ele diz o\nseguinte: \"Don't Repeat Yourself\", e é comumente conhecido como DRY. Em\nportuguês significa \"não se repita\". Se você estiver copiando e colando\npedaços de código, ou se tiver sentenças de código similares ao longo do seu\nprograma, significa que você está se repetindo. Já vimos este conceito em\nprática com o uso de estruturas repetitivas (loop): ao invés de ter um mesmo\nbloco de código repetido, você pode sustituí-lo por um for ou um while. Com\nas funções você pode alcançar o mesmo objetivo. Vejamos quais são as funções,\ncomo usá-las e por que são importantes.

\n

O que é uma função?

\n

Uma função é uma forma de agrupar código para que ele possa ser reutilizado. As\nfunções nos permitem executar a mesma peça de código em vários lugares de um\nprograma sem ter que copiar e colar o código repetidamente. Dito de outra\nmaneira, uma função é um pedaço de programa embrulhado em um valor. Esse\nvalor pode ser \"chamado\" várias vezes, em diferentes lugares do teu programa,\npara que execute o código que está ali dentro.

\n

Ao longo deste curso temos utilizado funções, porém temos chamado de\n\"comandos\". Os comandos como alert(), prompt() e console.log() são de\nfato funções.

\n

Funções em JavaScript

\n

As funções são o pão de cada dia na programação com JavaScript.

\n

A aplicação mais óbvia das funções é a de definir um novo vocabulário. Criar\nnovas palavras em uma linguagem humana comum (como o português, inglês ou o\nespanhol) é tipicamente algo de mal gosto. Contudo, na programação isto é\nindispensável.

\n

Um adulto médio possui umas 20.000 palavras em seu vocabulário. Poucas\nlinguagens de programação possuem 20.000 comandos incorporados. E o vocabulário\nque está disponível na programação tende a ser definido de forma mais precisa, e\nportanto menos flexível que em uma linguagem humana. Como consequência,\nusualmente precisamos agregar algo do nosso próprio vocabulário para evitar\nmuitas repetições.

\n

Agrupando fragmentos de código em uma função com um nome fácil de entender\n(dado que será parte do vocabulário que você está construindo) podemos\nestruturar melhor nosso código. Isto porque nos enfocamos em organizar as\nfunções, ao invés de cada linha de código que as compõem. Ao dividir nosso\ncódigo em peças menores e portanto mais fáceis de lidar, podemos ter uma visão\nmais completa do que estamos fazendo. Nos permite elevar-nos a um nível superior\nde abstração. Como diz o ditado: podemos visualizar a floresta completa, vendo\nalém das árvores.

\n

Definindo uma função

\n

A definição de uma função é simplesmente uma definição regular de uma variável,\nmas onde o valor dado à variável é uma função. Por exemplo, o código a seguir\ndefine a variável square para se referir à função que produz o quadrado de\num número dado:

\n
const square = function (num) {\n  return num * num;\n};\n
\n

A mesma função usando a sintaxe de função flecha (arrow function):

\n
const square = num => num * num;\n
\n

Uma função é criada por uma expressão que começa com o keyword function, ou\npode ser usando a sintaxe de arrow function. As funções possuem um conjunto de\nparâmetros (no exemplo anterior só temos um parâmetro: num) e um\ncorpo, que contêm as sentenças a serem executadas. Os parâmetros servem para\n\"transmitir\" valores à função e, assim, mudar seu comportamento segundo os\nvalores oferecidos. O corpo da função, usando a keyword function, precisa\nestar sempre fechado em chaves, inclusive quando houver uma única instrução\n(como no exemplo anterior), enquanto funções usando arrow function podemos\nfazer o retorno implícito quando o corpo possui apenas uma expressão. (que será\nimplícitamente o valor do retorno).

\n

Chamando uma função

\n

Para rodar o código dentro de uma função, necessitamos \"invocar, chamar, ou\naplicar\" a função. Isto se faz escrevendo o nome da função imediatamente\nseguido por parênteses (). Dentro dos parênteses se inclui o que você quer\n\"transmitir\" à função para usar como parâmetro. Os valores que se transmitem à\nfunção para usar como parâmetros são chamados argumentos.

\n

Agregando ao exemplo anterior um chamado à função square transmitindo-lhe como\nargumento o valor 12 vemos que nos devolve 144 (ou seja, 12 ao quadrado).

\n
const square = function (num) {\n  return num * num;\n};\n\nsquare(12);\n// → 144\n
\n

O valor de retorno

\n

Assim como os argumentos são os valores de \"entrada\" (input) que utiliza uma\nfunção ao ser chamada, o valor de retorno é o valor de saída (output) que\ndevolve a função (o 144 do exemplo anterior), e que pode ser utilizado em\nqualquer lugar do programa. Se uma função não especifica o valor de retorno,\nentão a função retorna undefined.

\n

O valor de retorno se especifica com o keyword return. No exemplo anterior,\nse especifica que o valor de retorno é o parâmetro multiplicado por si mesmo;\nisto é, o parâmetro ao quadrado. O keyword return sem uma expressão depois\ndele também fará com que a função devolva undefined.

\n

Adicionemos uma outra sentença ao exemplo anterior na qual se utilize o valor de\nretorno da função square:

\n
const square = function (num) {\n  return num * num;\n};\n\nconsole.log('El cuadrado de 12 es ' + square(12));\n// → El cuadrado de 12 es 144\n
\n

Com esta mudança acontece o seguinte: o valor de retorno que se obtém ao chamar\n(ou invocar) a função square com o valor 12 de argumento é: 144. Este se\nconcatena com o texto 'O quadrado de 12 é ' para formar 'O quadrado de 12 é 144'; o qual, por sua vez, se transmite como argumento à função console.log\npara que o imprima no painel de comando.

\n

Múltiplos parâmetros

\n

Uma função pode ter vários parâmetros ou pode não ter nenhum. No seguinte\nexemplo, makeNoise não tem parâmetros, enquanto power tem dois:

\n
const makeNoise = function () {\n  console.log('Pling!');\n};\n\nmakeNoise();\n// → Pling!\n\nconst power = function (base, exponent) {\n  let result = 1;\n  for (let count = 0; count < exponent; count++) {\n    result *= base;\n  }\n  return result;\n};\n\nconsole.log(power(2, 10));\n// → 1024\n
\n

A seguir Daniel te explica mais sobre funções:\n

\n

Saindo de uma função com return

\n

Quando o intérprete JavaScript observa um return dentro de uma função,\nimediatamente pula fora da função atual e passa o valor retornado ao código que\na chamou. Isto é, qualquer sentença que coloquemos depois do return em uma\nfunção, não será executada.

\n

Uma forma comum de utilizar return é para sair da função antecipadamente caso\nalgum dos argumentos brindados não seja válido; isto é, se não forem o tipo de\nargumentos que a função necessita para funcionar corretamente. Por exemplo, a\nseguinte função devolve uma cadeia que indica o quinto caracter do seu nome. Se\no nome transmitido à função tem menos de cinco caracteres, a função utiliza\nreturn para deixar a função imediatamente. Isto significa que a declaração de\ndevolução ao final, que te diz a quinta letra do seu nome, nunca se executa.

\n
const fifthLetter = function (name) {\n  if (name.length < 5) {\n    return;\n  }\n  return 'A quinta letra do seu nome é' + name[4] + '.';\n};\n
\n

Funções e controle de fluxo

\n

A funções também afetam o controle de fluxo do nosso programa. Com funções\npodemos criar estruturas repetitivas (com algo que se chama recursividade) e\nestruturas condicionais (com, por exemplo, múltiplos valores de return). De\nfato, as funções são tão versáteis para armar a estrutura de um programa que\nexiste todo um paradigma de programação baseado em funções. Isto é, existe uma\nmaneira de pensar na programação que está baseada em funções. Isto se chama o\nparadigma de programação funcional. Mais adiante estudaremos com mais\nprofundidade funções e o paradigma de programação funcional. Por enquanto, o\nimportante é entender que as funções são uma forma de agrupar código para que\npossa ser reutilizado.

\n

Utilizando múltiplos return no lugar de if... else

\n

Podemos usar vários return dentro de diferentes sentenças if no corpo de uma\nfunção para que a função devolva um valor diferente, dependendo do argumento\noferecido. Por exemplo, digamos que você está escrevendo um jogo que dá medalhas\naos jogadores conforme a sua pontuação. Uma pontuação menor a 3 é uma medalha de\nbronze, uma pontuação de 7 ou mais é ouro, e o que está no meio é prata. Você\npoderia utilizar uma função como medalForScore para avaliar uma pontuação e\ndar o tipo de medalha, como se mostra aqui:

\n
const medalForScore = function (score) {\n  if (score < 3) {\n    return 'Bronze';\n  }\n  if (score < 7) {\n    return 'Silver';\n  }\n  return 'Gold';\n};\n
\n

Embora estejamos comprovando múltiplas condições, não necessitamos usar\nsentenças if ... else encadeadas. Utilizamos as sentenças if ... else para\ngarantir que somente uma das sentenças se execute. Quando cada uma das opções\npossui sua própria sentença de return, garantimos que se execute somente uma\ndas opções --- porque, lembre-se, as funções só podem devolver uma vez.

" } } }, @@ -289,7 +289,7 @@ "slug": "power-of-two", "prefix": "01", "path": "topics/javascript/02-flow-control/06-code-challenges/01-power-of-two", - "createdAt": "2023-04-04T20:28:37.785Z", + "createdAt": "2023-05-17T20:37:28.370Z", "env": "cjs", "intl": { "es": { @@ -313,7 +313,7 @@ "slug": "reverse", "prefix": "02", "path": "topics/javascript/02-flow-control/06-code-challenges/02-reverse", - "createdAt": "2023-04-04T20:28:37.786Z", + "createdAt": "2023-05-17T20:37:28.370Z", "env": "cjs", "intl": { "es": { @@ -336,7 +336,7 @@ "slug": "count-vowels", "prefix": "03", "path": "topics/javascript/02-flow-control/06-code-challenges/03-count-vowels", - "createdAt": "2023-04-04T20:28:37.785Z", + "createdAt": "2023-05-17T20:37:28.370Z", "env": "cjs", "intl": { "es": { @@ -359,7 +359,7 @@ "slug": "even-or-odd", "prefix": "04", "path": "topics/javascript/02-flow-control/06-code-challenges/04-even-or-odd", - "createdAt": "2023-04-04T20:28:37.785Z", + "createdAt": "2023-05-17T20:37:28.370Z", "env": "cjs", "intl": { "es": { @@ -382,7 +382,7 @@ "slug": "max", "prefix": "05", "path": "topics/javascript/02-flow-control/06-code-challenges/05-max", - "createdAt": "2023-04-04T20:28:37.785Z", + "createdAt": "2023-05-17T20:37:28.370Z", "env": "cjs", "intl": { "es": { @@ -405,7 +405,7 @@ "slug": "is-prime", "prefix": "06", "path": "topics/javascript/02-flow-control/06-code-challenges/06-is-prime", - "createdAt": "2023-04-04T20:28:37.785Z", + "createdAt": "2023-05-17T20:37:28.370Z", "env": "cjs", "intl": { "es": { @@ -428,7 +428,7 @@ "slug": "can-drive-and-vote", "prefix": "07", "path": "topics/javascript/02-flow-control/06-code-challenges/07-can-drive-and-vote", - "createdAt": "2023-04-04T20:28:37.786Z", + "createdAt": "2023-05-17T20:37:28.370Z", "env": "cjs", "intl": { "es": { @@ -451,7 +451,7 @@ "slug": "are-odd", "prefix": "08", "path": "topics/javascript/02-flow-control/06-code-challenges/08-are-odd", - "createdAt": "2023-04-04T20:28:37.785Z", + "createdAt": "2023-05-17T20:37:28.370Z", "env": "cjs", "intl": { "es": { @@ -572,11 +572,11 @@ "intl": { "es": { "title": "Arreglos", - "body": "

Objetivos de Aprendizaje

\n
    \n
  • Aprender qué son arrays y para qué sirven
  • \n
  • Aprender a crear, acceder y modificar la información de un array
  • \n
\n
\n

El texto a continuación se basa en gran medida, con ciertos ajustes, en el\ncapítulo 4 de Eloquent JavaScript, de Marijn\nHaverbeke, 2014. Traducción en Español\ndisponible gracias a hectorip, y del capítulo 3\nde JavaScript for kids,\nNick Morgan, 2015.

\n
\n

Agrupando y manipulando data

\n

Como hemos visto, gran parte de la programación consiste en agrupar y manipular\ndata. Esto nos permite transformar datos en información y utilizar esa información\npara resolver problemas. Hasta ahora hemos podido agrupar y manipular data haciendo\nuso de tipos de datos simples como: numbers,booleans y strings. Sobre ellos\nhemos creado una serie de programas sencillos. También hemos aprendido a modificar\nel control de flujo de estos programas, por medio de estructuras repetitivas,\nestructuras condicionales y funciones, lo cual nos ha permitido crear productos\nun poco más complejos. Sin embargo, nuestros programas han estado seriamente limitados\ndebido a que operan únicamente con tipos de datos simples. Para resolver problemas\nmás complejos necesitamos poder agrupar y manipular data de una manera más interesante.\nAfortunadamente, un entorno JavaScript nos permite lograr esto brindándonos arrays\ny objects.

\n

¿Por qué necesitamos arrays?

\n

Digamos, por poner un ejemplo, que queremos representar una colección de\nnúmeros: 2, 3, 5, 7 y 11.

\n

Una opción para representar esto sería:

\n
const firstNumber = 2;\nconst secondNumber = 3;\nconst thirdNumber = 5;\nconst fourthNumber = 7;\n\n
\n

Esta lista es bien extraña y engorrosa. Implica tener una variable para cada\nelemento de nuestra lista. Cuando en realidad sólo deberíamos tener una sola\nvariable que \"contenga\" a cada una.¡Imagina que luego quieres tener una lista\nde 1,000 elementos!

\n

Otra opción -más creativa- sería utilizar un string. Después de todo, los\nstrings pueden ser de cualquier longitud, así que podemos poner mucha información\nen ellos. Podríamos usar un string con los números intercalados por un\nespacio, así:

\n
const listOfNumbers = '2 3 5 7 11';\n
\n

Sin embargo, esto también resulta engorroso. Tendríamos que buscar la manera de\nextraer cada elemento del string (contando los espacios entre ellos) y además,\ntendríamos que convertirlos de vuelta a number para acceder y manipular cada\nnúmero de manera individual.

\n

Afortunadamente, Javascript proporciona un tipo de dato específico para almacenar\nsecuencias de valores. Se llama array (arreglo en español) y se escribe como una\nlista de valores entre corchetes, separados por comas.

\n
const listOfNumbers = [2, 3, 5, 7, 11];\n\n
\n

Los arrays son tremendamente útiles para agrupar y manipular data. Es como\ncuando vamos al mercado y tenemos nuestra \"lista de compras\". Podríamos tener\nuna hoja de papel para cada artículo que queremos comprar. Por ejemplo, podríamos\ntener una hoja de papel que dice \"huevos\", otra hoja que dice \"pan\", y otra hoja\nque dice \"naranjas\". Sin embargo, la mayoría de la gente escribe la lista completa\nde cosas a comprar en una sola hoja de papel.

\n

Accediendo información de un array

\n

Antes de comenzar, vamos a generar una pequeña función utilitaria,\nque nos permita decir si dos string son iguales. La colocaremos\nen el prototype de Array.

\n
const equal = (one, other) => JSON.stringify(one) === JSON.stringify(other);\n\nconsole.assert(equal([1, 2, 3], [1, 2, 3]));\nconsole.assert(!equal([1, 2, 3], ['a', 'b', 'c']));\nconsole.assert(!equal([1, 2, 3], [3, 2, 1]));\n\n
\n

Para obtener un elemento dentro de un array, se utiliza la notación con corchetes,\ncon el index (índice en español) del elemento que se desea. Veamos un ejemplo:

\n
listOfNumbers = [2, 3, 5, 7, 11];\n\nconsole.assert(listOfNumbers[1] === 3);\nconsole.assert(listOfNumbers[1 - 1] === 2);\n\n
\n

El index es el número que corresponde a (o que coincide con) el punto del array\ndonde se almacena el valor. Al igual que con los strings, el primer elemento\nde un array está en el index 0, el segundo está en el index 1, el tercero\nen el index 2, y así sucesivamente. Es por eso que pedir index 1 - 1\n(es decir, 0) del array anterior devuelve el número 2.

\n

\"image\"

\n

Si no tienes antecedentes en programación, acostumbrarte a esta convención puede\ntomarte algún tiempo. Pero el conteo con base cero tiene una larga tradición en\ntecnología y mientras la convención se siga de manera consistente (que se ha hecho\nen Javascript), funciona bien.

\n

Definiendo o cambiando los elementos de un array

\n

Podemos utilizar los indexes entre corchetes para establecer, cambiar o incluso\nagregar elementos a un array. Por ejemplo, para reemplazar el primer elemento del\narray listOfNumbers por el número 1, podríamos hacer lo siguiente:

\n
listOfNumbers = [2, 3, 5, 7, 11];\nlistOfNumbers[0] = 1;\n\nconsole.assert(\n  equal(listOfNumbers, [1, 3, 5, 7, 11]),\n);\n\n
\n

También podemos utilizar los indexes entre corchetes para agregar elementos en\nun array. Por ejemplo, para agregar el número 13 al array listOfNumbers,\nharíamos lo siguiente:

\n
listOfNumbers = [2, 3, 5, 7, 11];\nlistOfNumbers[5] = 13;\n\nconsole.assert(\n  equal(listOfNumbers, [2, 3, 5, 7, 11, 13]),\n);\n\n
\n

De hecho, podemos crear un array vacío y luego definir cada elemento de forma\nindividual, así:

\n
listOfNumbers = [];\nlistOfNumbers[0] = 2;\nlistOfNumbers[1] = 3;\nlistOfNumbers[2] = 5;\nlistOfNumbers[3] = 7;\nlistOfNumbers[4] = 11;\n\nconsole.assert(\n  equal(listOfNumbers, [2, 3, 5, 7, 11]),\n);\n\n
\n

Mezclando tipos de datos en arrays

\n

Los elementos de un array no tienen que ser todos del mismo tipo de dato.\nPodemos, por ejemplo, tener un array que contenga un number (el número 3),\nun string (\"hola mundo\") y otro number (el número 3627.5):

\n
const mixedArray = [3, 'hola mundo', 3627.5];\nconsole.assert(mixedArray[0] === 3);\nconsole.assert(mixedArray[1] === 'hola mundo');\nconsole.assert(mixedArray[2] === 3627.5);\n\n
\n

Inclusive podemos tener un array dentro de otro array (algo que mucha gente\nllama arrays de 2 dimensiones). Por ejemplo, para organizar la data de preguntas\ny respuestas de un quiz, podemos utilizar un array en el que cada elemento es,\na su vez, un array que tiene dos elementos: una pregunta y una respuesta.

\n
let questions = [\n  ['¿En cuántos países opera Laboratoria?', 4],\n  ['¿Cuál es la capital de Perú?', 'Lima'],\n  ['¿Cuál es baile típico Chileno?', 'Cueca'],\n  ['¿Cuál es la moneda de México?', 'Peso'],\n];\n\n
\n

Para acceder a elementos individuales de los arrays internos simplemente se añade\nun nuevo par de corchetes con el index correspondiente. Por ejemplo, para obtener\nla respuesta a la pregunta '¿Cuál es la moneda de México?' haríamos:

\n
questions = [\n  ['¿En cuántos países opera Laboratoria?', 4],\n  ['¿Cuál es la capital de Perú?', 'Lima'],\n  ['¿Cuál es baile típico Chileno?', 'Cueca'],\n  ['¿Cuál es la moneda de México?', 'Peso'],\n];\nconsole.assert(questions[3][1] === 'Peso');\n\n
\n

Vamos a hacerlo de nuevo paso a paso

\n
questions = [\n  ['¿En cuántos países opera Laboratoria?', 4],\n  ['¿Cuál es la capital de Perú?', 'Lima'],\n  ['¿Cuál es baile típico Chileno?', 'Cueca'],\n  ['¿Cuál es la moneda de México?', 'Peso'],\n];\nconst quest3 = questions[3];\nconsole.assert(\n  equal(quest3, ['¿Cuál es la moneda de México?', 'Peso']),\n);\nconsole.assert(quest3[1] === 'Peso');\n\n
\n

A continuación Michelle nos explica los conceptos principales de arrays con un\nejemplo:

\n

\"ejemplo

" + "body": "

Objetivos de Aprendizaje

\n
    \n
  • Aprender qué son arrays y para qué sirven
  • \n
  • Aprender a crear, acceder y modificar la información de un array
  • \n
\n
\n

El texto a continuación se basa en gran medida, con ciertos ajustes, en el\ncapítulo 4 de Eloquent JavaScript, de Marijn\nHaverbeke, 2014. Traducción en Español\ndisponible gracias a hectorip, y del capítulo 3\nde JavaScript for kids,\nNick Morgan, 2015.

\n
\n

Agrupando y manipulando data

\n

Como hemos visto, gran parte de la programación consiste en agrupar y manipular\ndata. Esto nos permite transformar datos en información y utilizar esa información\npara resolver problemas. Hasta ahora hemos podido agrupar y manipular data haciendo\nuso de tipos de datos simples como: numbers,booleans y strings. Sobre ellos\nhemos creado una serie de programas sencillos. También hemos aprendido a modificar\nel control de flujo de estos programas, por medio de estructuras repetitivas,\nestructuras condicionales y funciones, lo cual nos ha permitido crear productos\nun poco más complejos. Sin embargo, nuestros programas han estado seriamente limitados\ndebido a que operan únicamente con tipos de datos simples. Para resolver problemas\nmás complejos necesitamos poder agrupar y manipular data de una manera más interesante.\nAfortunadamente, un entorno JavaScript nos permite lograr esto brindándonos arrays\ny objects.

\n

¿Por qué necesitamos arrays?

\n

Digamos, por poner un ejemplo, que queremos representar una colección de\nnúmeros: 2, 3, 5, 7 y 11.

\n

Una opción para representar esto sería:

\n
const firstNumber = 2;\nconst secondNumber = 3;\nconst thirdNumber = 5;\nconst fourthNumber = 7;\n\n
\n

Esta lista es bien extraña y engorrosa. Implica tener una variable para cada\nelemento de nuestra lista. Cuando en realidad sólo deberíamos tener una sola\nvariable que \"contenga\" a cada una.¡Imagina que luego quieres tener una lista\nde 1,000 elementos!

\n

Otra opción -más creativa- sería utilizar un string. Después de todo, los\nstrings pueden ser de cualquier longitud, así que podemos poner mucha información\nen ellos. Podríamos usar un string con los números intercalados por un\nespacio, así:

\n
const listOfNumbers = '2 3 5 7 11';\n
\n

Sin embargo, esto también resulta engorroso. Tendríamos que buscar la manera de\nextraer cada elemento del string (contando los espacios entre ellos) y además,\ntendríamos que convertirlos de vuelta a number para acceder y manipular cada\nnúmero de manera individual.

\n

Afortunadamente, Javascript proporciona un tipo de dato específico para almacenar\nsecuencias de valores. Se llama array (arreglo en español) y se escribe como una\nlista de valores entre corchetes, separados por comas.

\n
const listOfNumbers = [2, 3, 5, 7, 11];\n\n
\n

Los arrays son tremendamente útiles para agrupar y manipular data. Es como\ncuando vamos al mercado y tenemos nuestra \"lista de compras\". Podríamos tener\nuna hoja de papel para cada artículo que queremos comprar. Por ejemplo, podríamos\ntener una hoja de papel que dice \"huevos\", otra hoja que dice \"pan\", y otra hoja\nque dice \"naranjas\". Sin embargo, la mayoría de la gente escribe la lista completa\nde cosas a comprar en una sola hoja de papel.

\n

Accediendo información de un array

\n

Antes de comenzar, vamos a generar una pequeña función utilitaria,\nque nos permita decir si dos string son iguales. La colocaremos\nen el prototype de Array.

\n
const equal = (one, other) => JSON.stringify(one) === JSON.stringify(other);\n\nconsole.assert(equal([1, 2, 3], [1, 2, 3]));\nconsole.assert(!equal([1, 2, 3], ['a', 'b', 'c']));\nconsole.assert(!equal([1, 2, 3], [3, 2, 1]));\n\n
\n

Para obtener un elemento dentro de un array, se utiliza la notación con corchetes,\ncon el index (índice en español) del elemento que se desea. Veamos un ejemplo:

\n
listOfNumbers = [2, 3, 5, 7, 11];\n\nconsole.assert(listOfNumbers[1] === 3);\nconsole.assert(listOfNumbers[1 - 1] === 2);\n\n
\n

El index es el número que corresponde a (o que coincide con) el punto del array\ndonde se almacena el valor. Al igual que con los strings, el primer elemento\nde un array está en el index 0, el segundo está en el index 1, el tercero\nen el index 2, y así sucesivamente. Es por eso que pedir index 1 - 1\n(es decir, 0) del array anterior devuelve el número 2.

\n

\"image\"

\n

Si no tienes antecedentes en programación, acostumbrarte a esta convención puede\ntomarte algún tiempo. Pero el conteo con base cero tiene una larga tradición en\ntecnología y mientras la convención se siga de manera consistente (que se ha hecho\nen Javascript), funciona bien.

\n

Definiendo o cambiando los elementos de un array

\n

Podemos utilizar los indexes entre corchetes para establecer, cambiar o incluso\nagregar elementos a un array. Por ejemplo, para reemplazar el primer elemento del\narray listOfNumbers por el número 1, podríamos hacer lo siguiente:

\n
listOfNumbers = [2, 3, 5, 7, 11];\nlistOfNumbers[0] = 1;\n\nconsole.assert(\n  equal(listOfNumbers, [1, 3, 5, 7, 11]),\n);\n\n
\n

También podemos utilizar los indexes entre corchetes para agregar elementos en\nun array. Por ejemplo, para agregar el número 13 al array listOfNumbers,\nharíamos lo siguiente:

\n
listOfNumbers = [2, 3, 5, 7, 11];\nlistOfNumbers[5] = 13;\n\nconsole.assert(\n  equal(listOfNumbers, [2, 3, 5, 7, 11, 13]),\n);\n\n
\n

De hecho, podemos crear un array vacío y luego definir cada elemento de forma\nindividual, así:

\n
listOfNumbers = [];\nlistOfNumbers[0] = 2;\nlistOfNumbers[1] = 3;\nlistOfNumbers[2] = 5;\nlistOfNumbers[3] = 7;\nlistOfNumbers[4] = 11;\n\nconsole.assert(\n  equal(listOfNumbers, [2, 3, 5, 7, 11]),\n);\n\n
\n

Mezclando tipos de datos en arrays

\n

Los elementos de un array no tienen que ser todos del mismo tipo de dato.\nPodemos, por ejemplo, tener un array que contenga un number (el número 3),\nun string (\"hola mundo\") y otro number (el número 3627.5):

\n
const mixedArray = [3, 'hola mundo', 3627.5];\nconsole.assert(mixedArray[0] === 3);\nconsole.assert(mixedArray[1] === 'hola mundo');\nconsole.assert(mixedArray[2] === 3627.5);\n\n
\n

Inclusive podemos tener un array dentro de otro array (algo que mucha gente\nllama arrays de 2 dimensiones). Por ejemplo, para organizar la data de preguntas\ny respuestas de un quiz, podemos utilizar un array en el que cada elemento es,\na su vez, un array que tiene dos elementos: una pregunta y una respuesta.

\n
let questions = [\n  ['¿En cuántos países opera Laboratoria?', 4],\n  ['¿Cuál es la capital de Perú?', 'Lima'],\n  ['¿Cuál es baile típico Chileno?', 'Cueca'],\n  ['¿Cuál es la moneda de México?', 'Peso'],\n];\n\n
\n

Para acceder a elementos individuales de los arrays internos simplemente se añade\nun nuevo par de corchetes con el index correspondiente. Por ejemplo, para obtener\nla respuesta a la pregunta '¿Cuál es la moneda de México?' haríamos:

\n
questions = [\n  ['¿En cuántos países opera Laboratoria?', 4],\n  ['¿Cuál es la capital de Perú?', 'Lima'],\n  ['¿Cuál es baile típico Chileno?', 'Cueca'],\n  ['¿Cuál es la moneda de México?', 'Peso'],\n];\nconsole.assert(questions[3][1] === 'Peso');\n\n
\n

Vamos a hacerlo de nuevo paso a paso

\n
questions = [\n  ['¿En cuántos países opera Laboratoria?', 4],\n  ['¿Cuál es la capital de Perú?', 'Lima'],\n  ['¿Cuál es baile típico Chileno?', 'Cueca'],\n  ['¿Cuál es la moneda de México?', 'Peso'],\n];\nconst quest3 = questions[3];\nconsole.assert(\n  equal(quest3, ['¿Cuál es la moneda de México?', 'Peso']),\n);\nconsole.assert(quest3[1] === 'Peso');\n\n
\n

A continuación Michelle nos explica los conceptos principales de arrays con un\nejemplo:

\n

" }, "pt": { "title": "Arrays", - "body": "

Objetivos de Aprendizagem

\n
    \n
  • Aprenda o que são vetores (arrays) e para que servem
  • \n
  • Aprenda a criar, acessar e modificar os dados de um vetor
  • \n
\n

O texto a seguir se baseia em grande medida, com alguns ajustes, ao capítulo 4\ndo Eloquent JavaScript,de Marijn Haverbeke,\n2014. Tradução em\nPortuguês,\ne ao capítulo 3 do JavaScript for\nkids,\nNick Morgan, 2015;

\n
\n

Agrupando e manipulando dados

\n

Como vimos, grande parte da programação consiste em agrupar e manipular dados.\nIsso nos permite transformar dados em informações e usar essas informações para\nresolver problemas. Até agora, pudemos agrupar e manipular dados usando tipos de\ndados simples, tais como: numbers, booleans e strings. Com eles, criamos\numa série de programas simples. Também aprendemos a modificar o fluxo desses\nprogramas, através de estruturas repetitivas, condicionais e funcionais, as\nquais nos permitiram criar produtos um pouco mais complexos. No entanto, nossos\nprogramas tinham muitas limitações porque operávamos apenas com tipos de dados\nsimples.

\n

Para resolver problemas mais complexos, precisamos ser capazes de agrupar e\nmanipular dados de uma maneira mais interessante. Felizmente, um ambiente\nJavaScript nos permite alcançar isso através de arrays e objects.

\n

Por que precisamos de matrizes?

\n

Digamos, por exemplo, que queiramos representar um conjunto de números: 2,\n3, 5, 7 e 11

\n

Uma opção para representar isso seria:

\n
const firstNumber = 2;\nconst secondNumber = 3;\nconst thirdNumber = 5;\nconst fourthNumber = 7;\n
\n

Esta lista é bem estranha e trabalhosa. Isso implica em ter uma variável para\ncada elemento da nossa lista. Quando, na realidade, devemos ter apenas uma única\nvariável que \"contenha\" cada um. Imagine se você quiser uma lista de 1.000\nelementos!

\n

Outra opção - mais criativa - seria usar uma string. Afinal, as strings\npodem ser de qualquer tamanho, e então podemos colocar muita informação nelas.\nPoderíamos usar uma cadeia de caracteres (string) com os números\nintercalados por um espaço, como esta:

\n
const listOfNumbers = '2 3 5 7 11';\n
\n

No entanto, isso também é complicado. Teríamos que encontrar uma maneira de\nextrair cada elemento de uma string (considerando os espaços entre eles) e\ntambém teríamos que convertê-los para number a fim de acessar e manipular cada\num dos números.

\n

Felizmente, o Javascript fornece um tipo específico de dados para armazenar\nsequência de valores. É chamado de array (arranjo ou vetor/matriz) e é\nescrito como uma lista de valores entre colchetes, separados por vírgulas.

\n
const listOfNumbers = [2, 3, 5, 7, 11];\n
\n

Os arranjos são extremamente úteis para agrupar e manipular dados. É como quando\nvamos ao mercado e temos nossa \"lista de compras\". Poderíamos ter uma folha de\npapel para cada item que queremos comprar. Por exemplo, poderíamos ter uma folha\nde papel que diz \"ovos\", outra folha que diz \"pão\" e outra folha que diz\n\"laranjas\". No entanto, a maioria das pessoas escreve todos os itens para\ncomprar em uma única folha de papel.

\n

Acessando informações de um vetor

\n

Antes de começar, vamos gerar uma pequena função utilitária, que nos permite\ndescobrir se duas strings são iguais.

\n
const equal = (one, other) => JSON.stringify(one) === JSON.stringify(other);\n\nconsole.assert(equal([1, 2, 3], [1, 2, 3]));\nconsole.assert(!equal([1, 2, 3], ['a', 'b', 'c']));\nconsole.assert(!equal([1, 2, 3], [3, 2, 1]));\n
\n

Para obter um elemento de um array, a notação com colchetes é usada contento o\níndice (index) do elemento desejado. Veja o exemplo abaixo:

\n
const listOfNumbers = [2, 3, 5, 7, 11];\n\nconsole.assert(listOfNumbers[1] === 3);\nconsole.assert(listOfNumbers[1 - 1] === 2);\n
\n

Índice é o número que corresponde a (ou coincide com) a posição em que o valor\né armazenado. Assim como nas strings, o primeiro elemento de um vetor está no\níndice 0, o segundo no 1, o terceiro no 2, e assim por diante. É por isso\nque acessar o índice 1 - 1 no vetor acima, ou seja, devolve o número 2\n(índice 0).

\n

\"image\"

\n

Se você não tem experiência em programação, habituar-se com essa convenção pode\nlevar algum tempo. Mas a contagem baseada em zero tem uma longa tradição em\ntecnologia e, desde que a convenção seja seguida consistentemente (o que é\nfeito em JavaScript), ela funciona bem. Tome muito cuidado, pois esse descuido\né a causa de muitos bugs, inclusive para programadores um pouco mais\nexperientes.

\n

Definindo ou alterando os elementos de um array

\n

Podemos usar os índices entre colchetes para definir, alterar ou adicionar\nelementos a um vetor. Por exemplo, para substituir o primeiro elemento de\narraylistOfNumbers pelo número 1, poderíamos fazer o seguinte:

\n
listOfNumbers[0] = 1;\n\nconsole.assert(\n  equal(listOfNumbers, [1, 3, 5, 7, 11]),\n);\n\n
\n

Também podemos usar os índices entre colchetes para adicionar elementos em um\nvetor. Por exemplo, para adicionar o número 13 ao array listOfNumbers,\nfaríamos assim:

\n
listOfNumbers[5] = 13;\n\nconsole.assert(\n  equal(listOfNumbers, [1, 3, 5, 7, 11, 13]),\n);\n\n
\n

Ainda, podemos criar um vetor vazio e definir cada elemento individualmente a\nseguir, da seguinte maneira:

\n
const listOfNumbers = [];\nlistOfNumbers[0] = 2;\nlistOfNumbers[1] = 3;\nlistOfNumbers[2] = 5;\nlistOfNumbers[3] = 7;\nlistOfNumbers[4] = 11;\n\nconsole.assert(\n  equal(listOfNumbers, [2, 3, 5, 7, 11]),\n);\n\n
\n

Misturando tipos de dados em arrays

\n

Os elementos de um array não precisam ser todos do mesmo tipo de dados.\nPodemos, por exemplo, ter um vetor que contenha um number (o número 3), uma\nstring (\"dinossauros\") e outro number (o número 3627.5):

\n
const mixedArray = [3, 'hola mundo', 3627.5];\nconsole.assert(mixedArray[0] === 3);\nconsole.assert(mixedArray[1] === 'hola mundo');\nconsole.assert(mixedArray[2] === 3627.5);\n\n
\n

Podemos até ter um vetor dentro de outro (algo que muitas pessoas chamam de\nmatriz ou array de 2 dimensões). Por exemplo, para organizar os dados de\nperguntas e respostas de um questionário, podemos usar um arranjo no qual cada\nelemento é um vetor com dois elementos: uma pergunta e uma resposta.

\n
let questions = [\n  ['Em quantos países a Laboratoria opera?', 4],\n  ['Qual é a capital do Peru?', 'Lima'],\n  ['O que é dança chilena típica?', 'Cueca'],\n  ['Qual é a moeda do México?', 'Peso']\n];\n\n
\n

Para acessar elementos individuais dos vetores internos, basta adicionar um novo\npar de colchetes com o índice correspondente. Por exemplo, para obter a resposta\npara a pergunta \"Qual é a moeda do México?\", nós faríamos:

\n
questions = [\n  ['Em quantos países a Laboratoria opera?', 4],\n  ['Qual é a capital do Peru?', 'Lima'],\n  ['O que é dança chilena típica?', 'Cueca'],\n  ['Qual é a moeda do México?', 'Peso']\n];\nconsole.assert(questions[3][1] === 'Peso');\n\n
\n

Vamos fazer de novo passo a passo:

\n
questions = [\n  ['Em quantos países a Laboratoria opera?', 4],\n  ['Qual é a capital do Peru?', 'Lima'],\n  ['O que é dança chilena típica?', 'Cueca'],\n  ['Qual é a moeda do México?', 'Peso']\n];\nconst quest3 = questions[3];\nconsole.assert(\n  equal(quest3, ['Qual é a moeda do México?', 'Peso']),\n);\nconsole.assert(quest3[1] === 'Peso');\n\n
\n

A seguir Juliana nos explica os conceitos principais de arrays con um\nexemplo:

\n

\"Arrays\"

" + "body": "

Objetivos de Aprendizagem

\n
    \n
  • Aprenda o que são vetores (arrays) e para que servem
  • \n
  • Aprenda a criar, acessar e modificar os dados de um vetor
  • \n
\n

O texto a seguir se baseia em grande medida, com alguns ajustes, ao capítulo 4\ndo Eloquent JavaScript,de Marijn Haverbeke,\n2014. Tradução em\nPortuguês,\ne ao capítulo 3 do JavaScript for\nkids,\nNick Morgan, 2015;

\n
\n

Agrupando e manipulando dados

\n

Como vimos, grande parte da programação consiste em agrupar e manipular dados.\nIsso nos permite transformar dados em informações e usar essas informações para\nresolver problemas. Até agora, pudemos agrupar e manipular dados usando tipos de\ndados simples, tais como: numbers, booleans e strings. Com eles, criamos\numa série de programas simples. Também aprendemos a modificar o fluxo desses\nprogramas, através de estruturas repetitivas, condicionais e funcionais, as\nquais nos permitiram criar produtos um pouco mais complexos. No entanto, nossos\nprogramas tinham muitas limitações porque operávamos apenas com tipos de dados\nsimples.

\n

Para resolver problemas mais complexos, precisamos ser capazes de agrupar e\nmanipular dados de uma maneira mais interessante. Felizmente, um ambiente\nJavaScript nos permite alcançar isso através de arrays e objects.

\n

Por que precisamos de matrizes?

\n

Digamos, por exemplo, que queiramos representar um conjunto de números: 2,\n3, 5, 7 e 11

\n

Uma opção para representar isso seria:

\n
const firstNumber = 2;\nconst secondNumber = 3;\nconst thirdNumber = 5;\nconst fourthNumber = 7;\n
\n

Esta lista é bem estranha e trabalhosa. Isso implica em ter uma variável para\ncada elemento da nossa lista. Quando, na realidade, devemos ter apenas uma única\nvariável que \"contenha\" cada um. Imagine se você quiser uma lista de 1.000\nelementos!

\n

Outra opção - mais criativa - seria usar uma string. Afinal, as strings\npodem ser de qualquer tamanho, e então podemos colocar muita informação nelas.\nPoderíamos usar uma cadeia de caracteres (string) com os números\nintercalados por um espaço, como esta:

\n
const listOfNumbers = '2 3 5 7 11';\n
\n

No entanto, isso também é complicado. Teríamos que encontrar uma maneira de\nextrair cada elemento de uma string (considerando os espaços entre eles) e\ntambém teríamos que convertê-los para number a fim de acessar e manipular cada\num dos números.

\n

Felizmente, o Javascript fornece um tipo específico de dados para armazenar\nsequência de valores. É chamado de array (arranjo ou vetor/matriz) e é\nescrito como uma lista de valores entre colchetes, separados por vírgulas.

\n
const listOfNumbers = [2, 3, 5, 7, 11];\n
\n

Os arranjos são extremamente úteis para agrupar e manipular dados. É como quando\nvamos ao mercado e temos nossa \"lista de compras\". Poderíamos ter uma folha de\npapel para cada item que queremos comprar. Por exemplo, poderíamos ter uma folha\nde papel que diz \"ovos\", outra folha que diz \"pão\" e outra folha que diz\n\"laranjas\". No entanto, a maioria das pessoas escreve todos os itens para\ncomprar em uma única folha de papel.

\n

Acessando informações de um vetor

\n

Antes de começar, vamos gerar uma pequena função utilitária, que nos permite\ndescobrir se duas strings são iguais.

\n
const equal = (one, other) => JSON.stringify(one) === JSON.stringify(other);\n\nconsole.assert(equal([1, 2, 3], [1, 2, 3]));\nconsole.assert(!equal([1, 2, 3], ['a', 'b', 'c']));\nconsole.assert(!equal([1, 2, 3], [3, 2, 1]));\n
\n

Para obter um elemento de um array, a notação com colchetes é usada contento o\níndice (index) do elemento desejado. Veja o exemplo abaixo:

\n
const listOfNumbers = [2, 3, 5, 7, 11];\n\nconsole.assert(listOfNumbers[1] === 3);\nconsole.assert(listOfNumbers[1 - 1] === 2);\n
\n

Índice é o número que corresponde a (ou coincide com) a posição em que o valor\né armazenado. Assim como nas strings, o primeiro elemento de um vetor está no\níndice 0, o segundo no 1, o terceiro no 2, e assim por diante. É por isso\nque acessar o índice 1 - 1 no vetor acima, ou seja, devolve o número 2\n(índice 0).

\n

\"image\"

\n

Se você não tem experiência em programação, habituar-se com essa convenção pode\nlevar algum tempo. Mas a contagem baseada em zero tem uma longa tradição em\ntecnologia e, desde que a convenção seja seguida consistentemente (o que é\nfeito em JavaScript), ela funciona bem. Tome muito cuidado, pois esse descuido\né a causa de muitos bugs, inclusive para programadores um pouco mais\nexperientes.

\n

Definindo ou alterando os elementos de um array

\n

Podemos usar os índices entre colchetes para definir, alterar ou adicionar\nelementos a um vetor. Por exemplo, para substituir o primeiro elemento de\narraylistOfNumbers pelo número 1, poderíamos fazer o seguinte:

\n
listOfNumbers[0] = 1;\n\nconsole.assert(\n  equal(listOfNumbers, [1, 3, 5, 7, 11]),\n);\n\n
\n

Também podemos usar os índices entre colchetes para adicionar elementos em um\nvetor. Por exemplo, para adicionar o número 13 ao array listOfNumbers,\nfaríamos assim:

\n
listOfNumbers[5] = 13;\n\nconsole.assert(\n  equal(listOfNumbers, [1, 3, 5, 7, 11, 13]),\n);\n\n
\n

Ainda, podemos criar um vetor vazio e definir cada elemento individualmente a\nseguir, da seguinte maneira:

\n
const listOfNumbers = [];\nlistOfNumbers[0] = 2;\nlistOfNumbers[1] = 3;\nlistOfNumbers[2] = 5;\nlistOfNumbers[3] = 7;\nlistOfNumbers[4] = 11;\n\nconsole.assert(\n  equal(listOfNumbers, [2, 3, 5, 7, 11]),\n);\n\n
\n

Misturando tipos de dados em arrays

\n

Os elementos de um array não precisam ser todos do mesmo tipo de dados.\nPodemos, por exemplo, ter um vetor que contenha um number (o número 3), uma\nstring (\"dinossauros\") e outro number (o número 3627.5):

\n
const mixedArray = [3, 'hola mundo', 3627.5];\nconsole.assert(mixedArray[0] === 3);\nconsole.assert(mixedArray[1] === 'hola mundo');\nconsole.assert(mixedArray[2] === 3627.5);\n\n
\n

Podemos até ter um vetor dentro de outro (algo que muitas pessoas chamam de\nmatriz ou array de 2 dimensões). Por exemplo, para organizar os dados de\nperguntas e respostas de um questionário, podemos usar um arranjo no qual cada\nelemento é um vetor com dois elementos: uma pergunta e uma resposta.

\n
let questions = [\n  ['Em quantos países a Laboratoria opera?', 4],\n  ['Qual é a capital do Peru?', 'Lima'],\n  ['O que é dança chilena típica?', 'Cueca'],\n  ['Qual é a moeda do México?', 'Peso']\n];\n\n
\n

Para acessar elementos individuais dos vetores internos, basta adicionar um novo\npar de colchetes com o índice correspondente. Por exemplo, para obter a resposta\npara a pergunta \"Qual é a moeda do México?\", nós faríamos:

\n
questions = [\n  ['Em quantos países a Laboratoria opera?', 4],\n  ['Qual é a capital do Peru?', 'Lima'],\n  ['O que é dança chilena típica?', 'Cueca'],\n  ['Qual é a moeda do México?', 'Peso']\n];\nconsole.assert(questions[3][1] === 'Peso');\n\n
\n

Vamos fazer de novo passo a passo:

\n
questions = [\n  ['Em quantos países a Laboratoria opera?', 4],\n  ['Qual é a capital do Peru?', 'Lima'],\n  ['O que é dança chilena típica?', 'Cueca'],\n  ['Qual é a moeda do México?', 'Peso']\n];\nconst quest3 = questions[3];\nconsole.assert(\n  equal(quest3, ['Qual é a moeda do México?', 'Peso']),\n);\nconsole.assert(quest3[1] === 'Peso');\n\n
\n

A seguir Juliana nos explica os conceitos principais de arrays con um\nexemplo:

\n

" } } }, @@ -608,7 +608,7 @@ }, "pt": { "title": "filter, map, sort e reduce", - "body": "

Já vimos alguns dos métodos de uso mais comuns para arrays, porém\nArray.prototype nos fornece vários outros métodos úteis.

\n

Para facilitar um pouco a vida, os dividimos da seguinte forma:

\n
    \n
  • para agregar e retirar elementos: push, pop, shift, unshift, slice,\nsplice e concat.
  • \n
  • para buscar elementos dentro da array: indexOf, lastIndexOf, includes,\nfind, findIndex e filter.
  • \n
  • para transformar arrays: map,reduce, sort, reverse, split e join.
  • \n
\n

Agora focaremos nos quatro métodos que consideramos mais utilizados: filter,\nmap sort e reduce.

\n

Para conhecer em detalhes cada um destes métodos, visite a documentação no\nMDN

\n

Vamos usar uma função para comparar arrays.

\n
const equal = (one, other) => JSON.stringify(one) === JSON.stringify(other);\n\n
\n

Abaixo segue um conjunto de dados que utilizaremos como exemplo para nossos\nexemplos :)

\n
const inventors = [\n  {\n    first: 'Ada',\n    last: 'Lovelace',\n    year: 1815,\n    passed: 1852,\n  },\n  {\n    first: 'Lise',\n    last: 'Meitner',\n    year: 1878,\n    passed: 1968,\n  },\n  {\n    first: 'Caroline',\n    last: 'Herschel',\n    year: 1750,\n    passed: 1848,\n  },\n  {\n    first: 'Hanna',\n    last: 'Hammarström',\n    year: 1829,\n    passed: 1909,\n  },\n];\n\n
\n

Agora que já temos o que precisamos, vamos começar.

\n

Array.prototype.filter

\n

filter nos permite obter um subconjunto dos elementos da array, desde que\ncumpram uma certa condição.

\n
const deadBeforeSXX = inventors.filter(inventor => (inventor.passed < 1900));\nconsole.assert(\n  equal(deadBeforeSXX, [\n    {\n      first: 'Ada',\n      last: 'Lovelace',\n      year: 1815,\n      passed: 1852,\n    },\n    {\n      first: 'Caroline',\n      last: 'Herschel',\n      year: 1750,\n      passed: 1848,\n    },\n  ]),\n);\n\n
\n

A seguir o Dani explica mais a fundo como o método filter funciona:

\n

\"Filtrando

\n

Array.prototype.map

\n

map nos permite visitar cada um dos elementos da array, coletando neste\nprocesso um valor de retorno para cada elemento visitado.

\n

Por exemplo, supondo que queremos uma lista de nomes e sobrenomes da nossa base\nde dados.

\n
const fullNames = inventors.map(inventor => `${inventor.first} ${inventor.last}`);\nconsole.assert(\n  equal(fullNames, [\n    'Ada Lovelace',\n    'Lise Meitner',\n    'Caroline Herschel',\n    'Hanna Hammarström',\n  ]),\n);\n\n
\n

Ou quantos anos cada uma viveu.

\n
const yearAlive = inventors.map(({\n  first, last, passed, year,\n}) => [`${first} ${last}`, passed - year]);\nconsole.assert(\n  equal(yearAlive, [\n    ['Ada Lovelace', 37],\n    ['Lise Meitner', 90],\n    ['Caroline Herschel', 98],\n    ['Hanna Hammarström', 80],\n  ]),\n);\n\n
\n

Array.prototype.sort

\n

Ordena a array in place (ou seja, dentro da própria array).

\n
let arr = [1, 2, 15];\narr.sort();\nconsole.assert(equal(arr, [1, 15, 2]));\n\n
\n

Se olhar bem, vai perceber que algo está estranho: por padrão, sort ordena a\narray convertendo todos os elementos em strings. Por isso 15 apareceu antes\nde 2.

\n

Como resolvemos isso?

\n
const compareNumeric = (a, b) => {\n  if (a > b) return 1;\n  if (a === b) return 0;\n  /* if (a < b) */\n  return -1;\n};\narr = [1, 2, 15];\narr.sort(compareNumeric);\nconsole.assert(\n  equal(arr, [1, 2, 15]),\n);\n\n
\n

Vejamos alguns exemplos mais interessantes.

\n

Ordenar de maior a menor segundo o ano de nascimento

\n
let ordered = inventors.sort((a, b) => {\n  if (a.year > b.year) {\n    return 1;\n  }\n  return -1;\n});\nconsole.assert(equal(\n  ordered,\n  [\n    {\n      first: 'Caroline',\n      last: 'Herschel',\n      year: 1750,\n      passed: 1848,\n    },\n    {\n      first: 'Ada',\n      last: 'Lovelace',\n      year: 1815,\n      passed: 1852,\n    },\n    {\n      first: 'Hanna',\n      last: 'Hammarström',\n      year: 1829,\n      passed: 1909,\n    },\n    {\n      first: 'Lise',\n      last: 'Meitner',\n      year: 1878,\n      passed: 1968,\n    },\n  ],\n));\n\n
\n

Poderíamos escrever a função de comparação usando um operador ternário, obtendo\no mesmo resultado.

\n
ordered = inventors.sort((a, b) => (a.year > b.year ? 1 : -1));\n\n
\n

Ordenar segundo a quantidade de anos vividos

\n
const moreYearsAlive = inventors.sort((a, b) => {\n  const last = a.passed - a.year;\n  const next = b.passed - b.year;\n  return last > next ? -1 : 1;\n});\nconsole.assert(equal(\n  moreYearsAlive,\n  [\n    {\n      first: 'Caroline',\n      last: 'Herschel',\n      year: 1750,\n      passed: 1848,\n    },\n    {\n      first: 'Lise',\n      last: 'Meitner',\n      year: 1878,\n      passed: 1968,\n    },\n    {\n      first: 'Hanna',\n      last: 'Hammarström',\n      year: 1829,\n      passed: 1909,\n    },\n    {\n      first: 'Ada',\n      last: 'Lovelace',\n      year: 1815,\n      passed: 1852,\n    },\n  ],\n));\n\n
\n

Array.prototype.reduce

\n

Quando queremos iterar uma array, usamos forEach. Agora, para fazer o mesmo,\nmas coletando uma lista de valores, com um valor de cada elemento, usamos map.

\n

reduce é similar ao map, porém o utilizamos para iterar uma array e obter um\núnico valor que contenha um consolidado de todos os elementos.

\n

Façamos o seguinte:

\n
let initial = 0;\nconst value = arr.reduce((previousValue, item, index, array) => {\n  /* aqui tu codigo */\n}, initial);\n\n
\n

Onde

\n
    \n
  • \n

    item -- é o elemento atual que estamos iterando

    \n
  • \n
  • \n

    index -- é o índice atual

    \n
  • \n
  • \n

    array -- é a array atual

    \n
  • \n
\n

Até aqui tudo mais ou menos normal, porém adicionamos um parâmetro:

\n
    \n
  • valorPrevio -- que é o resultado da chamada anterior da função. Na primeira\nchamada da função, o valor de valorPrevio é inicial.
  • \n
\n

Vejamos um exemplo simples: somar todos os elementos de uma array.

\n
arr = [1, 2, 3, 4, 5];\ninitial = 0;\nconst arrSum = arr.reduce((sum, current) => sum + current, initial);\nconsole.assert(arrSum === 15);\n\n
\n

Aqui usamos a variante mais comum de reduce, que só utiliza os dois primeiros\nparâmetros.

\n

Vejamos com mais detalhes o que está acontecendo:

\n
    \n
  1. Na primeira chamada, soma tem o valor de inicial (o segundo argumento de\nreduce), que é 0. E atual é o primeiro elemento da array, que é 1.\nEntão o resultado é 1.
  2. \n
  3. Na segunda chamada, sum === 1, somamos o segundo elemento da array (2) e\ndevolvemos.
  4. \n
  5. Na terceira chamada, sum === 3 e somamos ao terceiro elemento (3) ...
  6. \n
\n

E assim segue:

\n

\"image\"

\n

Se passarmos para uma tabela, onde cada fila representa uma chamada da função\nsobre o próximo elemento da array:

\n

| |soma|atual|resultado|\n|----------------|------|-------|-----------|\n|primeira chamada| 0 | 1 | 1 |\n|segunda chamada | 1 | 2 | 3 |\n|terceira chamada| 3 | 3 | 6 |\n|quarta chamada | 6 | 4 | 10 |\n|quinta chamada | 10 | 5 | 15 |

\n

Como podemos ver, o resultado da chamada anterior se converte no primeiro\nparâmetro da próxima chamada.

\n

Finalizando, apenas vamos mencionar que reduceRight faz a mesma coisa, porém\ncomeçando pelo final da array.

\n

Vejamos agora dois exemplos:

\n

Calcular a quantidade de anos vividos de todas as inventoras, somados

\n
const totalYears = inventors.reduce(\n  (total, inventor) => total + (inventor.passed - inventor.year),\n  0,\n);\nconsole.assert(totalYears === 305);\n\n
\n

Somar a quantidade de ocorrências de cada meio de transporte

\n

Vamos mudar de base de dados.

\n
const transportationData = [\n  'car', 'car', 'truck', 'truck', 'bike', 'walk',\n  'car', 'van', 'bike', 'walk', 'car', 'van',\n  'car', 'truck',\n];\n\nconst transportReduceFn = (obj, item) => {\n  const result = {\n    ...obj,\n  };\n  /* si es la primera vez que encuentro este medio de transporte */\n  if (!obj[item]) {\n    result[item] = 0; /* inicializo en 0 */\n  }\n  result[item] += 1;\n  return result;\n};\n\nlet transportation = transportationData.reduce(transportReduceFn, {});\nconsole.assert(equal(\n  transportation,\n  {\n    car: 5, truck: 3, bike: 2, walk: 2, van: 2,\n  },\n));\n\n
\n

Agora a mesma coisa, porém agregando um novo meio de transporte (pogobol)

\n
transportationData.push('pogostick');\ntransportation = transportationData.reduce(transportReduceFn, {});\nconsole.assert(equal(\n  transportation,\n  {\n    car: 5, truck: 3, bike: 2, walk: 2, van: 2, pogostick: 1,\n  },\n));\n\n
\n
\n

Nesta leitura vimos alguns exemplos de métodos de arrays que, uma vez que se\naprende a dominá-los, são super úteis.

\n

Leituras complementares

\n" + "body": "

Já vimos alguns dos métodos de uso mais comuns para arrays, porém\nArray.prototype nos fornece vários outros métodos úteis.

\n

Para facilitar um pouco a vida, os dividimos da seguinte forma:

\n
    \n
  • para agregar e retirar elementos: push, pop, shift, unshift, slice,\nsplice e concat.
  • \n
  • para buscar elementos dentro da array: indexOf, lastIndexOf, includes,\nfind, findIndex e filter.
  • \n
  • para transformar arrays: map,reduce, sort, reverse, split e join.
  • \n
\n

Agora focaremos nos quatro métodos que consideramos mais utilizados: filter,\nmap sort e reduce.

\n

Para conhecer em detalhes cada um destes métodos, visite a documentação no\nMDN

\n

Vamos usar uma função para comparar arrays.

\n
const equal = (one, other) => JSON.stringify(one) === JSON.stringify(other);\n\n
\n

Abaixo segue um conjunto de dados que utilizaremos como exemplo para nossos\nexemplos :)

\n
const inventors = [\n  {\n    first: 'Ada',\n    last: 'Lovelace',\n    year: 1815,\n    passed: 1852,\n  },\n  {\n    first: 'Lise',\n    last: 'Meitner',\n    year: 1878,\n    passed: 1968,\n  },\n  {\n    first: 'Caroline',\n    last: 'Herschel',\n    year: 1750,\n    passed: 1848,\n  },\n  {\n    first: 'Hanna',\n    last: 'Hammarström',\n    year: 1829,\n    passed: 1909,\n  },\n];\n\n
\n

Agora que já temos o que precisamos, vamos começar.

\n

Array.prototype.filter

\n

filter nos permite obter um subconjunto dos elementos da array, desde que\ncumpram uma certa condição.

\n
const deadBeforeSXX = inventors.filter(inventor => (inventor.passed < 1900));\nconsole.assert(\n  equal(deadBeforeSXX, [\n    {\n      first: 'Ada',\n      last: 'Lovelace',\n      year: 1815,\n      passed: 1852,\n    },\n    {\n      first: 'Caroline',\n      last: 'Herschel',\n      year: 1750,\n      passed: 1848,\n    },\n  ]),\n);\n\n
\n

A seguir o Dani explica mais a fundo como o método filter funciona:

\n

\n

Array.prototype.map

\n

map nos permite visitar cada um dos elementos da array, coletando neste\nprocesso um valor de retorno para cada elemento visitado.

\n

Por exemplo, supondo que queremos uma lista de nomes e sobrenomes da nossa base\nde dados.

\n
const fullNames = inventors.map(inventor => `${inventor.first} ${inventor.last}`);\nconsole.assert(\n  equal(fullNames, [\n    'Ada Lovelace',\n    'Lise Meitner',\n    'Caroline Herschel',\n    'Hanna Hammarström',\n  ]),\n);\n\n
\n

Ou quantos anos cada uma viveu.

\n
const yearAlive = inventors.map(({\n  first, last, passed, year,\n}) => [`${first} ${last}`, passed - year]);\nconsole.assert(\n  equal(yearAlive, [\n    ['Ada Lovelace', 37],\n    ['Lise Meitner', 90],\n    ['Caroline Herschel', 98],\n    ['Hanna Hammarström', 80],\n  ]),\n);\n\n
\n

Array.prototype.sort

\n

Ordena a array in place (ou seja, dentro da própria array).

\n
let arr = [1, 2, 15];\narr.sort();\nconsole.assert(equal(arr, [1, 15, 2]));\n\n
\n

Se olhar bem, vai perceber que algo está estranho: por padrão, sort ordena a\narray convertendo todos os elementos em strings. Por isso 15 apareceu antes\nde 2.

\n

Como resolvemos isso?

\n
const compareNumeric = (a, b) => {\n  if (a > b) return 1;\n  if (a === b) return 0;\n  /* if (a < b) */\n  return -1;\n};\narr = [1, 2, 15];\narr.sort(compareNumeric);\nconsole.assert(\n  equal(arr, [1, 2, 15]),\n);\n\n
\n

Vejamos alguns exemplos mais interessantes.

\n

Ordenar de maior a menor segundo o ano de nascimento

\n
let ordered = inventors.sort((a, b) => {\n  if (a.year > b.year) {\n    return 1;\n  }\n  return -1;\n});\nconsole.assert(equal(\n  ordered,\n  [\n    {\n      first: 'Caroline',\n      last: 'Herschel',\n      year: 1750,\n      passed: 1848,\n    },\n    {\n      first: 'Ada',\n      last: 'Lovelace',\n      year: 1815,\n      passed: 1852,\n    },\n    {\n      first: 'Hanna',\n      last: 'Hammarström',\n      year: 1829,\n      passed: 1909,\n    },\n    {\n      first: 'Lise',\n      last: 'Meitner',\n      year: 1878,\n      passed: 1968,\n    },\n  ],\n));\n\n
\n

Poderíamos escrever a função de comparação usando um operador ternário, obtendo\no mesmo resultado.

\n
ordered = inventors.sort((a, b) => (a.year > b.year ? 1 : -1));\n\n
\n

Ordenar segundo a quantidade de anos vividos

\n
const moreYearsAlive = inventors.sort((a, b) => {\n  const last = a.passed - a.year;\n  const next = b.passed - b.year;\n  return last > next ? -1 : 1;\n});\nconsole.assert(equal(\n  moreYearsAlive,\n  [\n    {\n      first: 'Caroline',\n      last: 'Herschel',\n      year: 1750,\n      passed: 1848,\n    },\n    {\n      first: 'Lise',\n      last: 'Meitner',\n      year: 1878,\n      passed: 1968,\n    },\n    {\n      first: 'Hanna',\n      last: 'Hammarström',\n      year: 1829,\n      passed: 1909,\n    },\n    {\n      first: 'Ada',\n      last: 'Lovelace',\n      year: 1815,\n      passed: 1852,\n    },\n  ],\n));\n\n
\n

Array.prototype.reduce

\n

Quando queremos iterar uma array, usamos forEach. Agora, para fazer o mesmo,\nmas coletando uma lista de valores, com um valor de cada elemento, usamos map.

\n

reduce é similar ao map, porém o utilizamos para iterar uma array e obter um\núnico valor que contenha um consolidado de todos os elementos.

\n

Façamos o seguinte:

\n
let initial = 0;\nconst value = arr.reduce((previousValue, item, index, array) => {\n  /* aqui tu codigo */\n}, initial);\n\n
\n

Onde

\n
    \n
  • \n

    item -- é o elemento atual que estamos iterando

    \n
  • \n
  • \n

    index -- é o índice atual

    \n
  • \n
  • \n

    array -- é a array atual

    \n
  • \n
\n

Até aqui tudo mais ou menos normal, porém adicionamos um parâmetro:

\n
    \n
  • valorPrevio -- que é o resultado da chamada anterior da função. Na primeira\nchamada da função, o valor de valorPrevio é inicial.
  • \n
\n

Vejamos um exemplo simples: somar todos os elementos de uma array.

\n
arr = [1, 2, 3, 4, 5];\ninitial = 0;\nconst arrSum = arr.reduce((sum, current) => sum + current, initial);\nconsole.assert(arrSum === 15);\n\n
\n

Aqui usamos a variante mais comum de reduce, que só utiliza os dois primeiros\nparâmetros.

\n

Vejamos com mais detalhes o que está acontecendo:

\n
    \n
  1. Na primeira chamada, soma tem o valor de inicial (o segundo argumento de\nreduce), que é 0. E atual é o primeiro elemento da array, que é 1.\nEntão o resultado é 1.
  2. \n
  3. Na segunda chamada, sum === 1, somamos o segundo elemento da array (2) e\ndevolvemos.
  4. \n
  5. Na terceira chamada, sum === 3 e somamos ao terceiro elemento (3) ...
  6. \n
\n

E assim segue:

\n

\"image\"

\n

Se passarmos para uma tabela, onde cada fila representa uma chamada da função\nsobre o próximo elemento da array:

\n

| |soma|atual|resultado|\n|----------------|------|-------|-----------|\n|primeira chamada| 0 | 1 | 1 |\n|segunda chamada | 1 | 2 | 3 |\n|terceira chamada| 3 | 3 | 6 |\n|quarta chamada | 6 | 4 | 10 |\n|quinta chamada | 10 | 5 | 15 |

\n

Como podemos ver, o resultado da chamada anterior se converte no primeiro\nparâmetro da próxima chamada.

\n

Finalizando, apenas vamos mencionar que reduceRight faz a mesma coisa, porém\ncomeçando pelo final da array.

\n

Vejamos agora dois exemplos:

\n

Calcular a quantidade de anos vividos de todas as inventoras, somados

\n
const totalYears = inventors.reduce(\n  (total, inventor) => total + (inventor.passed - inventor.year),\n  0,\n);\nconsole.assert(totalYears === 305);\n\n
\n

Somar a quantidade de ocorrências de cada meio de transporte

\n

Vamos mudar de base de dados.

\n
const transportationData = [\n  'car', 'car', 'truck', 'truck', 'bike', 'walk',\n  'car', 'van', 'bike', 'walk', 'car', 'van',\n  'car', 'truck',\n];\n\nconst transportReduceFn = (obj, item) => {\n  const result = {\n    ...obj,\n  };\n  /* si es la primera vez que encuentro este medio de transporte */\n  if (!obj[item]) {\n    result[item] = 0; /* inicializo en 0 */\n  }\n  result[item] += 1;\n  return result;\n};\n\nlet transportation = transportationData.reduce(transportReduceFn, {});\nconsole.assert(equal(\n  transportation,\n  {\n    car: 5, truck: 3, bike: 2, walk: 2, van: 2,\n  },\n));\n\n
\n

Agora a mesma coisa, porém agregando um novo meio de transporte (pogobol)

\n
transportationData.push('pogostick');\ntransportation = transportationData.reduce(transportReduceFn, {});\nconsole.assert(equal(\n  transportation,\n  {\n    car: 5, truck: 3, bike: 2, walk: 2, van: 2, pogostick: 1,\n  },\n));\n\n
\n
\n

Nesta leitura vimos alguns exemplos de métodos de arrays que, uma vez que se\naprende a dominá-los, são super úteis.

\n

Leituras complementares

\n" } } }, @@ -620,11 +620,11 @@ "intl": { "es": { "title": "Ejercicios guiados", - "body": "

Objetivos

\n
    \n
  • Entender, a través de casos prácticos, cómo aplicar los conceptos de\nfunciones y arrays para la resolución de problemas.
  • \n
\n
\n

Enunciados

\n

Al igual que hemos hecho antes, es hora de aplicar los conceptos aprendidos para\nresolver problemas.

\n

A continuación tendrás varios problemas que debemos resolver. Intenta\nresolverlos primero por tu cuenta. Más abajo encontrarás las soluciones de\nLourdes, otra instructora estrella de Laboratoria. Después de haberlo intentado,\ncompara tus soluciones con las de Lourdes.

\n

1. Reverse

\n

Crea una función que invierta el orden de los elementos de un array. Completa\neste reto de dos maneras: en una, el array invertido es un nuevo array;\nen la segunda, modifica el mismo array que se proporciona como argumento.\nInvestiga sobre el método reverse.\n¿Qué puedes concluir?

\n

2. Search

\n

Crea una función que busque un elemento en un array, devolviendo su posición\n(index) e imprima el valor en la consola. Tip: utiliza el algoritmo de linear search. Con este ejercicio\nintroducimos el concepto de algoritmo. Para entender qué es un algoritmo,\nrevisa los siguientes videos:

\n\n

Solucionarios

\n

A continuación, Lourdes te explica cómo resolvió cada uno de los ejercicios\nanteriores.

\n

1. Reverse

\n

\"Solution

\n

2. Search

\n

\"Solution

" + "body": "

Objetivos

\n
    \n
  • Entender, a través de casos prácticos, cómo aplicar los conceptos de\nfunciones y arrays para la resolución de problemas.
  • \n
\n
\n

Enunciados

\n

Al igual que hemos hecho antes, es hora de aplicar los conceptos aprendidos para\nresolver problemas.

\n

A continuación tendrás varios problemas que debemos resolver. Intenta\nresolverlos primero por tu cuenta. Más abajo encontrarás las soluciones de\nLourdes, otra instructora estrella de Laboratoria. Después de haberlo intentado,\ncompara tus soluciones con las de Lourdes.

\n

1. Reverse

\n

Crea una función que invierta el orden de los elementos de un array. Completa\neste reto de dos maneras: en una, el array invertido es un nuevo array;\nen la segunda, modifica el mismo array que se proporciona como argumento.\nInvestiga sobre el método reverse.\n¿Qué puedes concluir?

\n

2. Search

\n

Crea una función que busque un elemento en un array, devolviendo su posición\n(index) e imprima el valor en la consola. Tip: utiliza el algoritmo de linear search. Con este ejercicio\nintroducimos el concepto de algoritmo. Para entender qué es un algoritmo,\nrevisa los siguientes videos:

\n\n

Solucionarios

\n

A continuación, Lourdes te explica cómo resolvió cada uno de los ejercicios\nanteriores.

\n

1. Reverse

\n

\n

2. Search

\n

" }, "pt": { "title": "Exercícios Livres", - "body": "

Objetivos

\n
    \n
  • Entender, através de casos práticos, como aplicar os conceitos de funções e\narrays para a resolução de problemas.
  • \n
\n
\n

Enunciados

\n

Como já fizemos anteriormente, agora é hora de aplicar os conceitos aprendidos\npara resolver problemas.

\n

A seguir, você verá vários problemas a serem resolvidos. Tente resolvê-los\nprimeiro por conta própria. Mais abaixo, você encontrará as soluções da nossa\nequipe. Depois que você tentar, compare suas soluções a nossa.

\n

1. Reverse

\n

Crie uma função que inverta a ordem dos elementos de um vetor (array).\nComplete este desafio de duas maneiras: em uma, o vetor invertido é um novo\nvetor; na segunda, modifique o mesmo array que é fornecido como argumento\n(in place). Pesquise o método\nreverse.\nO que você pode concluir?

\n

2. Search

\n

Crie uma função que procure um elemento em um vetor, retorne sua posição\n(índice - index) e imprima o valor no console. Dica: use o algoritmo de\nbusca linear. Nesse exercício,\nintroduzimos o conceito de algoritmo. Para entender o que é um algoritmo,\nconfira os seguintes vídeos:

\n\n

Soluções

\n

A seguir, Rafael lhe explicará como ele resolveu cada um dos exercícios\nanteriores.

\n

1. Reverse

\n

\"Solução

\n

2. Search

\n

\"Solução

" + "body": "

Objetivos

\n
    \n
  • Entender, através de casos práticos, como aplicar os conceitos de funções e\narrays para a resolução de problemas.
  • \n
\n
\n

Enunciados

\n

Como já fizemos anteriormente, agora é hora de aplicar os conceitos aprendidos\npara resolver problemas.

\n

A seguir, você verá vários problemas a serem resolvidos. Tente resolvê-los\nprimeiro por conta própria. Mais abaixo, você encontrará as soluções da nossa\nequipe. Depois que você tentar, compare suas soluções a nossa.

\n

1. Reverse

\n

Crie uma função que inverta a ordem dos elementos de um vetor (array).\nComplete este desafio de duas maneiras: em uma, o vetor invertido é um novo\nvetor; na segunda, modifique o mesmo array que é fornecido como argumento\n(in place). Pesquise o método\nreverse.\nO que você pode concluir?

\n

2. Search

\n

Crie uma função que procure um elemento em um vetor, retorne sua posição\n(índice - index) e imprima o valor no console. Dica: use o algoritmo de\nbusca linear. Nesse exercício,\nintroduzimos o conceito de algoritmo. Para entender o que é um algoritmo,\nconfira os seguintes vídeos:

\n\n

Soluções

\n

A seguir, Rafael lhe explicará como ele resolveu cada um dos exercícios\nanteriores.

\n

1. Reverse

\n

\n

2. Search

\n

" } }, "challenges": [] @@ -649,7 +649,7 @@ "slug": "compute-average-length-of-words", "prefix": "01", "path": "topics/javascript/04-arrays/06-practice/01-compute-average-length-of-words", - "createdAt": "2023-04-04T20:28:37.785Z", + "createdAt": "2023-05-17T20:37:28.371Z", "env": "cjs", "intl": { "es": { @@ -672,7 +672,7 @@ "slug": "get-nth-element", "prefix": "02", "path": "topics/javascript/04-arrays/06-practice/02-get-nth-element", - "createdAt": "2023-04-04T20:28:37.785Z", + "createdAt": "2023-05-17T20:37:28.371Z", "env": "cjs", "intl": { "es": { @@ -695,7 +695,7 @@ "slug": "convert-double-space-to-single", "prefix": "03", "path": "topics/javascript/04-arrays/06-practice/03-convert-double-space-to-single", - "createdAt": "2023-04-04T20:28:37.785Z", + "createdAt": "2023-05-17T20:37:28.371Z", "env": "cjs", "intl": { "es": { @@ -718,7 +718,7 @@ "slug": "are-valid-credentials", "prefix": "04", "path": "topics/javascript/04-arrays/06-practice/04-are-valid-credentials", - "createdAt": "2023-04-04T20:28:37.785Z", + "createdAt": "2023-05-17T20:37:28.371Z", "env": "cjs", "intl": { "es": { @@ -741,7 +741,7 @@ "slug": "find-pair-for-sum", "prefix": "05", "path": "topics/javascript/04-arrays/06-practice/05-find-pair-for-sum", - "createdAt": "2023-04-04T20:28:37.785Z", + "createdAt": "2023-05-17T20:37:28.371Z", "env": "cjs", "intl": { "es": { @@ -764,7 +764,7 @@ "slug": "filter-odd-elements", "prefix": "06", "path": "topics/javascript/04-arrays/06-practice/06-filter-odd-elements", - "createdAt": "2023-04-04T20:28:37.785Z", + "createdAt": "2023-05-17T20:37:28.371Z", "env": "cjs", "intl": { "es": { @@ -787,7 +787,7 @@ "slug": "find-shortest-word-among-mixed-elements", "prefix": "07", "path": "topics/javascript/04-arrays/06-practice/07-find-shortest-word-among-mixed-elements", - "createdAt": "2023-04-04T20:28:37.785Z", + "createdAt": "2023-05-17T20:37:28.371Z", "env": "cjs", "intl": { "es": { @@ -810,7 +810,7 @@ "slug": "find-smallest-number-among-mixed-elements", "prefix": "08", "path": "topics/javascript/04-arrays/06-practice/08-find-smallest-number-among-mixed-elements", - "createdAt": "2023-04-04T20:28:37.785Z", + "createdAt": "2023-05-17T20:37:28.371Z", "env": "cjs", "intl": { "es": { @@ -833,7 +833,7 @@ "slug": "get-longest-word-of-mixed-elements", "prefix": "09", "path": "topics/javascript/04-arrays/06-practice/09-get-longest-word-of-mixed-elements", - "createdAt": "2023-04-04T20:28:37.785Z", + "createdAt": "2023-05-17T20:37:28.371Z", "env": "cjs", "intl": { "es": { @@ -856,7 +856,7 @@ "slug": "get-largest-number-among-mixed-elements", "prefix": "10", "path": "topics/javascript/04-arrays/06-practice/10-get-largest-number-among-mixed-elements", - "createdAt": "2023-04-04T20:28:37.785Z", + "createdAt": "2023-05-17T20:37:28.371Z", "env": "cjs", "intl": { "es": { @@ -879,7 +879,7 @@ "slug": "compute-sum-of-all-elements", "prefix": "11", "path": "topics/javascript/04-arrays/06-practice/11-compute-sum-of-all-elements", - "createdAt": "2023-04-04T20:28:37.786Z", + "createdAt": "2023-05-17T20:37:28.371Z", "env": "cjs", "intl": { "es": { @@ -902,7 +902,7 @@ "slug": "compute-sum-between", "prefix": "12", "path": "topics/javascript/04-arrays/06-practice/12-compute-sum-between", - "createdAt": "2023-04-04T20:28:37.785Z", + "createdAt": "2023-05-17T20:37:28.372Z", "env": "cjs", "intl": { "es": { @@ -925,7 +925,7 @@ "slug": "get-longest-of-three-words", "prefix": "13", "path": "topics/javascript/04-arrays/06-practice/13-get-longest-of-three-words", - "createdAt": "2023-04-04T20:28:37.786Z", + "createdAt": "2023-05-17T20:37:28.372Z", "env": "cjs", "intl": { "es": { @@ -948,7 +948,7 @@ "slug": "find-shortest-of-three-words", "prefix": "14", "path": "topics/javascript/04-arrays/06-practice/14-find-shortest-of-three-words", - "createdAt": "2023-04-04T20:28:37.786Z", + "createdAt": "2023-05-17T20:37:28.372Z", "env": "cjs", "intl": { "es": { @@ -971,7 +971,7 @@ "slug": "calculate-bill-total", "prefix": "15", "path": "topics/javascript/04-arrays/06-practice/15-calculate-bill-total", - "createdAt": "2023-04-04T20:28:37.786Z", + "createdAt": "2023-05-17T20:37:28.372Z", "env": "cjs", "intl": { "es": { @@ -994,7 +994,7 @@ "slug": "convert-score-to-grade", "prefix": "16", "path": "topics/javascript/04-arrays/06-practice/16-convert-score-to-grade", - "createdAt": "2023-04-04T20:28:37.787Z", + "createdAt": "2023-05-17T20:37:28.372Z", "env": "cjs", "intl": { "es": { @@ -1037,11 +1037,11 @@ "intl": { "es": { "title": "Objetos en JavaScript", - "body": "

Objetivos de Aprendizaje

\n
    \n
  • Aprender qué son objects y para qué sirven
  • \n
  • Aprender a crear, acceder y modificar la información de un object
  • \n
  • Entender la diferencia entre un array y un object
  • \n
\n
\n

El texto a continuación se basa en gran medida, con ciertos ajustes, en el\ncapítulo 4 de Eloquent JavaScript,de Marijn\nHaverbeke, 2014. Traducción en Español\ndisponible gracias a hectorip, y del capítulo 3\nde JavaScript for kids,\nNick Morgan, 2015.

\n
\n

¿Qué es un object en JavaScript?

\n

Los objects en JavaScript son muy similares a los arrays, pero con dos\nimportantes diferencias:

\n
    \n
  1. \n

    Como hemos visto, para acceder a información dentro de un array utilizamos\nun número correspondiente al index; es decir, la posición en la que se\nubica el valor. Los objects, por su parte, utilizan strings en lugar de\nnúmeros para acceder a los diferentes elementos. Estos strings se denominan\nkeys (llaves) o propiedades, y los elementos a los que apuntan son llamados\nvalores. Juntas, estas piezas de información se llaman pares key-value.

    \n
  2. \n
  3. \n

    Dado que en los arrays se requiere del index para acceder a la\ninformación, es importante mantener un determinado orden de los valores. En\nel caso de los objects los pares key-value de información pueden estar en\ncualquier orden.

    \n
  4. \n
\n

Mientras que los arrays se utilizan sobre todo para representar listas de\ncosas múltiples, los objetos son a menudo usado para representar cosas simples\npero con múltiples características, o atributos. Por ejemplo, si quisiéramos\nagrupar los títulos de nuestras películas preferidas, utilizaríamos un array,\nasí:

\n
const favoriteMovies = [\n  'The Big Fish',\n  'The Lord of the Rings',\n  'The Empire Strikes Back',\n  'The Artist',\n  'The Godfather',\n  'Back to the Future',\n];\n\n
\n

¿Pero qué sucede si quisiéramos almacenar diferentes piezas de información sobre\nuna misma película? Aquí es donde entra la utilidad de un object.

\n

Creando Objetos

\n

Almacenemos diferentes piezas de información de la película Back to the Future\nen un solo lugar, por medio de un object:

\n
let movie = {\n  title: 'Back to the Future',\n  director: 'Robert Zemeckis',\n  stars: ['Michael J. Fox', 'Christopher Lloyd', 'Lea Thompson'],\n  plot: 'Marty McFly, a 17-year-old high school student, ' +\n    'is accidentally sent 30 years into the past in a time-traveling DeLorean ' +\n    'invented by his close friend, the maverick scientist Doc Brown.',\n  oscar: 1,\n  tags: ['Adventure', 'Comedy', 'Sci-Fi'],\n};\n\n
\n

En el ejemplo anterior hemos creado una variable llamada movie y le hemos\nasignado un objeto con 6 pares key-value. Para crear un objeto utilizamos las\nllaves {}, en lugar de los corchetes [] que usamos para crear arrays.\nDentro de las llaves colocamos los pares key-value separados por una coma.\nComo se muestra en el ejemplo, no necesitamos colocar una coma después del\núltimo par key-value.

\n

La sintaxis de cada par key-value es la siguiente:

\n
{ key : value }\n
\n

Cuando se crea un object, el key va antes de los dos puntos :, y el\nvalue va después. Los dos puntos actúan un poco como un signo igual (=); es\ndecir, los valores de la derecha se asignan a los nombres de la izquierda, al\nigual que cuando se crean variables.

\n

Keys (strings) con o sin comillas

\n

Como hemos visto, los keys son strings. Como muestra el ejemplo anterior, no\nes necesario colocar los keys entre comillas. Esto es porque Javascript sabe\nque los keys son strings. Sin embargo, es también válido colocar los keys\nentre comillas. Por ejemplo, el objeto a continuación también es válido:

\n
const person = {\n  age: 18,\n  name: 'Michelle',\n  friends: ['Alexandra', 'Ana'],\n};\n\n
\n

Si no colocamos las comillas, los keys deben seguir las mismas reglas de\nnombramiento de variables. Por ejemplo, no deben tener espacios. Pero si\ncolocamos los keys entre comillas, entonces sí podemos usar el nombre que\nqueramos. Por ejemplo, si queremos agregar un key del año en que salió la\npelícula ('year of release'), haríamos:

\n
movie = {\n  title: 'Back to the Future',\n  director: 'Robert Zemeckis',\n  stars: ['Michael J. Fox', 'Christopher Lloyd', 'Lea Thompson'],\n  plot: 'Marty McFly, a 17-year-old high school student, ' +\n    'is accidentally sent 30 years into the past in a time-traveling DeLorean ' +\n    'invented by his close friend, the maverick scientist Doc Brown.',\n  oscar: 1,\n  tags: ['Adventure', 'Comedy', 'Sci-Fi'],\n};\n\n
\n

Es importante resaltar que aunque los keys son siempre strings, los values\npueden ser cualquier valor JavaScript - inclusive pueden ser una variable que\ncontiene, o mejor dicho \"agarra\" (con sus tentáculos) un valor.

\n

Accediendo información de un object

\n

Podemos acceder a los valores de un object de dos maneras:

\n
    \n
  1. La primera es usando los corchetes [], tal como lo hacemos para los\narrays. La única diferencia es que, en lugar de usar el index (un\nnumber), utilizamos el key (un string), siempre entre comillas.
  2. \n
  3. La segunda es usando el punto (.) con el nombre del key inmediatamente\ndespués, sin comillas. A esto se le llama dot notation. Al igual que en\nla declaración de los keys, si utilizamos dot notation, el key debe\nobligatoriamente cumplir con las reglas de nombres válidos (por ejemplo, no\ndeben contener espacios).
  4. \n
\n

Veamos algunos ejemplos para aclarar cuándo se usa una o la otra:

\n
movie = {\n  title: 'Back to the Future',\n  director: 'Robert Zemeckis',\n  stars: ['Michael J. Fox', 'Christopher Lloyd', 'Lea Thompson'],\n};\n\nconsole.assert(movie['title'] === 'Back to the Future');\nconsole.assert(movie.title === movie['title']);\n\n
\n
let error = false;\ntry {\n  console.assert(movie[title] === 'Back to the Future');\n} catch (e) {\n  error = e.message;\n}\nconsole.assert(error === 'title is not defined');\n\n
\n
console.assert(movie.'title' === 'Back to the Future');\n// → Uncaught SyntaxError: Unexpected string\n
\n

Analicemos los dos errores:

\n
    \n
  1. Cuando utilizamos los corchetes sin comillas, JavaScript piensa que title\nes una variable y como en nuestro programa no existe una variable llamada\ntitle, se genera un error de referencia y JavaScript nos devuelve que title\nno está definida: Uncaught ReferenceError: title is not defined
  2. \n
  3. Cuando utilizamos dot notation con comillas, JavaScript nos devuleve un\nerror de sintaxis, dado que dot notation no se debe utilizar con un\nstring. Por eso nos devuelve: Uncaught SyntaxError: Unexpected string.
  4. \n
\n

¿Qué pasa cuando le pedimos un key que no tiene el object? JavaScript nos\ndevuelve undefined. Veamos un ejemplo:

\n
movie = {\n  title: 'Back to the Future',\n  director: 'Robert Zemeckis',\n  stars: ['Michael J. Fox', 'Christopher Lloyd', 'Lea Thompson'],\n  plot: 'Marty McFly, a 17-year-old high school student, ' +\n    'is accidentally sent 30 years into the past in a time-traveling DeLorean ' +\n    'invented by his close friend, the maverick scientist Doc Brown.',\n  oscar: 1,\n  tags: ['Adventure', 'Comedy', 'Sci-Fi'],\n};\n\nconsole.assert(movie['producer'] === undefined);\n\n
\n

¿Y cómo hacemos para obtener uno de los actores (stars) de la película? Para\nesto tenemos que entrar a la key 'stars' del object movie, que nos va a\ndevolver un array y luego acceder a uno de los elementos del array a través\nde los corchetes [] y el index. Veamos un ejemplo:

\n
movie = {\n  title: 'Back to the Future',\n  stars: ['Michael J. Fox', 'Christopher Lloyd', 'Lea Thompson'],\n};\n\nconsole.assert(movie.stars[0] === 'Michael J. Fox');\nconsole.assert(movie['stars'][1] === 'Christopher Lloyd');\nconsole.assert(movie.stars[2] === 'Lea Thompson');\n\n
\n

Fíjate que hemos usado movie.stars y movie['stars'] para hacer énfasis de\nque ambas maneras funcionan, como parte de la experiencia educativa. Pero\ncuidado, esto no es una buena práctica. Solo lo hemos hecho por dar el\nejemplo. Cuando escribamos programas, sean los retos de código, nuestros\nejercicios de clase o en proyectos personales, lo correcto es escoger una opción\ny ser consistente a lo largo del código. Recomendamos, en particular,\nmovie.stars ya que es más corto y fácil de leer. Recuerda que lo mismo sucede\ncon las comillas de los strings, se pueden usar simples o dobles, pero de\nmanera consistente.

\n

Definiendo o cambiando los elementos de un object

\n

Al igual que con los arrays, podemos añadir o cambiar los elementos de un\nobject utilizando los corchetes y keys o dot notation.

\n

Veamos un ejemplo que empieza con un object vacío y se le va añadiendo y\nmodificando elementos.

\n
/* creando un object vacío */\nconst student = {};\n\n/* añadiendo elementos al object con corchetes y comillas */\nstudent['name'] = 'Carolina';\nstudent['points'] = 2500;\n\n/* añadiendo elementos al object con dot notation */\nstudent.courses = ['Intro a JS', 'Intro a UX'];\nstudent.isActive = true;\n\n/* resucitamos nuestra función comparadora */\n\nconst equal = (one, other) => JSON.stringify(one) === JSON.stringify(other);\n\nconsole.assert(equal(\n  student,\n  {\n    name: 'Carolina',\n    points: 2500,\n    courses: ['Intro a JS', 'Intro a UX'],\n    isActive: true,\n  },\n));\n\n/* actualizando los puntos */\nstudent['points'] = 3500;\n\nconsole.assert(equal(\n  student,\n  {\n    name: 'Carolina',\n    points: 3500,\n    courses: ['Intro a JS', 'Intro a UX'],\n    isActive: true,\n  },\n));\n\n
\n

A continuación Michelle nos explica los conceptos principales de objects con\nun ejemplo:

\n

\"ejemplo

" + "body": "

Objetivos de Aprendizaje

\n
    \n
  • Aprender qué son objects y para qué sirven
  • \n
  • Aprender a crear, acceder y modificar la información de un object
  • \n
  • Entender la diferencia entre un array y un object
  • \n
\n
\n

El texto a continuación se basa en gran medida, con ciertos ajustes, en el\ncapítulo 4 de Eloquent JavaScript,de Marijn\nHaverbeke, 2014. Traducción en Español\ndisponible gracias a hectorip, y del capítulo 3\nde JavaScript for kids,\nNick Morgan, 2015.

\n
\n

¿Qué es un object en JavaScript?

\n

Los objects en JavaScript son muy similares a los arrays, pero con dos\nimportantes diferencias:

\n
    \n
  1. \n

    Como hemos visto, para acceder a información dentro de un array utilizamos\nun número correspondiente al index; es decir, la posición en la que se\nubica el valor. Los objects, por su parte, utilizan strings en lugar de\nnúmeros para acceder a los diferentes elementos. Estos strings se denominan\nkeys (llaves) o propiedades, y los elementos a los que apuntan son llamados\nvalores. Juntas, estas piezas de información se llaman pares key-value.

    \n
  2. \n
  3. \n

    Dado que en los arrays se requiere del index para acceder a la\ninformación, es importante mantener un determinado orden de los valores. En\nel caso de los objects los pares key-value de información pueden estar en\ncualquier orden.

    \n
  4. \n
\n

Mientras que los arrays se utilizan sobre todo para representar listas de\ncosas múltiples, los objetos son a menudo usado para representar cosas simples\npero con múltiples características, o atributos. Por ejemplo, si quisiéramos\nagrupar los títulos de nuestras películas preferidas, utilizaríamos un array,\nasí:

\n
const favoriteMovies = [\n  'The Big Fish',\n  'The Lord of the Rings',\n  'The Empire Strikes Back',\n  'The Artist',\n  'The Godfather',\n  'Back to the Future',\n];\n\n
\n

¿Pero qué sucede si quisiéramos almacenar diferentes piezas de información sobre\nuna misma película? Aquí es donde entra la utilidad de un object.

\n

Creando Objetos

\n

Almacenemos diferentes piezas de información de la película Back to the Future\nen un solo lugar, por medio de un object:

\n
let movie = {\n  title: 'Back to the Future',\n  director: 'Robert Zemeckis',\n  stars: ['Michael J. Fox', 'Christopher Lloyd', 'Lea Thompson'],\n  plot: 'Marty McFly, a 17-year-old high school student, ' +\n    'is accidentally sent 30 years into the past in a time-traveling DeLorean ' +\n    'invented by his close friend, the maverick scientist Doc Brown.',\n  oscar: 1,\n  tags: ['Adventure', 'Comedy', 'Sci-Fi'],\n};\n\n
\n

En el ejemplo anterior hemos creado una variable llamada movie y le hemos\nasignado un objeto con 6 pares key-value. Para crear un objeto utilizamos las\nllaves {}, en lugar de los corchetes [] que usamos para crear arrays.\nDentro de las llaves colocamos los pares key-value separados por una coma.\nComo se muestra en el ejemplo, no necesitamos colocar una coma después del\núltimo par key-value.

\n

La sintaxis de cada par key-value es la siguiente:

\n
{ key : value }\n
\n

Cuando se crea un object, el key va antes de los dos puntos :, y el\nvalue va después. Los dos puntos actúan un poco como un signo igual (=); es\ndecir, los valores de la derecha se asignan a los nombres de la izquierda, al\nigual que cuando se crean variables.

\n

Keys (strings) con o sin comillas

\n

Como hemos visto, los keys son strings. Como muestra el ejemplo anterior, no\nes necesario colocar los keys entre comillas. Esto es porque Javascript sabe\nque los keys son strings. Sin embargo, es también válido colocar los keys\nentre comillas. Por ejemplo, el objeto a continuación también es válido:

\n
const person = {\n  age: 18,\n  name: 'Michelle',\n  friends: ['Alexandra', 'Ana'],\n};\n\n
\n

Si no colocamos las comillas, los keys deben seguir las mismas reglas de\nnombramiento de variables. Por ejemplo, no deben tener espacios. Pero si\ncolocamos los keys entre comillas, entonces sí podemos usar el nombre que\nqueramos. Por ejemplo, si queremos agregar un key del año en que salió la\npelícula ('year of release'), haríamos:

\n
movie = {\n  title: 'Back to the Future',\n  director: 'Robert Zemeckis',\n  stars: ['Michael J. Fox', 'Christopher Lloyd', 'Lea Thompson'],\n  plot: 'Marty McFly, a 17-year-old high school student, ' +\n    'is accidentally sent 30 years into the past in a time-traveling DeLorean ' +\n    'invented by his close friend, the maverick scientist Doc Brown.',\n  oscar: 1,\n  tags: ['Adventure', 'Comedy', 'Sci-Fi'],\n};\n\n
\n

Es importante resaltar que aunque los keys son siempre strings, los values\npueden ser cualquier valor JavaScript - inclusive pueden ser una variable que\ncontiene, o mejor dicho \"agarra\" (con sus tentáculos) un valor.

\n

Accediendo información de un object

\n

Podemos acceder a los valores de un object de dos maneras:

\n
    \n
  1. La primera es usando los corchetes [], tal como lo hacemos para los\narrays. La única diferencia es que, en lugar de usar el index (un\nnumber), utilizamos el key (un string), siempre entre comillas.
  2. \n
  3. La segunda es usando el punto (.) con el nombre del key inmediatamente\ndespués, sin comillas. A esto se le llama dot notation. Al igual que en\nla declaración de los keys, si utilizamos dot notation, el key debe\nobligatoriamente cumplir con las reglas de nombres válidos (por ejemplo, no\ndeben contener espacios).
  4. \n
\n

Veamos algunos ejemplos para aclarar cuándo se usa una o la otra:

\n
movie = {\n  title: 'Back to the Future',\n  director: 'Robert Zemeckis',\n  stars: ['Michael J. Fox', 'Christopher Lloyd', 'Lea Thompson'],\n};\n\nconsole.assert(movie['title'] === 'Back to the Future');\nconsole.assert(movie.title === movie['title']);\n\n
\n
let error = false;\ntry {\n  console.assert(movie[title] === 'Back to the Future');\n} catch (e) {\n  error = e.message;\n}\nconsole.assert(error === 'title is not defined');\n\n
\n
console.assert(movie.'title' === 'Back to the Future');\n// → Uncaught SyntaxError: Unexpected string\n
\n

Analicemos los dos errores:

\n
    \n
  1. Cuando utilizamos los corchetes sin comillas, JavaScript piensa que title\nes una variable y como en nuestro programa no existe una variable llamada\ntitle, se genera un error de referencia y JavaScript nos devuelve que title\nno está definida: Uncaught ReferenceError: title is not defined
  2. \n
  3. Cuando utilizamos dot notation con comillas, JavaScript nos devuleve un\nerror de sintaxis, dado que dot notation no se debe utilizar con un\nstring. Por eso nos devuelve: Uncaught SyntaxError: Unexpected string.
  4. \n
\n

¿Qué pasa cuando le pedimos un key que no tiene el object? JavaScript nos\ndevuelve undefined. Veamos un ejemplo:

\n
movie = {\n  title: 'Back to the Future',\n  director: 'Robert Zemeckis',\n  stars: ['Michael J. Fox', 'Christopher Lloyd', 'Lea Thompson'],\n  plot: 'Marty McFly, a 17-year-old high school student, ' +\n    'is accidentally sent 30 years into the past in a time-traveling DeLorean ' +\n    'invented by his close friend, the maverick scientist Doc Brown.',\n  oscar: 1,\n  tags: ['Adventure', 'Comedy', 'Sci-Fi'],\n};\n\nconsole.assert(movie['producer'] === undefined);\n\n
\n

¿Y cómo hacemos para obtener uno de los actores (stars) de la película? Para\nesto tenemos que entrar a la key 'stars' del object movie, que nos va a\ndevolver un array y luego acceder a uno de los elementos del array a través\nde los corchetes [] y el index. Veamos un ejemplo:

\n
movie = {\n  title: 'Back to the Future',\n  stars: ['Michael J. Fox', 'Christopher Lloyd', 'Lea Thompson'],\n};\n\nconsole.assert(movie.stars[0] === 'Michael J. Fox');\nconsole.assert(movie['stars'][1] === 'Christopher Lloyd');\nconsole.assert(movie.stars[2] === 'Lea Thompson');\n\n
\n

Fíjate que hemos usado movie.stars y movie['stars'] para hacer énfasis de\nque ambas maneras funcionan, como parte de la experiencia educativa. Pero\ncuidado, esto no es una buena práctica. Solo lo hemos hecho por dar el\nejemplo. Cuando escribamos programas, sean los retos de código, nuestros\nejercicios de clase o en proyectos personales, lo correcto es escoger una opción\ny ser consistente a lo largo del código. Recomendamos, en particular,\nmovie.stars ya que es más corto y fácil de leer. Recuerda que lo mismo sucede\ncon las comillas de los strings, se pueden usar simples o dobles, pero de\nmanera consistente.

\n

Definiendo o cambiando los elementos de un object

\n

Al igual que con los arrays, podemos añadir o cambiar los elementos de un\nobject utilizando los corchetes y keys o dot notation.

\n

Veamos un ejemplo que empieza con un object vacío y se le va añadiendo y\nmodificando elementos.

\n
/* creando un object vacío */\nconst student = {};\n\n/* añadiendo elementos al object con corchetes y comillas */\nstudent['name'] = 'Carolina';\nstudent['points'] = 2500;\n\n/* añadiendo elementos al object con dot notation */\nstudent.courses = ['Intro a JS', 'Intro a UX'];\nstudent.isActive = true;\n\n/* resucitamos nuestra función comparadora */\n\nconst equal = (one, other) => JSON.stringify(one) === JSON.stringify(other);\n\nconsole.assert(equal(\n  student,\n  {\n    name: 'Carolina',\n    points: 2500,\n    courses: ['Intro a JS', 'Intro a UX'],\n    isActive: true,\n  },\n));\n\n/* actualizando los puntos */\nstudent['points'] = 3500;\n\nconsole.assert(equal(\n  student,\n  {\n    name: 'Carolina',\n    points: 3500,\n    courses: ['Intro a JS', 'Intro a UX'],\n    isActive: true,\n  },\n));\n\n
\n

A continuación Michelle nos explica los conceptos principales de objects con\nun ejemplo:

\n

" }, "pt": { "title": "Objetos em JavaScript", - "body": "

Objetivos de Aprendizagem

\n
    \n
  • Aprender o que são objects e para que servem
  • \n
  • Aprender a criar, acessar e modificar as informações de um object
  • \n
  • Entender a diferença entre um array e umobject
  • \n
\n
\n

O texto a seguir se baseia em grande medida, com alguns ajustes, ao capítulo 4\ndo Eloquent JavaScript,de Marijn Haverbeke,\n2014. Tradução em\nPortuguês,\ne ao capítulo 3 do JavaScript for\nkids,\nNick Morgan, 2015;

\n
\n

O que é um objeto em JavaScript?

\n

Os objetos em JavaScript são muito similares ao arrays, mas com alguns\ndiferenciais:

\n
    \n
  1. Como vimos, para acessar informações dentro de um array, nós usamos um\nnúmero correspondente ao índice; isto é, a posição em que o valor está\nlocalizado. Os objects, por outro lado, utilizam stringsao invés de\nnúmeros para acessar os diferentes elementos. Essas strings são chamadas de\nchaves (keys) ou propriedades, e os elementos para os quais eles apontam\nsão chamados de valores (values). Juntas, essas informações são\nchamadas de pares de chave-valor.
  2. \n
  3. Como nos arrays é necessário o índice para acessar informações, é\nimportante manter uma determinada ordem de seus valores. No caso dos pares\nde chave-valor, as informações podem estar em qualquer ordem.
  4. \n
\n

Enquanto os arrays são usados ​​principalmente para representar listas de\nvárias coisas, os objetos costumam ser usados ​​para representar elementos\nsimples, mas com várias características ou atributos. Por exemplo, se\nquiséssemos agrupar os títulos dos nossos filmes favoritos, usaríamos um array\nassim:

\n
let favoriteMovies = [\n  'The Big Fish',\n  'The Lord of the Rings',\n  'The Empire Strikes Back',\n  'The Artist',\n  'The Godfather',\n  'Back to the Future'\n];\n
\n

Mas o que aconteceria se quiséssemos armazenar diferentes informações sobre o\nmesmo filme? É aí que entra a utilidade de um object.

\n

Criando Objetos

\n

Nós armazenamos diferentes informações sobre o filme De Volta para o Futuro em\num só lugar, por meio de umobject:

\n
let movie = {\n  title: 'Back to the Future',\n  director: 'Robert Zemeckis',\n  stars: ['Michael J. Fox', 'Christopher Lloyd', 'Lea Thompson'],\n  plot: 'Marty McFly, a 17-year-old high school student, is accidentally sent 30 years into the past in a time-traveling DeLorean invented by his close friend, the maverick scientist Doc Brown.',\n  oscar: 1,\n  tags: ['Adventure', 'Comedy', 'Sci-Fi']\n};\n
\n

No exemplo anterior, criamos uma variável chamada moviee atribuímos a ela um\nobjeto com seis pares de chave-valor. Para criar um objeto, usamos as chaves\n{} ao invés dos colchetes [] que usamos para criar arrays. Dentro das\nchaves, colocamos os pares de chave-valor separados por uma vírgula. Conforme\nmostrado no exemplo, não precisamos colocar uma vírgula após o último par de\nchave-valor.

\n

A sintaxe de cada par de valores-chave é a seguinte:

\n
{chave: valor}\n
\n

Quando criamos um object, a chave (key) é colocada antes dos dois pontos\n:, e o valor (value), depois. Os dois pontos agem um pouco como um sinal\nde igual ( =), isto é, os valores à direita são atribuídos aos nomes à\nesquerda, assim como quando variáveis ​​são criadas.

\n

Chaves (strings) com ou sem aspas

\n

Como vimos, as chaves são strings. Como mostra o exemplo anterior, não é\nnecessário colocar as chaves entre aspas. Isso ocorre porque o JavaScript sabe\nque as chaves são strings. No entanto, também é válido colocar as chaves entre\naspas. Por exemplo, o objeto abaixo também é válido:

\n
const person = {\n  'age': 18,\n  'name': 'Michelle',\n  'friends': ['Alexandra','Ana']\n  };\n
\n

Se não colocarmos as aspas, as chaves devem seguir as mesmas regras para nomear\nvariáveis. Por exemplo, elas não devem ter espaços. Mas se colocarmos as chaves\nentre aspas, podemos usar o nome que quisermos. Por exemplo, se quisermos\nadicionar uma chave do ano em que o filme saiu (\"ano de lançamento\"),\nfaríamos:

\n
movie = {\n  title: 'Back to the Future',\n  director: 'Robert Zemeckis',\n  stars: ['Michael J. Fox', 'Christopher Lloyd', 'Lea Thompson'],\n  'year of release': 1984,\n  plot: 'Marty McFly, a 17-year-old high school student, is accidentally sent 30 years into the past in a time-traveling DeLorean invented by his close friend, the maverick scientist Doc Brown.',\n  oscar: 1,\n  tags: ['Adventure', 'Comedy', 'Sci-Fi'],\n  'other awards': ['best sound']\n  };\n
\n

É importante notar que, embora as keys sejam sempre strings, os values\npodem ser qualquer valor JavaScript - eles podem até ser uma variável que\ncontenha, ou melhor, \"agarre\" (com seus tentáculos) um valor.

\n

Acessando informações de um objeto

\n

Podemos acessar os valores de um objectde duas maneiras:

\n
    \n
  1. O primeiro é usar os colchetes [], assim como fazemos com arrays. A única\ndiferença é que, em vez de usar o índice (um number), usamos a chave\n(uma string), sempre entre aspas.
  2. \n
  3. O segundo é usando o ponto ( .) com o nome da chave imediatamente depois,\nsem aspas. Isso é chamado notação de ponto (dot notation). Como na\ndeclaração das chaves, se usarmos notação de ponto, a chave deve obedecer às\nregras de nomes válidos (por exemplo, elas não devem conter espaços).
  4. \n
\n

Vamos ver alguns exemplos para esclarecer quando um ou outro é usado:

\n
movie = {\n  title: 'Back to the Future',\n  director: 'Robert Zemeckis',\n  stars: ['Michael J. Fox', 'Christopher Lloyd', 'Lea Thompson'],\n};\n\nconsole.assert(movie['title'] === 'Back to the Future');\nconsole.assert(movie.title === movie['title']);\n\n
\n
let error = false;\ntry {\n  console.assert(movie[title] === 'Back to the Future');\n} catch (e) {\n  error = e.message;\n}\nconsole.assert(error === 'title is not defined');\n\n
\n
console.assert(movie.'title' === 'Back to the Future');\n// → Uncaught SyntaxError: Unexpected string\n
\n

Vamos analisar os dois erros:

\n
    \n
  1. Quando usamos colchetes sem aspas, o JavaScript acha que o título é uma\nvariável e como não há uma variável chamada titulo no nosso programa, um erro\nde referência é gerado e o JavaScript avisa que esse título não está\ndefinido:Uncaught ReferenceError: titulo is not defined
  2. \n
  3. Quando usado dot notation com aspas, o JavaScript devolve um erro de\nsintaxe, uma vez que dot notationnão deve ser usada com string. Por isso,\ndevolve-nos: Uncaught SyntaxError: Unexpected string.
  4. \n
\n

O que acontece quando pedimos uma chave que o object não tem? JavaScript nos\nretorna undefined. Vamos ver um exemplo:

\n
movie = {\n  title: 'Back to the Future',\n  director: 'Robert Zemeckis',\n  stars: ['Michael J. Fox', 'Christopher Lloyd', 'Lea Thompson'],\n  plot: 'Marty McFly, a 17-year-old high school student, ' +\n    'is accidentally sent 30 years into the past in a time-traveling DeLorean ' +\n    'invented by his close friend, the maverick scientist Doc Brown.',\n  oscar: 1,\n  tags: ['Adventure', 'Comedy', 'Sci-Fi'],\n};\n\nconsole.assert(movie['producer'] === undefined);\n
\n

E como conseguimos um dos atores (stars) do filme? Para isso, temos que\nacessar a chave 'stars' do objeto movie, que devolverá um array, para em\nseguida acessar um dos elementos através de colchetes [] e o índice. Vejamos\num exemplo:

\n
movie = {\n  title: 'Back to the Future',\n  stars: ['Michael J. Fox', 'Christopher Lloyd', 'Lea Thompson'],\n};\n\nconsole.assert(movie.stars[0] === 'Michael J. Fox');\nconsole.assert(movie['stars'][1] === 'Christopher Lloyd');\nconsole.assert(movie.stars[2] === 'Lea Thompson');\n
\n

Observe que usamos movie.starse movie['stars']para enfatizar que as duas\nformas funcionam, por motivos didáticos. Mas tenha cuidado, isso não é uma\nboa prática. Nós só fizemos isso para dar o exemplo. Quando escrevemos\nprogramas, seja nos desafios de código, nossos exercícios de classe ou projetos\npessoais, a coisa certa a fazer é escolher uma opção e ser consistente em todo o\ncódigo. Recomendamos, em particular, movie.starsuma vez que é mais curto e\nmais fácil de ler. Lembre-se que a mesma coisa acontece com as aspas das\nstrings: você pode usar simples ou dupla, mas de forma consistente.

\n

Definindo ou alterando os elementos de um objeto

\n

Assim como com arrays, podemos adicionar ou alterar os elementos de um\nobjectusando os colchetes e chaves ou notação de ponto.

\n

Vamos ver um exemplo que começa com um objectvazio e segue adicionando e\nmodificando elementos.

\n
/* criando um objeto vazio */\nconst student = {};\n\n/* adicionando elementos ao objeto */\nstudent['name'] = 'Carolina';\nstudent['points'] = 2500;\n\n/* adicionando elementos ao objeto */\nstudent.courses = ['Intro a JS', 'Intro a UX'];\nstudent.isActive = true;\n\n/* ressucitamos a nossa função comparadora */\n\nconst equal = (one, other) => JSON.stringify(one) === JSON.stringify(other);\n\nconsole.assert(equal(\n  student,\n  {\n    name: 'Carolina',\n    points: 2500,\n    courses: ['Intro a JS', 'Intro a UX'],\n    isActive: true,\n  },\n));\n\n/* atualiando os pontos */\nstudent['points'] = 3500;\n\nconsole.assert(equal(\n  student,\n  {\n    name: 'Carolina',\n    points: 3500,\n    courses: ['Intro a JS', 'Intro a UX'],\n    isActive: true,\n  },\n));\n\n
\n

A seguir Daniel nos explica os conceitos principais de objects com um\nexemplo:

\n

\"Arrays\"

" + "body": "

Objetivos de Aprendizagem

\n
    \n
  • Aprender o que são objects e para que servem
  • \n
  • Aprender a criar, acessar e modificar as informações de um object
  • \n
  • Entender a diferença entre um array e umobject
  • \n
\n
\n

O texto a seguir se baseia em grande medida, com alguns ajustes, ao capítulo 4\ndo Eloquent JavaScript,de Marijn Haverbeke,\n2014. Tradução em\nPortuguês,\ne ao capítulo 3 do JavaScript for\nkids,\nNick Morgan, 2015;

\n
\n

O que é um objeto em JavaScript?

\n

Os objetos em JavaScript são muito similares ao arrays, mas com alguns\ndiferenciais:

\n
    \n
  1. Como vimos, para acessar informações dentro de um array, nós usamos um\nnúmero correspondente ao índice; isto é, a posição em que o valor está\nlocalizado. Os objects, por outro lado, utilizam stringsao invés de\nnúmeros para acessar os diferentes elementos. Essas strings são chamadas de\nchaves (keys) ou propriedades, e os elementos para os quais eles apontam\nsão chamados de valores (values). Juntas, essas informações são\nchamadas de pares de chave-valor.
  2. \n
  3. Como nos arrays é necessário o índice para acessar informações, é\nimportante manter uma determinada ordem de seus valores. No caso dos pares\nde chave-valor, as informações podem estar em qualquer ordem.
  4. \n
\n

Enquanto os arrays são usados ​​principalmente para representar listas de\nvárias coisas, os objetos costumam ser usados ​​para representar elementos\nsimples, mas com várias características ou atributos. Por exemplo, se\nquiséssemos agrupar os títulos dos nossos filmes favoritos, usaríamos um array\nassim:

\n
let favoriteMovies = [\n  'The Big Fish',\n  'The Lord of the Rings',\n  'The Empire Strikes Back',\n  'The Artist',\n  'The Godfather',\n  'Back to the Future'\n];\n
\n

Mas o que aconteceria se quiséssemos armazenar diferentes informações sobre o\nmesmo filme? É aí que entra a utilidade de um object.

\n

Criando Objetos

\n

Nós armazenamos diferentes informações sobre o filme De Volta para o Futuro em\num só lugar, por meio de umobject:

\n
let movie = {\n  title: 'Back to the Future',\n  director: 'Robert Zemeckis',\n  stars: ['Michael J. Fox', 'Christopher Lloyd', 'Lea Thompson'],\n  plot: 'Marty McFly, a 17-year-old high school student, is accidentally sent 30 years into the past in a time-traveling DeLorean invented by his close friend, the maverick scientist Doc Brown.',\n  oscar: 1,\n  tags: ['Adventure', 'Comedy', 'Sci-Fi']\n};\n
\n

No exemplo anterior, criamos uma variável chamada moviee atribuímos a ela um\nobjeto com seis pares de chave-valor. Para criar um objeto, usamos as chaves\n{} ao invés dos colchetes [] que usamos para criar arrays. Dentro das\nchaves, colocamos os pares de chave-valor separados por uma vírgula. Conforme\nmostrado no exemplo, não precisamos colocar uma vírgula após o último par de\nchave-valor.

\n

A sintaxe de cada par de valores-chave é a seguinte:

\n
{chave: valor}\n
\n

Quando criamos um object, a chave (key) é colocada antes dos dois pontos\n:, e o valor (value), depois. Os dois pontos agem um pouco como um sinal\nde igual ( =), isto é, os valores à direita são atribuídos aos nomes à\nesquerda, assim como quando variáveis ​​são criadas.

\n

Chaves (strings) com ou sem aspas

\n

Como vimos, as chaves são strings. Como mostra o exemplo anterior, não é\nnecessário colocar as chaves entre aspas. Isso ocorre porque o JavaScript sabe\nque as chaves são strings. No entanto, também é válido colocar as chaves entre\naspas. Por exemplo, o objeto abaixo também é válido:

\n
const person = {\n  'age': 18,\n  'name': 'Michelle',\n  'friends': ['Alexandra','Ana']\n  };\n
\n

Se não colocarmos as aspas, as chaves devem seguir as mesmas regras para nomear\nvariáveis. Por exemplo, elas não devem ter espaços. Mas se colocarmos as chaves\nentre aspas, podemos usar o nome que quisermos. Por exemplo, se quisermos\nadicionar uma chave do ano em que o filme saiu (\"ano de lançamento\"),\nfaríamos:

\n
movie = {\n  title: 'Back to the Future',\n  director: 'Robert Zemeckis',\n  stars: ['Michael J. Fox', 'Christopher Lloyd', 'Lea Thompson'],\n  'year of release': 1984,\n  plot: 'Marty McFly, a 17-year-old high school student, is accidentally sent 30 years into the past in a time-traveling DeLorean invented by his close friend, the maverick scientist Doc Brown.',\n  oscar: 1,\n  tags: ['Adventure', 'Comedy', 'Sci-Fi'],\n  'other awards': ['best sound']\n  };\n
\n

É importante notar que, embora as keys sejam sempre strings, os values\npodem ser qualquer valor JavaScript - eles podem até ser uma variável que\ncontenha, ou melhor, \"agarre\" (com seus tentáculos) um valor.

\n

Acessando informações de um objeto

\n

Podemos acessar os valores de um objectde duas maneiras:

\n
    \n
  1. O primeiro é usar os colchetes [], assim como fazemos com arrays. A única\ndiferença é que, em vez de usar o índice (um number), usamos a chave\n(uma string), sempre entre aspas.
  2. \n
  3. O segundo é usando o ponto ( .) com o nome da chave imediatamente depois,\nsem aspas. Isso é chamado notação de ponto (dot notation). Como na\ndeclaração das chaves, se usarmos notação de ponto, a chave deve obedecer às\nregras de nomes válidos (por exemplo, elas não devem conter espaços).
  4. \n
\n

Vamos ver alguns exemplos para esclarecer quando um ou outro é usado:

\n
movie = {\n  title: 'Back to the Future',\n  director: 'Robert Zemeckis',\n  stars: ['Michael J. Fox', 'Christopher Lloyd', 'Lea Thompson'],\n};\n\nconsole.assert(movie['title'] === 'Back to the Future');\nconsole.assert(movie.title === movie['title']);\n\n
\n
let error = false;\ntry {\n  console.assert(movie[title] === 'Back to the Future');\n} catch (e) {\n  error = e.message;\n}\nconsole.assert(error === 'title is not defined');\n\n
\n
console.assert(movie.'title' === 'Back to the Future');\n// → Uncaught SyntaxError: Unexpected string\n
\n

Vamos analisar os dois erros:

\n
    \n
  1. Quando usamos colchetes sem aspas, o JavaScript acha que o título é uma\nvariável e como não há uma variável chamada titulo no nosso programa, um erro\nde referência é gerado e o JavaScript avisa que esse título não está\ndefinido:Uncaught ReferenceError: titulo is not defined
  2. \n
  3. Quando usado dot notation com aspas, o JavaScript devolve um erro de\nsintaxe, uma vez que dot notationnão deve ser usada com string. Por isso,\ndevolve-nos: Uncaught SyntaxError: Unexpected string.
  4. \n
\n

O que acontece quando pedimos uma chave que o object não tem? JavaScript nos\nretorna undefined. Vamos ver um exemplo:

\n
movie = {\n  title: 'Back to the Future',\n  director: 'Robert Zemeckis',\n  stars: ['Michael J. Fox', 'Christopher Lloyd', 'Lea Thompson'],\n  plot: 'Marty McFly, a 17-year-old high school student, ' +\n    'is accidentally sent 30 years into the past in a time-traveling DeLorean ' +\n    'invented by his close friend, the maverick scientist Doc Brown.',\n  oscar: 1,\n  tags: ['Adventure', 'Comedy', 'Sci-Fi'],\n};\n\nconsole.assert(movie['producer'] === undefined);\n
\n

E como conseguimos um dos atores (stars) do filme? Para isso, temos que\nacessar a chave 'stars' do objeto movie, que devolverá um array, para em\nseguida acessar um dos elementos através de colchetes [] e o índice. Vejamos\num exemplo:

\n
movie = {\n  title: 'Back to the Future',\n  stars: ['Michael J. Fox', 'Christopher Lloyd', 'Lea Thompson'],\n};\n\nconsole.assert(movie.stars[0] === 'Michael J. Fox');\nconsole.assert(movie['stars'][1] === 'Christopher Lloyd');\nconsole.assert(movie.stars[2] === 'Lea Thompson');\n
\n

Observe que usamos movie.starse movie['stars']para enfatizar que as duas\nformas funcionam, por motivos didáticos. Mas tenha cuidado, isso não é uma\nboa prática. Nós só fizemos isso para dar o exemplo. Quando escrevemos\nprogramas, seja nos desafios de código, nossos exercícios de classe ou projetos\npessoais, a coisa certa a fazer é escolher uma opção e ser consistente em todo o\ncódigo. Recomendamos, em particular, movie.starsuma vez que é mais curto e\nmais fácil de ler. Lembre-se que a mesma coisa acontece com as aspas das\nstrings: você pode usar simples ou dupla, mas de forma consistente.

\n

Definindo ou alterando os elementos de um objeto

\n

Assim como com arrays, podemos adicionar ou alterar os elementos de um\nobjectusando os colchetes e chaves ou notação de ponto.

\n

Vamos ver um exemplo que começa com um objectvazio e segue adicionando e\nmodificando elementos.

\n
/* criando um objeto vazio */\nconst student = {};\n\n/* adicionando elementos ao objeto */\nstudent['name'] = 'Carolina';\nstudent['points'] = 2500;\n\n/* adicionando elementos ao objeto */\nstudent.courses = ['Intro a JS', 'Intro a UX'];\nstudent.isActive = true;\n\n/* ressucitamos a nossa função comparadora */\n\nconst equal = (one, other) => JSON.stringify(one) === JSON.stringify(other);\n\nconsole.assert(equal(\n  student,\n  {\n    name: 'Carolina',\n    points: 2500,\n    courses: ['Intro a JS', 'Intro a UX'],\n    isActive: true,\n  },\n));\n\n/* atualiando os pontos */\nstudent['points'] = 3500;\n\nconsole.assert(equal(\n  student,\n  {\n    name: 'Carolina',\n    points: 3500,\n    courses: ['Intro a JS', 'Intro a UX'],\n    isActive: true,\n  },\n));\n\n
\n

A seguir Daniel nos explica os conceitos principais de objects com um\nexemplo:

\n

" } } }, @@ -1069,11 +1069,11 @@ "intl": { "es": { "title": "Combinando arrays con objects", - "body": "

Objetivos de Aprendizaje

\n
    \n
  • Entender, por medio de un ejemplo, cómo combinar las dos estructuras de datos\naprendidas en esta unidad: arrays y objects
  • \n
\n
\n

El texto a continuación se basa en gran medida, con ciertos ajustes, en 4 de\nJavaScript for kids,\nNick Morgan, 2015.

\n
\n

Combinando arrays con objects

\n

Ya hemos visto el caso de tener un array como valor de una propiedad\ndentro de un object (por ejemplo, un array de los protagonistas de un\nobject movie), pero otra combinación bastante común para agrupar data es\ntener un array de objects.Veamos un ejemplo:

\n

Imaginemos que tenemos data de 3 estudiantes de Laboratoria y queremos\nestructurarla en nuestro programa. Para cada estudiante, tenemos cierta data: su\nnombre, sus puntos, los cursos que ha completado y si la estudiante ha\nabandonado o sigue cursando el programa.

\n

Una manera de estructurar esta data sería crear un object para cada estudiante\n, cada uno con su información, y luego un array que contenga los 3 objects.

\n

Veamos:

\n
\nconst michelle = {\n  name: 'Michelle',\n  points: 2000,\n  isActive: true,\n  courses: ['Intro JS', 'JS avanzado', 'JS master']\n};\n\nconst alexandra = {\n  name: 'Alexandra',\n  points: 4100,\n  isActive: true,\n  courses: ['Intro JS', 'Intro UX', 'UX master']\n};\n\nconst andrea = {\n  name: 'Andrea',\n  points: 800,\n  isActive: false,\n  courses: ['Intro JS', 'JS avanzado']\n};\n\nconst students = [michelle, alexandra, andrea];\n\n
\n

Fíjate que para cada propiedad de los objects hemos utilizado un tipo de dato\ndiferente:

\n
    \n
  • El nombre es un string
  • \n
  • Los puntos son un number
  • \n
  • Para saber si está estudiando o ha abandonado el programa escogimos un\nboolean, donde true significa que está activa (es decir, estudiando)
  • \n
  • Los cursos que ha completado son un array.
  • \n
\n

Qué lindo cuando ya vemos todo lo que hemos aprendido aplicado en un solo bloque\nde código, ¿no? :) Lo mejor de todo es que con esta estrutura podemos acceder a\nla data de manera sencilla.

\n

A continuación Michelle te explica cómo utilizar funciones, estructuras repetitivas y estructuras condicionales para imprimir en la consola:

\n
    \n
  1. Los nombres de todas las estudiantes activas
  2. \n
  3. Los puntos totales de la clase
  4. \n
  5. Los nombres de las estudiantes que han llevado el curso de 'JS avanzado'
  6. \n
\n

\"video\"

" + "body": "

Objetivos de Aprendizaje

\n
    \n
  • Entender, por medio de un ejemplo, cómo combinar las dos estructuras de datos\naprendidas en esta unidad: arrays y objects
  • \n
\n
\n

El texto a continuación se basa en gran medida, con ciertos ajustes, en 4 de\nJavaScript for kids,\nNick Morgan, 2015.

\n
\n

Combinando arrays con objects

\n

Ya hemos visto el caso de tener un array como valor de una propiedad\ndentro de un object (por ejemplo, un array de los protagonistas de un\nobject movie), pero otra combinación bastante común para agrupar data es\ntener un array de objects.Veamos un ejemplo:

\n

Imaginemos que tenemos data de 3 estudiantes de Laboratoria y queremos\nestructurarla en nuestro programa. Para cada estudiante, tenemos cierta data: su\nnombre, sus puntos, los cursos que ha completado y si la estudiante ha\nabandonado o sigue cursando el programa.

\n

Una manera de estructurar esta data sería crear un object para cada estudiante\n, cada uno con su información, y luego un array que contenga los 3 objects.

\n

Veamos:

\n
\nconst michelle = {\n  name: 'Michelle',\n  points: 2000,\n  isActive: true,\n  courses: ['Intro JS', 'JS avanzado', 'JS master']\n};\n\nconst alexandra = {\n  name: 'Alexandra',\n  points: 4100,\n  isActive: true,\n  courses: ['Intro JS', 'Intro UX', 'UX master']\n};\n\nconst andrea = {\n  name: 'Andrea',\n  points: 800,\n  isActive: false,\n  courses: ['Intro JS', 'JS avanzado']\n};\n\nconst students = [michelle, alexandra, andrea];\n\n
\n

Fíjate que para cada propiedad de los objects hemos utilizado un tipo de dato\ndiferente:

\n
    \n
  • El nombre es un string
  • \n
  • Los puntos son un number
  • \n
  • Para saber si está estudiando o ha abandonado el programa escogimos un\nboolean, donde true significa que está activa (es decir, estudiando)
  • \n
  • Los cursos que ha completado son un array.
  • \n
\n

Qué lindo cuando ya vemos todo lo que hemos aprendido aplicado en un solo bloque\nde código, ¿no? :) Lo mejor de todo es que con esta estrutura podemos acceder a\nla data de manera sencilla.

\n

A continuación Michelle te explica cómo utilizar funciones, estructuras repetitivas y estructuras condicionales para imprimir en la consola:

\n
    \n
  1. Los nombres de todas las estudiantes activas
  2. \n
  3. Los puntos totales de la clase
  4. \n
  5. Los nombres de las estudiantes que han llevado el curso de 'JS avanzado'
  6. \n
\n

" }, "pt": { "title": "Vetores e Objetos", - "body": "

Objetivos de Aprendizagem

\n
    \n
  • Entender, por meio de um exemplo, como combinar as duas estruturas de dados\nestudadas nesta unidade: array e object
  • \n
\n
\n

O texto abaixo é amplamente baseado, com alguns ajustes, em 4 de JavaScript for\nKids ,\nNick Morgan, 2015.

\n
\n

Combinando arrays com objects

\n

Já vimos o caso de ter um arraycomo valor de uma propriedade dentro de um\nobject (por exemplo, um array do elenco de um object movie), mas outra\ncombinação bem comum para agrupar dados é ter um array de objects. Vejamos\num exemplo:

\n

Imagine que temos dados de 3 estudantes da Laboratoria e queremos estruturá-los\nem nosso programa. Para cada aluna, temos os dados: seu nome, sua pontuação, os\ncursos que ela completou e se a aluna deixou ou continua com o programa.

\n

Uma maneira de estruturar esses dados seria criar um object para cada aluna,\ncada um com suas informações e, em seguida, um array que contenha todos os\ntrês objects.

\n

Vamos ver:

\n
\nconst michelle = {\n  name: 'Michelle',\n  points: 2000,\n  isActive: true,\n  courses: ['Intro JS', 'JS avanzado', 'JS master']\n};\n\nconst alexandra = {\n  name: 'Alexandra',\n  points: 4100,\n  isActive: true,\n  courses: ['Intro JS', 'Intro UX', 'UX master']\n};\n\nconst andrea = {\n  name: 'Andrea',\n  points: 800,\n  isActive: false,\n  courses: ['Intro JS', 'JS avanzado']\n};\n\nconst students = [michelle, alexandra, andrea];\n\n
\n

Observe que, para cada propriedade dos objects, usamos um tipo diferente de\ndados:

\n
    \n
  • O nome é um string
  • \n
  • Os pontos são um number
  • \n
  • Para descobrir se ela está estudando ou saiu do programa, escolhemos um\nboolean, onde true quer dizer que ela está ativa (ou seja, estudando)
  • \n
  • Os cursos que completou estão em um array.
  • \n
\n

Que legal quando vemos tudo o que aprendemos aplicado em um único bloco de\ncódigo, né? :) A melhor parte é que, com essa estrutura, podemos acessar os\ndados de maneira simples.

\n

Em seguida, Daniel dirá como usar funções, estruturas de repetição e estruturas condicionais para imprimir no console:

\n
    \n
  1. Os nomes de todas as alunas ativas
  2. \n
  3. O total de pontos da turma
  4. \n
  5. Os nomes das alunas que fizeram um determinado curso
  6. \n
\n

\"Vídeo

" + "body": "

Objetivos de Aprendizagem

\n
    \n
  • Entender, por meio de um exemplo, como combinar as duas estruturas de dados\nestudadas nesta unidade: array e object
  • \n
\n
\n

O texto abaixo é amplamente baseado, com alguns ajustes, em 4 de JavaScript for\nKids ,\nNick Morgan, 2015.

\n
\n

Combinando arrays com objects

\n

Já vimos o caso de ter um arraycomo valor de uma propriedade dentro de um\nobject (por exemplo, um array do elenco de um object movie), mas outra\ncombinação bem comum para agrupar dados é ter um array de objects. Vejamos\num exemplo:

\n

Imagine que temos dados de 3 estudantes da Laboratoria e queremos estruturá-los\nem nosso programa. Para cada aluna, temos os dados: seu nome, sua pontuação, os\ncursos que ela completou e se a aluna deixou ou continua com o programa.

\n

Uma maneira de estruturar esses dados seria criar um object para cada aluna,\ncada um com suas informações e, em seguida, um array que contenha todos os\ntrês objects.

\n

Vamos ver:

\n
\nconst michelle = {\n  name: 'Michelle',\n  points: 2000,\n  isActive: true,\n  courses: ['Intro JS', 'JS avanzado', 'JS master']\n};\n\nconst alexandra = {\n  name: 'Alexandra',\n  points: 4100,\n  isActive: true,\n  courses: ['Intro JS', 'Intro UX', 'UX master']\n};\n\nconst andrea = {\n  name: 'Andrea',\n  points: 800,\n  isActive: false,\n  courses: ['Intro JS', 'JS avanzado']\n};\n\nconst students = [michelle, alexandra, andrea];\n\n
\n

Observe que, para cada propriedade dos objects, usamos um tipo diferente de\ndados:

\n
    \n
  • O nome é um string
  • \n
  • Os pontos são um number
  • \n
  • Para descobrir se ela está estudando ou saiu do programa, escolhemos um\nboolean, onde true quer dizer que ela está ativa (ou seja, estudando)
  • \n
  • Os cursos que completou estão em um array.
  • \n
\n

Que legal quando vemos tudo o que aprendemos aplicado em um único bloco de\ncódigo, né? :) A melhor parte é que, com essa estrutura, podemos acessar os\ndados de maneira simples.

\n

Em seguida, Daniel dirá como usar funções, estruturas de repetição e estruturas condicionais para imprimir no console:

\n
    \n
  1. Os nomes de todas as alunas ativas
  2. \n
  3. O total de pontos da turma
  4. \n
  5. Os nomes das alunas que fizeram um determinado curso
  6. \n
\n

" } } }, @@ -1085,11 +1085,11 @@ "intl": { "es": { "title": "Ejercicios guiados", - "body": "

Objetivos

\n
    \n
  • Entender, a través de casos prácticos, cómo aplicar los conceptos de\nfunciones, arrays y objetos para la resolución de problemas
  • \n
\n
\n

Enunciados

\n

Al igual que hemos hecho antes, es hora de aplicar los conceptos aprendidos para\nresolver problemas.

\n

A continuación tendrás un problema que resolver. Intenta resolverlo primero por\ntu cuenta. Más abajo encontrarás la solución de Lourdes, otra instructora\nestrella de Laboratoria. Después de haberlo intentado, compara tus solución con\nla de Lourdes.

\n

1. Array to Object

\n

Escribe una función que tome un array 2D y devuelva un objeto con cada par de\nelementos en el array como un par key-value. Por ejemplo:

\n
    \n
  • Input
  • \n
\n
[['make', 'Ford'], ['model', 'Mustang'], ['year', 1964]]\n
\n
    \n
  • Output
  • \n
\n
{\n  make : 'Ford',\n  model : 'Mustang',\n  year : 1964\n}\n
\n

También escribe una función que haga lo contrario. Transforme los pares\nkey-value de un object en un array 2D.

\n

Solucionario

\n

A continuación, Lourdes te explica cómo resolvió el ejercicio:

\n

1. Array to Object

\n

\"Solution

" + "body": "

Objetivos

\n
    \n
  • Entender, a través de casos prácticos, cómo aplicar los conceptos de\nfunciones, arrays y objetos para la resolución de problemas
  • \n
\n
\n

Enunciados

\n

Al igual que hemos hecho antes, es hora de aplicar los conceptos aprendidos para\nresolver problemas.

\n

A continuación tendrás un problema que resolver. Intenta resolverlo primero por\ntu cuenta. Más abajo encontrarás la solución de Lourdes, otra instructora\nestrella de Laboratoria. Después de haberlo intentado, compara tus solución con\nla de Lourdes.

\n

1. Array to Object

\n

Escribe una función que tome un array 2D y devuelva un objeto con cada par de\nelementos en el array como un par key-value. Por ejemplo:

\n
    \n
  • Input
  • \n
\n
[['make', 'Ford'], ['model', 'Mustang'], ['year', 1964]]\n
\n
    \n
  • Output
  • \n
\n
{\n  make : 'Ford',\n  model : 'Mustang',\n  year : 1964\n}\n
\n

También escribe una función que haga lo contrario. Transforme los pares\nkey-value de un object en un array 2D.

\n

Solucionario

\n

A continuación, Lourdes te explica cómo resolvió el ejercicio:

\n

1. Array to Object

\n

" }, "pt": { "title": "Exercícios Livres", - "body": "

Objetivos

\n
    \n
  • Entender, através de casos práticos, como aplicar os conceitos de funções,\narrays e objetos para resolução de problemas
  • \n
\n
\n

Enunciados

\n

Como já fizemos antes, é hora de aplicar os conceitos aprendidos para resolver\nproblemas.

\n

Em seguida, você terá um problema para resolver. Tente resolvê-lo primeiro\nsozinha. Abaixo, você encontrará a solução de Lourdes, outra excelente\ninstrutora da Laboratoria. Depois de tentar resolvê-lo, compare sua solução com\na de Lourdes.

\n

1. Array para Object

\n

Escreva uma função que receba um array 2D (vetor) e retorne um objeto com\ncada par de elementos do array como um par chave-valor . Por exemplo:

\n
    \n
  • Input
  • \n
\n
[['make', 'Ford'], ['model', 'Mustang'], ['year', 1964]]\n
\n
    \n
  • Output
  • \n
\n
{\n  make : 'Ford',\n  model : 'Mustang',\n  year : 1964\n}\n
\n

Escreva também uma função que faça o contrário. Transforme os pares de\nkey-value de um object em um array 2D.

\n

Resolução

\n

A seguir, Daniel explica como ele resolveu o exercício:

\n

1. Array para Object

\n

\"Solução\nArrayToObject\"

" + "body": "

Objetivos

\n
    \n
  • Entender, através de casos práticos, como aplicar os conceitos de funções,\narrays e objetos para resolução de problemas
  • \n
\n
\n

Enunciados

\n

Como já fizemos antes, é hora de aplicar os conceitos aprendidos para resolver\nproblemas.

\n

Em seguida, você terá um problema para resolver. Tente resolvê-lo primeiro\nsozinha. Abaixo, você encontrará a solução de Lourdes, outra excelente\ninstrutora da Laboratoria. Depois de tentar resolvê-lo, compare sua solução com\na de Lourdes.

\n

1. Array para Object

\n

Escreva uma função que receba um array 2D (vetor) e retorne um objeto com\ncada par de elementos do array como um par chave-valor . Por exemplo:

\n
    \n
  • Input
  • \n
\n
[['make', 'Ford'], ['model', 'Mustang'], ['year', 1964]]\n
\n
    \n
  • Output
  • \n
\n
{\n  make : 'Ford',\n  model : 'Mustang',\n  year : 1964\n}\n
\n

Escreva também uma função que faça o contrário. Transforme os pares de\nkey-value de um object em um array 2D.

\n

Resolução

\n

A seguir, Daniel explica como ele resolveu o exercício:

\n

1. Array para Object

\n

" } }, "challenges": [] @@ -1114,7 +1114,7 @@ "slug": "add-array-property", "prefix": "00", "path": "topics/javascript/05-objects/06-practice/00-add-array-property", - "createdAt": "2023-04-04T20:28:37.787Z", + "createdAt": "2023-05-17T20:37:28.372Z", "env": "cjs", "intl": { "es": { @@ -1137,7 +1137,7 @@ "slug": "object-properties-counter", "prefix": "01", "path": "topics/javascript/05-objects/06-practice/01-object-properties-counter", - "createdAt": "2023-04-04T20:28:37.786Z", + "createdAt": "2023-05-17T20:37:28.372Z", "env": "cjs", "intl": { "es": { @@ -1160,7 +1160,7 @@ "slug": "remove-string-values-longer-than", "prefix": "02", "path": "topics/javascript/05-objects/06-practice/02-remove-string-values-longer-than", - "createdAt": "2023-04-04T20:28:37.786Z", + "createdAt": "2023-05-17T20:37:28.372Z", "env": "cjs", "intl": { "es": { @@ -1183,7 +1183,7 @@ "slug": "get-element-of-array-property", "prefix": "03", "path": "topics/javascript/05-objects/06-practice/03-get-element-of-array-property", - "createdAt": "2023-04-04T20:28:37.786Z", + "createdAt": "2023-05-17T20:37:28.372Z", "env": "cjs", "intl": { "es": { @@ -1206,7 +1206,7 @@ "slug": "greet-customer", "prefix": "04", "path": "topics/javascript/05-objects/06-practice/04-greet-customer", - "createdAt": "2023-04-04T20:28:37.786Z", + "createdAt": "2023-05-17T20:37:28.372Z", "env": "cjs", "intl": { "es": { @@ -1229,7 +1229,7 @@ "slug": "transform-first-and-last", "prefix": "05", "path": "topics/javascript/05-objects/06-practice/05-transform-first-and-last", - "createdAt": "2023-04-04T20:28:37.786Z", + "createdAt": "2023-05-17T20:37:28.372Z", "env": "cjs", "intl": { "es": { @@ -1252,7 +1252,7 @@ "slug": "get-all-keys", "prefix": "06", "path": "topics/javascript/05-objects/06-practice/06-get-all-keys", - "createdAt": "2023-04-04T20:28:37.786Z", + "createdAt": "2023-05-17T20:37:28.372Z", "env": "cjs", "intl": { "es": { @@ -1275,7 +1275,7 @@ "slug": "from-list-to-object", "prefix": "07", "path": "topics/javascript/05-objects/06-practice/07-from-list-to-object", - "createdAt": "2023-04-04T20:28:37.786Z", + "createdAt": "2023-05-17T20:37:28.372Z", "env": "cjs", "intl": { "es": { @@ -1298,7 +1298,7 @@ "slug": "list-all-values", "prefix": "08", "path": "topics/javascript/05-objects/06-practice/08-list-all-values", - "createdAt": "2023-04-04T20:28:37.786Z", + "createdAt": "2023-05-17T20:37:28.372Z", "env": "cjs", "intl": { "es": { @@ -1321,7 +1321,7 @@ "slug": "transform-employee-data", "prefix": "09", "path": "topics/javascript/05-objects/06-practice/09-transform-employee-data", - "createdAt": "2023-04-04T20:28:37.786Z", + "createdAt": "2023-05-17T20:37:28.372Z", "env": "cjs", "intl": { "es": { @@ -1344,7 +1344,7 @@ "slug": "convert-object-to-list", "prefix": "10", "path": "topics/javascript/05-objects/06-practice/10-convert-object-to-list", - "createdAt": "2023-04-04T20:28:37.786Z", + "createdAt": "2023-05-17T20:37:28.372Z", "env": "cjs", "intl": { "es": { @@ -1367,7 +1367,7 @@ "slug": "get-sum-of-all-elements-at-property", "prefix": "11", "path": "topics/javascript/05-objects/06-practice/11-get-sum-of-all-elements-at-property", - "createdAt": "2023-04-04T20:28:37.786Z", + "createdAt": "2023-05-17T20:37:28.372Z", "env": "cjs", "intl": { "es": { @@ -1390,7 +1390,7 @@ "slug": "get-product-of-all-elements-at-property", "prefix": "12", "path": "topics/javascript/05-objects/06-practice/12-get-product-of-all-elements-at-property", - "createdAt": "2023-04-04T20:28:37.786Z", + "createdAt": "2023-05-17T20:37:28.372Z", "env": "cjs", "intl": { "es": { @@ -1413,7 +1413,7 @@ "slug": "add-object-property", "prefix": "13", "path": "topics/javascript/05-objects/06-practice/13-add-object-property", - "createdAt": "2023-04-04T20:28:37.786Z", + "createdAt": "2023-05-17T20:37:28.373Z", "env": "cjs", "intl": { "es": { @@ -1436,7 +1436,7 @@ "slug": "add-full-name-property", "prefix": "14", "path": "topics/javascript/05-objects/06-practice/14-add-full-name-property", - "createdAt": "2023-04-04T20:28:37.787Z", + "createdAt": "2023-05-17T20:37:28.373Z", "env": "cjs", "intl": { "es": { @@ -1507,7 +1507,7 @@ "slug": "currency-amount", "prefix": "01", "path": "topics/javascript/06-strings/02-practice/01-currency-amount", - "createdAt": "2023-04-04T20:28:37.787Z", + "createdAt": "2023-05-17T20:37:28.373Z", "env": "cjs", "intl": { "es": { @@ -1530,7 +1530,7 @@ "slug": "first-and-last-to-upper", "prefix": "02", "path": "topics/javascript/06-strings/02-practice/02-first-and-last-to-upper", - "createdAt": "2023-04-04T20:28:37.786Z", + "createdAt": "2023-05-17T20:37:28.373Z", "env": "cjs", "intl": { "es": { @@ -1773,7 +1773,7 @@ "slug": "validate-string", "prefix": "01", "path": "topics/javascript/09-errors/05-practice/01-validate-string", - "createdAt": "2023-04-04T20:28:37.786Z", + "createdAt": "2023-05-17T20:37:28.373Z", "env": "cjs", "intl": { "es": { @@ -1795,7 +1795,7 @@ "slug": "parse-json", "prefix": "02", "path": "topics/javascript/09-errors/05-practice/02-parse-json", - "createdAt": "2023-04-04T20:28:37.787Z", + "createdAt": "2023-05-17T20:37:28.373Z", "env": "cjs", "intl": { "es": { @@ -1913,7 +1913,7 @@ "slug": "say-hello", "prefix": "01", "path": "topics/javascript/10-debugging/03-code-challenges/01-say-hello", - "createdAt": "2023-04-04T20:28:37.787Z", + "createdAt": "2023-05-17T20:37:28.373Z", "env": "cjs", "intl": { "es": { @@ -1935,7 +1935,7 @@ "slug": "create-array", "prefix": "02", "path": "topics/javascript/10-debugging/03-code-challenges/02-create-array", - "createdAt": "2023-04-04T20:28:37.787Z", + "createdAt": "2023-05-17T20:37:28.374Z", "env": "cjs", "intl": { "es": { @@ -1957,7 +1957,7 @@ "slug": "calculate-tip", "prefix": "03", "path": "topics/javascript/10-debugging/03-code-challenges/03-calculate-tip", - "createdAt": "2023-04-04T20:28:37.787Z", + "createdAt": "2023-05-17T20:37:28.374Z", "env": "cjs", "intl": { "es": { @@ -1979,7 +1979,7 @@ "slug": "tell-fortune", "prefix": "04", "path": "topics/javascript/10-debugging/03-code-challenges/04-tell-fortune", - "createdAt": "2023-04-04T20:28:37.787Z", + "createdAt": "2023-05-17T20:37:28.374Z", "env": "cjs", "intl": { "es": { @@ -2001,7 +2001,7 @@ "slug": "what-to-wear", "prefix": "05", "path": "topics/javascript/10-debugging/03-code-challenges/05-what-to-wear", - "createdAt": "2023-04-04T20:28:37.787Z", + "createdAt": "2023-05-17T20:37:28.374Z", "env": "cjs", "intl": { "es": { @@ -2091,7 +2091,7 @@ "intl": { "es": { "title": "Qué es un test?", - "body": "

Cuando hablamos de tests (pruebas), podríamos ponernos a pensar en\nherramientas de testing, como Mocha, Jest, Jasmine, ... o metodologías de\ndesarrollo como TDD o BDD. Todo esto puede ser super confuso. En esta unidad\ntrataremos de desmitificar un poco este tema empezando desde el principio. Para\nello pensemos en pruebas simplemente como el acto de ejecutar algo en la\ncomputadora y después comprobar que efectivamente ocurrió lo que esperábamos.

\n

El test más sencillo posible:

\n
const a = 5;\nconsole.log(a);\n
\n

Podríamos decir que nuestro amigo console.log es la herramienta de testing más\nbásica de todas. Al imprimir un valor a la consola, lo podemos ver con nuestros\nojos y comprobar qué es ese valor (de una forma visual). Estamos probando (o\ncomprobando) que efectivamente la variable a tomó el valor 5, que era\nexactamente lo que esperábamos.

\n

Este proceso nos permite ir viendo qué está ocurriendo en el código mientras lo\nescribimos. Usa console.log, y úsalo mucho. Pero obviamente tiene sus\nlimitaciones. En este caso dependemos de que una persona ejecute el comando, vea\nel output (salida) y en su cabeza haga la comprobación. Muy útil para uno\nmismo, pero no es automatizable ni escalable.

\n

Por suerte, somos programadorxs, así que podemos escribir un poco de código (y/o\nusar código de otrxs) para atacar estos problemas :rocket:

\n
\n

Para seguir esta unidad, te recomendamos que crees una carpeta en algún lugar de\ntu computadora y vayas creando los archivos y codeando mientras avanzamos. Todo\nel código de esta lección lo puedes ejecutar con node.

\n
\n

Ahora imaginemos que queremos una función que dado un caracter, nos diga si es\nuna vocal o no (debería retornar true para las vocales y false para\ncualquier otro caracter). Antes de implementar la función podríamos plantear\nunos tests. Crea un archivo con el nombre isVowel.spec.js y escribe el\nsiguiente código:

\n
// Archivo `isVowel.spec.js`:\n\nconst isVowel = require('./isVowel');\n\nconsole.log('debería devolver true para letra a');\nif (isVowel('a') === true) {\n  console.log('✓ ok');\n} else {\n  console.error('✗ fail');\n}\n\nconsole.log('debería devolver false para letra b');\nif (isVowel('b') === false) {\n  console.log('✓ ok');\n} else {\n  console.error('✗ fail');\n}\n
\n

Ejecutemos nuestros tests con node en la línea de comando:

\n
$ node ./isVowel.spec.js\nmodule.js:557\n    throw err;\n    ^\n\nError: Cannot find module './isVowel'\n    at Function.Module._resolveFilename (module.js:555:15)\n    at Function.Module._load (module.js:482:25)\n    at Module.require (module.js:604:17)\n    at require (internal/module.js:11:18)\n    at Object.<anonymous> (/Users/lupo/work/laboratoria/curricula-js/05-deep-dive/03-testing/01-basics/files/isVowel.spec.js:1:79)\n    at Module._compile (module.js:660:30)\n    at Object.Module._extensions..js (module.js:671:10)\n    at Module.load (module.js:573:32)\n    at tryModuleLoad (module.js:513:12)\n    at Function.Module._load (module.js:505:3)\n
\n

Como vemos recibimos un error: Error: Cannot find module './isVowel'. Los\nerrores pueden ser un poco crípticos al principio, y hay que aprender a\nleerlos. El mensaje de error en sí dice que no se pudo encontrar el módulo\n./isVowel, y debajo tenemos una serie de líneas con el\nstack trace,\nque nos muestra la pila de llamadas donde ocurrió el error. En este caso podemos\nver que se menciona nuestro script (/Users/lupo/work/laboratoria/curricula-js/05-deep-dive/03-testing/01-basics/files/isVowel.spec.js:1:79),\ny al final de la ruta al archivo vemos que aparecen dos números separados por\ndos puntos (:). Estos números nos dicen en qué línea y qué columna (posición\ndentro de la línea) está el código en cuestión. La línea 1 contiene\nrequire('./isVowel'), que es la responsable del error.

\n

Esto es porque hemos tratado de importar un modulo del archivo ./isVowel.js en\nel mismo directorio que nuestro script con los tests, pero obviamente no existe,\nasí que creémoslo y declaremos una función con el nombre isVowel:

\n
// Archivo `isVowel.js`\n\nconst isVowel = function (char) {\n  // ...\n};\n
\n

Si volvemos a ejecutar los tests, ahora el output mostrado en la consola debería\nverse algo así:

\n
$ node ./isVowel.spec.js\ndebería devolver true para letra a\n/Users/lupo/work/laboratoria/curricula-js/05-deep-dive/03-testing/01-basics/files/isVowel.spec.js:4\nif (isVowel('a') !== true) {\n    ^\n\nTypeError: isVowel is not a function\n    at Object.<anonymous> (/Users/lupo/work/laboratoria/curricula-js/05-deep-dive/03-testing/01-basics/files/isVowel.spec.js:6:5)\n    at Module._compile (module.js:660:30)\n    at Object.Module._extensions..js (module.js:671:10)\n    at Module.load (module.js:573:32)\n    at tryModuleLoad (module.js:513:12)\n    at Function.Module._load (module.js:505:3)\n    at Function.Module.runMain (module.js:701:10)\n    at startup (bootstrap_node.js:194:16)\n    at bootstrap_node.js:618:3\n
\n

Esto quiere decir que ahora sí se ha podido cargar el módulo (el error de antes\nya no aparece), pero ahora recibimos un nuevo error: TypeError: isVowel is not a function. Si nos fijamos en la línea justo abajo del mensaje de error, vemos\nque el error se produjo en el archivo isVowel.spec.js en la línea 6 y\ncolumna 5). Si nos fijamos en el código, veremos que línea 6 y columna 5\nes donde está isVowel('a'). En esta línea es la primera vez que invocamos la\nfunción isVowel, y parece que no es lo que esperábamos (una función, doh!).

\n

El motivo por el que vemos este error es porque a pesar de que hemos creado el\narchivo isVowel.js y hemos declarado una función con el nombre isVowel, no\nla hemos exportado.

\n

Más adelante veremos más detalles sobre como exportar usando tanto CommonJS\n(require, module, module.exports) como módulos de ES6 (import,\nexport). Por ahora no vamos a detenernos con estos detalles. Lo importante por\nahora es saber que estamos ejecutando nuestro código con node, con lo cual\nvamos a usar el sistema de módulos de node (CommonJS). Cuando usamos este\nsistema, podemos exportar cualquier valor asignándolo a la propiedad exports\ndel objeto global module (module.exports). Node.js se encarga de que el\nobjeto module exista en el ámbito global.

\n
// Archivo `isVowel.js`\n\nconst isVowel = function (char) {\n  // ...\n};\n\nmodule.exports = isVowel;\n
\n

Ejecutemos los tests una vez más:

\n
$ node ./isVowel.spec.js\ndebería devolver true para letra a\n✗ fail\ndebería devolver false para letra b\n✗ fail\n
\n

Yay! Finalmente nuestro script de tests corre sin errores, pero vemos que la\nimplementación de isVowel() todavía no pasa ninguno de los dos tests que\nescribimos.

\n

Ahora sí, implementamos la funcionalidad esperada en isVowel():

\n
// Archivo `isVowel.js`\n\nconst isVowel = function (char) {\n  return ['a', 'e', 'i', 'o', 'u'].indexOf(char) > -1;\n};\n\nmodule.exports = isVowel;\n
\n

Y volvemos a ejecutar los tests una vez más:

\n
$ node ./isVowel.spec.js\ndebería devolver true para letra a\n✓ ok\ndebería devolver false para letra b\n✓ ok\n
\n
\n

Lecturas complementarias

\n

Unit Test - Martin Fowler

" + "body": "

Cuando hablamos de tests (pruebas), podríamos ponernos a pensar en\nherramientas de testing, como Mocha, Jest, Jasmine, ... o metodologías de\ndesarrollo como TDD o BDD. Todo esto puede ser super confuso. En esta unidad\ntrataremos de desmitificar un poco este tema empezando desde el principio. Para\nello pensemos en pruebas simplemente como el acto de ejecutar algo en la\ncomputadora y después comprobar que efectivamente ocurrió lo que esperábamos.

\n

El test más sencillo posible:

\n
const a = 5;\nconsole.log(a);\n
\n

Podríamos decir que nuestro amigo console.log es la herramienta de testing más\nbásica de todas. Al imprimir un valor a la consola, lo podemos ver con nuestros\nojos y comprobar qué es ese valor (de una forma visual). Estamos probando (o\ncomprobando) que efectivamente la variable a tomó el valor 5, que era\nexactamente lo que esperábamos.

\n

Este proceso nos permite ir viendo qué está ocurriendo en el código mientras lo\nescribimos. Usa console.log, y úsalo mucho. Pero obviamente tiene sus\nlimitaciones. En este caso dependemos de que una persona ejecute el comando, vea\nel output (salida) y en su cabeza haga la comprobación. Muy útil para uno\nmismo, pero no es automatizable ni escalable.

\n

Por suerte, somos programadorxs, así que podemos escribir un poco de código (y/o\nusar código de otrxs) para atacar estos problemas :rocket:

\n
\n

Para seguir esta unidad, te recomendamos que crees una carpeta en algún lugar de\ntu computadora y vayas creando los archivos y codeando mientras avanzamos. Todo\nel código de esta lección lo puedes ejecutar con node.

\n
\n

Ahora imaginemos que queremos una función que dado un caracter, nos diga si es\nuna vocal o no (debería retornar true para las vocales y false para\ncualquier otro caracter). Antes de implementar la función podríamos plantear\nunos tests. Crea un archivo con el nombre isVowel.spec.js y escribe el\nsiguiente código:

\n
// Archivo `isVowel.spec.js`:\n\nconst isVowel = require('./isVowel');\n\nconsole.log('debería devolver true para letra a');\nif (isVowel('a') === true) {\n  console.log('✓ ok');\n} else {\n  console.error('✗ fail');\n}\n\nconsole.log('debería devolver false para letra b');\nif (isVowel('b') === false) {\n  console.log('✓ ok');\n} else {\n  console.error('✗ fail');\n}\n
\n

Ejecutemos nuestros tests con node en la línea de comando:

\n
$ node ./isVowel.spec.js\nmodule.js:557\n    throw err;\n    ^\n\nError: Cannot find module './isVowel'\n    at Function.Module._resolveFilename (module.js:555:15)\n    at Function.Module._load (module.js:482:25)\n    at Module.require (module.js:604:17)\n    at require (internal/module.js:11:18)\n    at Object.<anonymous> (/Users/lupo/work/laboratoria/curricula-js/05-deep-dive/03-testing/01-basics/files/isVowel.spec.js:1:79)\n    at Module._compile (module.js:660:30)\n    at Object.Module._extensions..js (module.js:671:10)\n    at Module.load (module.js:573:32)\n    at tryModuleLoad (module.js:513:12)\n    at Function.Module._load (module.js:505:3)\n
\n

Como vemos recibimos un error: Error: Cannot find module './isVowel'. Los\nerrores pueden ser un poco crípticos al principio, y hay que aprender a\nleerlos. El mensaje de error en sí dice que no se pudo encontrar el módulo\n./isVowel, y debajo tenemos una serie de líneas con el\nstack trace,\nque nos muestra la pila de llamadas donde ocurrió el error. En este caso podemos\nver que se menciona nuestro script (/Users/lupo/work/laboratoria/curricula-js/05-deep-dive/03-testing/01-basics/files/isVowel.spec.js:1:79),\ny al final de la ruta al archivo vemos que aparecen dos números separados por\ndos puntos (:). Estos números nos dicen en qué línea y qué columna (posición\ndentro de la línea) está el código en cuestión. La línea 1 contiene\nrequire('./isVowel'), que es la responsable del error.

\n

Esto es porque hemos tratado de importar un modulo del archivo ./isVowel.js en\nel mismo directorio que nuestro script con los tests, pero obviamente no existe,\nasí que creémoslo y declaremos una función con el nombre isVowel:

\n
// Archivo `isVowel.js`\n\nconst isVowel = function (char) {\n  // ...\n};\n
\n

Si volvemos a ejecutar los tests, ahora el output mostrado en la consola debería\nverse algo así:

\n
$ node ./isVowel.spec.js\ndebería devolver true para letra a\n/Users/lupo/work/laboratoria/curricula-js/05-deep-dive/03-testing/01-basics/files/isVowel.spec.js:4\nif (isVowel('a') !== true) {\n    ^\n\nTypeError: isVowel is not a function\n    at Object.<anonymous> (/Users/lupo/work/laboratoria/curricula-js/05-deep-dive/03-testing/01-basics/files/isVowel.spec.js:6:5)\n    at Module._compile (module.js:660:30)\n    at Object.Module._extensions..js (module.js:671:10)\n    at Module.load (module.js:573:32)\n    at tryModuleLoad (module.js:513:12)\n    at Function.Module._load (module.js:505:3)\n    at Function.Module.runMain (module.js:701:10)\n    at startup (bootstrap_node.js:194:16)\n    at bootstrap_node.js:618:3\n
\n

Esto quiere decir que ahora sí se ha podido cargar el módulo (el error de antes\nya no aparece), pero ahora recibimos un nuevo error: TypeError: isVowel is not a function. Si nos fijamos en la línea justo abajo del mensaje de error, vemos\nque el error se produjo en el archivo isVowel.spec.js en la línea 6 y\ncolumna 5). Si nos fijamos en el código, veremos que línea 6 y columna 5\nes donde está isVowel('a'). En esta línea es la primera vez que invocamos la\nfunción isVowel, y parece que no es lo que esperábamos (una función, doh!).

\n

El motivo por el que vemos este error es porque a pesar de que hemos creado el\narchivo isVowel.js y hemos declarado una función con el nombre isVowel, no\nla hemos exportado.

\n

Más adelante veremos más detalles sobre como exportar usando tanto CommonJS\n(require, module, module.exports) como módulos de ES6 (import,\nexport). Por ahora no vamos a detenernos con estos detalles. Lo importante por\nahora es saber que estamos ejecutando nuestro código con node, con lo cual\nvamos a usar el sistema de módulos de node (CommonJS). Cuando usamos este\nsistema, podemos exportar cualquier valor asignándolo a la propiedad exports\ndel objeto global module (module.exports). Node.js se encarga de que el\nobjeto module exista en el ámbito global.

\n
// Archivo `isVowel.js`\n\nconst isVowel = function (char) {\n  // ...\n};\n\nmodule.exports = isVowel;\n
\n

Ejecutemos los tests una vez más:

\n
$ node ./isVowel.spec.js\ndebería devolver true para letra a\n✗ fail\ndebería devolver false para letra b\n✗ fail\n
\n

Yay! Finalmente nuestro script de tests corre sin errores, pero vemos que la\nimplementación de isVowel() todavía no pasa ninguno de los dos tests que\nescribimos.

\n

Ahora sí, implementamos la funcionalidad esperada en isVowel():

\n
// Archivo `isVowel.js`\n\nconst isVowel = function (char) {\n  return ['a', 'e', 'i', 'o', 'u'].indexOf(char) > -1;\n};\n\nmodule.exports = isVowel;\n
\n

Y volvemos a ejecutar los tests una vez más:

\n
$ node ./isVowel.spec.js\ndebería devolver true para letra a\n✓ ok\ndebería devolver false para letra b\n✓ ok\n
\n
\n\n

Lecturas complementarias

\n

Unit Test - Martin Fowler

" }, "pt": { "title": "O que é um teste?", diff --git a/dist/topics/learning-mindset.json b/dist/topics/learning-mindset.json index 80f53c535..8b2d0d602 100644 --- a/dist/topics/learning-mindset.json +++ b/dist/topics/learning-mindset.json @@ -2,9 +2,9 @@ "slug": "learning-mindset", "repo": "Laboratoria/bootcamp", "path": "topics/learning-mindset", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:39.558Z", + "createdAt": "2023-05-17T20:37:25.229Z", "track": "web-dev", "intl": { "es": { @@ -32,7 +32,7 @@ "intl": { "es": { "title": "Bienvenida y objetivos", - "body": "
\n

\"video\"

" + "body": "
\n

" } } }, @@ -44,7 +44,7 @@ "intl": { "es": { "title": "Malentendidos del aprendizaje", - "body": "
\n

Los 4 malentendidos del aprendizaje

\n

1. Caemos en creencias limitantes y la importancia de la mentalidad de crecimiento

\n

\"video\"

\n

2. Tenemos la expectativa de que el aprendizaje sea fácil y la importancia de la apropiación del aprendizaje

\n

\"video\"

\n

3. Caemos en ilusiones del aprendizaje y la importancia de la metacognición

\n

\"video\"

\n

4. El aprendizaje no debe encasillarse en el tiempo y la importancia del aprendizaje permanente

\n

\"video\"

\n

También te compartimos los siguientes recursos adicionales por si te interesa\nprofundizar sobre el tema.

\n
    \n
  • Vídeo ¿Qué es Growth Mindset? por Maria Paula\nRivarola, Ex Directora de Laboratoria en Perú
  • \n
  • Te invitamos a ver el Entrevista con Susana Claro\n, académica de la Escuela de Gobierno Universidad de Chile y co-fundadora de\nEnseña Chile de nuestro programa #EsBuenoSaberlo, donde hablamos sobre la\nmentalidad de crecimiento junto a Susana Claro.
  • \n
  • Blog de Nat Eliason (en inglés) sobre Self-Education: Teach Yourself Anything\nwith the Sandbox Method. La relevancia de desarrollar la habilidad para\nsolucionar problemas y el método sandbox.
  • \n
" + "body": "
\n

Los 4 malentendidos del aprendizaje

\n

1. Caemos en creencias limitantes y la importancia de la mentalidad de crecimiento

\n

\n

2. Tenemos la expectativa de que el aprendizaje sea fácil y la importancia de la apropiación del aprendizaje

\n

\n

3. Caemos en ilusiones del aprendizaje y la importancia de la metacognición

\n

\n

4. El aprendizaje no debe encasillarse en el tiempo y la importancia del aprendizaje permanente

\n

\n

También te compartimos los siguientes recursos adicionales por si te interesa\nprofundizar sobre el tema.

\n
    \n
  • Vídeo ¿Qué es Growth Mindset? por Maria Paula\nRivarola, Ex Directora de Laboratoria en Perú
  • \n
  • Te invitamos a ver el Entrevista con Susana Claro\n, académica de la Escuela de Gobierno Universidad de Chile y co-fundadora de\nEnseña Chile de nuestro programa #EsBuenoSaberlo, donde hablamos sobre la\nmentalidad de crecimiento junto a Susana Claro.
  • \n
  • Blog de Nat Eliason (en inglés) sobre Self-Education: Teach Yourself Anything\nwith the Sandbox Method. La relevancia de desarrollar la habilidad para\nsolucionar problemas y el método sandbox.
  • \n
" } } } diff --git a/dist/topics/paradigms.json b/dist/topics/paradigms.json index b3f85bf40..ce4e2fd42 100644 --- a/dist/topics/paradigms.json +++ b/dist/topics/paradigms.json @@ -2,9 +2,9 @@ "slug": "paradigms", "repo": "Laboratoria/bootcamp", "path": "topics/paradigms", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:39.928Z", + "createdAt": "2023-05-17T20:37:26.465Z", "track": "web-dev", "intl": { "es": { @@ -44,7 +44,7 @@ "intl": { "es": { "title": "¿Qué son los paradigmas de programación?", - "body": "

\"Paradigmas

\n

Los Paradigmas de Programación (Programming Paradigms) son formas\ndiferentes de pensar en cómo se organiza un programa basado en una serie de\nprincipios, los cuales resultan en estilos muy distintos y lenguajes muy\ndiversos.

\n

Consideremos la siguiente función:

\n
function sum(array) {\n  let total = 0;\n  for (let i = 0; i < array.length; i++) {\n    total += array[i];\n  }\n  return total;\n}\n
\n

La función sum(array) recibe un array de números y retorna la suma de todos\nlos elementos del array. Para llevar a cabo la suma, usamos la variable total,\nla cual vamos a ir actualizando (mutando) mientras vamos recorriendo el arreglo\ncon un bucle (for en este caso). Estas características son típicas del estilo\nimperativo.

\n

Ahora, podemos implementar exactamente la misma funcionalidad usando un enfoque\ncompletamente distinto.

\n
function sum(array) {\n  if (!array.length) {\n    return 0;\n  }\n  return array[0] + sum(array.slice(1));\n};\n
\n

En esta segunda implementación, la función sum(array) sigue teniendo la misma\ninterfaz (recibe los mismos argumentos y retorna lo mismo), pero claramente\npodemos ver que la lógica se expresa de una manera muy diferente. En la versión\nrecursiva hemos reemplazado el bucle for por recursión, y además podemos ver\nque no hay asignación ni mutación de variables, el \"cómputo\" se hace por\naplicación de argumentos a funciones. Este tipo de características son propias\ndel paradigma funcional.

\n
\n

PRO TIP:

\n

Haciendo uso de ES2015 podemos refactorizar la versión funcional de sum de\nesta manera:

\n
const sum = array => !array.length ? 0 : array[0] + sum(array.slice(1));\n
\n
\n

Cuando hablamos de Paradigmas de Programación inevitablemente tenemos que\nhablar de lenguajes de programación. Algunos lenguajes, como JavaScript, son\nmulti-paradigma, lo que quiere decir que nos permiten programar en diferentes\nparadigmas, mientras que otros se enfocan específicamente en uno.

\n

JavaScript es un leguage híbrido, por decirlo de alguna forma, y contiene\nelementos propios de lenguajes funcionales (por ejemplo funciones como objetos\nde primera clase, lambdas, ...) pero no estamos limitados al paradigma\nfuncional. JavaScript nos permite programar de forma funcional, orientado a\nobjetos, orientado a eventos, por procedimientos, ...

\n

También veremos que los \"paradigmas\" son \"estilos\" de programación que no son\nnecesariamente exclusivos. De hecho, algunos son complementarios o evoluciones\nde paradigmas más antiguos o con un nivel de abstracción más bajo. Así, la\nprogramación procedural y orientada a objetos, por ejemplo, ambas son\nimperativas, ya que comparten una raíz común.

\n
\n

Referencias

\n

Blog posts:

\n\n

Videos:

\n\n

Otros recursos:

\n" + "body": "

\"Paradigmas

\n

Los Paradigmas de Programación (Programming Paradigms) son formas\ndiferentes de pensar en cómo se organiza un programa basado en una serie de\nprincipios, los cuales resultan en estilos muy distintos y lenguajes muy\ndiversos.

\n

Consideremos la siguiente función:

\n
function sum(array) {\n  let total = 0;\n  for (let i = 0; i < array.length; i++) {\n    total += array[i];\n  }\n  return total;\n}\n
\n

La función sum(array) recibe un array de números y retorna la suma de todos\nlos elementos del array. Para llevar a cabo la suma, usamos la variable total,\nla cual vamos a ir actualizando (mutando) mientras vamos recorriendo el arreglo\ncon un bucle (for en este caso). Estas características son típicas del estilo\nimperativo.

\n

Ahora, podemos implementar exactamente la misma funcionalidad usando un enfoque\ncompletamente distinto.

\n
function sum(array) {\n  if (!array.length) {\n    return 0;\n  }\n  return array[0] + sum(array.slice(1));\n};\n
\n

En esta segunda implementación, la función sum(array) sigue teniendo la misma\ninterfaz (recibe los mismos argumentos y retorna lo mismo), pero claramente\npodemos ver que la lógica se expresa de una manera muy diferente. En la versión\nrecursiva hemos reemplazado el bucle for por recursión, y además podemos ver\nque no hay asignación ni mutación de variables, el \"cómputo\" se hace por\naplicación de argumentos a funciones. Este tipo de características son propias\ndel paradigma funcional.

\n
\n

PRO TIP:

\n

Haciendo uso de ES2015 podemos refactorizar la versión funcional de sum de\nesta manera:

\n
const sum = array => !array.length ? 0 : array[0] + sum(array.slice(1));\n
\n
\n

Cuando hablamos de Paradigmas de Programación inevitablemente tenemos que\nhablar de lenguajes de programación. Algunos lenguajes, como JavaScript, son\nmulti-paradigma, lo que quiere decir que nos permiten programar en diferentes\nparadigmas, mientras que otros se enfocan específicamente en uno.

\n

JavaScript es un leguage híbrido, por decirlo de alguna forma, y contiene\nelementos propios de lenguajes funcionales (por ejemplo funciones como objetos\nde primera clase, lambdas, ...) pero no estamos limitados al paradigma\nfuncional. JavaScript nos permite programar de forma funcional, orientado a\nobjetos, orientado a eventos, por procedimientos, ...

\n

También veremos que los \"paradigmas\" son \"estilos\" de programación que no son\nnecesariamente exclusivos. De hecho, algunos son complementarios o evoluciones\nde paradigmas más antiguos o con un nivel de abstracción más bajo. Así, la\nprogramación procedural y orientada a objetos, por ejemplo, ambas son\nimperativas, ya que comparten una raíz común.

\n
\n

Referencias

\n

Blog posts:

\n\n

Videos:

\n\n

Otros recursos:

\n" } } }, @@ -68,7 +68,7 @@ "intl": { "es": { "title": "Declarativo vs Imperativo", - "body": "

\"Paradigmas

\n

Hemos mencionado que los primeros lenguajes de programación eran imperativos, y\nque se centraban en el \"cómo\" más que en el \"qué\". Como contrapartida, el estilo\ndeclarativo se caracteriza por lo contrario, enfocarse más en \"qué\" queremos\nhacer, desde el punto de vista de un ser humano, en vez de cómo lo debe ejecutar\nla computadora. Por ende, cuanto más declarativo, más alejado del hardware.

\n

Algunos paradigmas son más imperativos y otros más declarativos. Por ejemplo,\nla programación orientada a procedimientos, o la programación orientada objetos,\nvan a tener un caracter imperativo, mientras que la programación funcional tiene\nun caracter mucho más declarativo.

\n

Imáginemos que tenemos la siguiente data en un array de objetos:

\n
const array = [\n  {id: 'uno', name: 'el primero'},\n  {id: 'dos', name: 'el segundo'},\n  {name: 'no tengo id'},\n];\n
\n

A partir de esta data, ahora nos piden extraer los id de cada un de los\nobjetos y amacenarlos en un nuevo arreglo (ids). Si nos planteamos el\nproblema desde un enfoque imperativo, podríamos implementar una solución así:

\n
const ids = [];\n\nfor (let i = 0; i < array.length; i++) {\n  if (array[i].id) {\n    ids.push(array[i].id);\n  }\n}\n\nconsole.log(ids); // ['uno', 'dos']\n
\n

En el código anterior, probablemente puedas identificar claramente el estilo\nimperativo. Las variables como \"contadores\" y \"acumuladores\", son típicos del\nestilo imperativo. En este estilo el principal mecanismo de cómputo se lleva a\ncabo a través de la asignación de valores en variables. Veremos así uso de\nvariables globales y mutación de los valores asignados a variables a través del\ntiempo.

\n

JavaScript nos ofrece utilidades para afrontar este tipo problemas desde el\nenfoque funcional. Así, los arrays (gracias a Array.prototype) tienen una\nserie de métodos para manipular su data a través de \"higher order functions\",\nque en este caso son funciones que aceptan otra función como argumento, como por\nejemplo Array.prototype.filter o Array.prototype.map. Veamos cómo podemos\nusar estas herramientas para implementar la misma lógica:

\n
const ids = array\n  .filter(item => typeof item.id === 'string')\n  .map(item => item.id);\n\nconsole.log(ids); // ['uno', 'dos']\n
\n

En esta nueva versión hacemos lo siguiente:

\n
    \n
  1. Usamos Array#filter para crear un nuevo arreglo sólo con aquellos elementos\nque tengan un id que sea un string (typeof item.id === 'string').
  2. \n
  3. Usamos Array#map para transformar cada elemento del arreglo y crear un\nnuevo arreglo con los resultados.
  4. \n
\n

De esta forma los detalles de la iteración quedan escondidos detrás de\nArray#filter y Array#map, haciendo nuestro código más declarativo.

\n

También podemos ver cómo \"encadenamos\" (method chaining) las invocaciones de\nfilter y map ya que ambas retornan un array, que a su vez tiene todos los\nmétodos de Array.prototype.

\n

El estilo declarativo depende de que el lenguaje (o librerías) nos ofrezcan este\ntipo de herramientas o abstracciones con las que poder expresar nuestra lógica\nsin preocuparnos tanto sobre los detalles de implementación.

\n

Para terminar esta sección, cabe mencionar que HTML es un lenguaje declarativo!\nMuchos se quejarían diciendo que HTML no es un lenguaje de programación, sino un\nlenguaje de marcado (markup language). Pero podemos considerear a HTML como un\nlenguaje declarativo muy restringido, no de uso general, donde sólo podemos\ncrear un árbol de nodos a partir de una estructura de etiquetas (tags) con una\nsintáxis y semántica predefinida. Es declarativo en el sentido de que no le\nestamos diciendo a la computadora cómo convertir nuestro código en\ninstrucciones, sino que describimos de formal declarativa lo que queremos que\nocurra (el compilador o intérprete se encarga del resto).

\n
\n

Referencias

\n

Videos:

\n\n

Otros recursos:

\n" + "body": "

\"Paradigmas

\n

Hemos mencionado que los primeros lenguajes de programación eran imperativos, y\nque se centraban en el \"cómo\" más que en el \"qué\". Como contrapartida, el estilo\ndeclarativo se caracteriza por lo contrario, enfocarse más en \"qué\" queremos\nhacer, desde el punto de vista de un ser humano, en vez de cómo lo debe ejecutar\nla computadora. Por ende, cuanto más declarativo, más alejado del hardware.

\n

Algunos paradigmas son más imperativos y otros más declarativos. Por ejemplo,\nla programación orientada a procedimientos, o la programación orientada objetos,\nvan a tener un caracter imperativo, mientras que la programación funcional tiene\nun caracter mucho más declarativo.

\n

Imáginemos que tenemos la siguiente data en un array de objetos:

\n
const array = [\n  {id: 'uno', name: 'el primero'},\n  {id: 'dos', name: 'el segundo'},\n  {name: 'no tengo id'},\n];\n
\n

A partir de esta data, ahora nos piden extraer los id de cada un de los\nobjetos y amacenarlos en un nuevo arreglo (ids). Si nos planteamos el\nproblema desde un enfoque imperativo, podríamos implementar una solución así:

\n
const ids = [];\n\nfor (let i = 0; i < array.length; i++) {\n  if (array[i].id) {\n    ids.push(array[i].id);\n  }\n}\n\nconsole.log(ids); // ['uno', 'dos']\n
\n

En el código anterior, probablemente puedas identificar claramente el estilo\nimperativo. Las variables como \"contadores\" y \"acumuladores\", son típicos del\nestilo imperativo. En este estilo el principal mecanismo de cómputo se lleva a\ncabo a través de la asignación de valores en variables. Veremos así uso de\nvariables globales y mutación de los valores asignados a variables a través del\ntiempo.

\n

JavaScript nos ofrece utilidades para afrontar este tipo problemas desde el\nenfoque funcional. Así, los arrays (gracias a Array.prototype) tienen una\nserie de métodos para manipular su data a través de \"higher order functions\",\nque en este caso son funciones que aceptan otra función como argumento, como por\nejemplo Array.prototype.filter o Array.prototype.map. Veamos cómo podemos\nusar estas herramientas para implementar la misma lógica:

\n
const ids = array\n  .filter(item => typeof item.id === 'string')\n  .map(item => item.id);\n\nconsole.log(ids); // ['uno', 'dos']\n
\n

En esta nueva versión hacemos lo siguiente:

\n
    \n
  1. Usamos Array#filter para crear un nuevo arreglo sólo con aquellos elementos\nque tengan un id que sea un string (typeof item.id === 'string').
  2. \n
  3. Usamos Array#map para transformar cada elemento del arreglo y crear un\nnuevo arreglo con los resultados.
  4. \n
\n

De esta forma los detalles de la iteración quedan escondidos detrás de\nArray#filter y Array#map, haciendo nuestro código más declarativo.

\n

También podemos ver cómo \"encadenamos\" (method chaining) las invocaciones de\nfilter y map ya que ambas retornan un array, que a su vez tiene todos los\nmétodos de Array.prototype.

\n

El estilo declarativo depende de que el lenguaje (o librerías) nos ofrezcan este\ntipo de herramientas o abstracciones con las que poder expresar nuestra lógica\nsin preocuparnos tanto sobre los detalles de implementación.

\n

Para terminar esta sección, cabe mencionar que HTML es un lenguaje declarativo!\nMuchos se quejarían diciendo que HTML no es un lenguaje de programación, sino un\nlenguaje de marcado (markup language). Pero podemos considerear a HTML como un\nlenguaje declarativo muy restringido, no de uso general, donde sólo podemos\ncrear un árbol de nodos a partir de una estructura de etiquetas (tags) con una\nsintáxis y semántica predefinida. Es declarativo en el sentido de que no le\nestamos diciendo a la computadora cómo convertir nuestro código en\ninstrucciones, sino que describimos de formal declarativa lo que queremos que\nocurra (el compilador o intérprete se encarga del resto).

\n
\n

Referencias

\n

Videos:

\n\n

Otros recursos:

\n" } } }, @@ -88,7 +88,7 @@ "slug": "print-primes", "prefix": "01", "path": "topics/paradigms/01-paradigms/04-imperative-exercise/01-print-primes", - "createdAt": "2023-04-04T20:28:39.926Z", + "createdAt": "2023-05-17T20:37:26.463Z", "env": "cjs", "intl": { "es": { @@ -144,7 +144,7 @@ "slug": "get-primes", "prefix": "01", "path": "topics/paradigms/01-paradigms/07-procedural-exercise/01-get-primes", - "createdAt": "2023-04-04T20:28:39.926Z", + "createdAt": "2023-05-17T20:37:26.463Z", "env": "cjs", "intl": { "es": { @@ -188,7 +188,7 @@ "slug": "notes", "prefix": "01", "path": "topics/paradigms/01-paradigms/09-oop-exercise/01-notes", - "createdAt": "2023-04-04T20:28:39.926Z", + "createdAt": "2023-05-17T20:37:26.463Z", "env": "cjs", "intl": { "es": { @@ -232,7 +232,7 @@ "slug": "notes", "prefix": "01", "path": "topics/paradigms/01-paradigms/11-fp-exercise/01-notes", - "createdAt": "2023-04-04T20:28:39.926Z", + "createdAt": "2023-05-17T20:37:26.464Z", "env": "cjs", "intl": { "es": { @@ -303,7 +303,7 @@ "intl": { "es": { "title": "Object.create()", - "body": "

\"Paradigmas

\n

En JavaScript todo objeto tiene un \"prototipo\", aunque no lo especifiquemos.\nCuando creamos un objeto literal, el prototipo del objeto por defecto es\nObject.prototype.

\n
console.log(Object.prototype.isPrototypeOf({})); // true\nconsole.log({} instanceof Object); // true\n
\n

En la lección anterior vimos como podemos usar constructores para crear\nobjetos con un prototipo determinado. Cuando usamos un constructor los objetos\nnuevos tendrán como prototipo la propiedad prototype del constructor.

\n
function Robot(name) {\n  this.name = name;\n}\n\nRobot.prototype.say = function () {\n  console.log('Hi! I\\'m ' + this.name + '!');\n};\n\nconst ada = new Robot('ada');\nada.say(); // Hi! I'm ada!\n\nconsole.log(ada instanceof Robot); // true\nconsole.log(Robot.prototype.isPrototypeOf(ada)); // true\n
\n

Los constructores son comunes porque se parecen a las \"clases\" que hay en otros\nlenguajes, pero no son la única manera de crear objetos con un prototipo\ndeterminado. Hay una manera más simple y más natural para el modelo prototipal:\nObject.create().

\n
// otra manera de asignar el prototipo: `Object.create()`\nconst robot = {\n  say: function () {\n    console.log('Hi! I\\'m ' + this.name + '!');\n  }\n};\n\nconst johnny = Object.create(robot);\njohnny.name = 'johnny';\njohnny.say(); // Hi! I'm johnny!\n\nconst betty = Object.create(robot);\nbetty.name = 'betty';\nbetty.say(); // Hi! I'm betty!\n\nconsole.log(robot.isPrototypeOf(johnny)); // true\nconsole.log(robot.isPrototypeOf(betty)); // true\n
\n

JavaScript implementa \"herencia\" a través de prototipos, lo que quiere decir que\nno heredamos de una clase, sino de un objeto. Así que podemos concentrarnos en\nlos prototipos sin necesidad de un constructor, new y Function#prototype.

\n

A diferencia de los constructores, cuando usamos directamente Object.create no\ntenemos dónde escribir lógica de inicialización. Para solventar esto podríamos\nrefactorizar el constructor anterior en una función que explícitamente crea un\nnuevo objeto usando Object.create() y le asigna la propiedad name.

\n
function createRobot(name) {\n  const obj = Object.create(robot);\n  obj.name = name;\n  return obj;\n}\n
\n

Como alternativa, una convención común cuando necesitamos lógica de constructor\nes añadir un método init que se encargue de inicializar el objeto:

\n
const robot = {\n  init: function (name) {\n    this.name = name;\n  },\n  say: function () {\n    console.log('Hi! I\\'m ' + this.name + '!');\n  }\n};\n
\n
\n

PRO TIP:

\n

Si nuestro métodod init retorna una referencia a this, podemos encadenar las\ninvocaciones:

\n
const robot = {\n  init: function (name) {\n    this.name = name;\n    return this;\n  },\n  say: function () {\n    console.log('Hi! I\\'m ' + this.name + '!');\n  }\n};\n\nconst johnny = Object.create(robot).init('johnny');\n
\n
\n

Por ahora hemos invocado Object.create() con un solo argumento: el prototipo\nque queremos que tenga el nuevo objeto. Pero Object.create() nos ofrece la\nposibilidad de pasar un segundo argumento: un objeto cuyas propiedades serán\nagregadas al objeto recién creado, con los nombres de propiedad\ncorrespondientes. Estas propiedades corresponden al segundo argumento de\nObject.defineProperties.

\n
function createRobot(name) {\n  return Object.create(robot, {\n    name: {\n      value: name,\n      enumerable: true\n    }\n  });\n}\n\nconst grace = createRobot('grace');\ngrace.say(); // Hi! I'm grace!\nconsole.log(grace); // { name: 'grace' }\n
\n
\n

BONUS FACT:

\n

Object.create() fue originalmente implementada y popularizada por Douglas\nCrockford, el abuelito gruñón\ndel JavaScript, con la intención de aclarar los malos entendidos que generan los\nconstructores, que parecen clases pero no lo son, y en cambio se centra en los\nprototipos. Hoy en día Object.create() ya es parte del lenguaje en sí.

\n
\n

Referencias

\n

Videos:

\n\n

Otros recursos:

\n" + "body": "

\"Paradigmas

\n

En JavaScript todo objeto tiene un \"prototipo\", aunque no lo especifiquemos.\nCuando creamos un objeto literal, el prototipo del objeto por defecto es\nObject.prototype.

\n
console.log(Object.prototype.isPrototypeOf({})); // true\nconsole.log({} instanceof Object); // true\n
\n

En la lección anterior vimos como podemos usar constructores para crear\nobjetos con un prototipo determinado. Cuando usamos un constructor los objetos\nnuevos tendrán como prototipo la propiedad prototype del constructor.

\n
function Robot(name) {\n  this.name = name;\n}\n\nRobot.prototype.say = function () {\n  console.log('Hi! I\\'m ' + this.name + '!');\n};\n\nconst ada = new Robot('ada');\nada.say(); // Hi! I'm ada!\n\nconsole.log(ada instanceof Robot); // true\nconsole.log(Robot.prototype.isPrototypeOf(ada)); // true\n
\n

Los constructores son comunes porque se parecen a las \"clases\" que hay en otros\nlenguajes, pero no son la única manera de crear objetos con un prototipo\ndeterminado. Hay una manera más simple y más natural para el modelo prototipal:\nObject.create().

\n
// otra manera de asignar el prototipo: `Object.create()`\nconst robot = {\n  say: function () {\n    console.log('Hi! I\\'m ' + this.name + '!');\n  }\n};\n\nconst johnny = Object.create(robot);\njohnny.name = 'johnny';\njohnny.say(); // Hi! I'm johnny!\n\nconst betty = Object.create(robot);\nbetty.name = 'betty';\nbetty.say(); // Hi! I'm betty!\n\nconsole.log(robot.isPrototypeOf(johnny)); // true\nconsole.log(robot.isPrototypeOf(betty)); // true\n
\n

JavaScript implementa \"herencia\" a través de prototipos, lo que quiere decir que\nno heredamos de una clase, sino de un objeto. Así que podemos concentrarnos en\nlos prototipos sin necesidad de un constructor, new y Function#prototype.

\n

A diferencia de los constructores, cuando usamos directamente Object.create no\ntenemos dónde escribir lógica de inicialización. Para solventar esto podríamos\nrefactorizar el constructor anterior en una función que explícitamente crea un\nnuevo objeto usando Object.create() y le asigna la propiedad name.

\n
function createRobot(name) {\n  const obj = Object.create(robot);\n  obj.name = name;\n  return obj;\n}\n
\n

Como alternativa, una convención común cuando necesitamos lógica de constructor\nes añadir un método init que se encargue de inicializar el objeto:

\n
const robot = {\n  init: function (name) {\n    this.name = name;\n  },\n  say: function () {\n    console.log('Hi! I\\'m ' + this.name + '!');\n  }\n};\n
\n
\n

PRO TIP:

\n

Si nuestro métodod init retorna una referencia a this, podemos encadenar las\ninvocaciones:

\n
const robot = {\n  init: function (name) {\n    this.name = name;\n    return this;\n  },\n  say: function () {\n    console.log('Hi! I\\'m ' + this.name + '!');\n  }\n};\n\nconst johnny = Object.create(robot).init('johnny');\n
\n
\n

Por ahora hemos invocado Object.create() con un solo argumento: el prototipo\nque queremos que tenga el nuevo objeto. Pero Object.create() nos ofrece la\nposibilidad de pasar un segundo argumento: un objeto cuyas propiedades serán\nagregadas al objeto recién creado, con los nombres de propiedad\ncorrespondientes. Estas propiedades corresponden al segundo argumento de\nObject.defineProperties.

\n
function createRobot(name) {\n  return Object.create(robot, {\n    name: {\n      value: name,\n      enumerable: true\n    }\n  });\n}\n\nconst grace = createRobot('grace');\ngrace.say(); // Hi! I'm grace!\nconsole.log(grace); // { name: 'grace' }\n
\n
\n

BONUS FACT:

\n

Object.create() fue originalmente implementada y popularizada por Douglas\nCrockford, el abuelito gruñón\ndel JavaScript, con la intención de aclarar los malos entendidos que generan los\nconstructores, que parecen clases pero no lo son, y en cambio se centra en los\nprototipos. Hoy en día Object.create() ya es parte del lenguaje en sí.

\n
\n

Referencias

\n

Videos:

\n\n

Otros recursos:

\n" } } }, @@ -315,7 +315,7 @@ "intl": { "es": { "title": "Herencia prototipal", - "body": "

\"Paradigmas

\n

Hasta ahora nos hemos concetrado en el concepto de prototipo y cómo crear\nobjetos con un prototipo determinado. También hemos mencionado el concepto\nde cadena de prototipos y cómo JavaScript \"resuleve\" (busca) las propiedades\nde un objeto empezando por aquellas definidas directamente sobre la instacia,\ndespués el prototipo, de ahí el prototipo del prototipo y así sucesivamente.

\n

También hemos hablado de cómo el concepto de \"herencia\" y las \"jerarquías de\nherencia\" son fundamentales en la programación orientada a objetos. Ahora es la\nhora de ver cómo usamos lo que hemos aprendido de prototipos y Object.create\npara implementar una jerarquía de herencia, donde un objeto hereda de otro\nobjeto que a su vez hereda de otro.

\n

Para heredar de un objeto existente, podemos crear un nuevo constructor y\na su prototipo asignarle un objeto que tenga como prototipo el prototipo del\nconstructor que queremos \"extender\". Para crear ese objeto que podamos usar como\nprototipo del nuevo constructor vamos a usar Object.create(), que nos permite\ncrear un nuevo objeto especificando su prototipo.

\n

Continuando con el ejemplo de la lección anterior, implementemos un nuevo tipo\nde nota que herede de Note.

\n
//\n// Note (constructor base que vamos a extender, copiado de la lección anterior)\n//\nfunction Note(text) {\n  this.text = text || '';\n  this.createdAt = new Date();\n  this.completed = false;\n}\n\nNote.prototype.toString = function () {\n  let str = '[' + (this.completed ? 'X' : ' ') + ']';\n  str += ' | ' + this.createdAt.toDateString();\n  str += ' | ' + this.text;\n  return str;\n};\n\n//\n// ImageNote (constructor que hereda de Note)\n//\nfunction ImageNote(url) {\n  this.url = url;\n}\n\n// Heredamos de `Note.prototype`\nImageNote.prototype = Object.create(Note.prototype);\n\nconsole.log(new ImageNote('http://foo.com/bar.png'));\n// Note { url: 'http://foo.com/bar.png' }\n
\n

Hemos creado un constructor ImageNote, y antes de fijarnos en el cuerpo del\nconstructor veamos primero el mecanismo de herencia. A ImageNote.prototype le\nasignamos un objeto nuevo que tiene Note.prototype como prototipo usando\nObject.create().

\n

Nuestra implementación de ImageNote todavía está incompleta, pero ya podemos\nver cómo hemos preparado el escenario para que herede de Note.prototype. En el\ncaso de Note, habíamos asignado propiedades a Note.prototype, pero no\nhabíamos asignado el objeto Note.prototype en sí. Ahora en ImageNote hacemos\nalgo muy distinto: usamos Object.create() para crear un nuevo objeto que tenga\ncomo prototipo Note.prototype, y éste nuevo objeto lo asignamos a\nImageNote.prototype. Lo que estamos haciendo es construir una cadena de\nprototipos. Los objetos creados con new ImageNote() tendrán como prototipo un\nobjeto que a su vez tiene Note.prototype como prototipo. Esto puede sonar\nbastante confuso al principio. Tómate tu tiempo para entender lo que está\npasando.

\n

Hemos dicho que nuestra implementación no está completa. Si nos fijamos en el\nconstructor Note vemos que inicializa el nuevo objeto con tres propiedades:\ntext, createdAt y completed. Podríamos \"duplicar\" la lógica dentro del\nconstructor ImageNote, pero si estamos usando herencia, es precisamente para\npoder reusar código y evitar repetición!

\n

Antes hemos visto como podemos usar bind para definir de forma explícita el\nvalor de this. Ahora veamos cómo otro método de las funciones nos permite\n\"invocar\" una función asignando this a lo que queramos.

\n
function ImageNote(url) {\n  this.url = url;\n  Note.call(this, 'an image note');\n}\n\n// Heredamos de `Note.prototype`\nImageNote.prototype = Object.create(Note.prototype);\n\nconsole.log(new ImageNote('http://foo.com/bar.png'));\n
\n

En la consola deberías ver algo así:

\n
Note {\n  url: 'http://foo.com/bar.png',\n  text: 'an image note',\n  createdAt: 2017-06-22T15:05:21.013Z,\n  completed: false }\n
\n

Dentro de nuestro constructor ImageNote hemos añadido una invocación al\nconstructor Note. De esa forma podemos reusar la lógica del constructor\nNote, y para asegurarnos de que Note opera sobre el this de la nueva nota\ncreada con ImageNote usamos call(). Function.prototype.call es muy\nparecida a Function.prototype.bind, pero en vez de retornar una función con\nel contexto fijado, lo que hace es invocar la función con el contexto deseado.

\n

También podemos ver, al hacer console.log, que el objeto aparece como de\n\"tipo\" Note y no ImageNote. Eso es porque el prototipo de una función guarda\nuna referencia a su constructor en una propiedad llamada constructor. Al\nreemplazar el prototipo de ImageNote con el objeto creado con Object.create,\nla propiedad constructor ahora resuleve al constructor de Note. Podemos\ncorregir esto explícitamente asignando ImageNote.prototype.constructor:

\n
function ImageNote(url) {\n  this.url = url;\n  Note.call(this, 'an image note');\n}\n\n// Heredamos de `Note.prototype`\nImageNote.prototype = Object.create(Note.prototype);\n// Asignamos constructor al nuevo prototipo\nImageNote.prototype.constructor = ImageNote;\n\nconsole.log(new ImageNote('http://foo.com/bar.png'));\n
\n

En la consola deberías ver algo así:

\n
ImageNote {\n  url: 'http://foo.com/bar.png',\n  text: 'an image note',\n  createdAt: 2017-06-22T15:12:40.163Z,\n  completed: false }\n
\n

Yay! Ya tenemos un constructor que hereda de Note! Ahora vamos a modificar la\nfuncionalidad del método Note#toString para que se adapte a ImageNote y nos\nmuestre la url de la imagen:

\n
function ImageNote(url) {\n  this.url = url;\n  Note.call(this, 'an image note');\n}\n\n// Heredamos de `Note.prototype`\nImageNote.prototype = Object.create(Note.prototype);\nImageNote.prototype.constructor = ImageNote;\n\n// Sobreescribimos el método `toString` para instancias de `ImageNote`\nImageNote.prototype.toString = function () {\n  return Note.prototype.toString.call(this) + ' | ' + this.url;\n};\n
\n

Hemos declarado un nuevo método toString sobre el prototipo de ImageNote, y\nen la implementación de ese método estamos reusando Note.prototype.toString,\nhaciendo uso de Function#call otra vez ;-)

\n

Ahora instanciemos nuestro objeto y veamos como se comporta:

\n
const imageNote = new ImageNote('http://foo.bar/baz.jpg');\n\nconsole.log(imageNote);\nconsole.log(imageNote.toString());\n// [ ] | Thu Jun 22 2017 | an image note | http://foo.bar/baz.jpg\n\nconsole.log(note instanceof ImageNote); // false\nconsole.log(imageNote instanceof Note); // true\nconsole.log(imageNote instanceof ImageNote); // true\n\nconsole.log(Note.prototype.isPrototypeOf(imageNote)); // true\nconsole.log(ImageNote.prototype.isPrototypeOf(note)); // false\nconsole.log(ImageNote.prototype.isPrototypeOf(imageNote)); // true\n
\n
\n

Referencias

\n

Capítulos de libros:

\n\n

Blog posts:

\n\n

Videos:

\n\n

Otros recursos:

\n" + "body": "

\"Paradigmas

\n

Hasta ahora nos hemos concetrado en el concepto de prototipo y cómo crear\nobjetos con un prototipo determinado. También hemos mencionado el concepto\nde cadena de prototipos y cómo JavaScript \"resuleve\" (busca) las propiedades\nde un objeto empezando por aquellas definidas directamente sobre la instacia,\ndespués el prototipo, de ahí el prototipo del prototipo y así sucesivamente.

\n

También hemos hablado de cómo el concepto de \"herencia\" y las \"jerarquías de\nherencia\" son fundamentales en la programación orientada a objetos. Ahora es la\nhora de ver cómo usamos lo que hemos aprendido de prototipos y Object.create\npara implementar una jerarquía de herencia, donde un objeto hereda de otro\nobjeto que a su vez hereda de otro.

\n

Para heredar de un objeto existente, podemos crear un nuevo constructor y\na su prototipo asignarle un objeto que tenga como prototipo el prototipo del\nconstructor que queremos \"extender\". Para crear ese objeto que podamos usar como\nprototipo del nuevo constructor vamos a usar Object.create(), que nos permite\ncrear un nuevo objeto especificando su prototipo.

\n

Continuando con el ejemplo de la lección anterior, implementemos un nuevo tipo\nde nota que herede de Note.

\n
//\n// Note (constructor base que vamos a extender, copiado de la lección anterior)\n//\nfunction Note(text) {\n  this.text = text || '';\n  this.createdAt = new Date();\n  this.completed = false;\n}\n\nNote.prototype.toString = function () {\n  let str = '[' + (this.completed ? 'X' : ' ') + ']';\n  str += ' | ' + this.createdAt.toDateString();\n  str += ' | ' + this.text;\n  return str;\n};\n\n//\n// ImageNote (constructor que hereda de Note)\n//\nfunction ImageNote(url) {\n  this.url = url;\n}\n\n// Heredamos de `Note.prototype`\nImageNote.prototype = Object.create(Note.prototype);\n\nconsole.log(new ImageNote('http://foo.com/bar.png'));\n// Note { url: 'http://foo.com/bar.png' }\n
\n

Hemos creado un constructor ImageNote, y antes de fijarnos en el cuerpo del\nconstructor veamos primero el mecanismo de herencia. A ImageNote.prototype le\nasignamos un objeto nuevo que tiene Note.prototype como prototipo usando\nObject.create().

\n

Nuestra implementación de ImageNote todavía está incompleta, pero ya podemos\nver cómo hemos preparado el escenario para que herede de Note.prototype. En el\ncaso de Note, habíamos asignado propiedades a Note.prototype, pero no\nhabíamos asignado el objeto Note.prototype en sí. Ahora en ImageNote hacemos\nalgo muy distinto: usamos Object.create() para crear un nuevo objeto que tenga\ncomo prototipo Note.prototype, y éste nuevo objeto lo asignamos a\nImageNote.prototype. Lo que estamos haciendo es construir una cadena de\nprototipos. Los objetos creados con new ImageNote() tendrán como prototipo un\nobjeto que a su vez tiene Note.prototype como prototipo. Esto puede sonar\nbastante confuso al principio. Tómate tu tiempo para entender lo que está\npasando.

\n

Hemos dicho que nuestra implementación no está completa. Si nos fijamos en el\nconstructor Note vemos que inicializa el nuevo objeto con tres propiedades:\ntext, createdAt y completed. Podríamos \"duplicar\" la lógica dentro del\nconstructor ImageNote, pero si estamos usando herencia, es precisamente para\npoder reusar código y evitar repetición!

\n

Antes hemos visto como podemos usar bind para definir de forma explícita el\nvalor de this. Ahora veamos cómo otro método de las funciones nos permite\n\"invocar\" una función asignando this a lo que queramos.

\n
function ImageNote(url) {\n  this.url = url;\n  Note.call(this, 'an image note');\n}\n\n// Heredamos de `Note.prototype`\nImageNote.prototype = Object.create(Note.prototype);\n\nconsole.log(new ImageNote('http://foo.com/bar.png'));\n
\n

En la consola deberías ver algo así:

\n
Note {\n  url: 'http://foo.com/bar.png',\n  text: 'an image note',\n  createdAt: 2017-06-22T15:05:21.013Z,\n  completed: false }\n
\n

Dentro de nuestro constructor ImageNote hemos añadido una invocación al\nconstructor Note. De esa forma podemos reusar la lógica del constructor\nNote, y para asegurarnos de que Note opera sobre el this de la nueva nota\ncreada con ImageNote usamos call(). Function.prototype.call es muy\nparecida a Function.prototype.bind, pero en vez de retornar una función con\nel contexto fijado, lo que hace es invocar la función con el contexto deseado.

\n

También podemos ver, al hacer console.log, que el objeto aparece como de\n\"tipo\" Note y no ImageNote. Eso es porque el prototipo de una función guarda\nuna referencia a su constructor en una propiedad llamada constructor. Al\nreemplazar el prototipo de ImageNote con el objeto creado con Object.create,\nla propiedad constructor ahora resuleve al constructor de Note. Podemos\ncorregir esto explícitamente asignando ImageNote.prototype.constructor:

\n
function ImageNote(url) {\n  this.url = url;\n  Note.call(this, 'an image note');\n}\n\n// Heredamos de `Note.prototype`\nImageNote.prototype = Object.create(Note.prototype);\n// Asignamos constructor al nuevo prototipo\nImageNote.prototype.constructor = ImageNote;\n\nconsole.log(new ImageNote('http://foo.com/bar.png'));\n
\n

En la consola deberías ver algo así:

\n
ImageNote {\n  url: 'http://foo.com/bar.png',\n  text: 'an image note',\n  createdAt: 2017-06-22T15:12:40.163Z,\n  completed: false }\n
\n

Yay! Ya tenemos un constructor que hereda de Note! Ahora vamos a modificar la\nfuncionalidad del método Note#toString para que se adapte a ImageNote y nos\nmuestre la url de la imagen:

\n
function ImageNote(url) {\n  this.url = url;\n  Note.call(this, 'an image note');\n}\n\n// Heredamos de `Note.prototype`\nImageNote.prototype = Object.create(Note.prototype);\nImageNote.prototype.constructor = ImageNote;\n\n// Sobreescribimos el método `toString` para instancias de `ImageNote`\nImageNote.prototype.toString = function () {\n  return Note.prototype.toString.call(this) + ' | ' + this.url;\n};\n
\n

Hemos declarado un nuevo método toString sobre el prototipo de ImageNote, y\nen la implementación de ese método estamos reusando Note.prototype.toString,\nhaciendo uso de Function#call otra vez ;-)

\n

Ahora instanciemos nuestro objeto y veamos como se comporta:

\n
const imageNote = new ImageNote('http://foo.bar/baz.jpg');\n\nconsole.log(imageNote);\nconsole.log(imageNote.toString());\n// [ ] | Thu Jun 22 2017 | an image note | http://foo.bar/baz.jpg\n\nconsole.log(note instanceof ImageNote); // false\nconsole.log(imageNote instanceof Note); // true\nconsole.log(imageNote instanceof ImageNote); // true\n\nconsole.log(Note.prototype.isPrototypeOf(imageNote)); // true\nconsole.log(ImageNote.prototype.isPrototypeOf(note)); // false\nconsole.log(ImageNote.prototype.isPrototypeOf(imageNote)); // true\n
\n
\n

Referencias

\n

Capítulos de libros:

\n\n

Blog posts:

\n\n

Videos:

\n\n

Otros recursos:

\n" } } }, @@ -335,7 +335,7 @@ "slug": "simple-objects", "prefix": "01", "path": "topics/paradigms/03-proto/04-ejercicios/01-simple-objects", - "createdAt": "2023-04-04T20:28:39.927Z", + "createdAt": "2023-05-17T20:37:26.464Z", "env": "cjs", "intl": { "es": { @@ -353,7 +353,7 @@ "slug": "proto", "prefix": "02", "path": "topics/paradigms/03-proto/04-ejercicios/02-proto", - "createdAt": "2023-04-04T20:28:39.927Z", + "createdAt": "2023-05-17T20:37:26.464Z", "env": "cjs", "intl": { "es": { @@ -371,7 +371,7 @@ "slug": "dynamic-lookups", "prefix": "03", "path": "topics/paradigms/03-proto/04-ejercicios/03-dynamic-lookups", - "createdAt": "2023-04-04T20:28:39.927Z", + "createdAt": "2023-05-17T20:37:26.464Z", "env": "cjs", "intl": { "es": { @@ -389,7 +389,7 @@ "slug": "property-assignments", "prefix": "04", "path": "topics/paradigms/03-proto/04-ejercicios/04-property-assignments", - "createdAt": "2023-04-04T20:28:39.927Z", + "createdAt": "2023-05-17T20:37:26.464Z", "env": "cjs", "intl": { "es": { @@ -407,7 +407,7 @@ "slug": "arrays-and-objects", "prefix": "05", "path": "topics/paradigms/03-proto/04-ejercicios/05-arrays-and-objects", - "createdAt": "2023-04-04T20:28:39.927Z", + "createdAt": "2023-05-17T20:37:26.464Z", "env": "cjs", "intl": { "es": { @@ -425,7 +425,7 @@ "slug": "object-create", "prefix": "06", "path": "topics/paradigms/03-proto/04-ejercicios/06-object-create", - "createdAt": "2023-04-04T20:28:39.927Z", + "createdAt": "2023-05-17T20:37:26.465Z", "env": "cjs", "intl": { "es": { @@ -443,7 +443,7 @@ "slug": "dot-new", "prefix": "07", "path": "topics/paradigms/03-proto/04-ejercicios/07-dot-new", - "createdAt": "2023-04-04T20:28:39.927Z", + "createdAt": "2023-05-17T20:37:26.464Z", "env": "cjs", "intl": { "es": { @@ -461,7 +461,7 @@ "slug": "constructor-functions", "prefix": "08", "path": "topics/paradigms/03-proto/04-ejercicios/08-constructor-functions", - "createdAt": "2023-04-04T20:28:39.927Z", + "createdAt": "2023-05-17T20:37:26.465Z", "env": "cjs", "intl": { "es": { @@ -479,7 +479,7 @@ "slug": "implicit-this", "prefix": "09", "path": "topics/paradigms/03-proto/04-ejercicios/09-implicit-this", - "createdAt": "2023-04-04T20:28:39.927Z", + "createdAt": "2023-05-17T20:37:26.465Z", "env": "cjs", "intl": { "es": { @@ -497,7 +497,7 @@ "slug": "function-prototype", "prefix": "10", "path": "topics/paradigms/03-proto/04-ejercicios/10-function-prototype", - "createdAt": "2023-04-04T20:28:39.927Z", + "createdAt": "2023-05-17T20:37:26.465Z", "env": "cjs", "intl": { "es": { @@ -612,7 +612,7 @@ "slug": "hof", "prefix": "01", "path": "topics/paradigms/06-composition/05-exercises/01-hof", - "createdAt": "2023-04-04T20:28:39.927Z", + "createdAt": "2023-05-17T20:37:26.465Z", "env": "cjs", "intl": { "es": { @@ -630,7 +630,7 @@ "slug": "map", "prefix": "02", "path": "topics/paradigms/06-composition/05-exercises/02-map", - "createdAt": "2023-04-04T20:28:39.927Z", + "createdAt": "2023-05-17T20:37:26.465Z", "env": "cjs", "intl": { "es": { @@ -648,7 +648,7 @@ "slug": "filter", "prefix": "03", "path": "topics/paradigms/06-composition/05-exercises/03-filter", - "createdAt": "2023-04-04T20:28:39.927Z", + "createdAt": "2023-05-17T20:37:26.465Z", "env": "cjs", "intl": { "es": { @@ -666,7 +666,7 @@ "slug": "reduce", "prefix": "04", "path": "topics/paradigms/06-composition/05-exercises/04-reduce", - "createdAt": "2023-04-04T20:28:39.927Z", + "createdAt": "2023-05-17T20:37:26.465Z", "env": "cjs", "intl": { "es": { @@ -684,7 +684,7 @@ "slug": "arrow-functions", "prefix": "05", "path": "topics/paradigms/06-composition/05-exercises/05-arrow-functions", - "createdAt": "2023-04-04T20:28:39.927Z", + "createdAt": "2023-05-17T20:37:26.465Z", "env": "cjs", "intl": { "es": { @@ -702,7 +702,7 @@ "slug": "closures", "prefix": "06", "path": "topics/paradigms/06-composition/05-exercises/06-closures", - "createdAt": "2023-04-04T20:28:39.927Z", + "createdAt": "2023-05-17T20:37:26.465Z", "env": "cjs", "intl": { "es": { @@ -720,7 +720,7 @@ "slug": "factories", "prefix": "07", "path": "topics/paradigms/06-composition/05-exercises/07-factories", - "createdAt": "2023-04-04T20:28:39.927Z", + "createdAt": "2023-05-17T20:37:26.465Z", "env": "cjs", "intl": { "es": { @@ -738,7 +738,7 @@ "slug": "object-assign", "prefix": "08", "path": "topics/paradigms/06-composition/05-exercises/08-object-assign", - "createdAt": "2023-04-04T20:28:39.927Z", + "createdAt": "2023-05-17T20:37:26.465Z", "env": "cjs", "intl": { "es": { @@ -756,7 +756,7 @@ "slug": "composition", "prefix": "09", "path": "topics/paradigms/06-composition/05-exercises/09-composition", - "createdAt": "2023-04-04T20:28:39.927Z", + "createdAt": "2023-05-17T20:37:26.465Z", "env": "cjs", "intl": { "es": { diff --git a/dist/topics/prototyping.json b/dist/topics/prototyping.json index 393e4672f..862e17bb9 100644 --- a/dist/topics/prototyping.json +++ b/dist/topics/prototyping.json @@ -2,9 +2,9 @@ "slug": "prototyping", "repo": "Laboratoria/bootcamp", "path": "topics/prototyping", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:39.620Z", + "createdAt": "2023-05-17T20:37:32.865Z", "track": "ux", "intl": { "es": { @@ -32,7 +32,7 @@ "intl": { "es": { "title": "Wireframes", - "body": "

Wireframing

\n

Un wireframe es un esquema simplificado de baja fidelidad de tu producto. Puedes\nreconocerlos por sus diseños distintivos de bloques, el uso de líneas para\nrepresentar texto y cuadrados \"✕\" que indican marcadores de posición para\nimágenes futuras.

\n

Elementos de un wireframe

\n
    \n
  • Distribución de espacios
  • \n
  • Priorización del contenido
  • \n
  • Funciones disponibles
  • \n
  • Acciones deseables
  • \n
  • Relación entre pantallas
  • \n
\n

Elementos que NO debe tener wireframe

\n
    \n
  • Elementos de diseño
  • \n
  • Colores
  • \n
  • Imágenes actuales
  • \n
  • Fonts
  • \n
  • Logos
  • \n
\n

Wireframes de baja fidelidad

\n

Los wireframes de baja fidelidad son el punto de partida de un diseñador UX para\ntrabajar en la estructura, contenido y jerarquía. Esta herramienta nos provee de\nuna visión simple en bloques de cómo debe estar organizado el espacio para\nimágenes y contenido.

\n

\"Low-fidelity

\n

Pros

\n
    \n
  • Fácil y rápido de crear
  • \n
  • Pueden ser usados como un punto de partida común
  • \n
\n

Cons

\n
    \n
  • Puede que no se vean muy profesional
  • \n
\n

Wireframes de alta fidelidad

\n

Un wireframe de alta fidelidad tiene contenido real y dimensiones exactas en\nimágenes y elementos. Puede ser diseñado usando tonos de grises para representar\nel contraste al momento de usar color. Sirven de puente entre wireframes y los\nprototipos de alta fidelidad.

\n

\"High-fidelity

\n

Pros

\n
    \n
  • Provee una mejor idea de cómo se va a ver el prototipo final
  • \n
\n

Cons

\n
    \n
  • Requiere más tiempo para ser creados
  • \n
\n

Recursos

\n" + "body": "

Wireframing

\n

Un wireframe es un esquema simplificado de baja fidelidad de tu producto. Puedes\nreconocerlos por sus diseños distintivos de bloques, el uso de líneas para\nrepresentar texto y cuadrados \"✕\" que indican marcadores de posición para\nimágenes futuras.

\n

Elementos de un wireframe

\n
    \n
  • Distribución de espacios
  • \n
  • Priorización del contenido
  • \n
  • Funciones disponibles
  • \n
  • Acciones deseables
  • \n
  • Relación entre pantallas
  • \n
\n

Elementos que NO debe tener wireframe

\n
    \n
  • Elementos de diseño
  • \n
  • Colores
  • \n
  • Imágenes actuales
  • \n
  • Fonts
  • \n
  • Logos
  • \n
\n

Wireframes de baja fidelidad

\n

Los wireframes de baja fidelidad son el punto de partida de un diseñador UX para\ntrabajar en la estructura, contenido y jerarquía. Esta herramienta nos provee de\nuna visión simple en bloques de cómo debe estar organizado el espacio para\nimágenes y contenido.

\n

\"Low-fidelity

\n

Pros

\n
    \n
  • Fácil y rápido de crear
  • \n
  • Pueden ser usados como un punto de partida común
  • \n
\n

Cons

\n
    \n
  • Puede que no se vean muy profesional
  • \n
\n

Wireframes de alta fidelidad

\n

Un wireframe de alta fidelidad tiene contenido real y dimensiones exactas en\nimágenes y elementos. Puede ser diseñado usando tonos de grises para representar\nel contraste al momento de usar color. Sirven de puente entre wireframes y los\nprototipos de alta fidelidad.

\n

\"High-fidelity

\n

Pros

\n
    \n
  • Provee una mejor idea de cómo se va a ver el prototipo final
  • \n
\n

Cons

\n
    \n
  • Requiere más tiempo para ser creados
  • \n
\n

Recursos

\n" } } }, diff --git a/dist/topics/scm.json b/dist/topics/scm.json index 793fb69b8..5fa02f445 100644 --- a/dist/topics/scm.json +++ b/dist/topics/scm.json @@ -2,9 +2,9 @@ "slug": "scm", "repo": "Laboratoria/bootcamp", "path": "topics/scm", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:41.950Z", + "createdAt": "2023-05-17T20:37:33.525Z", "track": "web-dev", "intl": { "es": { @@ -71,11 +71,11 @@ "intl": { "es": { "title": "Configuración", - "body": "

Ya tenemos instaladoGit en nuestro equipo, ahora personalizaremos nuestro\nentorno de Git.

\n
\n

Recuerda que si quieres ejecutar comandos de Git y te encuentras en Mac OS X o\nLinux deberás ejecutarlos en la línea de comandos, en cambio, si tu\nsistema operativo es Windows abriremos Git Bash para ejecutar los\ncomandos de Git.

\n
\n

Lo primero que debemos de hacer es establecer nuestro username y\ndirección de correo debido a que Git utilizará estos datos para la\nconfirmación de cambios (o como los conoceremos más adelante: commits),\npodemos configurar estos datos por medio del comando git config, este nos\npermite obtener y establecer variables de configuración que controlan el\naspecto y funcionamiento de Git, como por ejemplo si ejecuto el comando\ngit config --list en mi terminal me devuelve esto:

\n
user.name = michellesegv\nuser.email = michelle@laboratoria.la\n
\n

(Que vienen a ser los datos que ya he configurado)

\n

Ahora nosotras vamos configurar nuestro entorno de Git:

\n
    \n
  • \n

    Para configurar nuestro username debemos escribir la siguiente línea que\ndebe de tener nuestros datos, y luego presionaremos la tecla \"enter\":

    \n
    git config --global user.name Tu-username\n
    \n
  • \n
  • \n

    Para configurar nuestro correo electrónico debemos escribir la siguiente\nlínea con nuestros datos y luego presionaremos la tecla \"enter\":

    \n
    git config --global user.email tucorreo@gmail.com\n
    \n
  • \n
\n

Los datos con los que llenes las líneas anteriores deben de ser los mismos que\nusaste al crear tu cuenta de Github, porque como te comentaba con ellos se\nregistrarán los commits que hagas en Git y que luego pasarán al historial\nde nuestro proyecto en Github.

\n

\"Subiendo

" + "body": "

Ya tenemos instaladoGit en nuestro equipo, ahora personalizaremos nuestro\nentorno de Git.

\n
\n

Recuerda que si quieres ejecutar comandos de Git y te encuentras en Mac OS X o\nLinux deberás ejecutarlos en la línea de comandos, en cambio, si tu\nsistema operativo es Windows abriremos Git Bash para ejecutar los\ncomandos de Git.

\n
\n

Lo primero que debemos de hacer es establecer nuestro username y\ndirección de correo debido a que Git utilizará estos datos para la\nconfirmación de cambios (o como los conoceremos más adelante: commits),\npodemos configurar estos datos por medio del comando git config, este nos\npermite obtener y establecer variables de configuración que controlan el\naspecto y funcionamiento de Git, como por ejemplo si ejecuto el comando\ngit config --list en mi terminal me devuelve esto:

\n
user.name = michellesegv\nuser.email = michelle@laboratoria.la\n
\n

(Que vienen a ser los datos que ya he configurado)

\n

Ahora nosotras vamos configurar nuestro entorno de Git:

\n
    \n
  • \n

    Para configurar nuestro username debemos escribir la siguiente línea que\ndebe de tener nuestros datos, y luego presionaremos la tecla \"enter\":

    \n
    git config --global user.name Tu-username\n
    \n
  • \n
  • \n

    Para configurar nuestro correo electrónico debemos escribir la siguiente\nlínea con nuestros datos y luego presionaremos la tecla \"enter\":

    \n
    git config --global user.email tucorreo@gmail.com\n
    \n
  • \n
\n

Los datos con los que llenes las líneas anteriores deben de ser los mismos que\nusaste al crear tu cuenta de Github, porque como te comentaba con ellos se\nregistrarán los commits que hagas en Git y que luego pasarán al historial\nde nuestro proyecto en Github.

\n

" }, "pt": { "title": "Configuração", - "body": "

Com o Git já instalado em nosso computador, vamos agora personalizar o ambiente\ndo Git.

\n
\n

Lembre-se de que se você quiser executar comandos Git e estiver no Mac OS X ou\nLinux, deverá executá-los na linha de comandos. Porém, se seu sistema\noperacional é Windows, utilizará o Git Bash para executar os mesmos comandos\nde Git.

\n
\n

A primeira coisa a fazer é definir nosso nome de usuário (username) e e-mail\nque o Git utilizará para gravar as alterações de código (o que veremos mais\nadiante: commits). Podemos configurar esses dados através do comando git config, o qual nos permite visualizar e configurar variáveis que controlam a\naparência e funcionamento do Git. Por exemplo, se executo o comando git config --list em meu terminal, obtenho o seguinte resultado:

\n
user.name = michellesegv\nuser.email = michelle@laboratoria.la\n
\n

(Esses são os dados que eu já havia configurado)

\n

Agora, vamos definir o nosso ambiente de Git:

\n
    \n
  • \n

    Para definir seu username (nome de usuário), substitua seu-username na\nseguinte linha e depois pressione a tecla \"enter\":

    \n
    git config --global user.name seu-username\n
    \n
  • \n
  • \n

    Para definir seu e-mail, escreva o comando abaixo, pressionando \"enter\" em\nseguida:

    \n
    git config --global user.email seuemail@gmail.com\n
    \n
  • \n
\n

Os dados das linhas acima devem ser os mesmos que você usou ao criar a sua conta\nno GitHub, pois eles ficarão gravados nos commits que você fizer no Git e\nfarão parte do histórico do projeto que está armazenado no GitHub.

\n

\"Configurando\ngit\"

" + "body": "

Com o Git já instalado em nosso computador, vamos agora personalizar o ambiente\ndo Git.

\n
\n

Lembre-se de que se você quiser executar comandos Git e estiver no Mac OS X ou\nLinux, deverá executá-los na linha de comandos. Porém, se seu sistema\noperacional é Windows, utilizará o Git Bash para executar os mesmos comandos\nde Git.

\n
\n

A primeira coisa a fazer é definir nosso nome de usuário (username) e e-mail\nque o Git utilizará para gravar as alterações de código (o que veremos mais\nadiante: commits). Podemos configurar esses dados através do comando git config, o qual nos permite visualizar e configurar variáveis que controlam a\naparência e funcionamento do Git. Por exemplo, se executo o comando git config --list em meu terminal, obtenho o seguinte resultado:

\n
user.name = michellesegv\nuser.email = michelle@laboratoria.la\n
\n

(Esses são os dados que eu já havia configurado)

\n

Agora, vamos definir o nosso ambiente de Git:

\n
    \n
  • \n

    Para definir seu username (nome de usuário), substitua seu-username na\nseguinte linha e depois pressione a tecla \"enter\":

    \n
    git config --global user.name seu-username\n
    \n
  • \n
  • \n

    Para definir seu e-mail, escreva o comando abaixo, pressionando \"enter\" em\nseguida:

    \n
    git config --global user.email seuemail@gmail.com\n
    \n
  • \n
\n

Os dados das linhas acima devem ser os mesmos que você usou ao criar a sua conta\nno GitHub, pois eles ficarão gravados nos commits que você fizer no Git e\nfarão parte do histórico do projeto que está armazenado no GitHub.

\n

" } } }, @@ -117,11 +117,11 @@ "intl": { "es": { "title": "GitHub", - "body": "

Objetivos de Aprendizaje

\n
    \n
  • Crear tu cuenta en Github
  • \n
  • Diferenciar Git de Github
  • \n
  • Entender los conceptos básicos: local, remoto, working directory, staging\narea y branches
  • \n
  • Saber utilizar los comandos esenciales: remote, push y pull
  • \n
\n

¿Qué es Github?

\n

Github es conocida como la \"red social\" de los developers debido a que una\ngran cantidad de ellos suben sus proyectos aquí. Esto les permite crear\nrepositorios remotos que guardarán siempre una copia de su código y a la cual\npodrán acceder fácilmente mediante Git que es el controlador de versiones.

\n

Pero Github no solo sirve para \"subir\" nuestro código, él también contribuirá\nal desarrollo colaborativo del proyecto brindándonos herramientas como por\nejemplo:

\n
    \n
  • Un sistema de seguimiento de problemas que permite a los miembros de un\nequipo detallar un problema o una sugerencia que deseen hacer del proyecto.
  • \n
  • Una herramienta de revisión de código, donde se pueden añadir anotaciones\nen cualquier punto del proyecto y debatir sobre un cambio en específico.
  • \n
  • Un visor de versiones donde se puede comparar el progreso del proyecto en\nlas distintas versiones.
  • \n
\n

En resumen, se podría decir que Github es como Dropbox pero para developers.

\n

¿Cuál es la diferencia entre Git y Github?

\n

Git y Github se complementan pero no son iguales.

\n

Github utiliza a Git como Sistema de Control de Versiones. Gracias a\nGit podremos guardar localmente los diferentes avances (estados) de nuestro\nproyecto y gracias a Github podremos subir esos avances a la nube y\ncomenzar un trabajo colaborativo o trabajar en nuestros proyectos personales\nsin depender de la computadora donde se encuentre el proyecto o tener que estar\nguardándolo en un usb para copiarlo a otra computadora.

\n

¿Por qué es importante Git y Github?

\n

La programación se da, en su mayoría de veces, en equipos. Varias empresas\ntienen un equipo que se complementa para cada proyecto. Ante esta situación\nte preguntarás:

\n
\n

¿Cómo se organizan para trabajar todos en un solo proyecto? Tal vez tienen\ntodo en un usb y se lo turnan para poder trabajar, o trabajan cada uno por su\nlado y al momento de tener que unir las partes tienen que ver detalladamente\nsi se repiten o no alguna parte.

\n
\n

Esto no sería para nada eficiente, porque no se podría trabajar al mismo tiempo\nen algo en específico y se tendría que depender del avance de otro para que\nnosotros podamos avanzar.

\n

Para estos casos existen herramientas como Git y Github, los cuales nos\nayudan al momento de un trabajo colaborativo. Github es el lugar perfecto\npara trabajar conjuntamente en un proyecto con uno o varios compañeros, podrás\ncrear un proyecto y añadir como colaboradores a los miembros de tu equipo;\nademás, podrás traer a tu repositorio local los cambios que tus compañeros\nhayan subido al repositorio remoto y podrás ver automáticamente lo que acaba de\nañadir tu compañero.

\n

¿Cómo crear una cuenta en Github?

\n

Para crear tu cuenta de Github debemos seguir los siguientes pasos:

\n
    \n
  1. Debemos de dirigirnos a la página oficial de Github
  2. \n
  3. Ya en la página, haremos clic en Sign up.
  4. \n
  5. Ahora deberás escribir un username, que podrá ser uno que ya tengas. Por\nejemplo, si tienes un username que creaste para un juego online podrías\nusar ese. No hay límites de cómo debe de ser, pero ten en cuenta que será\nvisible para todo el mundo y puede que te lo pidan en algún momento para\nañadirte como colaborador de un proyecto, así que ten cuidado con lo que\npongas como username. Luego ingresa tu correo, una contraseña y\nhaz clic en Create an account.
  6. \n
  7. En la siguiente pantalla asegúrate de marcar la opción Unlimited public\nrepositories for free, esta es la versión \"free\" de Github; luego haz\nclic en continue.
  8. \n
  9. El paso 3 del registro puedes completarlo con tus datos y hacer clic en\nSubmit, o solo hacer clic en Skip this step.
  10. \n
\n

¡Y listo! Al hacer todos estos pasos ya tendríamos nuestra cuenta de Github\ncreada.

\n

Ahora Michelle, siguiendo los pasos anteriores, creará su cuenta en Github.

\n

\"creando

\n

¿Cómo creamos un repositorio remoto en Github?

\n

Sigue los pasos de Michelle para crear un repositorio en Github:

\n

\"Creando

\n

Por último tenemos la pantalla donde encontrarmos la url de nuestro\nrepositorio remoto, con la cual (más adelante) vincularemos nuestro\nrepositorio remoto con nuestro repositorio local.

\n

¿Cómo usar Git y Github?

\n

Hemos leído las ventajas que nos pueden brindar Git y Github, con ellos\npodremos subir un repositorio local a uno remoto, trabajar con versiones y\ncolaborativamente, etc. Ahora hagamos la \"magia\" de trabajar con Git y\nGithub, vamos a subir nuestro repositorio local a uno remoto y trabajar\ncolaborativamente.

\n
    \n
  • \n

    remote: Con remote vincularemos nuestro repositorio local con nuestro\nrepositorio que se encuentra en la \"nube\" por medio de la url.\nEste paso no se debe de hacer cada vez que creemos una nueva versión, solo\ncuando queramos especificar el repositorio remoto que tendremos.\nEntonces, para enlazar nuestro repositorio local con nuestro repositorio\nremoto debemos de ejecutar el siguiente comando:

    \n
    git remote add nombre-remoto url\n
    \n

    Normalmente, la mayoría de los developers, como nombre-remoto utiliza\norigin y url es la \"ruta\" (url) de nuestro repositorio en Github.\nPor ejemplo, hace un momento he creado el repositorio \"prueba\" en Github y\nsi quiero vincular mi repositorio local con ese repositorio remoto tendría\nque ejecutar la siguiente línea de comando:

    \n
    git remote add origin https://github.com/michellesegv/prueba.git\n
    \n
  • \n
  • \n

    push: Por medio de push enviaremos nuestra nueva versión que\nconfirmamos en el commit a nuestro repositorio remoto. El comando es el\nsiguiente:

    \n
    git push nombre-remoto master\n
    \n

    En nombre-remoto pondremos el mismo nombre-remoto que le hemos asignado\nal momento de añadir la url de nuestro proyecto (en nuestro caso sería\norigin) y seguido pondremos master, más adelante conoceremos el\ntrabajo en \"ramas\" que tiene Github. Las ramas son una copia paralela\nque podemos crear de nuestro código. Por defecto, los repositorios traen una\n\"rama\" llamada master y ahora trabajaremos solo en ella, así que\nsubiremos nuestros cambios a ella especificando master como el nombre de\nla rama a la que queremos subir nuestra versión, entonces el comando a\nejecutar sería:

    \n
    git push origin master\n
    \n
  • \n
  • \n

    pull: Sirve para actualizar nuestro repositorio local al últimocommit que\ntengamos registrado en el repositorio remoto. Este comando nos servirá mucho\nal momento de trabajar colaborativamente porque podremos tener los avances\nque nuestros colaboradores han subido al repositorio remotro a nuestro\nrepositorio local y mantenerlo actualizado. El comando es el siguiente:

    \n
    git pull nombre-remoto master\n
    \n

    En nuestro caso, como nuestro nombre-remoto ya lo declaramos como\norigin y la rama en la que estamos trabajando se llama master, el\ncomando sería:

    \n
    git pull origin master\n
    \n
  • \n
\n

Ejemplo

\n

Ahora veamos cómo Michelle utiliza Git y Github para manejar el control de\nversiones de sus proyectos y colaborar con otras coaches de Laboratoria.

\n

\"Subiendo

\n

Lecturas complementarias

\n

Recomendamos los siguientes recursos:

\n" + "body": "

Objetivos de Aprendizaje

\n
    \n
  • Crear tu cuenta en Github
  • \n
  • Diferenciar Git de Github
  • \n
  • Entender los conceptos básicos: local, remoto, working directory, staging\narea y branches
  • \n
  • Saber utilizar los comandos esenciales: remote, push y pull
  • \n
\n

¿Qué es Github?

\n

Github es conocida como la \"red social\" de los developers debido a que una\ngran cantidad de ellos suben sus proyectos aquí. Esto les permite crear\nrepositorios remotos que guardarán siempre una copia de su código y a la cual\npodrán acceder fácilmente mediante Git que es el controlador de versiones.

\n

Pero Github no solo sirve para \"subir\" nuestro código, él también contribuirá\nal desarrollo colaborativo del proyecto brindándonos herramientas como por\nejemplo:

\n
    \n
  • Un sistema de seguimiento de problemas que permite a los miembros de un\nequipo detallar un problema o una sugerencia que deseen hacer del proyecto.
  • \n
  • Una herramienta de revisión de código, donde se pueden añadir anotaciones\nen cualquier punto del proyecto y debatir sobre un cambio en específico.
  • \n
  • Un visor de versiones donde se puede comparar el progreso del proyecto en\nlas distintas versiones.
  • \n
\n

En resumen, se podría decir que Github es como Dropbox pero para developers.

\n

¿Cuál es la diferencia entre Git y Github?

\n

Git y Github se complementan pero no son iguales.

\n

Github utiliza a Git como Sistema de Control de Versiones. Gracias a\nGit podremos guardar localmente los diferentes avances (estados) de nuestro\nproyecto y gracias a Github podremos subir esos avances a la nube y\ncomenzar un trabajo colaborativo o trabajar en nuestros proyectos personales\nsin depender de la computadora donde se encuentre el proyecto o tener que estar\nguardándolo en un usb para copiarlo a otra computadora.

\n

¿Por qué es importante Git y Github?

\n

La programación se da, en su mayoría de veces, en equipos. Varias empresas\ntienen un equipo que se complementa para cada proyecto. Ante esta situación\nte preguntarás:

\n
\n

¿Cómo se organizan para trabajar todos en un solo proyecto? Tal vez tienen\ntodo en un usb y se lo turnan para poder trabajar, o trabajan cada uno por su\nlado y al momento de tener que unir las partes tienen que ver detalladamente\nsi se repiten o no alguna parte.

\n
\n

Esto no sería para nada eficiente, porque no se podría trabajar al mismo tiempo\nen algo en específico y se tendría que depender del avance de otro para que\nnosotros podamos avanzar.

\n

Para estos casos existen herramientas como Git y Github, los cuales nos\nayudan al momento de un trabajo colaborativo. Github es el lugar perfecto\npara trabajar conjuntamente en un proyecto con uno o varios compañeros, podrás\ncrear un proyecto y añadir como colaboradores a los miembros de tu equipo;\nademás, podrás traer a tu repositorio local los cambios que tus compañeros\nhayan subido al repositorio remoto y podrás ver automáticamente lo que acaba de\nañadir tu compañero.

\n

¿Cómo crear una cuenta en Github?

\n

Para crear tu cuenta de Github debemos seguir los siguientes pasos:

\n
    \n
  1. Debemos de dirigirnos a la página oficial de Github
  2. \n
  3. Ya en la página, haremos clic en Sign up.
  4. \n
  5. Ahora deberás escribir un username, que podrá ser uno que ya tengas. Por\nejemplo, si tienes un username que creaste para un juego online podrías\nusar ese. No hay límites de cómo debe de ser, pero ten en cuenta que será\nvisible para todo el mundo y puede que te lo pidan en algún momento para\nañadirte como colaborador de un proyecto, así que ten cuidado con lo que\npongas como username. Luego ingresa tu correo, una contraseña y\nhaz clic en Create an account.
  6. \n
  7. En la siguiente pantalla asegúrate de marcar la opción Unlimited public\nrepositories for free, esta es la versión \"free\" de Github; luego haz\nclic en continue.
  8. \n
  9. El paso 3 del registro puedes completarlo con tus datos y hacer clic en\nSubmit, o solo hacer clic en Skip this step.
  10. \n
\n

¡Y listo! Al hacer todos estos pasos ya tendríamos nuestra cuenta de Github\ncreada.

\n

Ahora Michelle, siguiendo los pasos anteriores, creará su cuenta en Github.

\n

\n

¿Cómo creamos un repositorio remoto en Github?

\n

Sigue los pasos de Michelle para crear un repositorio en Github:

\n

\n

Por último tenemos la pantalla donde encontrarmos la url de nuestro\nrepositorio remoto, con la cual (más adelante) vincularemos nuestro\nrepositorio remoto con nuestro repositorio local.

\n

¿Cómo usar Git y Github?

\n

Hemos leído las ventajas que nos pueden brindar Git y Github, con ellos\npodremos subir un repositorio local a uno remoto, trabajar con versiones y\ncolaborativamente, etc. Ahora hagamos la \"magia\" de trabajar con Git y\nGithub, vamos a subir nuestro repositorio local a uno remoto y trabajar\ncolaborativamente.

\n
    \n
  • \n

    remote: Con remote vincularemos nuestro repositorio local con nuestro\nrepositorio que se encuentra en la \"nube\" por medio de la url.\nEste paso no se debe de hacer cada vez que creemos una nueva versión, solo\ncuando queramos especificar el repositorio remoto que tendremos.\nEntonces, para enlazar nuestro repositorio local con nuestro repositorio\nremoto debemos de ejecutar el siguiente comando:

    \n
    git remote add nombre-remoto url\n
    \n

    Normalmente, la mayoría de los developers, como nombre-remoto utiliza\norigin y url es la \"ruta\" (url) de nuestro repositorio en Github.\nPor ejemplo, hace un momento he creado el repositorio \"prueba\" en Github y\nsi quiero vincular mi repositorio local con ese repositorio remoto tendría\nque ejecutar la siguiente línea de comando:

    \n
    git remote add origin https://github.com/michellesegv/prueba.git\n
    \n
  • \n
  • \n

    push: Por medio de push enviaremos nuestra nueva versión que\nconfirmamos en el commit a nuestro repositorio remoto. El comando es el\nsiguiente:

    \n
    git push nombre-remoto master\n
    \n

    En nombre-remoto pondremos el mismo nombre-remoto que le hemos asignado\nal momento de añadir la url de nuestro proyecto (en nuestro caso sería\norigin) y seguido pondremos master, más adelante conoceremos el\ntrabajo en \"ramas\" que tiene Github. Las ramas son una copia paralela\nque podemos crear de nuestro código. Por defecto, los repositorios traen una\n\"rama\" llamada master y ahora trabajaremos solo en ella, así que\nsubiremos nuestros cambios a ella especificando master como el nombre de\nla rama a la que queremos subir nuestra versión, entonces el comando a\nejecutar sería:

    \n
    git push origin master\n
    \n
  • \n
  • \n

    pull: Sirve para actualizar nuestro repositorio local al últimocommit que\ntengamos registrado en el repositorio remoto. Este comando nos servirá mucho\nal momento de trabajar colaborativamente porque podremos tener los avances\nque nuestros colaboradores han subido al repositorio remotro a nuestro\nrepositorio local y mantenerlo actualizado. El comando es el siguiente:

    \n
    git pull nombre-remoto master\n
    \n

    En nuestro caso, como nuestro nombre-remoto ya lo declaramos como\norigin y la rama en la que estamos trabajando se llama master, el\ncomando sería:

    \n
    git pull origin master\n
    \n
  • \n
\n

Ejemplo

\n

Ahora veamos cómo Michelle utiliza Git y Github para manejar el control de\nversiones de sus proyectos y colaborar con otras coaches de Laboratoria.

\n

\n

Lecturas complementarias

\n

Recomendamos los siguientes recursos:

\n" }, "pt": { "title": "GitHub", - "body": "

Objetivos de Aprendizagem

\n
    \n
  • Criar sua conta no GitHub
  • \n
  • Entender a diferença entre Git e GitHub
  • \n
  • Compreender os conceitos básicos: repositórios local e remoto, working\ndirectory, staging area e branches
  • \n
  • Saber utilizar os comandos essenciais: init,status, add, commit,\npush e pull
  • \n
\n

O que é Github?

\n

GitHub é conhecido como a \"rede social\" dos desenvolvedores, pois muitos deles\nenviam seus projetos para lá. Ele permite criar repositórios remotos que\nsempre terão uma cópia do seu código facilmente acessível pelo Git, o\ncontrolador de versões.

\n

Mas o GitHub não serve apenas para guardar o nosso código. Ele também\ncontribuirá para o desenvolvimento colaborativo do projeto fornecendo\nferramentas como:

\n
    \n
  • \n

    Um sistema de acompanhamento de problemas que permite aos membros da equipe\ndetalhar um problema ou sugerir alterações no projeto.

    \n
  • \n
  • \n

    Uma ferramenta de revisão código, através da qual é possível adicionar\nanotações em qualquer ponto do projeto e discutir sobre uma alteração em\nespecífico.

    \n
  • \n
  • \n

    Um visualizador de versões para comparar o progresso do projeto ao longo das\ndiferentes versões.

    \n
  • \n
\n

Resumindo, poderíamos dizer que GitHub é como o Dropbox, mas para\ndesenvolvedores.

\n

Qual é a diferença entre Git e GitHub?

\n

Git e GitHub se complementam, mas não são iguais.

\n

GitHub utiliza Git como sistema de controle de versões. Graças ao Git,\npodemos salvar localmente os diferentes progressos (estado) do nosso projeto\ne, graças ao GitHub, podemos enviá-los à nuvem e iniciar um trabalho\ncolaborativo ou trabalhar em nossos projetos pessoais sem depender do computador\nonde se encontra o projeto ou de um pen drive para copiá-lo a outra máquina.

\n

Por que Git e GitHub são importantes?

\n

A programação é feita, na maioria das vezes, em equipes. Várias empresas têm uma\nequipe que se complementa para cada projeto. Diante dessa situação, você pode se\nperguntar:

\n
\n

Como se organizam para trabalhar todos em um único projeto? Talvez eles tenham\ntudo em um USB e se revezam para poderem trabalhar, ou cada um trabalha por si\ne, na hora de juntar todas as partes, precisam analisar detalhadamente se\nrepetiram ou não algum pedaço.

\n
\n

Isso não seria nada eficiente, pois não seria possível trabalhar ao mesmo tempo\nem algo específico e dependeríamos do progresso de outra pessoa para que\npudéssemos avançar.

\n

Para esses casos, existem ferramentas como o Git e GitHub que nos ajudam a\ntrabalhar de forma colaborativa. GitHub é o lugar perfeito para trabalhar em\nconjunto num projeto com um ou vários companheiros, pois você poderá: criar um\nprojeto e adicionar os membros de sua equipe como colaboradores; trazer ao seu\nrepositório local as alterações que seus companheiros enviaram ao repositório\nremoto; ver automaticamente o que seu companheiro acabou de adicionar.

\n

Como criar uma conta no GitHub?

\n

Para criar sua conta no GitHub, siga estes passos:

\n
    \n
  1. \n

    Vá à página oficial do GitHub

    \n
  2. \n
  3. \n

    Uma vez na página, clique em \"Sign up\"

    \n
  4. \n
  5. \n

    Digite um nome de usuário (username) que pode ser um que você já tenha.\nPor exemplo, se você já criou um username para um jogo online, poderá usar\nele mesmo. Há infinitas possibilidades para criar um novo, mas tenha em mente\nque seu username será visível para o mundo todo e poderá ser solicitado\nquando alguém for incluí-la no time de colaboradores de um projeto. Portanto,\ntenha cuidado com sua escolha de username. Em seguida, digite seu e-mail,\nsenha e clique em \"Create an account\".

    \n
  6. \n
  7. \n

    Na próxima tela, certifique-se de marcar a opção \"Unlimited public\nrepositories for free\", a versão \"free\" do GitHub. Em seguida, clique em\n\"continue\"

    \n
  8. \n
  9. \n

    No terceiro passo do registro, você pode completar com seus dados e clicar em\n\"Submit\", ou somente clicar em \"Skip this step\"

    \n
  10. \n
\n

E pronto! Ao finalizar essas etapas, teremos nossa conta GitHub criada.

\n

Agora Juliana, seguindo os passos anteriores, criará\nsua conta no Github.

\n

\"Criando

\n

Como criamos um repositório remoto no GitHub?

\n

Siga os passos a seguir para criar um repositório no Github:

\n

\"Criando

\n

Por último temos a tela onde encontramos a url do nosso repositório remoto,\ncom o qual (mais adiante) vincularemos nosso repositório remoto com nosso\nrepositório local.

\n

Como usar o Git e GitHub?

\n

Já lemos as vantagens que Git e GitHub podem nos oferecer: com eles, podemos\nfazer upload de um repositório local a outro remoto, trabalhar com versões e de\nforma colaborativa, etc. Agora, vamos a \"mágica\" do Git com GitHub: enviar nosso\nrepositório local a um repositório remoto e trabalhar colaborativamente.

\n
    \n
  • \n

    remote: Com remote, vincularemos nosso repositório local ao nosso\nrepositório localizado na \"nuvem\" por meio de uma URL. Este passo não é\nfeito a cada versão criada, mas somente uma vez para especificarmos o\nrepositório remoto que temos à disposição. Para ligar o nosso repositório\nlocal com nosso repositório remoto, devemos executar o seguinte comando:

    \n
    git remote add nome-remoto url\n
    \n

    Normalmente, a maioria dos desenvolvedores utilizam origin (origem) como\nnome-remoto e url é o endereço do repositório no GitHub. Por exemplo,\ncriei um repositório \"teste\" no GitHub há pouco tempo atrás e, para vincular\nmeu repositório local a esse repositório remoto, eu devo executar a seguinte\nlinha de comando:

    \n
    git remote add origin https://github.com/michellesegv/teste.git\n
    \n
  • \n
  • \n

    push: Através do push, enviaremos nossa nova versão, confirmada pelo\ncommit, ao nosso repositório remoto. O comando é o seguinte:

    \n
    git push nome-remoto master\n
    \n

    O nome-remoto é aquele atribuído com o comando anterior (remote add) e,\nno nosso caso, é origin. Em seguida, digitamos master, o nome da branch.\nVeremos mais adiante como trabalhar com branches (ramos). Os ramos são uma\ncópia paralela que podemos criar do nosso código. Por padrão, os repositórios\npossuem um ramo chamado master (mestre) e, por enquanto, trabalharemos\nsomente nele. Dessa forma, para enviar as mudanças ao ramo remoto master,\nexecutamos:

    \n
    git push origin master\n
    \n
  • \n
  • \n

    pull: Permite atualizar nosso repositório local para o último commit\nregistrado no repositório remoto. Este comando irá nos ajudar muito ao\ntrabalharmos de forma colaborativa, pois poderemos trazer o progresso que\nnossos colaboradores enviaram ao repositório remoto para o repositório local,\nmantendo-o atualizado. O comando é o seguinte:

    \n
    git pull nome-remoto master\n
    \n

    No nosso caso, como já declaramos o nome do repositório remoto como origin e\nestamos trabalhando no ramo master (padrão), o comando seria:

    \n
    git pull origin master\n
    \n
  • \n
\n

Exemplo

\n

Agora vamos ver como Juliana utiliza Git e Github para manejar o controle\nde versões de ses projetos e colaborar com outras coaches de Laboratoria.

\n

\"Subindo

\n

Material complementar

\n

A seguir, temos uma lista de comandos do Git usados nesta aula:

\n

| Comando | Descrição |\n| --- | --- |\n| git config --global user.name seu-username | Configura o nome do usuário |\n| git config --global user.email seu@email.com | Configura o e-mail |\n| git init | Inicia o monitoramento do diretório indicado |\n| git add arquivo | Passa o arquivo do working directory à staging area |\n| git add . | Passa tudo do working directory à staging area |\n| git commit -m 'Comentário' | Confirma os arquivos para serem salvos |\n| git remote add nome-remoto URL | Vincula o repositório local com remoto |\n| git push nome-remoto master | Envia o conteúdo local no repositório remoto|\n| git status | Mostra o estado dos arquivos do diretório local |\n| git pull nome-remoto master | Atualiza o repositório local |

\n

Leituras complementares

\n

Recomendamos as seguintes leituras:

\n" + "body": "

Objetivos de Aprendizagem

\n
    \n
  • Criar sua conta no GitHub
  • \n
  • Entender a diferença entre Git e GitHub
  • \n
  • Compreender os conceitos básicos: repositórios local e remoto, working\ndirectory, staging area e branches
  • \n
  • Saber utilizar os comandos essenciais: init,status, add, commit,\npush e pull
  • \n
\n

O que é Github?

\n

GitHub é conhecido como a \"rede social\" dos desenvolvedores, pois muitos deles\nenviam seus projetos para lá. Ele permite criar repositórios remotos que\nsempre terão uma cópia do seu código facilmente acessível pelo Git, o\ncontrolador de versões.

\n

Mas o GitHub não serve apenas para guardar o nosso código. Ele também\ncontribuirá para o desenvolvimento colaborativo do projeto fornecendo\nferramentas como:

\n
    \n
  • \n

    Um sistema de acompanhamento de problemas que permite aos membros da equipe\ndetalhar um problema ou sugerir alterações no projeto.

    \n
  • \n
  • \n

    Uma ferramenta de revisão código, através da qual é possível adicionar\nanotações em qualquer ponto do projeto e discutir sobre uma alteração em\nespecífico.

    \n
  • \n
  • \n

    Um visualizador de versões para comparar o progresso do projeto ao longo das\ndiferentes versões.

    \n
  • \n
\n

Resumindo, poderíamos dizer que GitHub é como o Dropbox, mas para\ndesenvolvedores.

\n

Qual é a diferença entre Git e GitHub?

\n

Git e GitHub se complementam, mas não são iguais.

\n

GitHub utiliza Git como sistema de controle de versões. Graças ao Git,\npodemos salvar localmente os diferentes progressos (estado) do nosso projeto\ne, graças ao GitHub, podemos enviá-los à nuvem e iniciar um trabalho\ncolaborativo ou trabalhar em nossos projetos pessoais sem depender do computador\nonde se encontra o projeto ou de um pen drive para copiá-lo a outra máquina.

\n

Por que Git e GitHub são importantes?

\n

A programação é feita, na maioria das vezes, em equipes. Várias empresas têm uma\nequipe que se complementa para cada projeto. Diante dessa situação, você pode se\nperguntar:

\n
\n

Como se organizam para trabalhar todos em um único projeto? Talvez eles tenham\ntudo em um USB e se revezam para poderem trabalhar, ou cada um trabalha por si\ne, na hora de juntar todas as partes, precisam analisar detalhadamente se\nrepetiram ou não algum pedaço.

\n
\n

Isso não seria nada eficiente, pois não seria possível trabalhar ao mesmo tempo\nem algo específico e dependeríamos do progresso de outra pessoa para que\npudéssemos avançar.

\n

Para esses casos, existem ferramentas como o Git e GitHub que nos ajudam a\ntrabalhar de forma colaborativa. GitHub é o lugar perfeito para trabalhar em\nconjunto num projeto com um ou vários companheiros, pois você poderá: criar um\nprojeto e adicionar os membros de sua equipe como colaboradores; trazer ao seu\nrepositório local as alterações que seus companheiros enviaram ao repositório\nremoto; ver automaticamente o que seu companheiro acabou de adicionar.

\n

Como criar uma conta no GitHub?

\n

Para criar sua conta no GitHub, siga estes passos:

\n
    \n
  1. \n

    Vá à página oficial do GitHub

    \n
  2. \n
  3. \n

    Uma vez na página, clique em \"Sign up\"

    \n
  4. \n
  5. \n

    Digite um nome de usuário (username) que pode ser um que você já tenha.\nPor exemplo, se você já criou um username para um jogo online, poderá usar\nele mesmo. Há infinitas possibilidades para criar um novo, mas tenha em mente\nque seu username será visível para o mundo todo e poderá ser solicitado\nquando alguém for incluí-la no time de colaboradores de um projeto. Portanto,\ntenha cuidado com sua escolha de username. Em seguida, digite seu e-mail,\nsenha e clique em \"Create an account\".

    \n
  6. \n
  7. \n

    Na próxima tela, certifique-se de marcar a opção \"Unlimited public\nrepositories for free\", a versão \"free\" do GitHub. Em seguida, clique em\n\"continue\"

    \n
  8. \n
  9. \n

    No terceiro passo do registro, você pode completar com seus dados e clicar em\n\"Submit\", ou somente clicar em \"Skip this step\"

    \n
  10. \n
\n

E pronto! Ao finalizar essas etapas, teremos nossa conta GitHub criada.

\n

Agora Juliana, seguindo os passos anteriores, criará\nsua conta no Github.

\n

\n

Como criamos um repositório remoto no GitHub?

\n

Siga os passos a seguir para criar um repositório no Github:

\n

\n

Por último temos a tela onde encontramos a url do nosso repositório remoto,\ncom o qual (mais adiante) vincularemos nosso repositório remoto com nosso\nrepositório local.

\n

Como usar o Git e GitHub?

\n

Já lemos as vantagens que Git e GitHub podem nos oferecer: com eles, podemos\nfazer upload de um repositório local a outro remoto, trabalhar com versões e de\nforma colaborativa, etc. Agora, vamos a \"mágica\" do Git com GitHub: enviar nosso\nrepositório local a um repositório remoto e trabalhar colaborativamente.

\n
    \n
  • \n

    remote: Com remote, vincularemos nosso repositório local ao nosso\nrepositório localizado na \"nuvem\" por meio de uma URL. Este passo não é\nfeito a cada versão criada, mas somente uma vez para especificarmos o\nrepositório remoto que temos à disposição. Para ligar o nosso repositório\nlocal com nosso repositório remoto, devemos executar o seguinte comando:

    \n
    git remote add nome-remoto url\n
    \n

    Normalmente, a maioria dos desenvolvedores utilizam origin (origem) como\nnome-remoto e url é o endereço do repositório no GitHub. Por exemplo,\ncriei um repositório \"teste\" no GitHub há pouco tempo atrás e, para vincular\nmeu repositório local a esse repositório remoto, eu devo executar a seguinte\nlinha de comando:

    \n
    git remote add origin https://github.com/michellesegv/teste.git\n
    \n
  • \n
  • \n

    push: Através do push, enviaremos nossa nova versão, confirmada pelo\ncommit, ao nosso repositório remoto. O comando é o seguinte:

    \n
    git push nome-remoto master\n
    \n

    O nome-remoto é aquele atribuído com o comando anterior (remote add) e,\nno nosso caso, é origin. Em seguida, digitamos master, o nome da branch.\nVeremos mais adiante como trabalhar com branches (ramos). Os ramos são uma\ncópia paralela que podemos criar do nosso código. Por padrão, os repositórios\npossuem um ramo chamado master (mestre) e, por enquanto, trabalharemos\nsomente nele. Dessa forma, para enviar as mudanças ao ramo remoto master,\nexecutamos:

    \n
    git push origin master\n
    \n
  • \n
  • \n

    pull: Permite atualizar nosso repositório local para o último commit\nregistrado no repositório remoto. Este comando irá nos ajudar muito ao\ntrabalharmos de forma colaborativa, pois poderemos trazer o progresso que\nnossos colaboradores enviaram ao repositório remoto para o repositório local,\nmantendo-o atualizado. O comando é o seguinte:

    \n
    git pull nome-remoto master\n
    \n

    No nosso caso, como já declaramos o nome do repositório remoto como origin e\nestamos trabalhando no ramo master (padrão), o comando seria:

    \n
    git pull origin master\n
    \n
  • \n
\n

Exemplo

\n

Agora vamos ver como Juliana utiliza Git e Github para manejar o controle\nde versões de ses projetos e colaborar com outras coaches de Laboratoria.

\n

\n

Material complementar

\n

A seguir, temos uma lista de comandos do Git usados nesta aula:

\n

| Comando | Descrição |\n| --- | --- |\n| git config --global user.name seu-username | Configura o nome do usuário |\n| git config --global user.email seu@email.com | Configura o e-mail |\n| git init | Inicia o monitoramento do diretório indicado |\n| git add arquivo | Passa o arquivo do working directory à staging area |\n| git add . | Passa tudo do working directory à staging area |\n| git commit -m 'Comentário' | Confirma os arquivos para serem salvos |\n| git remote add nome-remoto URL | Vincula o repositório local com remoto |\n| git push nome-remoto master | Envia o conteúdo local no repositório remoto|\n| git status | Mostra o estado dos arquivos do diretório local |\n| git pull nome-remoto master | Atualiza o repositório local |

\n

Leituras complementares

\n

Recomendamos as seguintes leituras:

\n" } } } diff --git a/dist/topics/shell.json b/dist/topics/shell.json index add27d060..fcaad1195 100644 --- a/dist/topics/shell.json +++ b/dist/topics/shell.json @@ -2,9 +2,9 @@ "slug": "shell", "repo": "Laboratoria/bootcamp", "path": "topics/shell", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:41.835Z", + "createdAt": "2023-05-17T20:37:33.164Z", "track": "web-dev", "intl": { "es": { @@ -39,11 +39,11 @@ "intl": { "es": { "title": "Shell de UNIX", - "body": "

Qué es la shell de UNIX?

\n
\n

Una Shell de Unix o también shell, es el término usado en informática para\nreferirse a un intérprete de comandos, el cual consiste en la interfaz de\nusuario tradicional de los sistemas operativos basados en Unix y similares\ncomo GNU/Linux.

\n

Fuente: Shell de Unix - Wikipedia

\n
\n

Básicamente, la shell es el intérprete que se encarga de ejecutar los comandos\nque escribimos en el terminal (o emulador de terminal). Así como el motor de\nJavaScript (ya sea del navegador, Node.js, ...) es el responsable en interpretar\ny ejecutar nuestro código JavaScript, la shell se encarga de los comandos que\nescribimos en la línea de comando.

\n

Shells comunes

\n

La shell más común es problemente bash (Bourne Again SHell),\npero no está de más mencionar que existen muchas shells distintas, que comparten\ngran parte de sus características, pero cada una con sus peculiaridades. Otras\nshells comunes son: zsh, ksh, csh, ash, dash, ...

\n

Dentro de un emulador de terminal podemos ejecutar diferentes shells, así como\nconfigurar tu shell por defecto (ver comando chsh).

\n

La línea de comandos

\n

La línea de comandos es también conocida como

\n
    \n
  • Terminal
  • \n
  • Consola
  • \n
  • Command Prompt
  • \n
  • Símbolo de Sistema
  • \n
  • cmd
  • \n
  • Git Bash, etc.
  • \n
\n

Una de las herramientas que más nos acompañará en nuestro camino del código\nserá la línea de comandos. En esta lección conoceremos y aprenderemos cómo\nusar esa famosa pantalla negra que los \"hackers\" usan; pero tranquila, no\nvamos a \"hackear\" nada, ni haremos nada ilegal :)

\n

Puede parecer un poco aterrador al principio pero solo es una pantalla que\nespera a que le des órdenes.

\n

¿Para qué sirve la línea de comandos?

\n

La línea de comandos es una aplicación que nos permite ver, manejar y\nmanipular archivos de nuestra computadora por medio de comandos. Es como el\nExplorador de Windows o Finder en Mac, pero sin la \"interfaz\".

\n

Por lo tanto, nos da un control que es rápido y automatizado de las\ncomputadoras.

\n

Accediendo a la línea de comandos

\n

Windows

\n

Presionamos la tecla \"windows\" + r:

\n

\"teclas\"

\n

Ahora nos aparecerá una pequeña pantalla en la parte inferior izquierda en la que\nescribiremos cmd.exe

\n

\"run\"

\n

Hacemos clic en el botón OK y estaremos abriendo nuestra terminal. Al abrir\nla aplicación nos aparecerá una nueva ventana con un fondo negro y letras así:

\n

\"línea

\n

Mac OS X

\n

Launchpad → Terminal

\n

Linux

\n

Actividades → Terminal

\n

Prompt

\n

Ahora tendremos una pantalla negra que está esperando nuestras órdenes.

\n
    \n
  • \n

    Si nos encontramos en Windows debe de aparecernos una primera línea que termina\ncon el símbolo >

    \n
     C: \\Users\\Michelle >\n
    \n

    Si no te aparece \"Michelle\" no te preocupes, está bien, ahí debería de\naparecer tu nombre de usuario.

    \n
  • \n
  • \n

    Si te encuentras en Linux, te aparecerá una primera línea que termina con el\nsímbolo $

    \n
    [Laboratoria@Michelle ~] $\n
    \n

    En tu computadora, \"Laboratoria\" y \"Michelle\" serán reemplazados por tus datos.

    \n
  • \n
  • \n

    Si tienes una Mac, la primera línea estará compuesta por los datos de tu\ncomputadora y terminará con el símbolo $

    \n
    Laboratoria-MacBook-Air:~ Michelle$\n
    \n
  • \n
\n

Personalización

\n

Para finalizar, cabe mencionar que así como uno puede configurar su escritorio,\ncon tu propia imagen de fondo, shortcuts, ... los shells también permiten un\nmontón de personalización. Los detalles de cómo personalizar tu shell quedan\nfuera del scope de este curso, pero te invitamos a que explores lo siguiente:

\n
    \n
  • .profile
  • \n
  • .bashrc
  • \n
  • .bash_history
  • \n
  • oh-my-zsh
  • \n
\n

Lecturas complementarias

\n" + "body": "

Qué es la shell de UNIX?

\n
\n

Una Shell de Unix o también shell, es el término usado en informática para\nreferirse a un intérprete de comandos, el cual consiste en la interfaz de\nusuario tradicional de los sistemas operativos basados en Unix y similares\ncomo GNU/Linux.

\n

Fuente: Shell de Unix - Wikipedia

\n
\n

Básicamente, la shell es el intérprete que se encarga de ejecutar los comandos\nque escribimos en el terminal (o emulador de terminal). Así como el motor de\nJavaScript (ya sea del navegador, Node.js, ...) es el responsable en interpretar\ny ejecutar nuestro código JavaScript, la shell se encarga de los comandos que\nescribimos en la línea de comando.

\n

Shells comunes

\n

La shell más común es problemente bash (Bourne Again SHell),\npero no está de más mencionar que existen muchas shells distintas, que comparten\ngran parte de sus características, pero cada una con sus peculiaridades. Otras\nshells comunes son: zsh, ksh, csh, ash, dash, ...

\n

Dentro de un emulador de terminal podemos ejecutar diferentes shells, así como\nconfigurar tu shell por defecto (ver comando chsh).

\n

La línea de comandos

\n

La línea de comandos es también conocida como

\n
    \n
  • Terminal
  • \n
  • Consola
  • \n
  • Command Prompt
  • \n
  • Símbolo de Sistema
  • \n
  • cmd
  • \n
  • Git Bash, etc.
  • \n
\n

Una de las herramientas que más nos acompañará en nuestro camino del código\nserá la línea de comandos. En esta lección conoceremos y aprenderemos cómo\nusar esa famosa pantalla negra que los \"hackers\" usan; pero tranquila, no\nvamos a \"hackear\" nada, ni haremos nada ilegal :)

\n

Puede parecer un poco aterrador al principio pero solo es una pantalla que\nespera a que le des órdenes.

\n

¿Para qué sirve la línea de comandos?

\n

La línea de comandos es una aplicación que nos permite ver, manejar y\nmanipular archivos de nuestra computadora por medio de comandos. Es como el\nExplorador de Windows o Finder en Mac, pero sin la \"interfaz\".

\n

Por lo tanto, nos da un control que es rápido y automatizado de las\ncomputadoras.

\n

Accediendo a la línea de comandos

\n

Windows

\n

Presionamos la tecla \"windows\" + r:

\n

\"teclas\"

\n

Ahora nos aparecerá una pequeña pantalla en la parte inferior izquierda en la que\nescribiremos cmd.exe

\n

\"run\"

\n

Hacemos clic en el botón OK y estaremos abriendo nuestra terminal. Al abrir\nla aplicación nos aparecerá una nueva ventana con un fondo negro y letras así:

\n

\"línea

\n

Mac OS X

\n

Launchpad → Terminal

\n

Linux

\n

Actividades → Terminal

\n

Prompt

\n

Ahora tendremos una pantalla negra que está esperando nuestras órdenes.

\n
    \n
  • \n

    Si nos encontramos en Windows debe de aparecernos una primera línea que termina\ncon el símbolo >

    \n
     C: \\Users\\Michelle >\n
    \n

    Si no te aparece \"Michelle\" no te preocupes, está bien, ahí debería de\naparecer tu nombre de usuario.

    \n
  • \n
  • \n

    Si te encuentras en Linux, te aparecerá una primera línea que termina con el\nsímbolo $

    \n
    [Laboratoria@Michelle ~] $\n
    \n

    En tu computadora, \"Laboratoria\" y \"Michelle\" serán reemplazados por tus datos.

    \n
  • \n
  • \n

    Si tienes una Mac, la primera línea estará compuesta por los datos de tu\ncomputadora y terminará con el símbolo $

    \n
    Laboratoria-MacBook-Air:~ Michelle$\n
    \n
  • \n
\n\n

Personalización

\n

Para finalizar, cabe mencionar que así como uno puede configurar su escritorio,\ncon tu propia imagen de fondo, shortcuts, ... los shells también permiten un\nmontón de personalización. Los detalles de cómo personalizar tu shell quedan\nfuera del scope de este curso, pero te invitamos a que explores lo siguiente:

\n
    \n
  • .profile
  • \n
  • .bashrc
  • \n
  • .bash_history
  • \n
  • oh-my-zsh
  • \n
\n

Lecturas complementarias

\n" }, "pt": { "title": "Shell de UNIX", - "body": "

O que é a shell de UNIX?

\n
\n

Uma Shell de Unix ou também shell, é o terminal usado na informática\npara se referir a um intérprete de comandos, o qual consiste na interface de\nusuário tradicional dos sistemas operacionais baseados em Unix e similares\ncomo GNU/Linux.

\n

Fonte: Shell de Unix -\nWikipédia

\n
\n

Basicamente, o shell é um intérprete que é encarregado de executar os comandos\nque escrevemos no terminal (ou emulador de terminal). Assim como o motor do\nJavaScript (seja o do navegador, Node.js, ...) é o responsável por interpretar e\nexecutar nosso código JavaScript, a shell se encarrega dos comandos que\nescrevemos na linha de comando.

\n

Shells comuns: bash, zsh, etc

\n

A shell mais comum é provavelmente bash (Bourne Again\nSHell), mas não é demais mencionar que\nexistem muitas shells distintas que compartilham grande parte de suas\ncaracterísticas, mas cada uma com suas peculiaridades. Outras shells comuns são:\nzsh, ksh, csh, ash, dash, ...

\n

Dentro de um emulador do terminal podemos executar diferentes shells, assim como\nconfigurar sua shell por padrão (ver comando\nchsh).

\n

A linha de comandos

\n

A linha de comandos também é conhecida como:

\n
    \n
  • Terminal
  • \n
  • Console
  • \n
  • Prompt de comando
  • \n
  • CLI
  • \n
  • cmd
  • \n
  • Git Bash, etc.
  • \n
\n

Uma das ferramentas que mais nos acompanhará será a linha de comandos. Nessa\nlição conheceremos e aprenderemos como usar essa famosa tela preta que os\n\"hackers\" usam. Mas fique tranquila! Não vamos \"hackear\" nada, nem faremos nada\nilegal.

\n

Pode parecer um pouco assustador no começo, mas é apenas uma tela esperando\npelas suas ordens.

\n

Para que serve a linha de comandos?

\n

A linha de comandos é uma aplicação que nos permite visualizar, gerenciar e\nmanipular arquivos de nosso computador através de comandos. É como o Windows\nExplorer ou Finder do Mac, mas sem a interface gráfica.

\n

Dessa forma, a linha de comandos nos dá um controle rápido e automatizado dos\ncomputadores.

\n

Acessando a linha de comando

\n

Windows

\n

Pressione as teclas \"Windows\" + r:

\n

\"Teclas

\n

Uma pequena tela aparecerá na parte inferior esquerda. Nela, escreveremos\ncmd.exe.

\n

\"Executar\"

\n

Ao clicar no botão \"OK\", abriremos nosso terminal. Ao abrir a aplicação,\naparecerá uma nova janela aparecer com um fundo preto e letras como abaixo:

\n

\"Linha

\n

Mac OS X

\n

Launchpad → Terminal

\n

Linux

\n

Atividades → Terminal (pode variar conforme sua distribuição e configuração)

\n

Prompt

\n

Agora temos uma tela preta que está esperando por nossas ordens.

\n
    \n
  • \n

    Se estiver no Windows, a primeira linha deve terminar com o símbolo >:

    \n
    C:\\Users\\Michelle>\n
    \n

    Se não aparecer Michelle, não se preocupe, está tudo certo: aqui deve\naparecer o seu próprio nome de usuário.

    \n
  • \n
  • \n

    No Linux, a primeira linha terminará com o símbolo $:

    \n
    [Laboratoria@Michelle ~]$\n
    \n

    No seu computador, \"Laboratoria\" e \"Michelle\" serão substituídos pelos seus\ndados.

    \n
  • \n
  • \n

    Se você tem um Mac, a primeira linha será composta pelos dados do seu\ncomputador terminando com o símbolo $:

    \n
    Laboratoria-MacBook-Air:~ Michelle$\n
    \n
  • \n
\n

Personalização

\n

Para finalizar, cabe mencionar que assim como alguém pode configurar sua área de\ntrabalho com sua própria imagem de fundo, atalhos, ... os shells também permitem\numa grande quantidade de personalização. Os detalhes de como personalizar seu\nshell estão fora do escopo deste curso, mas convidamos você a explorar o\nseguinte:

\n
    \n
  • .profile
  • \n
  • .bashrc
  • \n
  • .bash_history
  • \n
  • oh-my-zsh
  • \n
\n

Leituras Complementares

\n" + "body": "

O que é a shell de UNIX?

\n
\n

Uma Shell de Unix ou também shell, é o terminal usado na informática\npara se referir a um intérprete de comandos, o qual consiste na interface de\nusuário tradicional dos sistemas operacionais baseados em Unix e similares\ncomo GNU/Linux.

\n

Fonte: Shell de Unix -\nWikipédia

\n
\n

Basicamente, o shell é um intérprete que é encarregado de executar os comandos\nque escrevemos no terminal (ou emulador de terminal). Assim como o motor do\nJavaScript (seja o do navegador, Node.js, ...) é o responsável por interpretar e\nexecutar nosso código JavaScript, a shell se encarrega dos comandos que\nescrevemos na linha de comando.

\n

Shells comuns: bash, zsh, etc

\n

A shell mais comum é provavelmente bash (Bourne Again\nSHell), mas não é demais mencionar que\nexistem muitas shells distintas que compartilham grande parte de suas\ncaracterísticas, mas cada uma com suas peculiaridades. Outras shells comuns são:\nzsh, ksh, csh, ash, dash, ...

\n

Dentro de um emulador do terminal podemos executar diferentes shells, assim como\nconfigurar sua shell por padrão (ver comando\nchsh).

\n

A linha de comandos

\n

A linha de comandos também é conhecida como:

\n
    \n
  • Terminal
  • \n
  • Console
  • \n
  • Prompt de comando
  • \n
  • CLI
  • \n
  • cmd
  • \n
  • Git Bash, etc.
  • \n
\n

Uma das ferramentas que mais nos acompanhará será a linha de comandos. Nessa\nlição conheceremos e aprenderemos como usar essa famosa tela preta que os\n\"hackers\" usam. Mas fique tranquila! Não vamos \"hackear\" nada, nem faremos nada\nilegal.

\n

Pode parecer um pouco assustador no começo, mas é apenas uma tela esperando\npelas suas ordens.

\n

Para que serve a linha de comandos?

\n

A linha de comandos é uma aplicação que nos permite visualizar, gerenciar e\nmanipular arquivos de nosso computador através de comandos. É como o Windows\nExplorer ou Finder do Mac, mas sem a interface gráfica.

\n

Dessa forma, a linha de comandos nos dá um controle rápido e automatizado dos\ncomputadores.

\n

Acessando a linha de comando

\n

Windows

\n

Pressione as teclas \"Windows\" + r:

\n

\"Teclas

\n

Uma pequena tela aparecerá na parte inferior esquerda. Nela, escreveremos\ncmd.exe.

\n

\"Executar\"

\n

Ao clicar no botão \"OK\", abriremos nosso terminal. Ao abrir a aplicação,\naparecerá uma nova janela aparecer com um fundo preto e letras como abaixo:

\n

\"Linha

\n

Mac OS X

\n

Launchpad → Terminal

\n

Linux

\n

Atividades → Terminal (pode variar conforme sua distribuição e configuração)

\n

Prompt

\n

Agora temos uma tela preta que está esperando por nossas ordens.

\n
    \n
  • \n

    Se estiver no Windows, a primeira linha deve terminar com o símbolo >:

    \n
    C:\\Users\\Michelle>\n
    \n

    Se não aparecer Michelle, não se preocupe, está tudo certo: aqui deve\naparecer o seu próprio nome de usuário.

    \n
  • \n
  • \n

    No Linux, a primeira linha terminará com o símbolo $:

    \n
    [Laboratoria@Michelle ~]$\n
    \n

    No seu computador, \"Laboratoria\" e \"Michelle\" serão substituídos pelos seus\ndados.

    \n
  • \n
  • \n

    Se você tem um Mac, a primeira linha será composta pelos dados do seu\ncomputador terminando com o símbolo $:

    \n
    Laboratoria-MacBook-Air:~ Michelle$\n
    \n
  • \n
\n\n

Personalização

\n

Para finalizar, cabe mencionar que assim como alguém pode configurar sua área de\ntrabalho com sua própria imagem de fundo, atalhos, ... os shells também permitem\numa grande quantidade de personalização. Os detalhes de como personalizar seu\nshell estão fora do escopo deste curso, mas convidamos você a explorar o\nseguinte:

\n
    \n
  • .profile
  • \n
  • .bashrc
  • \n
  • .bash_history
  • \n
  • oh-my-zsh
  • \n
\n

Leituras Complementares

\n" } } } diff --git a/dist/topics/ux-research.json b/dist/topics/ux-research.json index 977318df6..0f55b4b24 100644 --- a/dist/topics/ux-research.json +++ b/dist/topics/ux-research.json @@ -2,9 +2,9 @@ "slug": "ux-research", "repo": "Laboratoria/bootcamp", "path": "topics/ux-research", - "version": "6.2.0", + "version": "6.3.0", "parserVersion": "5.0.0-alpha.4", - "createdAt": "2023-04-04T20:28:42.263Z", + "createdAt": "2023-05-17T20:37:36.192Z", "track": "ux", "intl": { "es": { @@ -67,7 +67,7 @@ "intl": { "es": { "title": "Entrevistas", - "body": "

Intro

\n

Las entrevistas con usuarios son una herramienta muy importante para poder\nobtener más datos sobre cómo se sienten los usuarios con un producto o servicio.\nPara realizar una buena entrevista debemos hacer un buen planeamiento y seguir\nalgunos tips.

\n

Ser Curiosa

\n

\"curiosity\"

\n

La foto de la presentación, es una foto del explorador \"Curiosity\" de Marte,\nque fue lanzado por la NASA en el 2011 con la meta de determinar si Marte algún\ndía sería capaz de sostener vida microscópica. La segunda meta del explorador\nera recolectar data sobre Marte y comprender cómo era el ambiente y ecosistema.\nDemoró más de una semana de investigación, desarrollo y prueba poder construir\nun explorador que trabajaría en otro planeta.

\n

Tal como los astrofísicos que diseñaron el explorador de Marte, como\ninvestigadores tenemos que poner a prueba nuestros diseños continuamente para\nasegurarnos de que podemos generar soluciones \"de otro mundo\" para nuestros\nclientes.

\n

Y como el nombre de esta nave, \"Curiosidad\", debemos tener curiosidad por\nrecolectar data y preguntar las preguntas correctas a nuestros usuarios para\nasegurar que estamos diseñando productos que cumplen con sus necesidades.

\n

Para este curso, hicimos una mini investigación preguntándole a personas que han\ntrabajado en investigación por décadas (gente que trabaja para Google Ventures,\nFacebook, WeWork e incluso bancos y corporaciones internacionales). Les\npreguntamos cuál era la característica más importante que tenía que tener\nalguien que sobresalía en el mundo de la investigación.

\n

La respuesta más común fue que los investigadores necesitan tener curiosidad.\nTienen que estar interesados en entender el motor que mueve a sus usuarios y a\nlos seres humanos en general.

\n

Deben cuestionar todo y preguntarse constantemente:

\n
    \n
  • ¿Cómo realiza la gente ciertas tareas?
  • \n
  • ¿Por qué hacen ciertas cosas?
  • \n
  • ¿Cuándo hacen ciertas cosas?
  • \n
  • ¿Qué factores los llevan a tomar decisiones?
  • \n
  • ¿Qué es lo que las personas valoran?
  • \n
\n

Nunca recibimos respuestas que dijeran que un investigador debe ser\nextrovertido, creemos que ese es un mito que no está basado en la realidad.\nLos grandes investigadores pueden ser introvertidos o extrovertidos, pero tienen\nque ser inquisitivos y buscar siempre formas de aprender más sobre la gente.

\n

Haciendo mejores preguntas

\n

Ahora, en una situación de entrevista con usuarios, lo más probable es que no\npreguntemos \"por qué\" 5 veces seguidas. Esto es porque sería muy molesto para el\nusuario y probablemente no nos ayudaría a lograr nuestros objetivos de\ninvestigación.

\n

Así que no solo tenemos que ser curiosos, tenemos que aprender a hacer mejores\npreguntas.

\n

Hacer las preguntas correctas es realmente importante por 2 razones:

\n
    \n
  • Si obligamos a los usuarios a responder una respuesta que estamos buscando, o\nlos dirigimos a creer que hay una respuesta correcta, no lograremos capturar\ninformación adecuada.
  • \n
  • Si hacemos preguntas directivas, podemos incomodar al participante y es muy\nimportante que no hagamos esto.
  • \n
\n

Una cosa por mencionar, es que, como investigador, estás representando a la\ncompañía para la que trabajas, y hay una política en la que nos debemos\nconcentrar durante las sesiones de investigación, sobre todas las cosas:\nNunca hagas daño. Si una entrevista va mal y sientes que no has aprendido nada\nde lo que saliste a buscar, como mínimo deberías asegurarte que el participante\ndebería salir de la sesión sintiendo que su punto de vista fue apreciado y\nescuchado. Lo peor que puede pasar en un estudio es que el participante sienta\nque fue puesto a prueba y se equivocó en todas las respuestas, o peor aún, que\nse lleve una imagen negativa de la empresa por la forma en que lo trataste.

\n

Vamos a discutir algunas tácticas para evitar esto después, podría sonar como\nsentido común, pero son cosas importantes para tener en mente. Es especialmente\nimportante si trabajas con stakeholders de la empresa con un interés en el\nresultado de la investigación, y que podrían intentar jalar la conversación con\nusuarios en una dirección particular.

\n

Siempre debes poner la comodidad y necesidades de tus usuarios primero, y los\nobjetivos de la investigación en un cercano segundo lugar.

\n

Para una entrevista

\n
    \n
  • Lleva una guía de discusión
  • \n
  • Usa lenguaje positivo
  • \n
  • Valora el silencio
  • \n
  • No interrumpas
  • \n
  • Reconoce las respuestas de los entrevistados
  • \n
  • Haz preguntas para ir más a fondo (follow up questions)
  • \n
  • Sal de la guía cuando sea necesario
  • \n
  • Responde a preguntas con preguntas
  • \n
  • Ten alguna forma de documentar las respuestas (notas, grabaciones, etc)
  • \n
\n

Consejos para hacer preguntas en entrevistas

\n
    \n
  • Haz preguntas abiertas: ¿Qué medios de transporte usas?
  • \n
  • Pregunta sobre el comportamiento real: Cuéntame sobre tus hábitos de transporte.
  • \n
  • Enfócate en casos específicos: Cuéntame sobre la última vez que pediste un taxi
  • \n
  • Haz que las personas se concentren: ¿Me ayudas a resumir eso en una oración?
  • \n
  • Usa el silencio: *Las personas se sienten obligadas a rellenar los silencios.
  • \n
  • Haz preguntas simples: ¿Qué medios de pago usas cuando compras online?
  • \n
  • Pregunta ¿por qué seguido?: Me puedes hablar un poco más sobre eso.
  • \n
\n

Arco de una entrevista

\n

Muchos investigadores mencionan el arco de una entrevista, que básicamente es la\nforma en que la entrevista progresa a través del tiempo que tienes con los\nparticipantes. En el eje horizontal tienes el tiempo y en el eje vertical tienes\nun promedio de cuánto es probable que aprendas durante ese momento.

\n

Típicamente en los primeros cinco minutos vas a pasar la mayoría del tiempo\ntratando de hacer que tu participante se sienta cómodo, y ponerlo en contexto\ncon el proyecto. Puedes empezar por presentarte y explicar por qué lo has\nelegido como participante a él o ella.

\n

El siguiente paso se llama construir rapport, que básicamente significa hacer\nque la otra persona se sienta cómoda y sienta que puede confiar en ti. En esta\nfase en verdad no vas a aprender mucho. Eso está bien, porque todo el tiempo que\ninviertas en hacer que tu participante se sienta cómodo es increíblemente\nimportante. Si se sienten cómodos, hay mucha más probabilidad de que te de sus\nopiniones y pensamientos honestos. Puedes charlar un rato con el participante -\npreguntarle por su día o conversar sobre un tema neutral.

\n

Durante el calentamiento, te concentrarás en una lista de preguntas que te darán\nun mejor entendimiento sobre la persona que estás entrevistando, así como de\ntodo el contexto en el que usa el producto. Como verás, en este punto ya estás\nempezando a aprender un poco más.

\n

Una vez que has hecho algunas preguntas de fondo, puedes pasar a la \"carnecita\"\nde la entrevista. Si estás haciendo una investigación de observación o de\nusabilidad, este es el momento en que todas tus preguntas de ese tipo irán. En\neste momento en la entrevista generalmente será cuando más aprendes sobre el\ntema o producto particular para el que hiciste la investigación.

\n

Luego de completar las preguntas detalladas, puedes hacer unas cuantas preguntas\nde resumen. Esta parte es muy importante porque los usuarios típicamente te\ndarán buenos insights y citas acerca de su experiencia en general. Como verás,\nlos aprendizajes en el arco de la entrevista se disparan justo al final, porque\npedirle a la gente que resuma su experiencia los hace reflexionar y conectar los\npuntos un poquito. (Algunas veces la gente necesita un poco de tiempo para\npensar antes de poder articular lo que funcionó y lo que no funcionó.)

\n

Algunos ejemplos de preguntas de informe:

\n
    \n
  • Entonces, ¿cuál fue tu impresión en general de lo que viste hoy?
  • \n
  • ¿Cuáles son algunos de tus pensamientos generales?
  • \n
  • ¿Qué partes te gustaron?
  • \n
  • ¿Qué partes no te gustaron tanto?
  • \n
  • ¿Hay algún otro comentario que te gustaría compartir?
  • \n
\n

Building rapport

\n

Muchos investigadores hablan de la importancia de \"construir rapport\", que\nesencialmente significa generar confianza y un espacio seguro donde tu\nparticipante sienta que realmente puede abrirse y compartir sus experiencias.

\n

Es importante que no empieces inmediatamente con preguntas detalladas para la\nentrevista. Por ejemplo, nunca saltes directo a preguntas de testeo de\nusabilidad porque realmente necesitas que tu usuario se acostumbre y se sienta\ncómodo contigo primero. Usa los primeros minutos para preguntarle un poco sobre\nsí mismo.

\n

Algunos consejos que pueden ayudarte mientras te preparas para entrevistar\nusuarios:

\n
    \n
  • Métete en el personaje de \"investigador\" - Muchos investigadores hablan de\n\"meterse en el personaje\" antes de una entrevista. La entrevista no es momento\nde ser crítico o juzgar a tu interlocutor, así que prepárate antes de la\nentrevista para tener una mente abierta. Muchos de nosotros estamos\nacostumbrados a demostrar todo lo que sabemos sobre nuestros productos,\ntecnología o diseños de nuestro trabajo diario, pero este no es un momento\npara presumir. No importa para nada lo que tú sabes, ya que estás ahí para\nescuchar, observar y aprender de tus usuarios.
  • \n
  • Sonríe - te ayudará mucho a poner cómodo a tu participante. Algunos\ninvestigadores incluso recomiendan sonreír en entrevistas por teléfono: tu voz\nsimplemente suena diferente cuando sonríes.
  • \n
  • Estar realmente interesado y conectado con lo que dice el usuario ayuda\nmuchísimo.
  • \n
  • Demuestra que estás escuchando - No hace falta que respondas a cada cosa que\ndicen.
  • \n
  • Alienta a tus participantes para que compartan feedback, comentarios y\ncríticas constructivas.
  • \n
  • No juzgues las opiniones de tus usuarios - No te preocupes, tendrás mucho\ntiempo luego para analizar todo el comportamiento que observaste, y las cosas\nque aprendiste durante la entrevista.
  • \n
  • No lances ideas - Esta no es una oportunidad para proponerle ideas nuevas a\nnadie. Trata de mantenerte lo más neutral posible para conseguir buena data.
  • \n
\n

Los 5 actos de una entrevista

\n

La entrevista en 5 actos

\n

El Arte de entrevistar

\n
    \n
  • Para ser un gran investigador, tienes que conversar como conductor de\ntelevisión, pensar como escritor, entender el subtexto como un psicoanalista y\ntener el oído de un músico.
  • \n
\n

¿Qué entendiste de esta frase?

\n
    \n
  • Conversar como conductor de televisión - pon claros el contexto del proyecto y\nlas metas por las que elegiste entrevistar a tu participante.
  • \n
  • Piensa como escritor - más adelante en el proyecto vas a pensar en cómo\nconstruir una narrativa para contar la historia de los hallazgos con tus\nusuarios.
  • \n
  • Entender subtexto como psicoanalista - debes observar el comportamiento y\nlenguaje corporal del consumidor. Observar lo que están haciendo, además de\nescuchar lo que dicen.
  • \n
  • Tener el oído de un músico - escucha cuidadosamente todo lo que los usuarios\ndicen. No es tu turno de mostrar todo lo que sabes.
  • \n
\n

Los problemas más comunes

\n

Las personas normalmente no te dan a conocer sus malos hábitos

\n

Uno de los retos de la investigación cualitativa en general es que la gente\nsuele sub-reportar el mal comportamiento. No es porque sean malas personas, o\nestén tratando de engañarte, pero los humanos en general quieren ser vistos como\nbuenas personas. Solemos racionalizar el mal comportamiento convenciéndonos de\nque lo hacemos mucho menos de lo que en verdad hacemos.

\n

Por ejemplo, podríamos observar a las personas en lugar de preguntarles por su\ncomportamiento.

\n

Esta foto es un ejemplo de un tipo de mal comportamiento que la gente\nsub-reporta. Cuando se trata de contraseñas, mucha gente no usa claves seguras y\nelige algo como 123456 siempre que no hay requerimientos obligatorios de\nseguridad. Muchas personas también guardan sus contraseñas escritas en post-its\nen su escritorio. La mayoría de personas saben que no es seguro hacer esto, pero\nlo hacen porque es seguro y conveniente.

\n

En una entrevista, si preguntamos a las personas si siempre usan contraseñas\nseguras, es posible que digan que sí, pero esto no necesariamente representa lo\nque en verdad hacen. Este es un ejemplo clave de cómo las personas no siempre\nhacen lo que dicen que harán, y vice versa.

\n

Para evitar este problema potencial, podríamos pedir para observar a alguien\nmientras entra a una página web con su contraseña, en lugar de preguntarle si\nusa una contraseña segura.

\n

Las entrevistas ofrecen información sobre lo que la gente dice que hará

\n

...pero esto no es una buena representación de su comportamiento real

\n

El segundo problema común es que muchas veces en entrevistas hacemos preguntas\nhipotéticas sobre lo que la gente haría en una situación particular, pero esto\nno siempre es una buena representación de cómo actuarían en verdad. Los humanos\nen general no son buenos para explicar su comportamiento potencial en el futuro,\nporque muchísimo de nuestro comportamiento depende del contexto específico en el\nque nos encontramos.

\n

Una táctica bastante útil es pedir a tus participantes que te cuenten sobre\nexperiencias reales y anécdotas relacionadas al tema que estás investigando.

\n

Una mala pregunta que le encanta a los investigadores es \"Pagarías por este\nproducto?\" o \"Crees que usarías este producto en el futuro?\" Estas no son\npreguntas valiosas en una entrevista.

\n

En el caso de \"Pagarías por este producto?\" podrías preguntarle por otros\nproductos por los que han pagado en el pasado que puedan compararse, y en esos\ncasos cuánto pagaron y por qué. También puedes intentar de hacer preguntas más\ngenerales sobre otros productos que han usado y seguir esas preguntas con otras\nsobre el precio.

\n

Apégate al dicho \"Mostrar, no contar\" siempre que puedas, porque el feedback que\nrecibas será mucho más rico y valioso.

\n

Los humanos tienen problemas de memoria que el cerebro trata de compensar

\n

Otro problema frecuente que vemos como investigadores es que la gente normalmente\nno tiene tan buena memoria para recordar cualquier cosa que haya pasado hace más\nde una semana.

\n

Una opción para evitar este problema es hacer preguntas sobre una experiencia\nmuy específica. Por ejemplo, en lugar de preguntarle de manera general si leyó\nlos Términos y Condiciones, podrías preguntarle acerca de la última vez que tuvo\nque registrarse para un servicio como AirBnB y cómo lo hicieron. Puedes seguir\nesas preguntas con una acerca de si leyeron los términos o no, y por qué no.

\n

Nuevamente, sería mucho mejor si tienes la opción de observar gente pasando por\nun flujo de registro.

\n

Los usuarios no son diseñadores

\n

...y no están calificados para dar feedback sobre el diseño o saber exactamente\nqué quieren en un producto

\n

Otro problema común que pasa muy seguido en entrevistas de investigación es que\nlos investigadores tienden a preguntar a los usuarios qué pensaron de un diseño.\nLa mayoría de veces los usuarios no son diseñadores y no deberían tener que\ndarte feedback sobre un diseño para que puedas interpretar formas de mejorar sus\nexperiencias.

\n

Otro error común es preguntar a los usuarios exactamente qué quieren tener en un\nproducto. Como puedes ver en la cita de Steve Jobs:

\n
\n

No es trabajo del cliente saber lo que quiere.\"

\n
\n

Esta cita es súper importante y la deberían recordar. Como investigadores,\nnosotros deberíamos intentar entender mejor los problemas o desafíos que tiene\nun usuario, en lugar de preguntarles lo que quieren. Es el trabajo de tu equipo\ndescubrir qué necesitan los usuarios en base a los descubrimientos de las\nentrevistas con usuarios.

\n

Como mencionamos, una forma de evitar preguntar qué quieren las personas es\nhacer más preguntas acerca del contexto de usar el producto.

\n

Aquí hay 3 preguntas fáciles que te pueden ayudar a llegar al objetivo de\nidentificar lo que los usuarios necesitan o quieren:

\n
    \n
  • ¿Qué estás intentando hacer?
  • \n
  • ¿Qué estás haciendo en este momento?
  • \n
  • ¿Qué podría mejorar de cómo lo estás haciendo actualmente?
  • \n
\n

Los usuarios quieren una respuesta cuando tienen dudas sobre el flujo

\n

Responde a preguntas con preguntas

\n
    \n
  • Usuario: ¿Debo hacer un clic aca para buscar un vuelo?
  • \n
  • Investigadora: ¿Qué piensas tú?, ¿Cómo lo harías?
  • \n
\n

Algunos consejos para tener en mente:

\n
    \n
  • Asegúrate de no hacer preguntas directivas (leading questions) que puedan\ncausar una respuesta sesgada. Haz preguntas abiertas.
  • \n
  • No dejes ninguna información \"sobre la mesa\" - haz repreguntas y dale\nseguimiento a tus preguntas para sacar toda la información posible. Si no\nentiendes algo, no tengas miedo de pedir a tu usuario que repita lo que dijo.
  • \n
  • Responde preguntas con preguntas en lugar de responder al usuario cuando te\nhace preguntas sobre el producto o diseño - ¿Qué piensas tú? ¿Qué harías tú?
  • \n
  • Ten cuidado con el tiempo y trata de no excederte del tiempo agendado.
  • \n
  • Cuida tu lenguaje corporal, y especialmente tus expresiones faciales. Por\nejemplo, si el usuario hace o dice algo que no esperabas, trata de no verte\nsorprendido o confundido.
  • \n
\n

Referencias

\n" + "body": "

Intro

\n

Las entrevistas con usuarios son una herramienta muy importante para poder\nobtener más datos sobre cómo se sienten los usuarios con un producto o servicio.\nPara realizar una buena entrevista debemos hacer un buen planeamiento y seguir\nalgunos tips.

\n

Ser Curiosa

\n

\"curiosity\"

\n

La foto de la presentación, es una foto del explorador \"Curiosity\" de Marte,\nque fue lanzado por la NASA en el 2011 con la meta de determinar si Marte algún\ndía sería capaz de sostener vida microscópica. La segunda meta del explorador\nera recolectar data sobre Marte y comprender cómo era el ambiente y ecosistema.\nDemoró más de una semana de investigación, desarrollo y prueba poder construir\nun explorador que trabajaría en otro planeta.

\n

Tal como los astrofísicos que diseñaron el explorador de Marte, como\ninvestigadores tenemos que poner a prueba nuestros diseños continuamente para\nasegurarnos de que podemos generar soluciones \"de otro mundo\" para nuestros\nclientes.

\n

Y como el nombre de esta nave, \"Curiosidad\", debemos tener curiosidad por\nrecolectar data y preguntar las preguntas correctas a nuestros usuarios para\nasegurar que estamos diseñando productos que cumplen con sus necesidades.

\n

Para este curso, hicimos una mini investigación preguntándole a personas que han\ntrabajado en investigación por décadas (gente que trabaja para Google Ventures,\nFacebook, WeWork e incluso bancos y corporaciones internacionales). Les\npreguntamos cuál era la característica más importante que tenía que tener\nalguien que sobresalía en el mundo de la investigación.

\n

La respuesta más común fue que los investigadores necesitan tener curiosidad.\nTienen que estar interesados en entender el motor que mueve a sus usuarios y a\nlos seres humanos en general.

\n

Deben cuestionar todo y preguntarse constantemente:

\n
    \n
  • ¿Cómo realiza la gente ciertas tareas?
  • \n
  • ¿Por qué hacen ciertas cosas?
  • \n
  • ¿Cuándo hacen ciertas cosas?
  • \n
  • ¿Qué factores los llevan a tomar decisiones?
  • \n
  • ¿Qué es lo que las personas valoran?
  • \n
\n

Nunca recibimos respuestas que dijeran que un investigador debe ser\nextrovertido, creemos que ese es un mito que no está basado en la realidad.\nLos grandes investigadores pueden ser introvertidos o extrovertidos, pero tienen\nque ser inquisitivos y buscar siempre formas de aprender más sobre la gente.

\n

Haciendo mejores preguntas

\n

Ahora, en una situación de entrevista con usuarios, lo más probable es que no\npreguntemos \"por qué\" 5 veces seguidas. Esto es porque sería muy molesto para el\nusuario y probablemente no nos ayudaría a lograr nuestros objetivos de\ninvestigación.

\n

Así que no solo tenemos que ser curiosos, tenemos que aprender a hacer mejores\npreguntas.

\n

Hacer las preguntas correctas es realmente importante por 2 razones:

\n
    \n
  • Si obligamos a los usuarios a responder una respuesta que estamos buscando, o\nlos dirigimos a creer que hay una respuesta correcta, no lograremos capturar\ninformación adecuada.
  • \n
  • Si hacemos preguntas directivas, podemos incomodar al participante y es muy\nimportante que no hagamos esto.
  • \n
\n

Una cosa por mencionar, es que, como investigador, estás representando a la\ncompañía para la que trabajas, y hay una política en la que nos debemos\nconcentrar durante las sesiones de investigación, sobre todas las cosas:\nNunca hagas daño. Si una entrevista va mal y sientes que no has aprendido nada\nde lo que saliste a buscar, como mínimo deberías asegurarte que el participante\ndebería salir de la sesión sintiendo que su punto de vista fue apreciado y\nescuchado. Lo peor que puede pasar en un estudio es que el participante sienta\nque fue puesto a prueba y se equivocó en todas las respuestas, o peor aún, que\nse lleve una imagen negativa de la empresa por la forma en que lo trataste.

\n

Vamos a discutir algunas tácticas para evitar esto después, podría sonar como\nsentido común, pero son cosas importantes para tener en mente. Es especialmente\nimportante si trabajas con stakeholders de la empresa con un interés en el\nresultado de la investigación, y que podrían intentar jalar la conversación con\nusuarios en una dirección particular.

\n

Siempre debes poner la comodidad y necesidades de tus usuarios primero, y los\nobjetivos de la investigación en un cercano segundo lugar.

\n

Para una entrevista

\n
    \n
  • Lleva una guía de discusión
  • \n
  • Usa lenguaje positivo
  • \n
  • Valora el silencio
  • \n
  • No interrumpas
  • \n
  • Reconoce las respuestas de los entrevistados
  • \n
  • Haz preguntas para ir más a fondo (follow up questions)
  • \n
  • Sal de la guía cuando sea necesario
  • \n
  • Responde a preguntas con preguntas
  • \n
  • Ten alguna forma de documentar las respuestas (notas, grabaciones, etc)
  • \n
\n

Consejos para hacer preguntas en entrevistas

\n
    \n
  • Haz preguntas abiertas: ¿Qué medios de transporte usas?
  • \n
  • Pregunta sobre el comportamiento real: Cuéntame sobre tus hábitos de transporte.
  • \n
  • Enfócate en casos específicos: Cuéntame sobre la última vez que pediste un taxi
  • \n
  • Haz que las personas se concentren: ¿Me ayudas a resumir eso en una oración?
  • \n
  • Usa el silencio: *Las personas se sienten obligadas a rellenar los silencios.
  • \n
  • Haz preguntas simples: ¿Qué medios de pago usas cuando compras online?
  • \n
  • Pregunta ¿por qué seguido?: Me puedes hablar un poco más sobre eso.
  • \n
\n

Arco de una entrevista

\n

Muchos investigadores mencionan el arco de una entrevista, que básicamente es la\nforma en que la entrevista progresa a través del tiempo que tienes con los\nparticipantes. En el eje horizontal tienes el tiempo y en el eje vertical tienes\nun promedio de cuánto es probable que aprendas durante ese momento.

\n

Típicamente en los primeros cinco minutos vas a pasar la mayoría del tiempo\ntratando de hacer que tu participante se sienta cómodo, y ponerlo en contexto\ncon el proyecto. Puedes empezar por presentarte y explicar por qué lo has\nelegido como participante a él o ella.

\n

El siguiente paso se llama construir rapport, que básicamente significa hacer\nque la otra persona se sienta cómoda y sienta que puede confiar en ti. En esta\nfase en verdad no vas a aprender mucho. Eso está bien, porque todo el tiempo que\ninviertas en hacer que tu participante se sienta cómodo es increíblemente\nimportante. Si se sienten cómodos, hay mucha más probabilidad de que te de sus\nopiniones y pensamientos honestos. Puedes charlar un rato con el participante -\npreguntarle por su día o conversar sobre un tema neutral.

\n

Durante el calentamiento, te concentrarás en una lista de preguntas que te darán\nun mejor entendimiento sobre la persona que estás entrevistando, así como de\ntodo el contexto en el que usa el producto. Como verás, en este punto ya estás\nempezando a aprender un poco más.

\n

Una vez que has hecho algunas preguntas de fondo, puedes pasar a la \"carnecita\"\nde la entrevista. Si estás haciendo una investigación de observación o de\nusabilidad, este es el momento en que todas tus preguntas de ese tipo irán. En\neste momento en la entrevista generalmente será cuando más aprendes sobre el\ntema o producto particular para el que hiciste la investigación.

\n

Luego de completar las preguntas detalladas, puedes hacer unas cuantas preguntas\nde resumen. Esta parte es muy importante porque los usuarios típicamente te\ndarán buenos insights y citas acerca de su experiencia en general. Como verás,\nlos aprendizajes en el arco de la entrevista se disparan justo al final, porque\npedirle a la gente que resuma su experiencia los hace reflexionar y conectar los\npuntos un poquito. (Algunas veces la gente necesita un poco de tiempo para\npensar antes de poder articular lo que funcionó y lo que no funcionó.)

\n

Algunos ejemplos de preguntas de informe:

\n
    \n
  • Entonces, ¿cuál fue tu impresión en general de lo que viste hoy?
  • \n
  • ¿Cuáles son algunos de tus pensamientos generales?
  • \n
  • ¿Qué partes te gustaron?
  • \n
  • ¿Qué partes no te gustaron tanto?
  • \n
  • ¿Hay algún otro comentario que te gustaría compartir?
  • \n
\n

Building rapport

\n

Muchos investigadores hablan de la importancia de \"construir rapport\", que\nesencialmente significa generar confianza y un espacio seguro donde tu\nparticipante sienta que realmente puede abrirse y compartir sus experiencias.

\n

Es importante que no empieces inmediatamente con preguntas detalladas para la\nentrevista. Por ejemplo, nunca saltes directo a preguntas de testeo de\nusabilidad porque realmente necesitas que tu usuario se acostumbre y se sienta\ncómodo contigo primero. Usa los primeros minutos para preguntarle un poco sobre\nsí mismo.

\n

Algunos consejos que pueden ayudarte mientras te preparas para entrevistar\nusuarios:

\n
    \n
  • Métete en el personaje de \"investigador\" - Muchos investigadores hablan de\n\"meterse en el personaje\" antes de una entrevista. La entrevista no es momento\nde ser crítico o juzgar a tu interlocutor, así que prepárate antes de la\nentrevista para tener una mente abierta. Muchos de nosotros estamos\nacostumbrados a demostrar todo lo que sabemos sobre nuestros productos,\ntecnología o diseños de nuestro trabajo diario, pero este no es un momento\npara presumir. No importa para nada lo que tú sabes, ya que estás ahí para\nescuchar, observar y aprender de tus usuarios.
  • \n
  • Sonríe - te ayudará mucho a poner cómodo a tu participante. Algunos\ninvestigadores incluso recomiendan sonreír en entrevistas por teléfono: tu voz\nsimplemente suena diferente cuando sonríes.
  • \n
  • Estar realmente interesado y conectado con lo que dice el usuario ayuda\nmuchísimo.
  • \n
  • Demuestra que estás escuchando - No hace falta que respondas a cada cosa que\ndicen.
  • \n
  • Alienta a tus participantes para que compartan feedback, comentarios y\ncríticas constructivas.
  • \n
  • No juzgues las opiniones de tus usuarios - No te preocupes, tendrás mucho\ntiempo luego para analizar todo el comportamiento que observaste, y las cosas\nque aprendiste durante la entrevista.
  • \n
  • No lances ideas - Esta no es una oportunidad para proponerle ideas nuevas a\nnadie. Trata de mantenerte lo más neutral posible para conseguir buena data.
  • \n
\n

Los 5 actos de una entrevista

\n

\n

El Arte de entrevistar

\n
    \n
  • Para ser un gran investigador, tienes que conversar como conductor de\ntelevisión, pensar como escritor, entender el subtexto como un psicoanalista y\ntener el oído de un músico.
  • \n
\n

¿Qué entendiste de esta frase?

\n
    \n
  • Conversar como conductor de televisión - pon claros el contexto del proyecto y\nlas metas por las que elegiste entrevistar a tu participante.
  • \n
  • Piensa como escritor - más adelante en el proyecto vas a pensar en cómo\nconstruir una narrativa para contar la historia de los hallazgos con tus\nusuarios.
  • \n
  • Entender subtexto como psicoanalista - debes observar el comportamiento y\nlenguaje corporal del consumidor. Observar lo que están haciendo, además de\nescuchar lo que dicen.
  • \n
  • Tener el oído de un músico - escucha cuidadosamente todo lo que los usuarios\ndicen. No es tu turno de mostrar todo lo que sabes.
  • \n
\n

Los problemas más comunes

\n

Las personas normalmente no te dan a conocer sus malos hábitos

\n

Uno de los retos de la investigación cualitativa en general es que la gente\nsuele sub-reportar el mal comportamiento. No es porque sean malas personas, o\nestén tratando de engañarte, pero los humanos en general quieren ser vistos como\nbuenas personas. Solemos racionalizar el mal comportamiento convenciéndonos de\nque lo hacemos mucho menos de lo que en verdad hacemos.

\n

Por ejemplo, podríamos observar a las personas en lugar de preguntarles por su\ncomportamiento.

\n

Esta foto es un ejemplo de un tipo de mal comportamiento que la gente\nsub-reporta. Cuando se trata de contraseñas, mucha gente no usa claves seguras y\nelige algo como 123456 siempre que no hay requerimientos obligatorios de\nseguridad. Muchas personas también guardan sus contraseñas escritas en post-its\nen su escritorio. La mayoría de personas saben que no es seguro hacer esto, pero\nlo hacen porque es seguro y conveniente.

\n

En una entrevista, si preguntamos a las personas si siempre usan contraseñas\nseguras, es posible que digan que sí, pero esto no necesariamente representa lo\nque en verdad hacen. Este es un ejemplo clave de cómo las personas no siempre\nhacen lo que dicen que harán, y vice versa.

\n

Para evitar este problema potencial, podríamos pedir para observar a alguien\nmientras entra a una página web con su contraseña, en lugar de preguntarle si\nusa una contraseña segura.

\n

Las entrevistas ofrecen información sobre lo que la gente dice que hará

\n

...pero esto no es una buena representación de su comportamiento real

\n

El segundo problema común es que muchas veces en entrevistas hacemos preguntas\nhipotéticas sobre lo que la gente haría en una situación particular, pero esto\nno siempre es una buena representación de cómo actuarían en verdad. Los humanos\nen general no son buenos para explicar su comportamiento potencial en el futuro,\nporque muchísimo de nuestro comportamiento depende del contexto específico en el\nque nos encontramos.

\n

Una táctica bastante útil es pedir a tus participantes que te cuenten sobre\nexperiencias reales y anécdotas relacionadas al tema que estás investigando.

\n

Una mala pregunta que le encanta a los investigadores es \"Pagarías por este\nproducto?\" o \"Crees que usarías este producto en el futuro?\" Estas no son\npreguntas valiosas en una entrevista.

\n

En el caso de \"Pagarías por este producto?\" podrías preguntarle por otros\nproductos por los que han pagado en el pasado que puedan compararse, y en esos\ncasos cuánto pagaron y por qué. También puedes intentar de hacer preguntas más\ngenerales sobre otros productos que han usado y seguir esas preguntas con otras\nsobre el precio.

\n

Apégate al dicho \"Mostrar, no contar\" siempre que puedas, porque el feedback que\nrecibas será mucho más rico y valioso.

\n

Los humanos tienen problemas de memoria que el cerebro trata de compensar

\n

Otro problema frecuente que vemos como investigadores es que la gente normalmente\nno tiene tan buena memoria para recordar cualquier cosa que haya pasado hace más\nde una semana.

\n

Una opción para evitar este problema es hacer preguntas sobre una experiencia\nmuy específica. Por ejemplo, en lugar de preguntarle de manera general si leyó\nlos Términos y Condiciones, podrías preguntarle acerca de la última vez que tuvo\nque registrarse para un servicio como AirBnB y cómo lo hicieron. Puedes seguir\nesas preguntas con una acerca de si leyeron los términos o no, y por qué no.

\n

Nuevamente, sería mucho mejor si tienes la opción de observar gente pasando por\nun flujo de registro.

\n

Los usuarios no son diseñadores

\n

...y no están calificados para dar feedback sobre el diseño o saber exactamente\nqué quieren en un producto

\n

Otro problema común que pasa muy seguido en entrevistas de investigación es que\nlos investigadores tienden a preguntar a los usuarios qué pensaron de un diseño.\nLa mayoría de veces los usuarios no son diseñadores y no deberían tener que\ndarte feedback sobre un diseño para que puedas interpretar formas de mejorar sus\nexperiencias.

\n

Otro error común es preguntar a los usuarios exactamente qué quieren tener en un\nproducto. Como puedes ver en la cita de Steve Jobs:

\n
\n

No es trabajo del cliente saber lo que quiere.\"

\n
\n

Esta cita es súper importante y la deberían recordar. Como investigadores,\nnosotros deberíamos intentar entender mejor los problemas o desafíos que tiene\nun usuario, en lugar de preguntarles lo que quieren. Es el trabajo de tu equipo\ndescubrir qué necesitan los usuarios en base a los descubrimientos de las\nentrevistas con usuarios.

\n

Como mencionamos, una forma de evitar preguntar qué quieren las personas es\nhacer más preguntas acerca del contexto de usar el producto.

\n

Aquí hay 3 preguntas fáciles que te pueden ayudar a llegar al objetivo de\nidentificar lo que los usuarios necesitan o quieren:

\n
    \n
  • ¿Qué estás intentando hacer?
  • \n
  • ¿Qué estás haciendo en este momento?
  • \n
  • ¿Qué podría mejorar de cómo lo estás haciendo actualmente?
  • \n
\n

Los usuarios quieren una respuesta cuando tienen dudas sobre el flujo

\n

Responde a preguntas con preguntas

\n
    \n
  • Usuario: ¿Debo hacer un clic aca para buscar un vuelo?
  • \n
  • Investigadora: ¿Qué piensas tú?, ¿Cómo lo harías?
  • \n
\n

Algunos consejos para tener en mente:

\n
    \n
  • Asegúrate de no hacer preguntas directivas (leading questions) que puedan\ncausar una respuesta sesgada. Haz preguntas abiertas.
  • \n
  • No dejes ninguna información \"sobre la mesa\" - haz repreguntas y dale\nseguimiento a tus preguntas para sacar toda la información posible. Si no\nentiendes algo, no tengas miedo de pedir a tu usuario que repita lo que dijo.
  • \n
  • Responde preguntas con preguntas en lugar de responder al usuario cuando te\nhace preguntas sobre el producto o diseño - ¿Qué piensas tú? ¿Qué harías tú?
  • \n
  • Ten cuidado con el tiempo y trata de no excederte del tiempo agendado.
  • \n
  • Cuida tu lenguaje corporal, y especialmente tus expresiones faciales. Por\nejemplo, si el usuario hace o dice algo que no esperabas, trata de no verte\nsorprendido o confundido.
  • \n
\n

Referencias

\n" } } }, @@ -141,7 +141,7 @@ "intl": { "es": { "title": "Testing", - "body": "

Intro

\n

En los tests de usabilidad probamos nuestros productos en cualquier versión\n(muchas veces prototipos) para ver hasta qué nivel los usuarios pueden completar\ntareas en ellos. Durante esta etapa vemos cómo los usuarios interactuan con los\nproductos y qué problemas pueden tener para completar las tareas.

\n

Por qué

\n

Mira este video de Jakob Nielsen contando por qué y cómo testear con usuarios:

\n

video

\n

Cuándo testear

\n

Las UX Designers estamos constantemente haciendo testeos de los productos con\nlos que trabajamos. Testeamos en distintos tipos de fidelidad, desde nuestros\nprimeros wireframes o sketches en papel, nuestros prototipos interactivos y\ntambién el producto \"final\" (como estamos constantemente mejorando, rara vez\nun producto es el final) en código. Para empezar, miira los siguientes ejemplos\nde cómo se pueden hacer tests de usabilidad con un prototipo en papel e incluso\ncon frutas. Intenta anotar todos los aprendizajes que se van teniendo con esta\ntécnica.

\n

video

\n

video 2

\n

Planificación

\n
    \n
  • Reclutamiento: asegúrate que reclutas usuarios que sean relevantes\npara tu producto.\n
      \n
    • Es mejor si no son conocidos
    • \n
    • Hazle llenar un screener
    • \n
    • Ofrece una recompensa
    • \n
    \n
  • \n
  • Tareas: elabora una lista de tareas que los usuarios tendrán que completar\ncon el prototipo.
  • \n
  • Script: prepara un script donde detalles lo que le dirás al usuario. Cómo\nle presentarás el producto y la sesión.
  • \n
  • Autorización haz un documento de autorización en la que el usuario te da\npermiso para grabarlo y para usar la grabación para los fines del estudio.
  • \n
\n

La sesión de testing

\n
    \n
  • Bienvenida cálida e introducción: Dale la bienvenida al usuario y hazlo\nsentir cómodo. Explícale que estamos buscando su feedback para crear un mejor\nproducto.
  • \n
  • Preguntas sobre el contexto del usuario: ten una mejor idea de qué hace el\nusuario en el día a día, que tanto usa tecnología, internet, mobile, etc. Haz\nlas primeras preguntas sobre el tema del que quieres aprender.
  • \n
  • Introducción a los prototipos: Recuerdale al usuario que algunas cosas\nquizás no funcionen y que estás testeando el prototipo y no a él. Pídele que\npiense en voz alta durante el test.
  • \n
  • Mostrar tareas: empieza con un pequeño empujón y luego deja que el usuario\nrealice todas las tareas por su cuenta. Intenta hacer pequeñas preguntas que\nhagan que el usuario piense en voz alta.
  • \n
  • Cierre - debrief: haz preguntas que hagan que el usuario resuma su\nexperiencia. Luego agradécele por su ayuda y entrégale el regalo.
  • \n
\n

Técnicas para facilitar un test de usabilidad

\n

Mira este video de NNgroup contándonos valiosos tips para facilitar tests de\nusabilidad:

\n

video

" + "body": "

Intro

\n

En los tests de usabilidad probamos nuestros productos en cualquier versión\n(muchas veces prototipos) para ver hasta qué nivel los usuarios pueden completar\ntareas en ellos. Durante esta etapa vemos cómo los usuarios interactuan con los\nproductos y qué problemas pueden tener para completar las tareas.

\n

Por qué

\n

Mira este video de Jakob Nielsen contando por qué y cómo testear con usuarios:

\n

\n

Cuándo testear

\n

Las UX Designers estamos constantemente haciendo testeos de los productos con\nlos que trabajamos. Testeamos en distintos tipos de fidelidad, desde nuestros\nprimeros wireframes o sketches en papel, nuestros prototipos interactivos y\ntambién el producto \"final\" (como estamos constantemente mejorando, rara vez\nun producto es el final) en código. Para empezar, miira los siguientes ejemplos\nde cómo se pueden hacer tests de usabilidad con un prototipo en papel e incluso\ncon frutas. Intenta anotar todos los aprendizajes que se van teniendo con esta\ntécnica.

\n

\n

\n

Planificación

\n
    \n
  • Reclutamiento: asegúrate que reclutas usuarios que sean relevantes\npara tu producto.\n
      \n
    • Es mejor si no son conocidos
    • \n
    • Hazle llenar un screener
    • \n
    • Ofrece una recompensa
    • \n
    \n
  • \n
  • Tareas: elabora una lista de tareas que los usuarios tendrán que completar\ncon el prototipo.
  • \n
  • Script: prepara un script donde detalles lo que le dirás al usuario. Cómo\nle presentarás el producto y la sesión.
  • \n
  • Autorización haz un documento de autorización en la que el usuario te da\npermiso para grabarlo y para usar la grabación para los fines del estudio.
  • \n
\n

La sesión de testing

\n
    \n
  • Bienvenida cálida e introducción: Dale la bienvenida al usuario y hazlo\nsentir cómodo. Explícale que estamos buscando su feedback para crear un mejor\nproducto.
  • \n
  • Preguntas sobre el contexto del usuario: ten una mejor idea de qué hace el\nusuario en el día a día, que tanto usa tecnología, internet, mobile, etc. Haz\nlas primeras preguntas sobre el tema del que quieres aprender.
  • \n
  • Introducción a los prototipos: Recuerdale al usuario que algunas cosas\nquizás no funcionen y que estás testeando el prototipo y no a él. Pídele que\npiense en voz alta durante el test.
  • \n
  • Mostrar tareas: empieza con un pequeño empujón y luego deja que el usuario\nrealice todas las tareas por su cuenta. Intenta hacer pequeñas preguntas que\nhagan que el usuario piense en voz alta.
  • \n
  • Cierre - debrief: haz preguntas que hagan que el usuario resuma su\nexperiencia. Luego agradécele por su ayuda y entrégale el regalo.
  • \n
\n

Técnicas para facilitar un test de usabilidad

\n

Mira este video de NNgroup contándonos valiosos tips para facilitar tests de\nusabilidad:

\n

" } } }, @@ -247,7 +247,7 @@ "intl": { "es": { "title": "User personas", - "body": "

Intro

\n

Un User Persona es un personaje de ejemplo que representa al grupo de usuarios\nde tu producto. Se crea luego de haber realizado una investigación. Este\nartefacto es creado para entender mejor las metas, deseos y limitaciones de los\nprincipales grupos de usuarios de un producto. Además el User Persona es un\nproducto vivo que iremos actualizando según vamos conociendo mejor a nuestro\nusuario.

\n

video user personas

\n

Hay que tener en cuenta que un User Persona es un arquetipo no un estereotipo.

\n

Qué incluye un User Persona

\n
    \n
  1. Nombre
  2. \n
  3. Foto
  4. \n
  5. Frase
  6. \n
  7. Información demográfica
  8. \n
  9. Escenario
  10. \n
  11. Frustraciones
  12. \n
  13. Necesidades / metas
  14. \n
\n

\"ejemplo

\n

Aquí otros ejemplos:

\n

\"user

\n

\"user

\n

Por qué son importantes los User Personas

\n

Alan Cooper nos cuente por qué son\nimportantes en este video:

\n

otro video sobre personas

\n
    \n
  • Determinan qué debería hacer un producto y cómo debería hacerlo. Las metas\nde los User Personas sirven para tener una base en el diseño del producto.
  • \n
  • Mejoran la comunicación con stakeholders, desarrolladores y otros\ndiseñadores. Los User Personas proveen un lenguaje común para discutir temas\nde diseño y mantienen al equipo centrado en los usuarios en cada etapa del\nproceso.
  • \n
  • Crean consenso y compromiso con el diseño. Con un lenguaje común viene un\nentendimiento común. Los User Personas reducen la necesidad de crear modelos\nprogramáticos. Es fácil de entender todos los matices del comportamiento del\nusuario a través de la narrativa de que usan los User Personas.
  • \n
  • Miden la efectividad del diseño. Las opciones de diseño pueden ser\ntesteadas en un User Persona, de la misma manera en la que pueden ser\npresentadas a un usuario real durante el proceso.
  • \n
  • Contribuyen en otros esfuerzos relacionados al producto como marketing y\nventas. Ayudan en campañas de marketing, estructuras organizacionales y\ncentros de atención al cliente.
  • \n
\n

Además evitan los siguientes casos

\n
    \n
  • \n

    Usuario elástico: cuando se tienen que tomar decisiones, el usuario se\nvuelve elástico. Ej. “A veces es power user, a veces es super tech, a veces no\nsabe nada de tech, a veces compra mucho por internet, otras no.”

    \n
  • \n
  • \n

    Diseño autoreferenciado: cuando diseñadores y desarrolladores proyectan\nsus propias metas, motivaciones, habilidades y modelos mentales en el diseño\ndel producto.

    \n

    Ej. Caso del rediseño del app de nike que eliminó una función que era muy\nutilizada por los usuarios: \"el correr por metas\"

    \n

    \"caso

    \n
  • \n
  • \n

    Casos extremos: los user personas evitan diseñar para casos extremos\n(situaciones que probablemente no le sucedan a la mayoría de los usuarios).\nLos casos extremos no deberían ser el centro del diseño. Ej: crear un api para\ntu producto, agregar Bitcoin como medio de pago.

    \n
  • \n
\n

Otras clasificaciones

\n

User Persona primario

\n

Una primary persona es el target principal para diseñar el producto y su\ninterfaz. El producto solo debería tener una persona primaria.

\n

User Persoona secundario

\n

Una secondary persona, representa a un grupo de usuarios que estará satisfecho\ncon la mayor parte del producto creado para la persona primaria. Sin embargo,\nesta persona tiene otras necesidades adicionales que se pueden ir agregando al\nproducto de acuerdo al tiempo y costo del proyecto.

\n

Customer persona

\n

Customer persona, representa las necesidades de personas que no necesariamente\nson usuarios, pero sí influyen al comprar un producto. Es clásico el ejemplo de\nlas personas que trabajan en el área de compras de alguna empresa, ellos son los\nencargados de pedir cotizaciones, de negociar, etc. sin embargo, no serán los\nusuarios finales de los productos que compran. Al tener a este tipo de personas,\nbuscamos entender sus necesidades, para así poder satisfacerlas, ya que su\nsatisfacción se verá reflejada en el éxito del producto.

\n

En este video de Udacity nos muestran un ejemplo de este tipo de personas:

\n

video

\n

Served persona

\n

Served persona, representan las necesidades de personas que serán atendidas con\nun producto. Por ejemplo, si estamos trabajando en un aplicativo para tomar\npedidos en un restaurante, no solo tenemos que pensar en el mesero que utilizará\nel app sino también en los comensales a quienes se atenderá con este aplicativo.\n¿Qué pasa si el uso del aplicativo les restringe los cambios que pueden hacer\na su pedido? o ¿Si el uso del aplicativo hace más lenta la toma del pedido?

\n

Negative persona

\n

Negative persona, representan a las personas para quienes NO irá dirigido el\nproducto. Por ejemplo, criminales, muchas veces tenemos que pensar en formas\nde evitar que personas con motivaciones negativas utilicen nuestros productos\ncomo un app bancaria o un app de chat encriptado.

\n

IMPORTANTE: siempre debemos enfocarnos en resolver las necesidades de nuestro\nuser persona primario

\n

Si no hubiera un usuario primario y tomaramos en cuenta las necesidades de todos\npasaría esto:

\n

\"auto

\n

Sin embargo, si entendemos que los usuarios son distintos, con distintas\nnecesidades, podríamos llegar a soluciones como estas:

\n

\"auto

\n

Video

\n

Si no tienes en cuenta quién es tu usuario real mientras creas un producto,\nte podrían pasar cosas como esta:

\n

video silicon valley

\n

Referencias

\n" + "body": "

Intro

\n

Un User Persona es un personaje de ejemplo que representa al grupo de usuarios\nde tu producto. Se crea luego de haber realizado una investigación. Este\nartefacto es creado para entender mejor las metas, deseos y limitaciones de los\nprincipales grupos de usuarios de un producto. Además el User Persona es un\nproducto vivo que iremos actualizando según vamos conociendo mejor a nuestro\nusuario.

\n

\n

Hay que tener en cuenta que un User Persona es un arquetipo no un estereotipo.

\n

Qué incluye un User Persona

\n
    \n
  1. Nombre
  2. \n
  3. Foto
  4. \n
  5. Frase
  6. \n
  7. Información demográfica
  8. \n
  9. Escenario
  10. \n
  11. Frustraciones
  12. \n
  13. Necesidades / metas
  14. \n
\n

\"ejemplo

\n

Aquí otros ejemplos:

\n

\"user

\n

\"user

\n

Por qué son importantes los User Personas

\n

Alan Cooper nos cuente por qué son\nimportantes en este video:

\n

\n
    \n
  • Determinan qué debería hacer un producto y cómo debería hacerlo. Las metas\nde los User Personas sirven para tener una base en el diseño del producto.
  • \n
  • Mejoran la comunicación con stakeholders, desarrolladores y otros\ndiseñadores. Los User Personas proveen un lenguaje común para discutir temas\nde diseño y mantienen al equipo centrado en los usuarios en cada etapa del\nproceso.
  • \n
  • Crean consenso y compromiso con el diseño. Con un lenguaje común viene un\nentendimiento común. Los User Personas reducen la necesidad de crear modelos\nprogramáticos. Es fácil de entender todos los matices del comportamiento del\nusuario a través de la narrativa de que usan los User Personas.
  • \n
  • Miden la efectividad del diseño. Las opciones de diseño pueden ser\ntesteadas en un User Persona, de la misma manera en la que pueden ser\npresentadas a un usuario real durante el proceso.
  • \n
  • Contribuyen en otros esfuerzos relacionados al producto como marketing y\nventas. Ayudan en campañas de marketing, estructuras organizacionales y\ncentros de atención al cliente.
  • \n
\n

Además evitan los siguientes casos

\n
    \n
  • \n

    Usuario elástico: cuando se tienen que tomar decisiones, el usuario se\nvuelve elástico. Ej. “A veces es power user, a veces es super tech, a veces no\nsabe nada de tech, a veces compra mucho por internet, otras no.”

    \n
  • \n
  • \n

    Diseño autoreferenciado: cuando diseñadores y desarrolladores proyectan\nsus propias metas, motivaciones, habilidades y modelos mentales en el diseño\ndel producto.

    \n

    Ej. Caso del rediseño del app de nike que eliminó una función que era muy\nutilizada por los usuarios: \"el correr por metas\"

    \n

    \"caso

    \n
  • \n
  • \n

    Casos extremos: los user personas evitan diseñar para casos extremos\n(situaciones que probablemente no le sucedan a la mayoría de los usuarios).\nLos casos extremos no deberían ser el centro del diseño. Ej: crear un api para\ntu producto, agregar Bitcoin como medio de pago.

    \n
  • \n
\n

Otras clasificaciones

\n

User Persona primario

\n

Una primary persona es el target principal para diseñar el producto y su\ninterfaz. El producto solo debería tener una persona primaria.

\n

User Persoona secundario

\n

Una secondary persona, representa a un grupo de usuarios que estará satisfecho\ncon la mayor parte del producto creado para la persona primaria. Sin embargo,\nesta persona tiene otras necesidades adicionales que se pueden ir agregando al\nproducto de acuerdo al tiempo y costo del proyecto.

\n

Customer persona

\n

Customer persona, representa las necesidades de personas que no necesariamente\nson usuarios, pero sí influyen al comprar un producto. Es clásico el ejemplo de\nlas personas que trabajan en el área de compras de alguna empresa, ellos son los\nencargados de pedir cotizaciones, de negociar, etc. sin embargo, no serán los\nusuarios finales de los productos que compran. Al tener a este tipo de personas,\nbuscamos entender sus necesidades, para así poder satisfacerlas, ya que su\nsatisfacción se verá reflejada en el éxito del producto.

\n

En este video de Udacity nos muestran un ejemplo de este tipo de personas:

\n

\n

Served persona

\n

Served persona, representan las necesidades de personas que serán atendidas con\nun producto. Por ejemplo, si estamos trabajando en un aplicativo para tomar\npedidos en un restaurante, no solo tenemos que pensar en el mesero que utilizará\nel app sino también en los comensales a quienes se atenderá con este aplicativo.\n¿Qué pasa si el uso del aplicativo les restringe los cambios que pueden hacer\na su pedido? o ¿Si el uso del aplicativo hace más lenta la toma del pedido?

\n

Negative persona

\n

Negative persona, representan a las personas para quienes NO irá dirigido el\nproducto. Por ejemplo, criminales, muchas veces tenemos que pensar en formas\nde evitar que personas con motivaciones negativas utilicen nuestros productos\ncomo un app bancaria o un app de chat encriptado.

\n

IMPORTANTE: siempre debemos enfocarnos en resolver las necesidades de nuestro\nuser persona primario

\n

Si no hubiera un usuario primario y tomaramos en cuenta las necesidades de todos\npasaría esto:

\n

\"auto

\n

Sin embargo, si entendemos que los usuarios son distintos, con distintas\nnecesidades, podríamos llegar a soluciones como estas:

\n

\"auto

\n

Video

\n

Si no tienes en cuenta quién es tu usuario real mientras creas un producto,\nte podrían pasar cosas como esta:

\n

\n

Referencias

\n" } } }, @@ -259,7 +259,7 @@ "intl": { "es": { "title": "Customer Journey Maps", - "body": "

Intro

\n

El customer journey map, es una herramienta de Design Thinking que permite\nplasmar en un mapa, cada una de las etapas, interacciones, canales y elementos\npor los que atraviesa nuestro cliente desde un punto a otro de nuestro servicio.

\n

Los elementos necesarios para elaborar un buen customer journey map son los\nsiguientes:

\n
    \n
  • Personas
  • \n
  • Línea de tiempo (timeline)
  • \n
  • Emociones que sienten los clientes su experiencia de usuario
  • \n
  • Touchpoints o puntos de contacto
  • \n
  • Momentos
  • \n
  • Interacciones
  • \n
\n

\"Ejemplo

\n

Mira esta forma distinta de mostrar un journey map en video:

\n

video

\n

Referencias

\n" + "body": "

Intro

\n

El customer journey map, es una herramienta de Design Thinking que permite\nplasmar en un mapa, cada una de las etapas, interacciones, canales y elementos\npor los que atraviesa nuestro cliente desde un punto a otro de nuestro servicio.

\n

Los elementos necesarios para elaborar un buen customer journey map son los\nsiguientes:

\n
    \n
  • Personas
  • \n
  • Línea de tiempo (timeline)
  • \n
  • Emociones que sienten los clientes su experiencia de usuario
  • \n
  • Touchpoints o puntos de contacto
  • \n
  • Momentos
  • \n
  • Interacciones
  • \n
\n

\"Ejemplo

\n

Mira esta forma distinta de mostrar un journey map en video:

\n

\n

Referencias

\n" } } }, @@ -307,7 +307,7 @@ "intl": { "es": { "title": "Storytelling", - "body": "

Intro

\n

Mira este video sobre qué es storytelling (recuerda activar los subtítulos):

\n

intro storytelling pixar

\n

Como dicen en el video todos queremos escuchar historias y todos sabemos contar\nhistorias. ¿No estás segura? Júntate con tus compañeras de mesa y hagan este\nejercicio:

\n

La primera crea una oración que empiece con \"había una vez\". Luego la segunda,\ncomplementa empezando la siguiente oración con \"y todos los días\", y así hasta\nque usen todas las siguientes frases o algunas adicionales que quieran probar:

\n
    \n
  • Habia una vez ...
  • \n
  • Y todos los días ...
  • \n
  • Hasta que un día ...
  • \n
  • Debido a eso ...
  • \n
  • Y debido a eso ...
  • \n
\n

Para terminar utilicen las siguientes frases:

\n
    \n
  • Hasta que finalmente ...
  • \n
  • Y desde ese día ...
  • \n
  • Y el aprendizaje es ...
  • \n
\n

Con este ejercicio te darás cuenta que todos somos buenos para contar historias.\nHemos nacido con esa capacidad y es algo que hacemos todos los días.

\n

Pero, ¿cómo podríamos utilizar esa capacidad que tenemos para enganchar a\nnuestros usuarios y clientes?

\n

Crea una historia

\n

\"La narrativa es como esculpir, donde tienes que ir tallando hasta que revelas\nalgo hermoso.\" Esta es una cita de la clase de narrativa de IDEO.

\n

La idea principal aquí es que para una buena narrativa no tienes que revelar las\npartes más importantes de la historia desde el inicio. Debes generar expectativa\npara lo más importante e ir enganchando a tu audiencia desde el principio.

\n

Algunos consejos de técnicas narrativas que deberían servirles al pensar en cómo\ncontar la historia de lo que han aprendido durante el proyecto:

\n
    \n
  • Abre con un inicio fuerte, una apertura que intrigue a tu público
  • \n
  • Enfócate en una historia real de un usuario con el que hablaste. Puedes llamar\nal usuario por su nombre. Cuáles son sus necesidades?. Cuáles son sus pain\npoints o molestias, desafíos en el proceso?. Por ejemplo: \"Conozcan a\nSandra, una madre soltera, que trabaja largos turnos de mantenimiento en la\nuniversidad y necesita un medio fácil para pagar sus deudas online.\"
  • \n
  • Trata de concentrarte en la audiencia con quién estás hablando y encontrarás\nformas de conectar tus historias con sus desafíos. Esto te ayudará a construir\nempatía si las historias son identificables.
  • \n
  • Trata de hacer todo lo más visual posible. Como se dice, una imagen vale más\nque mil palabras. Imágenes de tus usuarios ayudarán a tu audiencia a entender\nde lo que estás hablando.
  • \n
\n

Algunos consejos adicionales:

\n
    \n
  • Crea expectativa para la parte más importante de la historia - como la cita\nque vimos de IDEO - no cuentes la mejor parte de la historia al inicio.
  • \n
  • Haz recomendaciones y anima a tus stakeholders a tomar acción en base a los\ninsights que has encontrado.
  • \n
  • Apoya tus puntos con data real de las entrevistas con usuarios citas, videos,\nfotos, etc.
  • \n
  • Termina tu historia con una de las partes más importantes: Tu audiencia\ndebería irse con un sentido claro de lo que deben hacer con esta información.
  • \n
\n

“Crear conciencia en las historias se trata de desencadenar reacciones\nemocionales. Alegría 😀, sorpresa 😯, tristeza 😟, ira 😡, miedo 😱,\ndisgusto 😖.”

\n

Una plantilla

\n

Puedes usar esta plantilla para ayudarte a crear la historia que quieres contar

\n

\"plantilla

\n

Otro video sobre Storytelling

\n

video

\n

Referencias

\n

Storytelling Khan Academy

" + "body": "

Intro

\n

Mira este video sobre qué es storytelling (recuerda activar los subtítulos):

\n

\n

Como dicen en el video todos queremos escuchar historias y todos sabemos contar\nhistorias. ¿No estás segura? Júntate con tus compañeras de mesa y hagan este\nejercicio:

\n

La primera crea una oración que empiece con \"había una vez\". Luego la segunda,\ncomplementa empezando la siguiente oración con \"y todos los días\", y así hasta\nque usen todas las siguientes frases o algunas adicionales que quieran probar:

\n
    \n
  • Habia una vez ...
  • \n
  • Y todos los días ...
  • \n
  • Hasta que un día ...
  • \n
  • Debido a eso ...
  • \n
  • Y debido a eso ...
  • \n
\n

Para terminar utilicen las siguientes frases:

\n
    \n
  • Hasta que finalmente ...
  • \n
  • Y desde ese día ...
  • \n
  • Y el aprendizaje es ...
  • \n
\n

Con este ejercicio te darás cuenta que todos somos buenos para contar historias.\nHemos nacido con esa capacidad y es algo que hacemos todos los días.

\n

Pero, ¿cómo podríamos utilizar esa capacidad que tenemos para enganchar a\nnuestros usuarios y clientes?

\n

Crea una historia

\n

\"La narrativa es como esculpir, donde tienes que ir tallando hasta que revelas\nalgo hermoso.\" Esta es una cita de la clase de narrativa de IDEO.

\n

La idea principal aquí es que para una buena narrativa no tienes que revelar las\npartes más importantes de la historia desde el inicio. Debes generar expectativa\npara lo más importante e ir enganchando a tu audiencia desde el principio.

\n

Algunos consejos de técnicas narrativas que deberían servirles al pensar en cómo\ncontar la historia de lo que han aprendido durante el proyecto:

\n
    \n
  • Abre con un inicio fuerte, una apertura que intrigue a tu público
  • \n
  • Enfócate en una historia real de un usuario con el que hablaste. Puedes llamar\nal usuario por su nombre. Cuáles son sus necesidades?. Cuáles son sus pain\npoints o molestias, desafíos en el proceso?. Por ejemplo: \"Conozcan a\nSandra, una madre soltera, que trabaja largos turnos de mantenimiento en la\nuniversidad y necesita un medio fácil para pagar sus deudas online.\"
  • \n
  • Trata de concentrarte en la audiencia con quién estás hablando y encontrarás\nformas de conectar tus historias con sus desafíos. Esto te ayudará a construir\nempatía si las historias son identificables.
  • \n
  • Trata de hacer todo lo más visual posible. Como se dice, una imagen vale más\nque mil palabras. Imágenes de tus usuarios ayudarán a tu audiencia a entender\nde lo que estás hablando.
  • \n
\n

Algunos consejos adicionales:

\n
    \n
  • Crea expectativa para la parte más importante de la historia - como la cita\nque vimos de IDEO - no cuentes la mejor parte de la historia al inicio.
  • \n
  • Haz recomendaciones y anima a tus stakeholders a tomar acción en base a los\ninsights que has encontrado.
  • \n
  • Apoya tus puntos con data real de las entrevistas con usuarios citas, videos,\nfotos, etc.
  • \n
  • Termina tu historia con una de las partes más importantes: Tu audiencia\ndebería irse con un sentido claro de lo que deben hacer con esta información.
  • \n
\n

“Crear conciencia en las historias se trata de desencadenar reacciones\nemocionales. Alegría 😀, sorpresa 😯, tristeza 😟, ira 😡, miedo 😱,\ndisgusto 😖.”

\n

Una plantilla

\n

Puedes usar esta plantilla para ayudarte a crear la historia que quieres contar

\n

\"plantilla

\n

Otro video sobre Storytelling

\n

\n

Referencias

\n

Storytelling Khan Academy

" } } } @@ -330,7 +330,7 @@ "intl": { "es": { "title": "Introducción a los negocios", - "body": "

Intro a los negocios y al mundo digital

\n

Por qué una UXD tiene que saber de Negocios y Tecnología

\n

Te lo explicamos con dos gráficos muy parecidos.

\n

El primero nos dice que un producto digital exitoso es una mezcla de Diseño,\nTecnología y Negocios.

\n

\"succesul

\n

El segundo gráfico del libro AboutFace\nva un poco más allá y nos dice que un producto exitoso tiene que ser deseable\n(diseño), viable (negocios) y posible (tecnología).

\n

\"overall

\n

Un producto no será exitoso si es que tiene pérdidas económicas para una\nempresa. Por otro lado, si un producto no es factible de ser construido por el\nequipo técnico de una empresa, este no verá la luz nunca. Y por último, si una\nempresa construye un producto sin pensar en el usuario, es posible que no sea\nexitoso tampoco.

\n

El libro nos da unos ejemplos adicionales (que están cambiando/actualizándose):

\n
    \n
  • Apple: en sus primeras décadas, se enfocaba solo en la experiencia de sus\nusuarios, sin pensar mucho en el lado de negocio. Finalmente, sobrevivió por\nla lealtad de sus usuarios.
  • \n
  • Microsoft: por muchos años fue una compañía muy enfocada en los negocios. Pero\nno logró hacer que sus productos sean \"deseables\" por los usuarios. Lo que le\ndio pie a otras empresas de abrirse campo en el mercado (como Apple).
  • \n
  • Novell: fue una empresa que se dedicó\nmucho a la tecnología y que sin poder lograr tener un modelo de negocio\nexitoso, terminó cerrando.
  • \n
\n

Es por eso que buscamos que todas las UX Designers de Laboratoria conozcan un\npoco de cada una de estas disciplinas.

\n

De todos modos, como te estarás preguntando, en algunos casos el componente de\ndiseño es mayor, en otros el de tecnología y en otros el de negocio. Como\nmuestra este gráfico (puedes leer más en este artículo):

\n

\"distintos

\n

Aquí un artículo adicional que habla sobre estos 3 aspectos

\n

Antes de empezar a hablar de negocios, hablaremos de las empresas en las que\ntrabajaremos y luego conoceremos un poco más de c/u de sus negocios.

\n

Cuáles son los 4 tipos de empresas en las que trabajaremos

\n

Cómo ya te hemos mencionado en distintas charlas, al salir de Laboratoria\nentrerás a trabajar en alguna organzación de estas categorías:

\n
    \n
  1. Fábrica de Software
  2. \n
  3. Agencia de Marketing (Digital)
  4. \n
  5. Empresa de Transformación Digital
  6. \n
  7. Startup
  8. \n
\n

Qué es una compañía y qué es una startup

\n

Mira este video:

\n

What is a company

\n

5 razones que hacen del mundo digital un gran recurso para la innovación

\n
    \n
  • Velocidad y bajo costo de experimentación
  • \n
  • Disponibilidad y calidad de analytics
  • \n
  • Escalabilidad
  • \n
  • Relación con el cliente
  • \n
  • La facilidad de colaborar con otros
  • \n
\n

Cómo trabajan las startups, empresas o equipos de producto ahora

\n

Los equipos de producto dentro de empresas o algunas startups que siguen viendo\na la startup como una versión pequeña de una compañia están trabajando de esta\nmanera:

\n

Estrategia

\n

Estrategia

\n

Procesos

\n

Procesos

\n

Organización

\n

Organización

\n

Cómo les afecta trabajar de esta manera

\n

Porque toman mucho tiempo y dinero en cosas que es probable no resultan (y sobre\ntodo sin conocer a sus usuarios).

\n

Qué están haciendo las empresas que sí están ganando en digital

\n

Las empresas que están liderando el mundo digital están siguiendo estas 4\nestrategias:

\n

Adoptar la experimentación

\n

En lugar de apostar millones de dólares en soluciones que no llegan a tener\ntracción, los líderes de hoy están apostando por procesos de desarrollo\niterativos, basados en la experimentación.

\n

Puedes ver un video más detallado aquí.

\n

Innovar abiertamente

\n

Líderes de hoy están abiertos a poner en las manos de terceros la capacidad de\ncrear propuestas de valor.

\n

Puedes ver un video más detallado aquí.

\n

Diseñar productos basados en data

\n

Las empresas que ganan en digital tienen la capacidad de convertir data en\nconocimiento y utilizar ese conocimiento para diseñar mejores experiencias e\nimpulsar el negocio.

\n

Puedes ver un video más detallado aquí.

\n

Integrar canales

\n

Las empresas que ganan en digital reconocen que sus usuarios exigen que la\nexperiencia a través de canales sea consistente, integrada y fluida.

\n

Puedes ver un video más detallado aquí.

\n

El factor de la cultura en las empresas actuales

\n

Todas estas estrategias y cambios que ha traido la tecnología a los negocios,\nvienen acompañados también de un cambio en la cultura y organización en las\nempresas. Para eso miremos lo que nos cuentan en Spotify y Facebook sobre eso.

\n

Spotify

\n

Video de la cultura en spotify

\n

Las cosas que se rescatan de este video son:

\n
    \n
  • Los cambios más relevantes suceden cuando hay una cultura que promueve la\nexcelencia y la confianza.
  • \n
  • Tienen procesos para documentar el aprendizaje\n
      \n
    • Retrospectivas (aprender de los errores)
    • \n
    • Improvement boards (tomar acción y corregir)
    • \n
    \n
  • \n
  • Tienen mecanismos para minimizar el riesgo\n
      \n
    • Limited blast radius
    • \n
    • Tener control end-to-end
    • \n
    \n
  • \n
  • Actividades para promover la cultura\n
      \n
    • Training
    • \n
    • Hiring
    • \n
    • Storytelling
    • \n
    • Desarrollar \"role models\"
    • \n
    \n
  • \n
\n

Facebook

\n

Video de Facebook

\n

Las cosas que se rescatan de esta entrevista son:

\n
    \n
  • Las empresas son organismos que aprenden, si NO están aprendiendo\nconstantemente, entonces no están evolucionando y se están quedando atrás.
  • \n
  • Una empresa puede decidir aprender rápido o aprender lento. Si estás sacando a\nproducción un proyecto que demora 1 año, entonces estás aprendiendo una vez al\naño. Si por el contrario, sacas pequeños \"releases\" cada 2 semanas, tu ritmo\nde aprendizaje será constante.
  • \n
  • Se trata de volver al método científico, donde se plantea una hipótesis, se\nrealiza un experimento y se verifica si estabas en lo cierto o no. Y de ello\nproviene nuevamente otra hipótesis.
  • \n
  • Hay más de 10k versiones de facebook a la vez, dado que los ingenieros tienen\nla autoridad de correr sus experimentos cuando a ellos les convenga y medirlos\npara ver si funcionarán o no.
  • \n
" + "body": "

Intro a los negocios y al mundo digital

\n

Por qué una UXD tiene que saber de Negocios y Tecnología

\n

Te lo explicamos con dos gráficos muy parecidos.

\n

El primero nos dice que un producto digital exitoso es una mezcla de Diseño,\nTecnología y Negocios.

\n

\"succesul

\n

El segundo gráfico del libro AboutFace\nva un poco más allá y nos dice que un producto exitoso tiene que ser deseable\n(diseño), viable (negocios) y posible (tecnología).

\n

\"overall

\n

Un producto no será exitoso si es que tiene pérdidas económicas para una\nempresa. Por otro lado, si un producto no es factible de ser construido por el\nequipo técnico de una empresa, este no verá la luz nunca. Y por último, si una\nempresa construye un producto sin pensar en el usuario, es posible que no sea\nexitoso tampoco.

\n

El libro nos da unos ejemplos adicionales (que están cambiando/actualizándose):

\n
    \n
  • Apple: en sus primeras décadas, se enfocaba solo en la experiencia de sus\nusuarios, sin pensar mucho en el lado de negocio. Finalmente, sobrevivió por\nla lealtad de sus usuarios.
  • \n
  • Microsoft: por muchos años fue una compañía muy enfocada en los negocios. Pero\nno logró hacer que sus productos sean \"deseables\" por los usuarios. Lo que le\ndio pie a otras empresas de abrirse campo en el mercado (como Apple).
  • \n
  • Novell: fue una empresa que se dedicó\nmucho a la tecnología y que sin poder lograr tener un modelo de negocio\nexitoso, terminó cerrando.
  • \n
\n

Es por eso que buscamos que todas las UX Designers de Laboratoria conozcan un\npoco de cada una de estas disciplinas.

\n

De todos modos, como te estarás preguntando, en algunos casos el componente de\ndiseño es mayor, en otros el de tecnología y en otros el de negocio. Como\nmuestra este gráfico (puedes leer más en este artículo):

\n

\"distintos

\n

Aquí un artículo adicional que habla sobre estos 3 aspectos

\n

Antes de empezar a hablar de negocios, hablaremos de las empresas en las que\ntrabajaremos y luego conoceremos un poco más de c/u de sus negocios.

\n

Cuáles son los 4 tipos de empresas en las que trabajaremos

\n

Cómo ya te hemos mencionado en distintas charlas, al salir de Laboratoria\nentrerás a trabajar en alguna organzación de estas categorías:

\n
    \n
  1. Fábrica de Software
  2. \n
  3. Agencia de Marketing (Digital)
  4. \n
  5. Empresa de Transformación Digital
  6. \n
  7. Startup
  8. \n
\n

Qué es una compañía y qué es una startup

\n

Mira este video:

\n

\n

5 razones que hacen del mundo digital un gran recurso para la innovación

\n
    \n
  • Velocidad y bajo costo de experimentación
  • \n
  • Disponibilidad y calidad de analytics
  • \n
  • Escalabilidad
  • \n
  • Relación con el cliente
  • \n
  • La facilidad de colaborar con otros
  • \n
\n

Cómo trabajan las startups, empresas o equipos de producto ahora

\n

Los equipos de producto dentro de empresas o algunas startups que siguen viendo\na la startup como una versión pequeña de una compañia están trabajando de esta\nmanera:

\n

Estrategia

\n

\n

Procesos

\n

\n

Organización

\n

\n

Cómo les afecta trabajar de esta manera

\n

Porque toman mucho tiempo y dinero en cosas que es probable no resultan (y sobre\ntodo sin conocer a sus usuarios).

\n

Qué están haciendo las empresas que sí están ganando en digital

\n

Las empresas que están liderando el mundo digital están siguiendo estas 4\nestrategias:

\n

Adoptar la experimentación

\n

En lugar de apostar millones de dólares en soluciones que no llegan a tener\ntracción, los líderes de hoy están apostando por procesos de desarrollo\niterativos, basados en la experimentación.

\n

Puedes ver un video más detallado aquí.

\n

Innovar abiertamente

\n

Líderes de hoy están abiertos a poner en las manos de terceros la capacidad de\ncrear propuestas de valor.

\n

Puedes ver un video más detallado aquí.

\n

Diseñar productos basados en data

\n

Las empresas que ganan en digital tienen la capacidad de convertir data en\nconocimiento y utilizar ese conocimiento para diseñar mejores experiencias e\nimpulsar el negocio.

\n

Puedes ver un video más detallado aquí.

\n

Integrar canales

\n

Las empresas que ganan en digital reconocen que sus usuarios exigen que la\nexperiencia a través de canales sea consistente, integrada y fluida.

\n

Puedes ver un video más detallado aquí.

\n

El factor de la cultura en las empresas actuales

\n

Todas estas estrategias y cambios que ha traido la tecnología a los negocios,\nvienen acompañados también de un cambio en la cultura y organización en las\nempresas. Para eso miremos lo que nos cuentan en Spotify y Facebook sobre eso.

\n

Spotify

\n

\n

Las cosas que se rescatan de este video son:

\n
    \n
  • Los cambios más relevantes suceden cuando hay una cultura que promueve la\nexcelencia y la confianza.
  • \n
  • Tienen procesos para documentar el aprendizaje\n
      \n
    • Retrospectivas (aprender de los errores)
    • \n
    • Improvement boards (tomar acción y corregir)
    • \n
    \n
  • \n
  • Tienen mecanismos para minimizar el riesgo\n
      \n
    • Limited blast radius
    • \n
    • Tener control end-to-end
    • \n
    \n
  • \n
  • Actividades para promover la cultura\n
      \n
    • Training
    • \n
    • Hiring
    • \n
    • Storytelling
    • \n
    • Desarrollar \"role models\"
    • \n
    \n
  • \n
\n

Facebook

\n

\n

Las cosas que se rescatan de esta entrevista son:

\n
    \n
  • Las empresas son organismos que aprenden, si NO están aprendiendo\nconstantemente, entonces no están evolucionando y se están quedando atrás.
  • \n
  • Una empresa puede decidir aprender rápido o aprender lento. Si estás sacando a\nproducción un proyecto que demora 1 año, entonces estás aprendiendo una vez al\naño. Si por el contrario, sacas pequeños \"releases\" cada 2 semanas, tu ritmo\nde aprendizaje será constante.
  • \n
  • Se trata de volver al método científico, donde se plantea una hipótesis, se\nrealiza un experimento y se verifica si estabas en lo cierto o no. Y de ello\nproviene nuevamente otra hipótesis.
  • \n
  • Hay más de 10k versiones de facebook a la vez, dado que los ingenieros tienen\nla autoridad de correr sus experimentos cuando a ellos les convenga y medirlos\npara ver si funcionarán o no.
  • \n
" } } }, @@ -342,7 +342,7 @@ "intl": { "es": { "title": "Modelo de Negocios", - "body": "

Intro a Modelos de Negocios

\n

El primer paso para entender a los que serán nuestros clientes como Diseñadoras\nUX es entender porqué las empresas existen. Todas empresas existen con un fin,\nun fin que tiene que ver con el negocio que hay detrás, el objetivo que hay\ndetrás de lo que quieren que haga el usuario final, y que les supone un\nbeneficio y suele estar asociado con sus ganancias monetarias.

\n

Sin un modelo de negocio, o si éste no está bien resuelto, no tendrían\nganancias, y sin ganancias tendrían que cerrar sus puertas. Lo mismo ha pasado\ncon las empresas que no han sabido adaptar su modelo de negocio a los nuevos\ntiempos (por ejemplo BlockBuster, o Kodak).

\n

Qué es un modelo de negocios

\n

Es cómo una empresa crea valor para sí misma mientras entrega productos o\nservicios para sus clientes.

\n

Saber y entender la existencia de Modelos de negocios, te van a ayudar a abrir\ntu mente a muchas formas de ver o plantear una idea y no sólo eso, sino llevarla\na cabo y entender todos los factores relacionados para ello.

\n

Y al momento de trabajar para una empresa, esto te va a ayudar a entender para\nquién trabajas, dónde estás parada y hacia donde debes ir. Pero no sólo eso,\nsino entender si lo que estás proponiendo es factible.

\n

La intención de entender el contexto de la empresas y sus objetivos de negocio\nes para estar en sincronía con la empresa y así, lo que se quiera hacer o\nproponer esté alineado con sus objetivos, canales, partners, actividades, etc.

\n

Algunas empresas y startups usan una herramienta llamada Business Model Canvas.

\n

Business Model Canvas

\n

El BMC es una herramientas con la cual vamos a contextualizar nuestra propuesta\nde valor y ver la “big picture”. Nos va a llevar a un entendimiento más completo\nde todos los factores que intervienen en el negocio de la empresa.

\n

\"BMC\"

\n

Está dividido en secciones específicas, las cuales te van a orientar a que\naterrices una serie de elementos importantes a considerar como: propuesta de\nvalor, relaciones con los clientes, segmentos de los clientes, canales de\ndistribución, actividades clave, recursos clave, socios clave, estructura de\ncostos y flujos de ingresos o ganancias.

\n

Te recomiendo ver los siguientes videos enlazados para entender de manera visual\nlo anterior, así como podrás ver algunas aplicaciones.

\n

Videos para profundizar o ejemplificar:\nEjemplo 1 -\nEjemplo 2

\n

Mira estos ejemplos:\nNetflix -\nSpotify -\nDisney

\n

¿Satisface una necesidad o la genera?

\n

Es interesante analizar y tener en mente si lo que vamos a diseñar es un\nproducto que satisface o genera una necesidad, esto nos da una perspectiva\nclara de hacia dónde debe ir orientado nuestro mensaje.

\n

\"necesidad

\n

Scope canvas

\n

Como UX Designers, necesitamos entender el modelo de negocio de la empresa en\ngeneral y específicamente entender los objetivos y metas del área que nos\ncontrata y del proyecto que quieren que hagamos: cómo lo ligamos a las\nnecesidades de los usuarios y las métricas del proyecto que tenemos entre manos.

\n

El Scope Canvas está inspirado en el BMC con el objetivo de conectar las\nnecesidades de los usuarios con los objetivos de negocio de la organización.

\n

El Scope Canvas, como tal, es una manera visual de ordenar los conceptos\nbásicos. Nos ayuda a tener siempre en mente y presentes las motivaciones,\nnecesidades, objetivos y dolores del usuario a la hora de aterrizar el proyecto\nUX.

\n

\"scope

\n

Te recomiendo ver el siguiente link donde podrás saber de primera fuente acerca\ndel SC - scope canvas

\n

Recuerda que la práctica hace a la maestra, ahora tienes estas herramientas con\nlas que puedes comenzar y practicar para ver desde el mundo de las empresas.

" + "body": "

Intro a Modelos de Negocios

\n

El primer paso para entender a los que serán nuestros clientes como Diseñadoras\nUX es entender porqué las empresas existen. Todas empresas existen con un fin,\nun fin que tiene que ver con el negocio que hay detrás, el objetivo que hay\ndetrás de lo que quieren que haga el usuario final, y que les supone un\nbeneficio y suele estar asociado con sus ganancias monetarias.

\n

Sin un modelo de negocio, o si éste no está bien resuelto, no tendrían\nganancias, y sin ganancias tendrían que cerrar sus puertas. Lo mismo ha pasado\ncon las empresas que no han sabido adaptar su modelo de negocio a los nuevos\ntiempos (por ejemplo BlockBuster, o Kodak).

\n

Qué es un modelo de negocios

\n

Es cómo una empresa crea valor para sí misma mientras entrega productos o\nservicios para sus clientes.

\n

Saber y entender la existencia de Modelos de negocios, te van a ayudar a abrir\ntu mente a muchas formas de ver o plantear una idea y no sólo eso, sino llevarla\na cabo y entender todos los factores relacionados para ello.

\n

Y al momento de trabajar para una empresa, esto te va a ayudar a entender para\nquién trabajas, dónde estás parada y hacia donde debes ir. Pero no sólo eso,\nsino entender si lo que estás proponiendo es factible.

\n

La intención de entender el contexto de la empresas y sus objetivos de negocio\nes para estar en sincronía con la empresa y así, lo que se quiera hacer o\nproponer esté alineado con sus objetivos, canales, partners, actividades, etc.

\n

Algunas empresas y startups usan una herramienta llamada Business Model Canvas.

\n

Business Model Canvas

\n

El BMC es una herramientas con la cual vamos a contextualizar nuestra propuesta\nde valor y ver la “big picture”. Nos va a llevar a un entendimiento más completo\nde todos los factores que intervienen en el negocio de la empresa.

\n

\"BMC\"

\n

Está dividido en secciones específicas, las cuales te van a orientar a que\naterrices una serie de elementos importantes a considerar como: propuesta de\nvalor, relaciones con los clientes, segmentos de los clientes, canales de\ndistribución, actividades clave, recursos clave, socios clave, estructura de\ncostos y flujos de ingresos o ganancias.

\n

Te recomiendo ver los siguientes videos enlazados para entender de manera visual\nlo anterior, así como podrás ver algunas aplicaciones.

\n

Videos para profundizar o ejemplificar:\n -\n

\n

Mira estos ejemplos:\n -\n -\n

\n

¿Satisface una necesidad o la genera?

\n

Es interesante analizar y tener en mente si lo que vamos a diseñar es un\nproducto que satisface o genera una necesidad, esto nos da una perspectiva\nclara de hacia dónde debe ir orientado nuestro mensaje.

\n

\"necesidad

\n

Scope canvas

\n

Como UX Designers, necesitamos entender el modelo de negocio de la empresa en\ngeneral y específicamente entender los objetivos y metas del área que nos\ncontrata y del proyecto que quieren que hagamos: cómo lo ligamos a las\nnecesidades de los usuarios y las métricas del proyecto que tenemos entre manos.

\n

El Scope Canvas está inspirado en el BMC con el objetivo de conectar las\nnecesidades de los usuarios con los objetivos de negocio de la organización.

\n

El Scope Canvas, como tal, es una manera visual de ordenar los conceptos\nbásicos. Nos ayuda a tener siempre en mente y presentes las motivaciones,\nnecesidades, objetivos y dolores del usuario a la hora de aterrizar el proyecto\nUX.

\n

\"scope

\n

Te recomiendo ver el siguiente link donde podrás saber de primera fuente acerca\ndel SC - scope canvas

\n

Recuerda que la práctica hace a la maestra, ahora tienes estas herramientas con\nlas que puedes comenzar y practicar para ver desde el mundo de las empresas.

" } } }, diff --git a/package.json b/package.json index 668dd6bad..025d421cc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "bootcamp", - "version": "6.2.0", + "version": "6.3.0", "description": "Proyectos y tópicos del Bootcamp de @Laboratoria", "repository": "Laboratoria/bootcamp", "keywords": [