Merge pull request #5058 from FreeCodeCamp/feature/hikes
Add super blocks and challenge placeholders
This commit is contained in:
@ -1,5 +1,5 @@
|
||||
import React, { PropTypes } from 'react';
|
||||
import { Spring } from 'react-motion';
|
||||
import { Motion } from 'react-motion';
|
||||
import { History, Lifecycle } from 'react-router';
|
||||
import debugFactory from 'debug';
|
||||
import {
|
||||
@ -215,7 +215,8 @@ export default React.createClass({
|
||||
},
|
||||
|
||||
renderQuestion(number, question, answer, shake) {
|
||||
return ({ val: { x } }) => {
|
||||
return ({ x: xFunc }) => {
|
||||
const x = xFunc().val.x;
|
||||
const style = {
|
||||
WebkitTransform: `translate3d(${ x }px, 0, 0)`,
|
||||
transform: `translate3d(${ x }px, 0, 0)`
|
||||
@ -252,9 +253,9 @@ export default React.createClass({
|
||||
xs={ 8 }
|
||||
xsOffset={ 2 }>
|
||||
<Row>
|
||||
<Spring endValue={ this.getTweenValues }>
|
||||
<Motion style={{ x: this.getTweenValues }}>
|
||||
{ this.renderQuestion(number, question, answer, shake) }
|
||||
</Spring>
|
||||
</Motion>
|
||||
{ this.renderInfo(showInfo, info) }
|
||||
<Panel>
|
||||
<Button
|
||||
|
@ -29,9 +29,25 @@
|
||||
"suborder": {
|
||||
"type": "number"
|
||||
},
|
||||
"isBeta": {
|
||||
"type": "boolean",
|
||||
"description": "Show only during dev or on beta site. Completely omitted otherwise"
|
||||
},
|
||||
"isComingSoon": {
|
||||
"type": "boolean",
|
||||
"description": "Challenge shows in production, but is unreachable and disabled. Is reachable in beta/dev only if isBeta flag is set"
|
||||
},
|
||||
"dashedName": {
|
||||
"type": "string"
|
||||
},
|
||||
"superBlock": {
|
||||
"type": "string",
|
||||
"description": "Used for ordering challenge blocks in map"
|
||||
},
|
||||
"superOrder": {
|
||||
"type": "number",
|
||||
"description": "Used to determine super block order, set by prepending two digit number to super block folder name"
|
||||
},
|
||||
"block": {
|
||||
"type": "string"
|
||||
},
|
||||
|
@ -123,6 +123,11 @@
|
||||
"defaut": false,
|
||||
"description": "Camper is front end certified"
|
||||
},
|
||||
"isBackEndCert": {
|
||||
"type": "boolean",
|
||||
"default": false,
|
||||
"description": "Campers is back end certified"
|
||||
},
|
||||
"isFullStackCert": {
|
||||
"type": "boolean",
|
||||
"default": false,
|
||||
|
@ -13,7 +13,7 @@
|
||||
"prestart-production": "bower cache clean && bower install && gulp build -p",
|
||||
"start-production": "node pm2Start",
|
||||
"lint": "npm run lint-js && npm run lint-json",
|
||||
"lint-challenges": "jsonlint -q seed/challenges/*.json",
|
||||
"lint-challenges": "jsonlint -q seed/challenges/**/*.json",
|
||||
"lint-nonprofits": "jsonlint -q seed/nonprofits.json",
|
||||
"lint-server": "jsonlint -q server/*.json",
|
||||
"lint-resources": "jsonlint -q server/resources/*.json",
|
||||
|
@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "Get Started with Free Code Camp",
|
||||
"name": "Getting Started",
|
||||
"order": 1,
|
||||
"time": "10m",
|
||||
"time": "15m",
|
||||
"challenges": [
|
||||
{
|
||||
"id": "560add10cb82ac38a17513be",
|
29
seed/challenges/02-data-visualization-certification/d3.json
Normal file
29
seed/challenges/02-data-visualization-certification/d3.json
Normal file
@ -0,0 +1,29 @@
|
||||
{
|
||||
"name": "D3",
|
||||
"order": 16,
|
||||
"isComingSoon": true,
|
||||
"time": "5h",
|
||||
"challenges": [
|
||||
{
|
||||
"id": "bd7158d8c423ede2aab5bdee",
|
||||
"title": "Learn D3 Challenges",
|
||||
"challengeSeed": [],
|
||||
"description": [
|
||||
],
|
||||
"type": "waypoint",
|
||||
"challengeType": 3,
|
||||
"tests": [],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "Crea una aplicación de votaciones",
|
||||
"descriptionEs": [
|
||||
],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
}
|
||||
]
|
||||
}
|
@ -0,0 +1,83 @@
|
||||
{
|
||||
"name": "Claim Your Data Visualization Certificate",
|
||||
"isComingSoon": true,
|
||||
"order": 18,
|
||||
"time": "5m",
|
||||
"challenges": [
|
||||
{
|
||||
"id": "561add10cb82ac38a17513b3",
|
||||
"title": "Claim Your Data Visualization Certificate",
|
||||
"challengeSeed": [
|
||||
{
|
||||
"properties": ["isHonest", "isDataVisualizationCert"],
|
||||
"apis": ["/certificate/honest", "/certificate/verify/data-visualization"],
|
||||
"stepIndex": [1, 2]
|
||||
}
|
||||
],
|
||||
"description": [
|
||||
[
|
||||
"http://i.imgur.com/syJxavV.jpg",
|
||||
"An image of our Front End Development Certificate",
|
||||
"This challenge will give you your verified Front End Development Certificate. Before we issue your certificate, we must verify that you have completed all of our basic and intermediate Bonfires, and all our basic and intermediate Ziplines. You must also accept our Academic Honesty Pledge. Click the button below to start this process.",
|
||||
""
|
||||
],
|
||||
[
|
||||
"http://i.imgur.com/HArFfMN.jpg",
|
||||
"The definition of plagiarism: Plagiarism (noun) - copying someone else’s work and presenting it as your own without crediting them",
|
||||
"By clicking below, you pledge that all of your submitted code A) is code you or your pair personally wrote, or B) comes from open source libraries like jQuery, or C) has been clearly attributed to its original authors. You also give us permission to audit your challenge solutions and revoke your certificate if we discover evidence of plagiarism.",
|
||||
"#"
|
||||
],
|
||||
[
|
||||
"http://i.imgur.com/14F2Van.jpg",
|
||||
"An image of the text \"Front End Development Certificate requirements\"",
|
||||
"Let's confirm that you have completed all of our basic and intermediate Bonfires, and all our basic and intermediate Ziplines. Click the button below to verify this.",
|
||||
"#"
|
||||
],
|
||||
[
|
||||
"http://i.imgur.com/16SIhHO.jpg",
|
||||
"An image of the word \"Congratulations\"",
|
||||
"Congratulations! We've added your Front End Development Certificate to your certificate to your portfolio page. Unless you choose to hide your solutions, this certificate will remain publicly visible and verifiable.",
|
||||
""
|
||||
]
|
||||
],
|
||||
"type": "Waypoint",
|
||||
"challengeType": 7,
|
||||
"tests": [],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "Reclama tu certificado de desarrollo Front End",
|
||||
"descriptionEs": [
|
||||
[
|
||||
"http://i.imgur.com/syJxavV.jpg",
|
||||
"Una imagen que muestra nuestro certificado de desarrollo Front End",
|
||||
"Este desafío te otorga tu certificado autenticado de desarrollo Front End. Antes de que podamos emitir tu certificado, debemos verificar que has completado todos los Bonfires básicos e intermedios, y todos los Ziplines básicos e intermedios. También debes aceptar nuestro Juramento de honestidad académica. Pulsa el botón siguiente para iniciar este proceso.",
|
||||
""
|
||||
],
|
||||
[
|
||||
"http://i.imgur.com/HArFfMN.jpg",
|
||||
"Plagio (nombre): acción y efecto de plagiar. Plagiar (verbo) - copiar en lo sustancial obras ajenas, dándolas como propias.",
|
||||
"Al pulsar el botón siguiente, juras que todo el código en tus soluciones a los desafíos A) es código que tú o tu compañero escribieron personalmente, o B) proviene de librerías de código abierto como jQuery, o C) ha sido claramente atribuido a sus autores originales. También nos otorgas el permiso para auditar tus soluciones a los desafíos y revocar tu certificado si encontramos evidencia de plagio.",
|
||||
"#"
|
||||
],
|
||||
[
|
||||
"http://i.imgur.com/14F2Van.jpg",
|
||||
"Una imagen del texto \"Front End Development Certificate requirements\"",
|
||||
"Confirmemos que has completado todos nuestros Bonfires básicos e intermedios, y todos nuestros Ziplines básicos e intermedios. Pulsa el botón siguiente para hacer la verificación.",
|
||||
"#"
|
||||
],
|
||||
[
|
||||
"http://i.imgur.com/16SIhHO.jpg",
|
||||
"Una imagen de la palabra \"Congratulations\"",
|
||||
"¡Felicitaciones! Hemos agregado tu Certificado de desarrollo Front End a tu portafolio. A menos que elijas no mostrar tus soluciones, este certificado será públicamente visible y verificable.",
|
||||
""
|
||||
]
|
||||
],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
}
|
||||
]
|
||||
}
|
@ -0,0 +1,113 @@
|
||||
{
|
||||
"name": "Data Visualization Projects",
|
||||
"order": 17,
|
||||
"isComingSoon": true,
|
||||
"time": "200h",
|
||||
"challenges": [
|
||||
{
|
||||
"id": "bd7158d8c443ede2aeb5bdef",
|
||||
"title": "Data Visualization Project 1",
|
||||
"challengeSeed": [],
|
||||
"description": [
|
||||
],
|
||||
"type": "zipline",
|
||||
"challengeType": 3,
|
||||
"tests": [],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "Crea una aplicación de votaciones",
|
||||
"descriptionEs": [
|
||||
],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
},
|
||||
{
|
||||
"id": "bd7158d8c443ede2aeb5bdff",
|
||||
"title": "Data Visualization Project 2",
|
||||
"challengeSeed": [],
|
||||
"description": [
|
||||
],
|
||||
"type": "zipline",
|
||||
"challengeType": 3,
|
||||
"tests": [],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "Crea una aplicación de coordinación de vida nocturna",
|
||||
"descriptionEs": [
|
||||
],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
},
|
||||
{
|
||||
"id": "bd7158d8c443ede2aeb5bd0e",
|
||||
"title": "Data Visualization Project 3",
|
||||
"challengeSeed": [],
|
||||
"description": [
|
||||
],
|
||||
"type": "zipline",
|
||||
"challengeType": 3,
|
||||
"tests": [],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "Grafica el mercado de acciones",
|
||||
"descriptionEs": [
|
||||
],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
},
|
||||
{
|
||||
"id": "bd7158d8c443ede2aeb5bd0f",
|
||||
"title": "Data Visualization Project 4",
|
||||
"challengeSeed": [],
|
||||
"description": [
|
||||
],
|
||||
"type": "zipline",
|
||||
"challengeType": 3,
|
||||
"tests": [],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "Administra un club de intercambio de libros",
|
||||
"descriptionEs": [
|
||||
],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
},
|
||||
{
|
||||
"id": "bd7158d8c443ede2aeb5bdee",
|
||||
"title": "Data Visualization Project 5",
|
||||
"challengeSeed": ["133315784"],
|
||||
"description": [
|
||||
],
|
||||
"type": "zipline",
|
||||
"challengeType": 3,
|
||||
"tests": [],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "Crea un clon de Pinterest",
|
||||
"descriptionEs": [
|
||||
],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
}
|
||||
]
|
||||
}
|
@ -0,0 +1,113 @@
|
||||
{
|
||||
"name": "React Projects",
|
||||
"order": 15,
|
||||
"isComingSoon": true,
|
||||
"time": "200h",
|
||||
"challenges": [
|
||||
{
|
||||
"id": "bd7158d8c443ede1aeb5bdef",
|
||||
"title": "React Project 1",
|
||||
"challengeSeed": [],
|
||||
"description": [
|
||||
],
|
||||
"type": "zipline",
|
||||
"challengeType": 3,
|
||||
"tests": [],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "Crea una aplicación de votaciones",
|
||||
"descriptionEs": [
|
||||
],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
},
|
||||
{
|
||||
"id": "bd7158d8c443ede1aeb5bdff",
|
||||
"title": "React Project 2",
|
||||
"challengeSeed": [],
|
||||
"description": [
|
||||
],
|
||||
"type": "zipline",
|
||||
"challengeType": 3,
|
||||
"tests": [],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "Crea una aplicación de coordinación de vida nocturna",
|
||||
"descriptionEs": [
|
||||
],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
},
|
||||
{
|
||||
"id": "bd7158d8c443ede1aeb5bd0e",
|
||||
"title": "React Project 3",
|
||||
"challengeSeed": [],
|
||||
"description": [
|
||||
],
|
||||
"type": "zipline",
|
||||
"challengeType": 3,
|
||||
"tests": [],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "Grafica el mercado de acciones",
|
||||
"descriptionEs": [
|
||||
],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
},
|
||||
{
|
||||
"id": "bd7158d8c443ede1aeb5bd0f",
|
||||
"title": "React Project 4",
|
||||
"challengeSeed": [],
|
||||
"description": [
|
||||
],
|
||||
"type": "zipline",
|
||||
"challengeType": 3,
|
||||
"tests": [],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "Administra un club de intercambio de libros",
|
||||
"descriptionEs": [
|
||||
],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
},
|
||||
{
|
||||
"id": "bd7158d8c443ede1aeb5bdee",
|
||||
"title": "React Project 5",
|
||||
"challengeSeed": ["133315784"],
|
||||
"description": [
|
||||
],
|
||||
"type": "zipline",
|
||||
"challengeType": 3,
|
||||
"tests": [],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "Crea un clon de Pinterest",
|
||||
"descriptionEs": [
|
||||
],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
}
|
||||
]
|
||||
}
|
@ -0,0 +1,29 @@
|
||||
{
|
||||
"name": "React",
|
||||
"order": 14,
|
||||
"isComingSoon": true,
|
||||
"time": "5h",
|
||||
"challenges": [
|
||||
{
|
||||
"id": "bd7158d8c423ede3aeb5bdee",
|
||||
"title": "Learn React Challenges",
|
||||
"challengeSeed": [],
|
||||
"description": [
|
||||
],
|
||||
"type": "waypoint",
|
||||
"challengeType": 3,
|
||||
"tests": [],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "Crea una aplicación de votaciones",
|
||||
"descriptionEs": [
|
||||
],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
}
|
||||
]
|
||||
}
|
@ -0,0 +1,29 @@
|
||||
{
|
||||
"name": "SASS",
|
||||
"order": 13,
|
||||
"isComingSoon": true,
|
||||
"time": "5h",
|
||||
"challenges": [
|
||||
{
|
||||
"id": "bd7158d8c423ede2aeb5bdee",
|
||||
"title": "Learn SASS Challenges",
|
||||
"challengeSeed": [],
|
||||
"description": [
|
||||
],
|
||||
"type": "waypoint",
|
||||
"challengeType": 3,
|
||||
"tests": [],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "Crea una aplicación de votaciones",
|
||||
"descriptionEs": [
|
||||
],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
}
|
||||
]
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Advanced Algorithm Scripting",
|
||||
"order": 15,
|
||||
"order": 21,
|
||||
"time": "50h",
|
||||
"challenges": [
|
||||
{
|
@ -0,0 +1,113 @@
|
||||
{
|
||||
"name": "API Projects",
|
||||
"order": 26,
|
||||
"isComingSoon": true,
|
||||
"time": "100h",
|
||||
"challenges": [
|
||||
{
|
||||
"id": "bd7158d8c443edefaeb5bdef",
|
||||
"title": "API Project 1",
|
||||
"challengeSeed": [],
|
||||
"description": [
|
||||
],
|
||||
"type": "basejump",
|
||||
"challengeType": 4,
|
||||
"tests": [],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "Crea una aplicación de votaciones",
|
||||
"descriptionEs": [
|
||||
],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
},
|
||||
{
|
||||
"id": "bd7158d8c443edefaeb5bdff",
|
||||
"title": "API Project 2",
|
||||
"challengeSeed": [],
|
||||
"description": [
|
||||
],
|
||||
"type": "basejump",
|
||||
"challengeType": 4,
|
||||
"tests": [],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "Crea una aplicación de coordinación de vida nocturna",
|
||||
"descriptionEs": [
|
||||
],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
},
|
||||
{
|
||||
"id": "bd7158d8c443edefaeb5bd0e",
|
||||
"title": "API Project 3",
|
||||
"challengeSeed": [],
|
||||
"description": [
|
||||
],
|
||||
"type": "basejump",
|
||||
"challengeType": 4,
|
||||
"tests": [],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "Grafica el mercado de acciones",
|
||||
"descriptionEs": [
|
||||
],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
},
|
||||
{
|
||||
"id": "bd7158d8c443edefaeb5bd0f",
|
||||
"title": "API Project 4",
|
||||
"challengeSeed": [],
|
||||
"description": [
|
||||
],
|
||||
"type": "basejump",
|
||||
"challengeType": 4,
|
||||
"tests": [],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "Administra un club de intercambio de libros",
|
||||
"descriptionEs": [
|
||||
],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
},
|
||||
{
|
||||
"id": "bd7158d8c443edefaeb5bdee",
|
||||
"title": "API Project 5",
|
||||
"challengeSeed": ["133315784"],
|
||||
"description": [
|
||||
],
|
||||
"type": "basejump",
|
||||
"challengeType": 4,
|
||||
"tests": [],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "Crea un clon de Pinterest",
|
||||
"descriptionEs": [
|
||||
],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
}
|
||||
]
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Automated Testing and Debugging",
|
||||
"order": 14,
|
||||
"order": 20,
|
||||
"time": "15m",
|
||||
"challenges": [
|
||||
{
|
@ -1,23 +1,23 @@
|
||||
{
|
||||
"name": "Claim Your Full Stack Development Certificate",
|
||||
"order": 21,
|
||||
"name": "Claim Your Back End Development Certificate",
|
||||
"order": 29,
|
||||
"time": "5m",
|
||||
"challenges": [
|
||||
{
|
||||
"id": "660add10cb82ac38a17513be",
|
||||
"title": "Claim Your Full Stack Development Certificate",
|
||||
"title": "Claim Your Back End Development Certificate",
|
||||
"challengeSeed": [
|
||||
{
|
||||
"properties": ["isHonest", "isFullStackCert"],
|
||||
"apis": ["/certificate/honest", "/certificate/verify/full-stack"],
|
||||
"properties": ["isHonest", "isBackEndCert"],
|
||||
"apis": ["/certificate/honest", "/certificate/verify/back-end"],
|
||||
"stepIndex": [1, 2]
|
||||
}
|
||||
],
|
||||
"description": [
|
||||
[
|
||||
"http://i.imgur.com/sKYQhdG.jpg",
|
||||
"An image of our Full Stack Development Certificate",
|
||||
"This challenge will give you your verified Full Stack Development Certificate. Before we issue your certificate, we must verify that you have completed all of Bonfires, Ziplines and Basejumps. You must also accept our Academic Honesty Pledge. Click the button below to start this process.",
|
||||
"An image of our Back End Development Certificate",
|
||||
"This challenge will give you your verified Back End Development Certificate. Before we issue your certificate, we must verify that you have completed all of Bonfires, Ziplines and Basejumps. You must also accept our Academic Honesty Pledge. Click the button below to start this process.",
|
||||
""
|
||||
],
|
||||
[
|
||||
@ -28,7 +28,7 @@
|
||||
],
|
||||
[
|
||||
"http://i.imgur.com/2qn7tHp.jpg",
|
||||
"An image of the text \"Full Stack Development Certificate requirements\"",
|
||||
"An image of the text \"Back End Development Certificate requirements\"",
|
||||
"Let's confirm that you have completed all of our Bonfires, Ziplines and Basejumps. Click the button below to verify this.",
|
||||
"#"
|
||||
],
|
@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "Full Stack JavaScript Projects",
|
||||
"order": 20,
|
||||
"time": "300h",
|
||||
"name": "Dynamic Web Applications",
|
||||
"order": 27,
|
||||
"time": "200h",
|
||||
"challenges": [
|
||||
{
|
||||
"id": "bd7158d8c443eddfaeb5bcef",
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Git",
|
||||
"order" : 17,
|
||||
"order" : 24,
|
||||
"time": "3h",
|
||||
"challenges": [
|
||||
{
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "MongoDB",
|
||||
"order" : 19,
|
||||
"order" : 25,
|
||||
"time": "3h",
|
||||
"challenges": [
|
||||
{
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Node.js and Express.js",
|
||||
"order" : 18,
|
||||
"order" : 24,
|
||||
"time": "20h",
|
||||
"challenges": [
|
||||
{
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Upper Intermediate Algorithm Scripting",
|
||||
"order": 13,
|
||||
"order": 19,
|
||||
"time": "50h",
|
||||
"challenges": [
|
||||
{
|
@ -1,165 +0,0 @@
|
||||
{
|
||||
"name": "AngularJS",
|
||||
"order": 16,
|
||||
"time": "5h",
|
||||
"challenges": [
|
||||
{
|
||||
"id": "bd7154d8c441eddfaeb5bdef",
|
||||
"title": "Get Started with Angular.js",
|
||||
"challengeSeed": ["114684726"],
|
||||
"description": [
|
||||
"Code School has a short, free Angular.js course. This will give us a quick tour of Angular.js's mechanics and features.",
|
||||
"In this course, we'll build a virtual shop entirely in Angular.js.",
|
||||
"Go to <a href='http://campus.codeschool.com/courses/shaping-up-with-angular-js/level/1/section/1/video/1' target='_blank'>http://campus.codeschool.com/courses/shaping-up-with-angular-js/level/1/section/1/video/1</a> and complete the section."
|
||||
],
|
||||
"type": "waypoint",
|
||||
"challengeType": 2,
|
||||
"tests": [
|
||||
"assert(true, 'No test needed');"
|
||||
],
|
||||
"solutions": [
|
||||
"/* no test needed */"
|
||||
],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "Aprendamos a usar Angular.js",
|
||||
"descriptionEs": [
|
||||
"Code School tiene un curso corto gratuito sobre Angular.js. Este curso nos dará un vistazo a las características y la mecánica de Angular.js.",
|
||||
"En este curso crearemos una pequeña tienda virtual completamente en Angular.js.",
|
||||
"Ve a <a href='http://campus.codeschool.com/courses/shaping-up-with-angular-js/level/1/section/1/video/1' target='_blank'>http://campus.codeschool.com/courses/shaping-up-with-angular-js/level/1/section/1/video/1</a> y completa esa sección."
|
||||
],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
},
|
||||
{
|
||||
"id": "bd7155d8c441eddfaeb5bdef",
|
||||
"title": "Apply Angular.js Directives",
|
||||
"challengeSeed": ["114684727"],
|
||||
"description": [
|
||||
"Directives serve as markers in your HTML. When Angular.js compiles your HTML, it will alter the behavior of DOM elements based on the directives you've used.",
|
||||
"Let's learn how these powerful directives work, and how to use them to make your web apps more dynamic",
|
||||
"Go to <a href='http://campus.codeschool.com/courses/shaping-up-with-angular-js/level/2/section/1/video/1' target='_blank'>http://campus.codeschool.com/courses/shaping-up-with-angular-js/level/2/section/1/video/1</a> and complete the section."
|
||||
],
|
||||
"type": "waypoint",
|
||||
"challengeType": 2,
|
||||
"tests": [
|
||||
"assert(true, 'No test needed');"
|
||||
],
|
||||
"solutions": [
|
||||
"/* no test needed */"
|
||||
],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "Aplica directivas en Angular.js",
|
||||
"descriptionEs": [
|
||||
"Las directivas sirven como marcadores en tu HTML. Cuando Angular.js compila tu código HTML, también altera el comportamiento de los elementos del DOM basándose en las directivas que usaste.",
|
||||
"Aprendamos a utilizar el poder de estas directivas, y cómo emplearlas para hacer tus apps más dinámicas.",
|
||||
"Ve a <a href='http://campus.codeschool.com/courses/shaping-up-with-angular-js/level/2/section/1/video/1' target='_blank'>http://campus.codeschool.com/courses/shaping-up-with-angular-js/level/2/section/1/video/1</a> y completa esa sección."
|
||||
],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
},
|
||||
{
|
||||
"id": "bd7156d8c441eddfaeb5bdef",
|
||||
"title": "Power Forms with Angular.js",
|
||||
"challengeSeed": ["114684729"],
|
||||
"description": [
|
||||
"One area where Angular.js really shines is its powerful web forms.",
|
||||
"Learn how to create reactive Angular.js forms, including real-time form validation.",
|
||||
"Go to <a href='http://campus.codeschool.com/courses/shaping-up-with-angular-js/level/3/section/1/video/1' target='_blank'>http://campus.codeschool.com/courses/shaping-up-with-angular-js/level/3/section/1/video/1</a> and complete the section."
|
||||
],
|
||||
"type": "waypoint",
|
||||
"challengeType": 2,
|
||||
"tests": [
|
||||
"assert(true, 'No test needed');"
|
||||
],
|
||||
"solutions": [
|
||||
"/* no test needed */"
|
||||
],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "Formularios con Angular.js",
|
||||
"descriptionEs": [
|
||||
"Un área donde Angular.js muestra su verdadero poder es en sus formularios web.",
|
||||
"Aprendamos ahora a crear formularios reactivos en Angular.js, incluyendo validación en tiempo real.",
|
||||
"Ve a <a href='http://campus.codeschool.com/courses/shaping-up-with-angular-js/level/3/section/1/video/1' target='_blank'>http://campus.codeschool.com/courses/shaping-up-with-angular-js/level/3/section/1/video/1</a> y completa esa sección."
|
||||
],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
},
|
||||
{
|
||||
"id": "bd7157d8c441eddfaeb5bdef",
|
||||
"title": "Customize Angular.js Directives",
|
||||
"challengeSeed": ["114685062"],
|
||||
"description": [
|
||||
"Now we'll learn how to modify existing Angular.js directives, and even build directives of your own.",
|
||||
"Go to <a href='http://campus.codeschool.com/courses/shaping-up-with-angular-js/level/4/section/1/video/1' target='_blank'>http://campus.codeschool.com/courses/shaping-up-with-angular-js/level/4/section/1/video/1</a> and complete the section."
|
||||
],
|
||||
"type": "waypoint",
|
||||
"challengeType": 2,
|
||||
"tests": [
|
||||
"assert(true, 'No test needed');"
|
||||
],
|
||||
"solutions": [
|
||||
"/* no test needed */"
|
||||
],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "Crea directivas personalizadas con Angular.js",
|
||||
"descriptionEs": [
|
||||
"Ahora aprenderemos a modificar directivas existentes en Angular.js y a crear nuestras propias directivas.",
|
||||
"Ve a <a href='http://campus.codeschool.com/courses/shaping-up-with-angular-js/level/4/section/1/video/1' target='_blank'>http://campus.codeschool.com/courses/shaping-up-with-angular-js/level/4/section/1/video/1</a> y completa esa sección."
|
||||
],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
},
|
||||
{
|
||||
"id": "bd7158d8c441eddfaeb5bdef",
|
||||
"title": "Create Angular.js Services",
|
||||
"challengeSeed": ["114685060"],
|
||||
"description": [
|
||||
"Services are functions that you can use and reuse throughout your Angular.js app to get things done.",
|
||||
"We'll learn how to use services in this final Code School Angular.js challenge.",
|
||||
"Go to <a href='http://campus.codeschool.com/courses/shaping-up-with-angular-js/level/5/section/1/video/1' target='_blank'>http://campus.codeschool.com/courses/shaping-up-with-angular-js/level/5/section/1/video/1</a> and complete the section."
|
||||
],
|
||||
"type": "waypoint",
|
||||
"challengeType": 2,
|
||||
"tests": [
|
||||
"assert(true, 'No test needed');"
|
||||
],
|
||||
"solutions": [
|
||||
"/* no test needed */"
|
||||
],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "Crea servicios con Angular.js",
|
||||
"descriptionEs": [
|
||||
"Los servicios son funciones que puedes usar y reciclar en tu app en Angular.js para mejorar tu eficiencia.",
|
||||
"Aprenderemos cómo utilizar servicios en este desafío final de Angular.js en Code School.",
|
||||
"Ve a <a href='http://campus.codeschool.com/courses/shaping-up-with-angular-js/level/5/section/1/video/1' target='_blank'>http://campus.codeschool.com/courses/shaping-up-with-angular-js/level/5/section/1/video/1</a> y completa esa sección."
|
||||
],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
}
|
||||
]
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
{
|
||||
"name": "Hikes",
|
||||
"name": "Computer Basics",
|
||||
"order": 0.050,
|
||||
"time": "3h",
|
||||
"challenges": [
|
||||
@ -479,331 +479,6 @@
|
||||
"descriptionEs": [],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
},
|
||||
{
|
||||
"id": "bd712bd8c441eddfbeb5bddf",
|
||||
"title": "What Do Programmers Do?",
|
||||
"challengeSeed": [
|
||||
"133166912"
|
||||
],
|
||||
"description": [
|
||||
"Programmers (a.k.a. coders, developers, or software engineers) solve problems by turning big ideas into tiny steps that a computer can understand.",
|
||||
"In this video, we'll discuss what programmers do.",
|
||||
"Programmers can also be called coders, developers, or software engineers, and what all of these peple do is take ideas and turn them into functional code.",
|
||||
"It's not just creating that code, but also maintaining it.",
|
||||
"Let's look at how the computer looks at code, specifically javascript.",
|
||||
"The computer looks at code one line at a time, and as you're writing code, you will notice numbers on the left hand side.",
|
||||
"The computer literally goes down line by line, making sense of what each line has to say.",
|
||||
"Everything is done sequentially, just straight down, so refrencing something that is below and hasn't happened yet will lead to a problem.",
|
||||
"Computers just read straight down like you would read a book.",
|
||||
"Programmers are the ones responsible for breaking their ideas down into the little tiny steps and writing them in a way that computers can understand them."
|
||||
],
|
||||
"type": "hike",
|
||||
"challengeType": 6,
|
||||
"tests": [
|
||||
["Computers look at code one line at a time", true],
|
||||
["Programmers and developers are totally different professions with very little in common.", false, "Those titles are so similar they could even describe the same job position."],
|
||||
["Programmers take ideas and break them down into little tiny steps the computer can understand", true]
|
||||
],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "",
|
||||
"descriptionEs": [],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
},
|
||||
{
|
||||
"id": "bd712ad8c441eddfbeb5bddf",
|
||||
"title": "Console and Logging",
|
||||
"challengeSeed": [
|
||||
"133170880"
|
||||
],
|
||||
"description": [
|
||||
"We discuss what (and where) the console is, why it's useful, and show a little of how it works.",
|
||||
"The console: what it is, where you can find it, and what you use it for.",
|
||||
"The console is very commonly used to display system adminstrative messages.",
|
||||
"Your browser and your computer both have their own consoles.",
|
||||
"Once you become famlliar with it, you will find it to be a very useful and powerful tool.",
|
||||
"In Javascript, the console is used as a great tool for debugging and finding out where in your code there's a problem.",
|
||||
"One of the most important terms you'll need to remember is \"console.log()\".",
|
||||
"The process of doing this can be put anywhere in the lines of code to help find, identify, and ultimately fix specific issues.",
|
||||
"Using the Chrome browser and the Chrome console, if we type in \"console.log(\"Free Code Camp rocks!\");\", the console will literally display \"Free Code Camp rocks!\".",
|
||||
"This will also work with numbers and booleans, which are true/false statements.",
|
||||
"When consoling words, it's important to put it inside of quotations so it recognizes it's a string."
|
||||
],
|
||||
"type": "hike",
|
||||
"challengeType": 6,
|
||||
"tests": [
|
||||
["The console serves only small, unnecessary purposes.", false, "The console's main purpose is to debug, which is a vital step in creating code."],
|
||||
["You can console strings (sets of words), numbers, and booleans (true/false statements)", true]
|
||||
],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "",
|
||||
"descriptionEs": [],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
},
|
||||
{
|
||||
"id": "bd7119d8c441eddfbeb5bddf",
|
||||
"title": "Variables In Code",
|
||||
"challengeSeed": [
|
||||
"133172920"
|
||||
],
|
||||
"description": [
|
||||
"Variables are used frequently in Javascript and many other coding languages.",
|
||||
"In this video, we're going to talk about variables in code.",
|
||||
"Variables, just like in Algebra, are when you have a letter or a word and it represents something else.",
|
||||
"Here we're doing var x = \"Briana\". When we reference \"x\" later on, it's going to know that's Briana.",
|
||||
"When we console.log(x), it's going to output \"Briana\".",
|
||||
"But be careful - if we put console.log(\"x\"), with the x in quotation marks, it will output the letter \"x\".",
|
||||
"What I want you to take away from this video is that variables exist in code, and you can store everything from a simple string all the way up to a function, all within a simple name."
|
||||
],
|
||||
"type": "hike",
|
||||
"challengeType": 6,
|
||||
"tests": [
|
||||
["Variables are useful in coding languages like JavaScript.", true],
|
||||
["Variables can't stand for anything that isn't a string, number, or boolean.", false, "Variables can stand for things ranging from simple to very complex"]
|
||||
],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "",
|
||||
"descriptionEs": [],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
},
|
||||
{
|
||||
"id": "bd7029d8c441eddfbeb5bddf",
|
||||
"title": "Source Code",
|
||||
"challengeSeed": [
|
||||
"133177129"
|
||||
],
|
||||
"description": [
|
||||
"In this video we discuss what source code is, interpreters and compilers, and what open source means.",
|
||||
"Let's talk about source code: what source code is, where you'll see it, and how the computer makes sense of it.",
|
||||
"Source code itself is the actual text document that the programmer creates: they type it up, it's letters, numbers, and symbols.",
|
||||
"If you give that to somebody and have them look at that document on their computer, that's not going to help them view their email, it's not going to be a browser, it's just a text document.",
|
||||
"The computer has to have a way of interpreting that and making something really powerful run from it.",
|
||||
"There are two main ways this is done: either by an interpreter or a compiler.",
|
||||
"Every browser has an interpreter, and that's how javascript is processed.",
|
||||
"Other languages, like C++, are used with a compiler.",
|
||||
"Unlike an interpreter, the compiler does all of its work on the programmer's end.",
|
||||
"They send out their package, their product, and it's already been compiled, it can already run on a machine.",
|
||||
"Javascript, however, and other interpreter languages, you just write the javascript and the browser on the user's end has the capability to interpret it so you don't need a compiler.",
|
||||
"Everyone has an opinion to which is better (interpreter or compiler), but really each has their pros and cons, and it goes on a case by case basis.",
|
||||
"They're better at different things.",
|
||||
"Now, let's focus on what open source means.",
|
||||
"Free Code Camp is open source, meaning that all of the documentation and source code is open and accessable.",
|
||||
"You may be thinking, \"so what?\", but what's awesome is that if you want to change or improve Free Code Camp, you can write that improvement and maybe get it implemented.",
|
||||
"It's a great way for websites and software to grow in a strong and fast way because of the community working together to improve it.",
|
||||
"One unwritten rule of contributing to open source projects is that you should generally submit your improvements to also be open source, and by giving that improvement back to the public, you let others use your improvement as well."
|
||||
],
|
||||
"type": "hike",
|
||||
"challengeType": 6,
|
||||
"tests": [
|
||||
["Source code is a text document.", true],
|
||||
["Javascript is a compiler language.", false, "Javascript is an interpreter language"],
|
||||
["Free Code Camp is open source.", true]
|
||||
],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "",
|
||||
"descriptionEs": [],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
},
|
||||
{
|
||||
"id": "bd7129d8b441eddfbeb5bddf",
|
||||
"title": "Routers and Packets",
|
||||
"challengeSeed": [
|
||||
"133181251"
|
||||
],
|
||||
"description": [
|
||||
"In this video, we go into a little more detail about routers and packets, important concepts to understand about how the internet works.",
|
||||
"Let's talk more about routers and how they relate to networking.",
|
||||
"Routers are the things that connect different small area networks.",
|
||||
"I want to give a metaphor for this: I'm a teacher and I work at a school.",
|
||||
"Say I have a package that I need to get to someone who works in the district offices.",
|
||||
"I don't know where she is, I don't know where her office is located, but I know her name.",
|
||||
"I go to my secretary, like my first router, and I say \"Hey, I need to get this to so-and-so at the district office, can you please help me?\", and she'll say \"Sure, I don't know exactly where her office is either, but I know the next step, I can get it to the district\".",
|
||||
"So she goes on and sends it to the secretary at the district office, the next router.",
|
||||
"That secretary has no idea who I am or where I am, but she sees the name on the package and knows the end location.",
|
||||
"What I'm trying to get across here is that each router only has to know its own little network, the stops right next to it.",
|
||||
"It doesn't have to know the whole internet, but just its own connections.",
|
||||
"It can take information and say, alright, I don't know exactly where that's going, but I'll pass it along in the right direction.",
|
||||
"That's really all it takes.",
|
||||
"Routers can be different sizes, different capacities, but what they do is know their own neighborhood, take the information, and pass it in the right direction.",
|
||||
"Another thing we'll get into a little later is that the routers don't even have to have the full package of information.",
|
||||
"If one comptuer is trying to send information to another, the data might get split up between different routers and that's okay.",
|
||||
"The computers still know how to put the information back together correctly.",
|
||||
"The little pieces of information that are sent are called packets.",
|
||||
"Packets are actually little pieces of binary code (drawn on board).",
|
||||
"This is an example of what packets might look like, a visual representation of the electrical current that the computer can translate into 1's and 0's, which we all know is binary that can represent literally any digital data.",
|
||||
"These little packets are sent across through routers, and if a file is too large for one packet, it can be broken up into frames (smaller little packets).",
|
||||
"The frames don't have to take the same route to the end destination.",
|
||||
"They can take whichever route is open, whichever is fastest, and since they have the end IP address, all of the routers know where to send them.",
|
||||
"Once they get to the end destination, that computer knows how to put all of the information back together."
|
||||
],
|
||||
"type": "hike",
|
||||
"challengeType": 6,
|
||||
"tests": [
|
||||
["Routers have to know the whole internet.", false, "Routers just have to know the stops around them to send information in the right direction."],
|
||||
["Packets are little peices of binary code.", true],
|
||||
["Packets have to be sent in one piece.", false, "packets can be broken up into frames."]
|
||||
],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "",
|
||||
"descriptionEs": [],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
},
|
||||
{
|
||||
"id": "bd7129d8a441eddfbeb5bddf",
|
||||
"title": "Hardware: Chips and Moore's Law",
|
||||
"challengeSeed": [
|
||||
"133182057"
|
||||
],
|
||||
"description": [
|
||||
"We discuss what constitutes a chip and why technology gets cheaper every year.",
|
||||
"In this video we are going to be talking about chips and something called Moore's Law.",
|
||||
"You've probably noticed over the last 10 or so years, if you're going to go buy an MP3 player, you can get a lot more storage for a lot lower price.",
|
||||
"You probably have even done the thing where you're at the store and you think, \"Well, I can get one now, or I could wait 6 months and see how far the price has dropped\", which might sound ridiculous but this is actually a trend that's been happening for a long time.",
|
||||
"Let's talk about what makes a chip.",
|
||||
"A chip is full of these little things called transistors, which are switches that can either be a 1 or a 0 (noticing a theme here?).",
|
||||
"All of these transistors fit onto a chip, and that's how it stores information.",
|
||||
"What makes these chips larger/faster is the amount of transistors on a single chip.",
|
||||
"Moore's Law is the observation that the amount of transistors fit on each chip has doubled every two years since 1965.",
|
||||
"This is important because it's making technology more affordable and accessible."
|
||||
],
|
||||
"type": "hike",
|
||||
"challengeType": 6,
|
||||
"tests": [
|
||||
["Chips have transistors, little switches that can store a 1 or a 0.", true],
|
||||
["Moore's Law is the observation that technology doubles in speed every year.", false, "Moore's Law is the observation that the number of transistors per chip doubles every 2 years)."],
|
||||
["Moore's Law has slowed down in recent years.", false, "Somehow this continues to be true."]
|
||||
],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "",
|
||||
"descriptionEs": [],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
},
|
||||
{
|
||||
"id": "bd7129d80441eddfbeb5bddf",
|
||||
"title": "Analog vs Digital and File Compression",
|
||||
"challengeSeed": [
|
||||
"133182587"
|
||||
],
|
||||
"description": [
|
||||
"How computers turn analog sound into digital files, and the pros and cons of data compression.",
|
||||
"Let's discuss analog vs digital on a very basic level.",
|
||||
"Most specifically, we'll talk about how computers interpret analog sound and turn it into a digital file.",
|
||||
"An analog sound wave could look like anything, but for this example it's a wavy line.",
|
||||
"The computer takes it and measures at lots of different points, turning them into numbers.",
|
||||
"This is called sampling.",
|
||||
"Later, the computer can take those numbers and turn them into sound again.",
|
||||
"Let's also discuss data compression.",
|
||||
"The benefit of compression is that it's a smaller file: it's easier to store, it's easier to send to someone else, and it just takes up less space.",
|
||||
"One of the ways this is done in sound is that the sampling is taken less often.",
|
||||
"Another way is that it takes the measurement from a median point instead of from 0, so the numbers recorded are smaller.",
|
||||
"In images, it's done by measuring groups of pixels by 16 instead of individually.",
|
||||
"The takeaway from this video is that you'll want to use digital files as they're a higher quality, and when you're looking at compression, you want to decide how far you are willing to go to ensure the user still has the best possible experience."
|
||||
],
|
||||
"type": "hike",
|
||||
"challengeType": 6,
|
||||
"tests": [
|
||||
["Digital files can be made from analog sounds and analog sounds can be made from digital files.", true],
|
||||
["Compression is not worth it, because it lessens quality.", false, "Sometimes compression is a great idea. It depends on what you're trying to do and what your end goal for the product is."]
|
||||
],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "",
|
||||
"descriptionEs": [],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
},
|
||||
{
|
||||
"id": "bd7129d89441eddfbeb5bddf",
|
||||
"title": "Computer Security",
|
||||
"challengeSeed": [
|
||||
"133186284"
|
||||
],
|
||||
"description": [
|
||||
"The basics of computer security, and how to make sure you protect your information.",
|
||||
"Let's cover computer security.",
|
||||
"The first thing we're going to talk about is something called a dictionary attack which has to do with your passwords.",
|
||||
"When creating your passwords, some sites require extremely specific and complicated passwords, which is actually a bit unnecessary.",
|
||||
"The type of attacks they're trying to gaurd you from are dictionary attacks.",
|
||||
"Dictionary attacks are programmed to try every word in the dictionary, or in its own database of common words and passwords, as the password for a large mass of usernames.",
|
||||
"If your password is Kangaroo, they're probably going to break into your account.",
|
||||
"Most passwords aren't this simple, but that doesn't matter.",
|
||||
"They attack such a massive amount of accounts that they only need a few passwords that are relatively simple.",
|
||||
"When creating a password, you want to use different cases, numbers, and symbols, but one of the most effective ways to create a good password is to throw some random letters in there (ex: kangarooSyCA67).",
|
||||
"Also, stay away from sequential numbers.",
|
||||
"Phishing, another thing to watch out for, is emails or webpages that mimic other valid sites to try and trick people into entering their personal information, though the site truly isn't connected to the site it's trying to mimic.",
|
||||
"In general, two ways to safeguard from these attacks are checking the address in the browser and to open a new browser and go to the website that is claiming to contact you.",
|
||||
"Let's also discuss encryption and HTTPS.",
|
||||
"If you are at Starbucks trying to access your bank account, you have reason to be suspicious that someone could see and take your information.",
|
||||
"You will want to look for a green HTTPS instead of HTTP at the beginning of the web address.",
|
||||
"That means that the site you're sending your information to is encrypting your passwords and other information, scrambling up data according to a code that only they know.",
|
||||
"In general, whenever you're showing private or sensitive information, check for HTTPS.",
|
||||
"A few other general tips: don't share passwords between important accounts.",
|
||||
"If a site you use gets hacked into, your password may be compromised regardless of its strength.",
|
||||
"Also, don't download strange files.",
|
||||
"If you don't recognise the file type like .pdf, .txt, .jpg, be wary.",
|
||||
"Some of these files you download can be very powerful and even run your computer from the inside.",
|
||||
"Lastly, keep your software updated, particularly software that interacts with the internet.",
|
||||
"One way that information can be compromised is when 'bad guys' find holes and gaps in security of older versions of softwares.",
|
||||
"Those bugs have been patched in newer versions, so if you keep everything updated, you'll avoid lots of problems.",
|
||||
"These are all very basic things you should know about how to keep your information safe on your computer."
|
||||
],
|
||||
"type": "hike",
|
||||
"challengeType": 6,
|
||||
"tests": [
|
||||
["Passwords should be shared with all of your accounts.", false, "Don't reuse important passwords"],
|
||||
["If you don't trust a site or an email, open a new browser and re-enter the intended location.", true],
|
||||
["Keeping software updated will help protect your computer and your information.", true]
|
||||
],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "",
|
||||
"descriptionEs": [],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
}
|
||||
]
|
||||
}
|
332
seed/challenges/hikes/programming.json
Normal file
332
seed/challenges/hikes/programming.json
Normal file
@ -0,0 +1,332 @@
|
||||
{
|
||||
"name": "Programming",
|
||||
"order": 0.050,
|
||||
"time": "3h",
|
||||
"challenges": [
|
||||
{
|
||||
"id": "bd712bd8c441eddfbeb5bddf",
|
||||
"title": "What Do Programmers Do?",
|
||||
"challengeSeed": [
|
||||
"133166912"
|
||||
],
|
||||
"description": [
|
||||
"Programmers (a.k.a. coders, developers, or software engineers) solve problems by turning big ideas into tiny steps that a computer can understand.",
|
||||
"In this video, we'll discuss what programmers do.",
|
||||
"Programmers can also be called coders, developers, or software engineers, and what all of these peple do is take ideas and turn them into functional code.",
|
||||
"It's not just creating that code, but also maintaining it.",
|
||||
"Let's look at how the computer looks at code, specifically javascript.",
|
||||
"The computer looks at code one line at a time, and as you're writing code, you will notice numbers on the left hand side.",
|
||||
"The computer literally goes down line by line, making sense of what each line has to say.",
|
||||
"Everything is done sequentially, just straight down, so refrencing something that is below and hasn't happened yet will lead to a problem.",
|
||||
"Computers just read straight down like you would read a book.",
|
||||
"Programmers are the ones responsible for breaking their ideas down into the little tiny steps and writing them in a way that computers can understand them."
|
||||
],
|
||||
"type": "hike",
|
||||
"challengeType": 6,
|
||||
"tests": [
|
||||
["Computers look at code one line at a time", true],
|
||||
["Programmers and developers are totally different professions with very little in common.", false, "Those titles are so similar they could even describe the same job position."],
|
||||
["Programmers take ideas and break them down into little tiny steps the computer can understand", true]
|
||||
],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "",
|
||||
"descriptionEs": [],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
},
|
||||
{
|
||||
"id": "bd712ad8c441eddfbeb5bddf",
|
||||
"title": "Console and Logging",
|
||||
"challengeSeed": [
|
||||
"133170880"
|
||||
],
|
||||
"description": [
|
||||
"We discuss what (and where) the console is, why it's useful, and show a little of how it works.",
|
||||
"The console: what it is, where you can find it, and what you use it for.",
|
||||
"The console is very commonly used to display system adminstrative messages.",
|
||||
"Your browser and your computer both have their own consoles.",
|
||||
"Once you become famlliar with it, you will find it to be a very useful and powerful tool.",
|
||||
"In Javascript, the console is used as a great tool for debugging and finding out where in your code there's a problem.",
|
||||
"One of the most important terms you'll need to remember is \"console.log()\".",
|
||||
"The process of doing this can be put anywhere in the lines of code to help find, identify, and ultimately fix specific issues.",
|
||||
"Using the Chrome browser and the Chrome console, if we type in \"console.log(\"Free Code Camp rocks!\");\", the console will literally display \"Free Code Camp rocks!\".",
|
||||
"This will also work with numbers and booleans, which are true/false statements.",
|
||||
"When consoling words, it's important to put it inside of quotations so it recognizes it's a string."
|
||||
],
|
||||
"type": "hike",
|
||||
"challengeType": 6,
|
||||
"tests": [
|
||||
["The console serves only small, unnecessary purposes.", false, "The console's main purpose is to debug, which is a vital step in creating code."],
|
||||
["You can console strings (sets of words), numbers, and booleans (true/false statements)", true]
|
||||
],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "",
|
||||
"descriptionEs": [],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
},
|
||||
{
|
||||
"id": "bd7119d8c441eddfbeb5bddf",
|
||||
"title": "Variables In Code",
|
||||
"challengeSeed": [
|
||||
"133172920"
|
||||
],
|
||||
"description": [
|
||||
"Variables are used frequently in Javascript and many other coding languages.",
|
||||
"In this video, we're going to talk about variables in code.",
|
||||
"Variables, just like in Algebra, are when you have a letter or a word and it represents something else.",
|
||||
"Here we're doing var x = \"Briana\". When we reference \"x\" later on, it's going to know that's Briana.",
|
||||
"When we console.log(x), it's going to output \"Briana\".",
|
||||
"But be careful - if we put console.log(\"x\"), with the x in quotation marks, it will output the letter \"x\".",
|
||||
"What I want you to take away from this video is that variables exist in code, and you can store everything from a simple string all the way up to a function, all within a simple name."
|
||||
],
|
||||
"type": "hike",
|
||||
"challengeType": 6,
|
||||
"tests": [
|
||||
["Variables are useful in coding languages like JavaScript.", true],
|
||||
["Variables can't stand for anything that isn't a string, number, or boolean.", false, "Variables can stand for things ranging from simple to very complex"]
|
||||
],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "",
|
||||
"descriptionEs": [],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
},
|
||||
{
|
||||
"id": "bd7029d8c441eddfbeb5bddf",
|
||||
"title": "Source Code",
|
||||
"challengeSeed": [
|
||||
"133177129"
|
||||
],
|
||||
"description": [
|
||||
"In this video we discuss what source code is, interpreters and compilers, and what open source means.",
|
||||
"Let's talk about source code: what source code is, where you'll see it, and how the computer makes sense of it.",
|
||||
"Source code itself is the actual text document that the programmer creates: they type it up, it's letters, numbers, and symbols.",
|
||||
"If you give that to somebody and have them look at that document on their computer, that's not going to help them view their email, it's not going to be a browser, it's just a text document.",
|
||||
"The computer has to have a way of interpreting that and making something really powerful run from it.",
|
||||
"There are two main ways this is done: either by an interpreter or a compiler.",
|
||||
"Every browser has an interpreter, and that's how javascript is processed.",
|
||||
"Other languages, like C++, are used with a compiler.",
|
||||
"Unlike an interpreter, the compiler does all of its work on the programmer's end.",
|
||||
"They send out their package, their product, and it's already been compiled, it can already run on a machine.",
|
||||
"Javascript, however, and other interpreter languages, you just write the javascript and the browser on the user's end has the capability to interpret it so you don't need a compiler.",
|
||||
"Everyone has an opinion to which is better (interpreter or compiler), but really each has their pros and cons, and it goes on a case by case basis.",
|
||||
"They're better at different things.",
|
||||
"Now, let's focus on what open source means.",
|
||||
"Free Code Camp is open source, meaning that all of the documentation and source code is open and accessable.",
|
||||
"You may be thinking, \"so what?\", but what's awesome is that if you want to change or improve Free Code Camp, you can write that improvement and maybe get it implemented.",
|
||||
"It's a great way for websites and software to grow in a strong and fast way because of the community working together to improve it.",
|
||||
"One unwritten rule of contributing to open source projects is that you should generally submit your improvements to also be open source, and by giving that improvement back to the public, you let others use your improvement as well."
|
||||
],
|
||||
"type": "hike",
|
||||
"challengeType": 6,
|
||||
"tests": [
|
||||
["Source code is a text document.", true],
|
||||
["Javascript is a compiler language.", false, "Javascript is an interpreter language"],
|
||||
["Free Code Camp is open source.", true]
|
||||
],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "",
|
||||
"descriptionEs": [],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
},
|
||||
{
|
||||
"id": "bd7129d8b441eddfbeb5bddf",
|
||||
"title": "Routers and Packets",
|
||||
"challengeSeed": [
|
||||
"133181251"
|
||||
],
|
||||
"description": [
|
||||
"In this video, we go into a little more detail about routers and packets, important concepts to understand about how the internet works.",
|
||||
"Let's talk more about routers and how they relate to networking.",
|
||||
"Routers are the things that connect different small area networks.",
|
||||
"I want to give a metaphor for this: I'm a teacher and I work at a school.",
|
||||
"Say I have a package that I need to get to someone who works in the district offices.",
|
||||
"I don't know where she is, I don't know where her office is located, but I know her name.",
|
||||
"I go to my secretary, like my first router, and I say \"Hey, I need to get this to so-and-so at the district office, can you please help me?\", and she'll say \"Sure, I don't know exactly where her office is either, but I know the next step, I can get it to the district\".",
|
||||
"So she goes on and sends it to the secretary at the district office, the next router.",
|
||||
"That secretary has no idea who I am or where I am, but she sees the name on the package and knows the end location.",
|
||||
"What I'm trying to get across here is that each router only has to know its own little network, the stops right next to it.",
|
||||
"It doesn't have to know the whole internet, but just its own connections.",
|
||||
"It can take information and say, alright, I don't know exactly where that's going, but I'll pass it along in the right direction.",
|
||||
"That's really all it takes.",
|
||||
"Routers can be different sizes, different capacities, but what they do is know their own neighborhood, take the information, and pass it in the right direction.",
|
||||
"Another thing we'll get into a little later is that the routers don't even have to have the full package of information.",
|
||||
"If one comptuer is trying to send information to another, the data might get split up between different routers and that's okay.",
|
||||
"The computers still know how to put the information back together correctly.",
|
||||
"The little pieces of information that are sent are called packets.",
|
||||
"Packets are actually little pieces of binary code (drawn on board).",
|
||||
"This is an example of what packets might look like, a visual representation of the electrical current that the computer can translate into 1's and 0's, which we all know is binary that can represent literally any digital data.",
|
||||
"These little packets are sent across through routers, and if a file is too large for one packet, it can be broken up into frames (smaller little packets).",
|
||||
"The frames don't have to take the same route to the end destination.",
|
||||
"They can take whichever route is open, whichever is fastest, and since they have the end IP address, all of the routers know where to send them.",
|
||||
"Once they get to the end destination, that computer knows how to put all of the information back together."
|
||||
],
|
||||
"type": "hike",
|
||||
"challengeType": 6,
|
||||
"tests": [
|
||||
["Routers have to know the whole internet.", false, "Routers just have to know the stops around them to send information in the right direction."],
|
||||
["Packets are little peices of binary code.", true],
|
||||
["Packets have to be sent in one piece.", false, "packets can be broken up into frames."]
|
||||
],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "",
|
||||
"descriptionEs": [],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
},
|
||||
{
|
||||
"id": "bd7129d8a441eddfbeb5bddf",
|
||||
"title": "Hardware: Chips and Moore's Law",
|
||||
"challengeSeed": [
|
||||
"133182057"
|
||||
],
|
||||
"description": [
|
||||
"We discuss what constitutes a chip and why technology gets cheaper every year.",
|
||||
"In this video we are going to be talking about chips and something called Moore's Law.",
|
||||
"You've probably noticed over the last 10 or so years, if you're going to go buy an MP3 player, you can get a lot more storage for a lot lower price.",
|
||||
"You probably have even done the thing where you're at the store and you think, \"Well, I can get one now, or I could wait 6 months and see how far the price has dropped\", which might sound ridiculous but this is actually a trend that's been happening for a long time.",
|
||||
"Let's talk about what makes a chip.",
|
||||
"A chip is full of these little things called transistors, which are switches that can either be a 1 or a 0 (noticing a theme here?).",
|
||||
"All of these transistors fit onto a chip, and that's how it stores information.",
|
||||
"What makes these chips larger/faster is the amount of transistors on a single chip.",
|
||||
"Moore's Law is the observation that the amount of transistors fit on each chip has doubled every two years since 1965.",
|
||||
"This is important because it's making technology more affordable and accessible."
|
||||
],
|
||||
"type": "hike",
|
||||
"challengeType": 6,
|
||||
"tests": [
|
||||
["Chips have transistors, little switches that can store a 1 or a 0.", true],
|
||||
["Moore's Law is the observation that technology doubles in speed every year.", false, "Moore's Law is the observation that the number of transistors per chip doubles every 2 years)."],
|
||||
["Moore's Law has slowed down in recent years.", false, "Somehow this continues to be true."]
|
||||
],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "",
|
||||
"descriptionEs": [],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
},
|
||||
{
|
||||
"id": "bd7129d80441eddfbeb5bddf",
|
||||
"title": "Analog vs Digital and File Compression",
|
||||
"challengeSeed": [
|
||||
"133182587"
|
||||
],
|
||||
"description": [
|
||||
"How computers turn analog sound into digital files, and the pros and cons of data compression.",
|
||||
"Let's discuss analog vs digital on a very basic level.",
|
||||
"Most specifically, we'll talk about how computers interpret analog sound and turn it into a digital file.",
|
||||
"An analog sound wave could look like anything, but for this example it's a wavy line.",
|
||||
"The computer takes it and measures at lots of different points, turning them into numbers.",
|
||||
"This is called sampling.",
|
||||
"Later, the computer can take those numbers and turn them into sound again.",
|
||||
"Let's also discuss data compression.",
|
||||
"The benefit of compression is that it's a smaller file: it's easier to store, it's easier to send to someone else, and it just takes up less space.",
|
||||
"One of the ways this is done in sound is that the sampling is taken less often.",
|
||||
"Another way is that it takes the measurement from a median point instead of from 0, so the numbers recorded are smaller.",
|
||||
"In images, it's done by measuring groups of pixels by 16 instead of individually.",
|
||||
"The takeaway from this video is that you'll want to use digital files as they're a higher quality, and when you're looking at compression, you want to decide how far you are willing to go to ensure the user still has the best possible experience."
|
||||
],
|
||||
"type": "hike",
|
||||
"challengeType": 6,
|
||||
"tests": [
|
||||
["Digital files can be made from analog sounds and analog sounds can be made from digital files.", true],
|
||||
["Compression is not worth it, because it lessens quality.", false, "Sometimes compression is a great idea. It depends on what you're trying to do and what your end goal for the product is."]
|
||||
],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "",
|
||||
"descriptionEs": [],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
},
|
||||
{
|
||||
"id": "bd7129d89441eddfbeb5bddf",
|
||||
"title": "Computer Security",
|
||||
"challengeSeed": [
|
||||
"133186284"
|
||||
],
|
||||
"description": [
|
||||
"The basics of computer security, and how to make sure you protect your information.",
|
||||
"Let's cover computer security.",
|
||||
"The first thing we're going to talk about is something called a dictionary attack which has to do with your passwords.",
|
||||
"When creating your passwords, some sites require extremely specific and complicated passwords, which is actually a bit unnecessary.",
|
||||
"The type of attacks they're trying to gaurd you from are dictionary attacks.",
|
||||
"Dictionary attacks are programmed to try every word in the dictionary, or in its own database of common words and passwords, as the password for a large mass of usernames.",
|
||||
"If your password is Kangaroo, they're probably going to break into your account.",
|
||||
"Most passwords aren't this simple, but that doesn't matter.",
|
||||
"They attack such a massive amount of accounts that they only need a few passwords that are relatively simple.",
|
||||
"When creating a password, you want to use different cases, numbers, and symbols, but one of the most effective ways to create a good password is to throw some random letters in there (ex: kangarooSyCA67).",
|
||||
"Also, stay away from sequential numbers.",
|
||||
"Phishing, another thing to watch out for, is emails or webpages that mimic other valid sites to try and trick people into entering their personal information, though the site truly isn't connected to the site it's trying to mimic.",
|
||||
"In general, two ways to safeguard from these attacks are checking the address in the browser and to open a new browser and go to the website that is claiming to contact you.",
|
||||
"Let's also discuss encryption and HTTPS.",
|
||||
"If you are at Starbucks trying to access your bank account, you have reason to be suspicious that someone could see and take your information.",
|
||||
"You will want to look for a green HTTPS instead of HTTP at the beginning of the web address.",
|
||||
"That means that the site you're sending your information to is encrypting your passwords and other information, scrambling up data according to a code that only they know.",
|
||||
"In general, whenever you're showing private or sensitive information, check for HTTPS.",
|
||||
"A few other general tips: don't share passwords between important accounts.",
|
||||
"If a site you use gets hacked into, your password may be compromised regardless of its strength.",
|
||||
"Also, don't download strange files.",
|
||||
"If you don't recognise the file type like .pdf, .txt, .jpg, be wary.",
|
||||
"Some of these files you download can be very powerful and even run your computer from the inside.",
|
||||
"Lastly, keep your software updated, particularly software that interacts with the internet.",
|
||||
"One way that information can be compromised is when 'bad guys' find holes and gaps in security of older versions of softwares.",
|
||||
"Those bugs have been patched in newer versions, so if you keep everything updated, you'll avoid lots of problems.",
|
||||
"These are all very basic things you should know about how to keep your information safe on your computer."
|
||||
],
|
||||
"type": "hike",
|
||||
"challengeType": 6,
|
||||
"tests": [
|
||||
["Passwords should be shared with all of your accounts.", false, "Don't reuse important passwords"],
|
||||
["If you don't trust a site or an email, open a new browser and re-enter the intended location.", true],
|
||||
["Keeping software updated will help protect your computer and your information.", true]
|
||||
],
|
||||
"nameCn": "",
|
||||
"descriptionCn": [],
|
||||
"nameFr": "",
|
||||
"descriptionFr": [],
|
||||
"nameRu": "",
|
||||
"descriptionRu": [],
|
||||
"nameEs": "",
|
||||
"descriptionEs": [],
|
||||
"namePt": "",
|
||||
"descriptionPt": []
|
||||
}
|
||||
]
|
||||
}
|
6
seed/create-challenge-bundle.js
Normal file
6
seed/create-challenge-bundle.js
Normal file
@ -0,0 +1,6 @@
|
||||
var fs = require('fs');
|
||||
var getChallenges = require('./getChallenges');
|
||||
|
||||
var challengeSpecs = getChallenges();
|
||||
|
||||
fs.writeFileSync('seed/challenge-bundle.json', JSON.stringify(challengeSpecs));
|
@ -1,17 +1,59 @@
|
||||
/* eslint-disable no-self-compare */
|
||||
var fs = require('fs');
|
||||
var path = require('path');
|
||||
|
||||
|
||||
function getFilesFor(dir) {
|
||||
return fs.readdirSync(path.join(__dirname, '/' + dir));
|
||||
return fs.readdirSync(path.join(__dirname, '/' + dir))
|
||||
.map(function(file) {
|
||||
let superBlock;
|
||||
if (fs.statSync(path.join(__dirname, dir + '/' + file)).isFile()) {
|
||||
return { file: file };
|
||||
}
|
||||
superBlock = file;
|
||||
return getFilesFor(dir + '/' + superBlock)
|
||||
.map(function(data) {
|
||||
return {
|
||||
file: superBlock + '/' + data.file,
|
||||
superBlock: superBlock
|
||||
};
|
||||
});
|
||||
})
|
||||
.reduce(function(files, file) {
|
||||
if (!Array.isArray(file)) {
|
||||
files.push(file);
|
||||
return files;
|
||||
}
|
||||
return files.concat(file);
|
||||
}, []);
|
||||
}
|
||||
|
||||
function getSupOrder(filePath) {
|
||||
var order = parseInt((filePath || '').split('-')[0], 10);
|
||||
// check for NaN
|
||||
if (order !== order) {
|
||||
return 0;
|
||||
}
|
||||
return order;
|
||||
}
|
||||
|
||||
function getSupName(filePath) {
|
||||
var order = parseInt((filePath || '').split('-')[0], 10);
|
||||
// check for NaN
|
||||
if (order !== order) {
|
||||
return filePath;
|
||||
}
|
||||
|
||||
return (filePath || '').split('-').splice(1).join('-');
|
||||
}
|
||||
|
||||
module.exports = function getChallenges() {
|
||||
try {
|
||||
return getFilesFor('challenges')
|
||||
.map(function(file) {
|
||||
var challengeSpec = require('./challenges/' + file);
|
||||
challengeSpec.fileName = file;
|
||||
.map(function(data) {
|
||||
var challengeSpec = require('./challenges/' + data.file);
|
||||
challengeSpec.fileName = data.file;
|
||||
challengeSpec.superBlock = getSupName(data.superBlock);
|
||||
challengeSpec.superOrder = getSupOrder(data.superBlock);
|
||||
|
||||
return challengeSpec;
|
||||
});
|
||||
|
@ -17,7 +17,10 @@ destroy()
|
||||
.flatMap(function(challengeSpec) {
|
||||
var order = challengeSpec.order;
|
||||
var block = challengeSpec.name;
|
||||
var superBlock = challengeSpec.superBlock;
|
||||
var superOrder = challengeSpec.superOrder;
|
||||
var isBeta = !!challengeSpec.isBeta;
|
||||
var isComingSoon = !!challengeSpec.isComingSoon;
|
||||
var fileName = challengeSpec.fileName;
|
||||
console.log('parsed %s successfully', block);
|
||||
|
||||
@ -44,7 +47,15 @@ destroy()
|
||||
challenge.suborder = index + 1;
|
||||
challenge.block = block;
|
||||
challenge.isBeta = challenge.isBeta || isBeta;
|
||||
challenge.isComingSoon = challenge.isComingSoon || isComingSoon;
|
||||
challenge.time = challengeSpec.time;
|
||||
challenge.superOrder = superOrder;
|
||||
challenge.superBlock = superBlock
|
||||
.split('-')
|
||||
.map(function(word) {
|
||||
return _.capitalize(word);
|
||||
})
|
||||
.join(' ');
|
||||
|
||||
return challenge;
|
||||
});
|
||||
|
@ -1,5 +0,0 @@
|
||||
{
|
||||
"name": "D3",
|
||||
"order": 0.099,
|
||||
"challenges": []
|
||||
}
|
@ -1,5 +0,0 @@
|
||||
{
|
||||
"name": "ReactJS",
|
||||
"order": 0.099,
|
||||
"challenges": []
|
||||
}
|
@ -14,8 +14,8 @@ import {
|
||||
} from '../utils/rx';
|
||||
|
||||
import {
|
||||
frontEndChallangeId,
|
||||
fullStackChallangeId
|
||||
frontEndChallengeId,
|
||||
backEndChallengeId
|
||||
} from '../utils/constantStrings.json';
|
||||
|
||||
import {
|
||||
@ -27,11 +27,8 @@ const sendMessageToNonUser = ifNoUserSend(
|
||||
'must be logged in to complete.'
|
||||
);
|
||||
|
||||
function isCertified(frontEndIds, { completedChallenges, isFrontEndCert }) {
|
||||
if (isFrontEndCert) {
|
||||
return true;
|
||||
}
|
||||
return _.every(frontEndIds, ({ id }) => {
|
||||
function isCertified(ids, { completedChallenges }) {
|
||||
return _.every(ids, ({ id }) => {
|
||||
return _.some(completedChallenges, (challenge) => {
|
||||
return challenge.id === id || challenge._id === id;
|
||||
});
|
||||
@ -42,10 +39,10 @@ export default function certificate(app) {
|
||||
const router = app.loopback.Router();
|
||||
const { Challenge } = app.models;
|
||||
|
||||
const frontEndChallangeIds$ = observeQuery(
|
||||
const frontEndChallengeIds$ = observeQuery(
|
||||
Challenge,
|
||||
'findById',
|
||||
frontEndChallangeId,
|
||||
frontEndChallengeId,
|
||||
{
|
||||
id: true,
|
||||
tests: true,
|
||||
@ -55,10 +52,10 @@ export default function certificate(app) {
|
||||
)
|
||||
.shareReplay();
|
||||
|
||||
const fullStackChallangeIds$ = observeQuery(
|
||||
const backEndChallengeIds$ = observeQuery(
|
||||
Challenge,
|
||||
'findById',
|
||||
fullStackChallangeId,
|
||||
backEndChallengeId,
|
||||
{
|
||||
id: true,
|
||||
tests: true,
|
||||
@ -75,7 +72,7 @@ export default function certificate(app) {
|
||||
);
|
||||
|
||||
router.post(
|
||||
'/certificate/verify/full-stack',
|
||||
'/certificate/verify/back-end',
|
||||
ifNoUser401,
|
||||
verifyCert
|
||||
);
|
||||
@ -93,9 +90,9 @@ export default function certificate(app) {
|
||||
Observable.just({})
|
||||
.flatMap(() => {
|
||||
if (isFront) {
|
||||
return frontEndChallangeIds$;
|
||||
return frontEndChallengeIds$;
|
||||
}
|
||||
return fullStackChallangeIds$;
|
||||
return backEndChallengeIds$;
|
||||
})
|
||||
.flatMap(challenge => {
|
||||
const { user } = req;
|
||||
@ -106,14 +103,21 @@ export default function certificate(app) {
|
||||
challengeType
|
||||
} = challenge;
|
||||
if (
|
||||
isFront && !user.isFrontEndCert && isCertified(tests, user) ||
|
||||
!isFront && !user.isFullStackCert && isCertified(tests, user)
|
||||
|
||||
isFront &&
|
||||
!user.isFrontEndCert &&
|
||||
isCertified(tests, user) ||
|
||||
|
||||
!isFront &&
|
||||
!user.isBackEndCert &&
|
||||
isCertified(tests, user)
|
||||
|
||||
) {
|
||||
debug('certified');
|
||||
if (isFront) {
|
||||
user.isFrontEndCert = true;
|
||||
} else {
|
||||
user.isFullStackCert = true;
|
||||
user.isBackEndCert = true;
|
||||
}
|
||||
|
||||
user.completedChallenges.push({
|
||||
@ -143,7 +147,7 @@ export default function certificate(app) {
|
||||
user => {
|
||||
if (
|
||||
isFront && user.isFrontEndCert ||
|
||||
!isFront && user.isFullStackCert
|
||||
!isFront && user.isBackEndCert
|
||||
) {
|
||||
return res.status(200).send(true);
|
||||
}
|
||||
|
@ -84,11 +84,42 @@ function updateUserProgress(user, challengeId, completedChallenge) {
|
||||
return user;
|
||||
}
|
||||
|
||||
|
||||
// small helper function to determine whether to mark something as new
|
||||
const dateFormat = 'MMM MMMM DD, YYYY';
|
||||
function shouldShowNew(element, block) {
|
||||
if (element) {
|
||||
return typeof element.releasedOn !== 'undefined' &&
|
||||
moment(element.releasedOn, dateFormat).diff(moment(), 'days') >= -30;
|
||||
}
|
||||
|
||||
if (block) {
|
||||
const newCount = block.reduce((sum, { markNew }) => {
|
||||
if (markNew) {
|
||||
return sum + 1;
|
||||
}
|
||||
return sum;
|
||||
}, 0);
|
||||
return newCount / block.length * 100 === 100;
|
||||
}
|
||||
}
|
||||
|
||||
// meant to be used with a filter method
|
||||
// on an array or observable stream
|
||||
// true if challenge should be passed through
|
||||
// false if should filter challenge out of array or stream
|
||||
function shouldNotFilterComingSoon({ isComingSoon, isBeta: challengeIsBeta }) {
|
||||
return isDev ||
|
||||
!isComingSoon ||
|
||||
(isBeta && challengeIsBeta);
|
||||
}
|
||||
|
||||
module.exports = function(app) {
|
||||
const router = app.loopback.Router();
|
||||
|
||||
const challengesQuery = {
|
||||
order: [
|
||||
'superOrder ASC',
|
||||
'order ASC',
|
||||
'suborder ASC'
|
||||
]
|
||||
@ -100,7 +131,6 @@ module.exports = function(app) {
|
||||
const findChallenge$ = observeMethod(Challenge, 'find');
|
||||
// create a stream of all the challenges
|
||||
const challenge$ = findChallenge$(challengesQuery)
|
||||
.doOnNext(() => debug('query challenges'))
|
||||
.flatMap(challenges => Observable.from(
|
||||
challenges,
|
||||
null,
|
||||
@ -115,18 +145,22 @@ module.exports = function(app) {
|
||||
// create a stream of challenge blocks
|
||||
const blocks$ = challenge$
|
||||
.map(challenge => challenge.toJSON())
|
||||
.filter(shouldNotFilterComingSoon)
|
||||
// group challenges by block | returns a stream of observables
|
||||
.groupBy(challenge => challenge.block)
|
||||
// turn block group stream into an array
|
||||
.flatMap(block$ => block$.toArray())
|
||||
.flatMap(blocks$ => blocks$.toArray())
|
||||
// turn array into stream of object
|
||||
.map(blockArray => ({
|
||||
name: blockArray[0].block,
|
||||
dashedName: dasherize(blockArray[0].block),
|
||||
challenges: blockArray
|
||||
.map(blocksArray => ({
|
||||
name: blocksArray[0].block,
|
||||
dashedName: dasherize(blocksArray[0].block),
|
||||
challenges: blocksArray,
|
||||
superBlock: blocksArray[0].superBlock,
|
||||
order: blocksArray[0].order
|
||||
}))
|
||||
.filter(({ name })=> {
|
||||
return name !== 'Hikes';
|
||||
// filter out hikes
|
||||
.filter(({ superBlock }) => {
|
||||
return !(/hikes/gi).test(superBlock);
|
||||
})
|
||||
.shareReplay();
|
||||
|
||||
@ -164,7 +198,10 @@ module.exports = function(app) {
|
||||
// find challenge
|
||||
return challenge$
|
||||
.map(challenge => challenge.toJSON())
|
||||
.filter(({ block }) => block !== 'Hikes')
|
||||
// filter out challenges coming soon
|
||||
.filter(shouldNotFilterComingSoon)
|
||||
// filter out hikes
|
||||
.filter(({ superBlock }) => !(/hikes/gi).test(superBlock))
|
||||
.filter(({ id }) => id === challengeId)
|
||||
// now lets find the block it belongs to
|
||||
.flatMap(challenge => {
|
||||
@ -172,6 +209,7 @@ module.exports = function(app) {
|
||||
const blockIndex$ = blocks$
|
||||
.findIndex(({ name }) => name === challenge.block);
|
||||
|
||||
|
||||
return blockIndex$
|
||||
.flatMap(blockIndex => {
|
||||
// could not find block?
|
||||
@ -185,6 +223,7 @@ module.exports = function(app) {
|
||||
.map(({ challenges = [] }) => challenges[0]);
|
||||
|
||||
return blocks$
|
||||
.filter(shouldNotFilterComingSoon)
|
||||
.elementAt(blockIndex)
|
||||
.flatMap(block => {
|
||||
// find where our challenge lies in the block
|
||||
@ -252,7 +291,8 @@ module.exports = function(app) {
|
||||
debug('looking for %s', testChallengeName);
|
||||
challenge$
|
||||
.filter((challenge) => {
|
||||
return testChallengeName.test(challenge.name);
|
||||
return testChallengeName.test(challenge.name) &&
|
||||
shouldNotFilterComingSoon(challenge);
|
||||
})
|
||||
.last({ defaultValue: null })
|
||||
.flatMap(challenge => {
|
||||
@ -455,23 +495,6 @@ module.exports = function(app) {
|
||||
|
||||
function challengeMap({ user = {} }, res, next) {
|
||||
|
||||
// small helper function to determine whether to mark something as new
|
||||
function shouldShowNew(element, block) {
|
||||
if (element) {
|
||||
return (typeof element.releasedOn !== 'undefined' &&
|
||||
moment(element.releasedOn, 'MMM MMMM DD, YYYY')
|
||||
.diff(moment(), 'days') >= -30);
|
||||
} else if (block) {
|
||||
const newCount = block.reduce((sum, { markNew }) => {
|
||||
if (markNew) {
|
||||
return sum + 1;
|
||||
}
|
||||
return sum;
|
||||
}, 0);
|
||||
return newCount / block.length * 100 === 100;
|
||||
}
|
||||
}
|
||||
|
||||
let lastCompleted;
|
||||
const daysRunning = moment().diff(new Date('10/15/2014'), 'days');
|
||||
|
||||
@ -485,7 +508,7 @@ module.exports = function(app) {
|
||||
.map(camperCount => numberWithCommas(camperCount));
|
||||
|
||||
// create a stream of an array of all the challenge blocks
|
||||
const blocks$ = challenge$
|
||||
const superBlocks$ = challenge$
|
||||
// mark challenge completed
|
||||
.map(challengeModel => {
|
||||
const challenge = challengeModel.toJSON();
|
||||
@ -507,10 +530,13 @@ module.exports = function(app) {
|
||||
return sum;
|
||||
}, 0);
|
||||
const isBeta = _.every(blockArray, 'isBeta');
|
||||
const isComingSoon = _.every(blockArray, 'isComingSoon');
|
||||
|
||||
return {
|
||||
isBeta,
|
||||
isComingSoon,
|
||||
name: blockArray[0].block,
|
||||
superBlock: blockArray[0].superBlock,
|
||||
dashedName: dasherize(blockArray[0].block),
|
||||
markNew: shouldShowNew(null, blockArray),
|
||||
challenges: blockArray,
|
||||
@ -518,25 +544,36 @@ module.exports = function(app) {
|
||||
time: blockArray[0] && blockArray[0].time || '???'
|
||||
};
|
||||
})
|
||||
.filter(({ name }) => name !== 'Hikes')
|
||||
// filter out hikes
|
||||
.filter(({ superBlock }) => {
|
||||
return !(/hikes/i).test(superBlock);
|
||||
})
|
||||
// turn stream of blocks into a stream of an array
|
||||
.toArray()
|
||||
.doOnNext((blocks) => {
|
||||
.doOnNext(blocks => {
|
||||
const lastCompletedBlock = _.findLast(blocks, (block) => {
|
||||
return block.completed === 100;
|
||||
});
|
||||
lastCompleted = lastCompletedBlock && lastCompletedBlock.name || null;
|
||||
});
|
||||
})
|
||||
.flatMap(blocks => Observable.from(blocks, null, null, Scheduler.default))
|
||||
.groupBy(block => block.superBlock)
|
||||
.flatMap(blocks$ => blocks$.toArray())
|
||||
.map(superBlockArray => ({
|
||||
name: superBlockArray[0].superBlock,
|
||||
blocks: superBlockArray
|
||||
}))
|
||||
.toArray();
|
||||
|
||||
Observable.combineLatest(
|
||||
camperCount$,
|
||||
blocks$,
|
||||
(camperCount, blocks) => ({ camperCount, blocks })
|
||||
superBlocks$,
|
||||
(camperCount, superBlocks) => ({ camperCount, superBlocks })
|
||||
)
|
||||
.subscribe(
|
||||
({ camperCount, blocks }) => {
|
||||
({ camperCount, superBlocks }) => {
|
||||
res.render('challengeMap/show', {
|
||||
blocks,
|
||||
superBlocks,
|
||||
daysRunning,
|
||||
globalCompletedCount: numberWithCommas(
|
||||
5612952 + (Math.floor((Date.now() - 1446268581061) / 2000))
|
||||
|
@ -36,7 +36,10 @@ module.exports = function(app) {
|
||||
router.get('/stories', showTestimonials);
|
||||
router.get('/all-stories', showAllTestimonials);
|
||||
router.get('/links', showLinks);
|
||||
router.get('/the-fastest-web-page-on-the-internet', theFastestWebPageOnTheInternet);
|
||||
router.get(
|
||||
'/the-fastest-web-page-on-the-internet',
|
||||
theFastestWebPageOnTheInternet
|
||||
);
|
||||
|
||||
app.use(router);
|
||||
|
||||
|
@ -5,8 +5,8 @@ import { Observable } from 'rx';
|
||||
import debugFactory from 'debug';
|
||||
|
||||
import {
|
||||
frontEndChallangeId,
|
||||
fullStackChallangeId
|
||||
frontEndChallengeId,
|
||||
backEndChallengeId
|
||||
} from '../utils/constantStrings.json';
|
||||
import { ifNoUser401, ifNoUserRedirectTo } from '../utils/middleware';
|
||||
import { observeQuery } from '../utils/rx';
|
||||
@ -126,6 +126,11 @@ module.exports = function(app) {
|
||||
|
||||
router.get(
|
||||
'/:username/full-stack-certification',
|
||||
(req, res) => res.redirect(req.url.replace('full-stack', 'back-end'))
|
||||
);
|
||||
|
||||
router.get(
|
||||
'/:username/back-end-certification',
|
||||
showCert
|
||||
);
|
||||
|
||||
@ -243,6 +248,7 @@ module.exports = function(app) {
|
||||
pledge: profileUser.pledge,
|
||||
|
||||
isFrontEndCert: profileUser.isFrontEndCert,
|
||||
isBackEndCert: profileUser.isBackEndCert,
|
||||
isFullStackCert: profileUser.isFullStackCert,
|
||||
isHonest: profileUser.isHonest,
|
||||
|
||||
@ -275,7 +281,8 @@ module.exports = function(app) {
|
||||
function showCert(req, res, next) {
|
||||
const username = req.params.username.toLowerCase();
|
||||
const { user } = req;
|
||||
const showFront = req.path.split('/').pop() === 'front-end-certification';
|
||||
const whichCert = req.path.split('/').pop();
|
||||
const showFront = whichCert === 'front-end-certification';
|
||||
Observable.just(user)
|
||||
.flatMap(user => {
|
||||
if (user && user.username === username) {
|
||||
@ -285,6 +292,7 @@ module.exports = function(app) {
|
||||
isGithubCool: true,
|
||||
isFrontEndCert: true,
|
||||
isFullStackCert: true,
|
||||
isBackEndCert: true,
|
||||
isHonest: true,
|
||||
completedChallenges: true,
|
||||
username: true,
|
||||
@ -329,19 +337,19 @@ module.exports = function(app) {
|
||||
|
||||
if (
|
||||
showFront && user.isFrontEndCert ||
|
||||
!showFront && user.isFullStackCert
|
||||
!showFront && user.isBackEndCert
|
||||
) {
|
||||
var { completedDate = new Date() } =
|
||||
_.find(user.completedChallenges, {
|
||||
id: showFront ?
|
||||
frontEndChallangeId :
|
||||
fullStackChallangeId
|
||||
frontEndChallengeId :
|
||||
backEndChallengeId
|
||||
}) || {};
|
||||
|
||||
return res.render(
|
||||
showFront ?
|
||||
'certificate/front-end.jade' :
|
||||
'certificate/full-stack.jade',
|
||||
'certificate/back-end.jade',
|
||||
{
|
||||
username: user.username,
|
||||
date: moment(new Date(completedDate))
|
||||
@ -353,7 +361,7 @@ module.exports = function(app) {
|
||||
req.flash('errors', {
|
||||
msg: showFront ?
|
||||
`Looks like user ${username} is not Front End certified` :
|
||||
`Looks like user ${username} is not Full Stack certified`
|
||||
`Looks like user ${username} is not Back End certified`
|
||||
});
|
||||
res.redirect('back');
|
||||
},
|
||||
|
@ -11,7 +11,7 @@ export default function hikesService(app) {
|
||||
read: (req, resource, params, config, cb) => {
|
||||
const query = {
|
||||
where: { challengeType: '6' },
|
||||
order: 'difficulty ASC'
|
||||
order: 'suborder ASC'
|
||||
};
|
||||
|
||||
debug('params', params);
|
||||
|
@ -1,5 +1,5 @@
|
||||
{
|
||||
"gitHubUserAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1521.3 Safari/537.36",
|
||||
"frontEndChallangeId": "561add10cb82ac38a17513be",
|
||||
"fullStackChallangeId": "660add10cb82ac38a17513be"
|
||||
"frontEndChallengeId": "561add10cb82ac38a17513be",
|
||||
"backEndChallengeId": "660add10cb82ac38a17513be"
|
||||
}
|
||||
|
@ -67,9 +67,9 @@ block content
|
||||
.spacer
|
||||
if isFrontEndCert
|
||||
a.btn.btn-primary(href='/' + username + '/front-end-certification') View My Front End Development Certification
|
||||
if isFullStackCert
|
||||
if isBackEndCert
|
||||
.button-spacer
|
||||
a.btn.btn-success(href='/' + username + '/full-stack-certification') View My Full Stack Development Certification
|
||||
a.btn.btn-success(href='/' + username + '/back-end-certification') View My Back End Development Certification
|
||||
//if (user && user.username !== username)
|
||||
// a.btn.btn-lg.btn-block.btn-twitter.btn-link-social(href='/leaderboard/add?username=#{username}')
|
||||
// i.fa.fa-plus-square
|
||||
|
6
server/views/certificate/back-end.jade
Normal file
6
server/views/certificate/back-end.jade
Normal file
@ -0,0 +1,6 @@
|
||||
include font
|
||||
#name.cert-name= name
|
||||
img#cert.img-abs(src='http://i.imgur.com/yBKoMVP.jpg')
|
||||
.cert-date= date
|
||||
.cert-link verify this certification at: http://freecodecamp.com/#{username}/back-end-certification
|
||||
include script
|
@ -42,134 +42,160 @@ block content
|
||||
a#hide-map-notice-button(href='#') Hide this forever
|
||||
.spacer
|
||||
|
||||
.row
|
||||
.col-xs-12.col-sm-8.col-sm-offset-2
|
||||
h3 800 Hours of Practice:
|
||||
- var i = 0
|
||||
for challengeBlock in blocks
|
||||
- i++
|
||||
.row
|
||||
if (user)
|
||||
if (challengeBlock.completed === 100)
|
||||
.hidden-xs.col-sm-3.col-md-2.text-primary.ion-checkmark-circled.padded-ionic-icon.text-center.map-p.negative-10
|
||||
.col-xs-1.col-sm-1.col-md-1.map-row-numbers
|
||||
span.map-p.negative-10 #{i}.
|
||||
.col-xs-11.col-sm-8.col-md-9
|
||||
span.map-p.faded.negative-10
|
||||
a(href='#' + challengeBlock.dashedName)= challengeBlock.name
|
||||
if challengeBlock.markNew
|
||||
span.text-danger.small    
|
||||
strong
|
||||
em NEW
|
||||
else
|
||||
.hidden-xs.col-sm-3.col-md-2
|
||||
.progress.progress-bar-padding.text-center.thin-progress-bar
|
||||
.progress-bar(role='progressbar', aria-valuenow=(challengeBlock.completed), aria-valuemin='0', aria-valuemax='100', style='width: ' + challengeBlock.completed + '%;')
|
||||
.col-xs-1.col-sm-1.col-md-1.map-row-numbers
|
||||
span.map-p.negative-10 #{i}.
|
||||
.col-xs-11.col-sm-8.col-md-9
|
||||
span.map-p.negative-10
|
||||
a(href='#' + challengeBlock.dashedName)= challengeBlock.name
|
||||
if challengeBlock.markNew
|
||||
span.text-danger.small    
|
||||
strong
|
||||
em NEW
|
||||
else
|
||||
.hidden-xs.col-sm-3.col-md-2
|
||||
.col-xs-1.col-sm-1.col-md-1.map-row-numbers
|
||||
span.map-p.negative-10 #{i}.
|
||||
.col-xs-10.col-sm-8.col-md-9
|
||||
span.map-p.negative-10
|
||||
a(href='#' + challengeBlock.dashedName)= challengeBlock.name
|
||||
if challengeBlock.markNew
|
||||
span.text-danger.small    
|
||||
strong
|
||||
em NEW
|
||||
|
||||
.row
|
||||
.col-xs-12.col-sm-8.col-sm-offset-2
|
||||
h3 800 Hours of  
|
||||
a(href="/nonprofits/directory") Real World Work Experience
|
||||
| :
|
||||
- var i = 0
|
||||
.row
|
||||
.hidden-xs.col-sm-3.col-md-2.ion-locked.padded-ionic-icon.text-center.map-p.negative-10
|
||||
.col-xs-1.col-sm-1.col-md-1.map-row-numbers
|
||||
span.map-p.negative-10 #{++i}.
|
||||
.col-xs-10.col-sm-8.col-md-9
|
||||
span.map-p.negative-10 100-hour Nonprofit Project
|
||||
.row
|
||||
.hidden-xs.col-sm-3.col-md-2.ion-locked.padded-ionic-icon.text-center.map-p.negative-10
|
||||
.col-xs-1.col-sm-1.col-md-1.map-row-numbers
|
||||
span.map-p.negative-10 #{++i}.
|
||||
.col-xs-10.col-sm-8.col-md-9
|
||||
span.map-p.negative-10 200-hour Nonprofit Project #1
|
||||
.row
|
||||
.hidden-xs.col-sm-3.col-md-2.ion-locked.padded-ionic-icon.text-center.map-p.negative-10
|
||||
.col-xs-1.col-sm-1.col-md-1.map-row-numbers
|
||||
span.map-p.negative-10 #{++i}.
|
||||
.col-xs-10.col-sm-8.col-md-9
|
||||
span.map-p.negative-10 200-hour Nonprofit Project #2
|
||||
.row
|
||||
.hidden-xs.col-sm-3.col-md-2.ion-locked.padded-ionic-icon.text-center.map-p.negative-10
|
||||
.col-xs-1.col-sm-1.col-md-1.map-row-numbers
|
||||
span.map-p.negative-10 #{++i}.
|
||||
.col-xs-10.col-sm-8.col-md-9
|
||||
span.map-p.negative-10 300-hour Nonprofit Project
|
||||
hr
|
||||
|
||||
for challengeBlock in blocks
|
||||
.row
|
||||
a(href='#' name=challengeBlock.dashedName)
|
||||
.spacer.negative-55
|
||||
|
||||
.row
|
||||
.hidden-xs.col-sm-3.col-md-2
|
||||
h3.text-primary.text-right.nowrap
|
||||
i.fa.fa-clock-o
|
||||
= challengeBlock.time
|
||||
.col-xs-12.col-sm-9.col-md-10
|
||||
h3 #{challengeBlock.name}  
|
||||
|
||||
|
||||
ul
|
||||
for superBlock in superBlocks
|
||||
h1= superBlock.name
|
||||
- var i = 0
|
||||
for challenge in challengeBlock.challenges
|
||||
for challengeBlock in superBlock.blocks
|
||||
- i++
|
||||
.row
|
||||
if challenge.completed
|
||||
.hidden-xs.col-sm-3.col-md-2.text-primary.ion-checkmark-circled.padded-ionic-icon.text-center.map-p.negative-10
|
||||
.col-xs-1.col-sm-1.col-md-1.map-row-numbers
|
||||
span.map-p.negative-10 #{i}.
|
||||
.col-xs-10.col-sm-8.col-md-9
|
||||
span.faded.map-p.negative-10
|
||||
a(href="/challenges/#{challenge.dashedName}")
|
||||
span.capitalize= challenge.type + ': '
|
||||
span= challenge.title
|
||||
span.sr-only= " Complete"
|
||||
|
||||
|
||||
if (user)
|
||||
if (challengeBlock.completed === 100)
|
||||
.hidden-xs.col-sm-3.col-md-2.text-primary.ion-checkmark-circled.padded-ionic-icon.text-center.map-p.negative-10
|
||||
.col-xs-1.col-sm-1.col-md-1.map-row-numbers
|
||||
span.map-p.negative-10 #{i}.
|
||||
.col-xs-11.col-sm-8.col-md-9
|
||||
li.map-p.faded.negative-10
|
||||
a(href='#' + challengeBlock.dashedName)= challengeBlock.name
|
||||
if challengeBlock.markNew
|
||||
span.text-info.small    
|
||||
strong
|
||||
em NEW
|
||||
if challengeBlock.isComingSoon
|
||||
span.text-info.small    
|
||||
strong
|
||||
em Coming Soon
|
||||
else
|
||||
.hidden-xs.col-sm-3.col-md-2
|
||||
.progress.progress-bar-padding.text-center.thin-progress-bar
|
||||
.progress-bar(role='progressbar', aria-valuenow=(challengeBlock.completed), aria-valuemin='0', aria-valuemax='100', style='width: ' + challengeBlock.completed + '%;')
|
||||
.col-xs-1.col-sm-1.col-md-1.map-row-numbers
|
||||
span.map-p.negative-10 #{i}.
|
||||
.col-xs-11.col-sm-8.col-md-9
|
||||
li.map-p.negative-10
|
||||
a(href='#' + challengeBlock.dashedName)= challengeBlock.name
|
||||
if challengeBlock.markNew
|
||||
span.text-info.small    
|
||||
strong
|
||||
em NEW
|
||||
if challengeBlock.isComingSoon
|
||||
span.text-info.small    
|
||||
strong
|
||||
em Coming Soon
|
||||
else
|
||||
.hidden-xs.col-sm-3.col-md-2
|
||||
span.negative-10
|
||||
.col-xs-1.col-sm-1.col-md-1.map-row-numbers
|
||||
span.map-p.negative-10 #{i}.
|
||||
.col-xs-10.col-sm-8.col-md-9
|
||||
span.map-p.negative-10
|
||||
a(href="/challenges/#{challenge.dashedName}")
|
||||
span.capitalize= challenge.type + ': '
|
||||
span= challenge.title
|
||||
span.sr-only= " Incomplete"
|
||||
if challenge.markNew
|
||||
span.text-danger.small    
|
||||
a(href='#' + challengeBlock.dashedName)= challengeBlock.name
|
||||
if challengeBlock.markNew
|
||||
span.text-info.small    
|
||||
strong
|
||||
em NEW
|
||||
if challengeBlock.isComingSoon
|
||||
span.text-info.small    
|
||||
strong
|
||||
em Coming Soon
|
||||
h1 Full Stack Development Certification
|
||||
.row
|
||||
.hidden-xs.col-sm-3.col-md-2.ion-locked.padded-ionic-icon.text-center.map-p.negative-10
|
||||
.col-xs-12.col-sm-9.col-md-10
|
||||
li.map-p.negative-10 Greefield Nonprofit Project 1
|
||||
.hidden-xs.col-sm-3.col-md-2.ion-locked.padded-ionic-icon.text-center.map-p.negative-10
|
||||
.col-xs-12.col-sm-9.col-md-10
|
||||
li.map-p.negative-10 Greefield Nonprofit Project 2
|
||||
.hidden-xs.col-sm-3.col-md-2.ion-locked.padded-ionic-icon.text-center.map-p.negative-10
|
||||
.col-xs-12.col-sm-9.col-md-10
|
||||
li.map-p.negative-10 Legacy Nonprofit Project 1
|
||||
.hidden-xs.col-sm-3.col-md-2.ion-locked.padded-ionic-icon.text-center.map-p.negative-10
|
||||
.col-xs-12.col-sm-9.col-md-10
|
||||
li.map-p.negative-10 Legacy Nonprofit Project 2
|
||||
.hidden-xs.col-sm-3.col-md-2.ion-locked.padded-ionic-icon.text-center.map-p.negative-10
|
||||
.col-xs-12.col-sm-9.col-md-10
|
||||
li.map-p.negative-10 Claim your Full Stack Development Certification
|
||||
|
||||
h1 Coding Interview Preparation
|
||||
.row
|
||||
.hidden-xs.col-sm-3.col-md-2.ion-locked.padded-ionic-icon.text-center.map-p.negative-10
|
||||
.col-xs-12.col-sm-9.col-md-10
|
||||
li.map-p.negative-10 Whiteboard Coding Interview Training
|
||||
.hidden-xs.col-sm-3.col-md-2.ion-locked.padded-ionic-icon.text-center.map-p.negative-10
|
||||
.col-xs-12.col-sm-9.col-md-10
|
||||
li.map-p.negative-10 Critical Thinking Interview Training
|
||||
.hidden-xs.col-sm-3.col-md-2.ion-locked.padded-ionic-icon.text-center.map-p.negative-10
|
||||
.col-xs-12.col-sm-9.col-md-10
|
||||
li.map-p.negative-10 Mock Interview 1
|
||||
.hidden-xs.col-sm-3.col-md-2.ion-locked.padded-ionic-icon.text-center.map-p.negative-10
|
||||
.col-xs-12.col-sm-9.col-md-10
|
||||
li.map-p.negative-10 Mock Interview 2
|
||||
.hidden-xs.col-sm-3.col-md-2.ion-locked.padded-ionic-icon.text-center.map-p.negative-10
|
||||
.col-xs-12.col-sm-9.col-md-10
|
||||
li.map-p.negative-10 Mock Interview 3
|
||||
|
||||
hr
|
||||
|
||||
for superBlock, index in superBlocks
|
||||
for challengeBlock in superBlock.blocks
|
||||
.row
|
||||
a(href='#' name=challengeBlock.dashedName)
|
||||
.spacer.negative-55
|
||||
|
||||
.row
|
||||
.hidden-xs.col-sm-3.col-md-2
|
||||
h3.text-primary.text-right.nowrap
|
||||
i.fa.fa-clock-o
|
||||
= challengeBlock.time
|
||||
.col-xs-12.col-sm-9.col-md-10
|
||||
h3 #{challengeBlock.name}  
|
||||
|
||||
- var i = 0
|
||||
for challenge in challengeBlock.challenges
|
||||
- i++
|
||||
.row
|
||||
if challenge.completed
|
||||
.hidden-xs.col-sm-3.col-md-2.text-primary.ion-checkmark-circled.padded-ionic-icon.text-center.map-p.negative-10
|
||||
.col-xs-1.col-sm-1.col-md-1.map-row-numbers
|
||||
span.map-p.negative-10 #{i}.
|
||||
.col-xs-10.col-sm-8.col-md-9
|
||||
span.faded.map-p.negative-10
|
||||
a(href="/challenges/#{challenge.dashedName}")
|
||||
span.capitalize= challenge.type + ': '
|
||||
span= challenge.title
|
||||
span.sr-only= " Complete"
|
||||
|
||||
else
|
||||
.hidden-xs.col-sm-3.col-md-2
|
||||
span.negative-10
|
||||
.col-xs-1.col-sm-1.col-md-1.map-row-numbers
|
||||
span.map-p.negative-10 #{i}.
|
||||
.col-xs-10.col-sm-8.col-md-9
|
||||
span.map-p.negative-10
|
||||
a(href="/challenges/#{challenge.dashedName}" class=challenge.isComingSoon ? 'disabled' : '')
|
||||
span.capitalize= challenge.type + ': '
|
||||
span= challenge.title
|
||||
span.sr-only= " Incomplete"
|
||||
if challenge.markNew
|
||||
span.text-info.small    
|
||||
strong
|
||||
em NEW
|
||||
if challengeBlock.isComingSoon
|
||||
span.text-info.small    
|
||||
strong
|
||||
em Coming Soon
|
||||
|
||||
if (challengeBlock.completed === 100)
|
||||
.button-spacer
|
||||
.row
|
||||
.col-xs-12.col-sm-8.col-md-6.col-sm-offset-3.col-md-offset-2.hidden
|
||||
a.btn.btn-lg.btn-block.signup-btn.map-challenge-block-share Section complete. Share your code portfolio with your friends.
|
||||
.hidden(id="#{challengeBlock.name}")
|
||||
|
||||
if (index < superBlocks.length - 1)
|
||||
.spacer
|
||||
hr
|
||||
.spacer
|
||||
|
||||
if (challengeBlock.completed === 100)
|
||||
.button-spacer
|
||||
.row
|
||||
.col-xs-12.col-sm-8.col-md-6.col-sm-offset-3.col-md-offset-2.hidden
|
||||
a.btn.btn-lg.btn-block.signup-btn.map-challenge-block-share Section complete. Share your code portfolio with your friends.
|
||||
.hidden(id="#{challengeBlock.name}")
|
||||
script.
|
||||
var username = !{JSON.stringify(user && user.username || '')};
|
||||
var lastCompleted = !{JSON.stringify(lastCompleted || false)}
|
||||
@ -185,4 +211,4 @@ block content
|
||||
}, 1000);
|
||||
localStorage.hideRedditNotice = "true";
|
||||
});
|
||||
});
|
||||
});
|
||||
|
Reference in New Issue
Block a user