Merge branch 'timestamp' into challenges
Conflicts: config/passport.js public/css/main.less
This commit is contained in:
15
app.js
15
app.js
@ -33,6 +33,10 @@ var userController = require('./controllers/user');
|
|||||||
var apiController = require('./controllers/api');
|
var apiController = require('./controllers/api');
|
||||||
var contactController = require('./controllers/contact');
|
var contactController = require('./controllers/contact');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* User model
|
||||||
|
*/
|
||||||
|
var User = require('./models/User');
|
||||||
/**
|
/**
|
||||||
* API keys and Passport configuration.
|
* API keys and Passport configuration.
|
||||||
*/
|
*/
|
||||||
@ -164,9 +168,18 @@ app.get('/account/unlink/:provider', userController.getOauthUnlink);
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* API examples routes.
|
* API examples routes.
|
||||||
|
* accepts a post request. the challenge id req.body.challengeNumber
|
||||||
|
* and updates user.challengesHash & user.challengesCompleted
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
app.post('/completed_challenge', function(req, res) {
|
app.post('/completed_challenge', function(req, res) {
|
||||||
req.user.challengesCompleted.push(parseInt(req.body.cn));
|
req.user.challengesHash[parseInt(req.body.challengeNumber)] = Math.round(+new Date() / 1000);
|
||||||
|
var ch = req.user.challengesHash;
|
||||||
|
var p = 0;
|
||||||
|
for (k in ch) {
|
||||||
|
if (ch[k] > 0) { p += 1}
|
||||||
|
}
|
||||||
|
req.user.points = p;
|
||||||
req.user.save();
|
req.user.save();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ exports.returnChallenge = function(req, res, next) {
|
|||||||
video: c.video,
|
video: c.video,
|
||||||
time: c.time,
|
time: c.time,
|
||||||
steps: c.steps,
|
steps: c.steps,
|
||||||
cc: req.user.challengesCompleted
|
cc: req.user.challengesHash
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
@ -6,7 +6,7 @@
|
|||||||
exports.index = function(req, res) {
|
exports.index = function(req, res) {
|
||||||
if (req.user) {
|
if (req.user) {
|
||||||
if (req.user.challengesCompleted.length > 0) {
|
if (req.user.challengesCompleted.length > 0) {
|
||||||
nextChallenge = Math.max.apply(Math, req.user.challengesCompleted) + 1;
|
nextChallenge = Math.max.apply(Math, req.user.challengesHash) + 1;
|
||||||
res.redirect("challenges/" + nextChallenge);
|
res.redirect("challenges/" + nextChallenge);
|
||||||
} else {
|
} else {
|
||||||
res.redirect("challenges/0");
|
res.redirect("challenges/0");
|
||||||
|
@ -5,6 +5,7 @@ var nodemailer = require('nodemailer');
|
|||||||
var passport = require('passport');
|
var passport = require('passport');
|
||||||
var User = require('../models/User');
|
var User = require('../models/User');
|
||||||
var secrets = require('../config/secrets');
|
var secrets = require('../config/secrets');
|
||||||
|
var moment = require('moment');
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GET /login
|
* GET /login
|
||||||
@ -130,7 +131,9 @@ exports.postEmailSignup = function(req, res, next) {
|
|||||||
|
|
||||||
exports.getAccount = function(req, res) {
|
exports.getAccount = function(req, res) {
|
||||||
res.render('account/profile', {
|
res.render('account/profile', {
|
||||||
title: 'Manage your Free Code Camp Account'
|
title: 'Manage your Free Code Camp Account',
|
||||||
|
cc: req.user.challengesHash,
|
||||||
|
moment: moment
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -14,8 +14,60 @@ var userSchema = new mongoose.Schema({
|
|||||||
instagram: String,
|
instagram: String,
|
||||||
linkedin: String,
|
linkedin: String,
|
||||||
tokens: Array,
|
tokens: Array,
|
||||||
|
points: { type: Number, default: 0 },
|
||||||
challengesCompleted: { type: Array, default: [] },
|
challengesCompleted: { type: Array, default: [] },
|
||||||
|
challengesHash: {
|
||||||
|
0: { type: Number, default: 0 },
|
||||||
|
1: { type: Number, default: 0 },
|
||||||
|
2: { type: Number, default: 0 },
|
||||||
|
3: { type: Number, default: 0 },
|
||||||
|
4: { type: Number, default: 0 },
|
||||||
|
5: { type: Number, default: 0 },
|
||||||
|
6: { type: Number, default: 0 },
|
||||||
|
7: { type: Number, default: 0 },
|
||||||
|
8: { type: Number, default: 0 },
|
||||||
|
9: { type: Number, default: 0 },
|
||||||
|
10: { type: Number, default: 0 },
|
||||||
|
11: { type: Number, default: 0 },
|
||||||
|
12: { type: Number, default: 0 },
|
||||||
|
13: { type: Number, default: 0 },
|
||||||
|
14: { type: Number, default: 0 },
|
||||||
|
15: { type: Number, default: 0 },
|
||||||
|
16: { type: Number, default: 0 },
|
||||||
|
17: { type: Number, default: 0 },
|
||||||
|
18: { type: Number, default: 0 },
|
||||||
|
19: { type: Number, default: 0 },
|
||||||
|
20: { type: Number, default: 0 },
|
||||||
|
21: { type: Number, default: 0 },
|
||||||
|
22: { type: Number, default: 0 },
|
||||||
|
23: { type: Number, default: 0 },
|
||||||
|
24: { type: Number, default: 0 },
|
||||||
|
25: { type: Number, default: 0 },
|
||||||
|
26: { type: Number, default: 0 },
|
||||||
|
27: { type: Number, default: 0 },
|
||||||
|
28: { type: Number, default: 0 },
|
||||||
|
29: { type: Number, default: 0 },
|
||||||
|
30: { type: Number, default: 0 },
|
||||||
|
31: { type: Number, default: 0 },
|
||||||
|
32: { type: Number, default: 0 },
|
||||||
|
33: { type: Number, default: 0 },
|
||||||
|
34: { type: Number, default: 0 },
|
||||||
|
35: { type: Number, default: 0 },
|
||||||
|
36: { type: Number, default: 0 },
|
||||||
|
37: { type: Number, default: 0 },
|
||||||
|
38: { type: Number, default: 0 },
|
||||||
|
39: { type: Number, default: 0 },
|
||||||
|
40: { type: Number, default: 0 },
|
||||||
|
41: { type: Number, default: 0 },
|
||||||
|
42: { type: Number, default: 0 },
|
||||||
|
43: { type: Number, default: 0 },
|
||||||
|
44: { type: Number, default: 0 },
|
||||||
|
45: { type: Number, default: 0 },
|
||||||
|
46: { type: Number, default: 0 },
|
||||||
|
47: { type: Number, default: 0 },
|
||||||
|
48: { type: Number, default: 0 },
|
||||||
|
49: { type: Number, default: 0 }
|
||||||
|
},
|
||||||
profile: {
|
profile: {
|
||||||
name: { type: String, default: '' },
|
name: { type: String, default: '' },
|
||||||
gender: { type: String, default: '' },
|
gender: { type: String, default: '' },
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
"connect-mongo": "^0.4.1",
|
"connect-mongo": "^0.4.1",
|
||||||
"cookie-parser": "^1.3.3",
|
"cookie-parser": "^1.3.3",
|
||||||
"csso": "^1.3.11",
|
"csso": "^1.3.11",
|
||||||
|
"dateformat": "^1.0.11",
|
||||||
"dotenv": "^0.4.0",
|
"dotenv": "^0.4.0",
|
||||||
"errorhandler": "^1.3.0",
|
"errorhandler": "^1.3.0",
|
||||||
"express": "^4.10.4",
|
"express": "^4.10.4",
|
||||||
@ -34,11 +35,12 @@
|
|||||||
"lastfm": "^0.9.2",
|
"lastfm": "^0.9.2",
|
||||||
"less": "^1.7.5",
|
"less": "^1.7.5",
|
||||||
"lodash": "^2.4.1",
|
"lodash": "^2.4.1",
|
||||||
"newrelic": "^1.13.3",
|
|
||||||
"lusca": "^1.0.2",
|
"lusca": "^1.0.2",
|
||||||
"method-override": "^2.3.0",
|
"method-override": "^2.3.0",
|
||||||
|
"moment": "^2.8.4",
|
||||||
"mongoose": "^3.8.19",
|
"mongoose": "^3.8.19",
|
||||||
"morgan": "^1.5.0",
|
"morgan": "^1.5.0",
|
||||||
|
"newrelic": "^1.13.3",
|
||||||
"node-foursquare": "^0.2.1",
|
"node-foursquare": "^0.2.1",
|
||||||
"node-linkedin": "^0.3.4",
|
"node-linkedin": "^0.3.4",
|
||||||
"nodemailer": "^1.3.0",
|
"nodemailer": "^1.3.0",
|
||||||
@ -51,8 +53,9 @@
|
|||||||
"passport-local": "^1.0.0",
|
"passport-local": "^1.0.0",
|
||||||
"passport-oauth": "^1.0.0",
|
"passport-oauth": "^1.0.0",
|
||||||
"passport-twitter": "^1.0.2",
|
"passport-twitter": "^1.0.2",
|
||||||
"sitemap": "^0.7.4",
|
|
||||||
"request": "^2.49.0",
|
"request": "^2.49.0",
|
||||||
|
"sitemap": "^0.7.4",
|
||||||
|
"strftime": "^0.8.2",
|
||||||
"stripe": "^3.0.2",
|
"stripe": "^3.0.2",
|
||||||
"tumblr.js": "^0.0.4",
|
"tumblr.js": "^0.0.4",
|
||||||
"twilio": "^1.9.0",
|
"twilio": "^1.9.0",
|
||||||
|
@ -275,6 +275,7 @@ ul {
|
|||||||
height: 100%;
|
height: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
<<<<<<< HEAD
|
||||||
.signup-btn.btn {
|
.signup-btn.btn {
|
||||||
background-color: #ffac33;
|
background-color: #ffac33;
|
||||||
background-image: linear-gradient(#ffcc4d, #ffac33);
|
background-image: linear-gradient(#ffcc4d, #ffac33);
|
||||||
@ -328,3 +329,11 @@ ul {
|
|||||||
.btn-big {
|
.btn-big {
|
||||||
font-size: 30px;
|
font-size: 30px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.table {
|
||||||
|
margin-left: -16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
thead {
|
||||||
|
font-size: 150%;
|
||||||
|
}
|
@ -20,14 +20,11 @@ $(document).ready(function() {
|
|||||||
$('#complete-dialog').modal('show');
|
$('#complete-dialog').modal('show');
|
||||||
l = location.pathname.split('/');
|
l = location.pathname.split('/');
|
||||||
cn = l[l.length - 1]
|
cn = l[l.length - 1]
|
||||||
|
console.log(cn);
|
||||||
$.ajax({
|
$.ajax({
|
||||||
type: 'POST',
|
type: 'POST',
|
||||||
data: {cn: cn},
|
data: {challengeNumber: cn},
|
||||||
url: '/completed_challenge/',
|
url: '/completed_challenge/'
|
||||||
success: function(data) {
|
|
||||||
console.log('success');
|
|
||||||
console.log(JSON.stringify(data));
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -33,6 +33,185 @@ block content
|
|||||||
span.ion-edit
|
span.ion-edit
|
||||||
| Update my profile
|
| Update my profile
|
||||||
|
|
||||||
|
h1 Completed Challenges
|
||||||
|
.col-xs-12
|
||||||
|
table.table.table-striped
|
||||||
|
thead
|
||||||
|
tr
|
||||||
|
th Challenge
|
||||||
|
th Date Finished
|
||||||
|
if cc[0] > 0
|
||||||
|
tr
|
||||||
|
td A One-minute Introduction to Free Code Camp
|
||||||
|
td=moment(cc[0], 'X').format("MMM DD, YYYY")
|
||||||
|
if cc[1] > 0
|
||||||
|
tr
|
||||||
|
td Enter the Free Code Camp Chat Room
|
||||||
|
td=moment(cc[1], 'X').format("MMM DD, YYYY")
|
||||||
|
if cc[2] > 0
|
||||||
|
tr
|
||||||
|
td Create a Website and Deploy it to the Internet
|
||||||
|
td=moment(cc[2], 'X').format("MMM DD, YYYY")
|
||||||
|
if cc[3] > 0
|
||||||
|
tr
|
||||||
|
td Install Github's Atom Text Editor
|
||||||
|
td=moment(cc[3], 'X').format("MMM DD, YYYY")
|
||||||
|
if cc[4] > 0
|
||||||
|
tr
|
||||||
|
td Modify and Redeploy Your Website
|
||||||
|
td=moment(cc[4], 'X').format("MMM DD, YYYY")
|
||||||
|
if cc[5] > 0
|
||||||
|
tr
|
||||||
|
td Add Dynamic Content to your Website
|
||||||
|
td=moment(cc[5], 'X').format("MMM DD, YYYY")
|
||||||
|
if cc[6] > 0
|
||||||
|
tr
|
||||||
|
td Codecademy's HTML & CSS track
|
||||||
|
td=moment(cc[6], 'X').format("MMM DD, YYYY")
|
||||||
|
if cc[7] > 0
|
||||||
|
tr
|
||||||
|
td Experiment with HTML and CSS in CodePen
|
||||||
|
td=moment(cc[7], 'X').format("MMM DD, YYYY")
|
||||||
|
if cc[8] > 0
|
||||||
|
tr
|
||||||
|
td Codecademy's jQuery track
|
||||||
|
td=moment(cc[8], 'X').format("MMM DD, YYYY")
|
||||||
|
if cc[9] > 0
|
||||||
|
tr
|
||||||
|
td Code School's Try jQuery
|
||||||
|
td=moment(cc[9], 'X').format("MMM DD, YYYY")
|
||||||
|
if cc[10] > 0
|
||||||
|
tr
|
||||||
|
td Code School's Discover DevTools
|
||||||
|
td=moment(cc[10], 'X').format("MMM DD, YYYY")
|
||||||
|
if cc[11] > 0
|
||||||
|
tr
|
||||||
|
td jQuery Exercises
|
||||||
|
td=moment(cc[11], 'X').format("MMM DD, YYYY")
|
||||||
|
if cc[12] > 0
|
||||||
|
tr
|
||||||
|
td Customize Bootstrap with Bootswatch
|
||||||
|
td=moment(cc[12], 'X').format("MMM DD, YYYY")
|
||||||
|
if cc[13] > 0
|
||||||
|
tr
|
||||||
|
td Inject Life with CSS Transformations
|
||||||
|
td=moment(cc[13], 'X').format("MMM DD, YYYY")
|
||||||
|
if cc[14] > 0
|
||||||
|
tr
|
||||||
|
td Codecademy's JavaScript track
|
||||||
|
td=moment(cc[14], 'X').format("MMM DD, YYYY")
|
||||||
|
if cc[15] > 0
|
||||||
|
tr
|
||||||
|
td Stanford's Introduction to Computer Science
|
||||||
|
td=moment(cc[15], 'X').format("MMM DD, YYYY")
|
||||||
|
if cc[16] > 0
|
||||||
|
tr
|
||||||
|
td Get Help The Hacker Way with RSAP
|
||||||
|
td=moment(cc[16], 'X').format("MMM DD, YYYY")
|
||||||
|
if cc[17] > 0
|
||||||
|
tr
|
||||||
|
td Learn Regular Expressions
|
||||||
|
td=moment(cc[17], 'X').format("MMM DD, YYYY")
|
||||||
|
if cc[18] > 0
|
||||||
|
tr
|
||||||
|
td Start Your First Pair Programming Session
|
||||||
|
td=moment(cc[18], 'X').format("MMM DD, YYYY")
|
||||||
|
if cc[19] > 0
|
||||||
|
tr
|
||||||
|
td Easy Algorithm Scripting Challenges on Coderbyte
|
||||||
|
td=moment(cc[19], 'X').format("MMM DD, YYYY")
|
||||||
|
if cc[20] > 0
|
||||||
|
tr
|
||||||
|
td Stanford's Relational Databases Mini-course
|
||||||
|
td=moment(cc[20], 'X').format("MMM DD, YYYY")
|
||||||
|
if cc[21] > 0
|
||||||
|
tr
|
||||||
|
td Stanford's SQL Mini-course
|
||||||
|
td=moment(cc[21], 'X').format("MMM DD, YYYY")
|
||||||
|
if cc[22] > 0
|
||||||
|
tr
|
||||||
|
td Stanford's JSON Mini-course
|
||||||
|
td=moment(cc[22], 'X').format("MMM DD, YYYY")
|
||||||
|
if cc[23] > 0
|
||||||
|
tr
|
||||||
|
td Medium Algorithm Scripting Challenges on Coderbyte
|
||||||
|
td=moment(cc[23], 'X').format("MMM DD, YYYY")
|
||||||
|
if cc[24] > 0
|
||||||
|
tr
|
||||||
|
td Build an Interview Question Machine
|
||||||
|
td=moment(cc[24], 'X').format("MMM DD, YYYY")
|
||||||
|
if cc[25] > 0
|
||||||
|
tr
|
||||||
|
td Build a Text-based Adventure
|
||||||
|
td=moment(cc[25], 'X').format("MMM DD, YYYY")
|
||||||
|
if cc[26] > 0
|
||||||
|
tr
|
||||||
|
td Hard Algorithm Scripting Challenges on Coderbyte
|
||||||
|
td=moment(cc[26], 'X').format("MMM DD, YYYY")
|
||||||
|
if cc[27] > 0
|
||||||
|
tr
|
||||||
|
td Code School's Try Git
|
||||||
|
td=moment(cc[27], 'X').format("MMM DD, YYYY")
|
||||||
|
if cc[28] > 0
|
||||||
|
tr
|
||||||
|
td Install Node.js
|
||||||
|
td=moment(cc[28], 'X').format("MMM DD, YYYY")
|
||||||
|
if cc[29] > 0
|
||||||
|
tr
|
||||||
|
td Clone a Github Repo
|
||||||
|
td=moment(cc[29], 'X').format("MMM DD, YYYY")
|
||||||
|
if cc[30] > 0
|
||||||
|
tr
|
||||||
|
td Deploy an app to Heroku
|
||||||
|
td=moment(cc[30], 'X').format("MMM DD, YYYY")
|
||||||
|
if cc[31] > 0
|
||||||
|
tr
|
||||||
|
td Code School's Real-time web with Node.JS
|
||||||
|
td=moment(cc[31], 'X').format("MMM DD, YYYY")
|
||||||
|
if cc[32] > 0
|
||||||
|
tr
|
||||||
|
td Try MongoDB
|
||||||
|
td=moment(cc[32], 'X').format("MMM DD, YYYY")
|
||||||
|
if cc[33] > 0
|
||||||
|
tr
|
||||||
|
td Explore your Network with the LinkedIn API
|
||||||
|
td=moment(cc[33], 'X').format("MMM DD, YYYY")
|
||||||
|
if cc[34] > 0
|
||||||
|
tr
|
||||||
|
td Build your first API
|
||||||
|
td=moment(cc[34], 'X').format("MMM DD, YYYY")
|
||||||
|
if cc[35] > 0
|
||||||
|
tr
|
||||||
|
td Aggregate Data with Chron Jobs and Screen Scraping
|
||||||
|
td=moment(cc[35], 'X').format("MMM DD, YYYY")
|
||||||
|
if cc[36] > 0
|
||||||
|
tr
|
||||||
|
td Code School's Shaping up with Angular.JS
|
||||||
|
td=moment(cc[36], 'X').format("MMM DD, YYYY")
|
||||||
|
if cc[37] > 0
|
||||||
|
tr
|
||||||
|
td Reverse Engineer SnapChat
|
||||||
|
td=moment(cc[37], 'X').format("MMM DD, YYYY")
|
||||||
|
if cc[38] > 0
|
||||||
|
tr
|
||||||
|
td Reverse Engineer Reddit
|
||||||
|
td=moment(cc[38], 'X').format("MMM DD, YYYY")
|
||||||
|
if cc[39] > 0
|
||||||
|
tr
|
||||||
|
td Reverse Engineer Pintrest
|
||||||
|
td=moment(cc[39], 'X').format("MMM DD, YYYY")
|
||||||
|
if cc[40] > 0
|
||||||
|
tr
|
||||||
|
td Help a Nonprofit: Team Project
|
||||||
|
td=moment(cc[40], 'X').format("MMM DD, YYYY")
|
||||||
|
if cc[41] > 0
|
||||||
|
tr
|
||||||
|
td Help a Nonprofit: Solo Project
|
||||||
|
td=moment(cc[41], 'X').format("MMM DD, YYYY")
|
||||||
|
if cc[42] > 0
|
||||||
|
tr
|
||||||
|
td Crack the Coding Interview
|
||||||
|
td=moment(cc[42], 'X').format("MMM DD, YYYY")
|
||||||
h3 Danger Zone
|
h3 Danger Zone
|
||||||
button.btn.btn-danger.confirm-deletion
|
button.btn.btn-danger.confirm-deletion
|
||||||
span.ion-trash-b
|
span.ion-trash-b
|
||||||
|
@ -4,133 +4,133 @@
|
|||||||
ol(start='0')
|
ol(start='0')
|
||||||
h4 Web Design
|
h4 Web Design
|
||||||
li
|
li
|
||||||
a(href="/challenges/0", class="#{ cc.indexOf(0) > -1 ? 'strikethrough' : '' }") A One-minute Introduction to Free Code Camp
|
a(href="/challenges/0", class="#{ cc[0] > 0 ? 'strikethrough' : '' }") A One-minute Introduction to Free Code Camp
|
||||||
| (1 min)
|
| (1 min)
|
||||||
li
|
li
|
||||||
a(href="/challenges/1", class="#{ cc.indexOf(1) > -1 ? 'strikethrough' : '' }") Enter the Free Code Camp Chat Room
|
a(href="/challenges/1", class="#{ cc[1] > 0 ? 'strikethrough' : '' }") Enter the Free Code Camp Chat Room
|
||||||
| (10 mins)
|
| (10 mins)
|
||||||
li
|
li
|
||||||
a(href="/challenges/2", class="#{ cc.indexOf(2) > -1 ? 'strikethrough' : '' }") Create a Website and Deploy it to the Internet
|
a(href="/challenges/2", class="#{ cc[2] > 0 ? 'strikethrough' : '' }") Create a Website and Deploy it to the Internet
|
||||||
| (5 mins)
|
| (5 mins)
|
||||||
li
|
li
|
||||||
a(href="/challenges/3", class="#{ cc.indexOf(3) > -1 ? 'strikethrough' : '' }") Install Github's Atom Text Editor
|
a(href="/challenges/3", class="#{ cc[3] > 0 ? 'strikethrough' : '' }") Install Github's Atom Text Editor
|
||||||
| (5 mins)
|
| (5 mins)
|
||||||
li
|
li
|
||||||
a(href="/challenges/4", class="#{ cc.indexOf(4) > -1 ? 'strikethrough' : '' }") Modify and Redeploy Your Website
|
a(href="/challenges/4", class="#{ cc[4] > 0 ? 'strikethrough' : '' }") Modify and Redeploy Your Website
|
||||||
| (5 mins)
|
| (5 mins)
|
||||||
li
|
li
|
||||||
a(href="/challenges/5", class="#{ cc.indexOf(5) > -1 ? 'strikethrough' : '' }") Add Dynamic Content to your Website
|
a(href="/challenges/5", class="#{ cc[5] > 0 ? 'strikethrough' : '' }") Add Dynamic Content to your Website
|
||||||
| (10 mins)
|
| (10 mins)
|
||||||
li
|
li
|
||||||
a(href="/challenges/6", class="#{ cc.indexOf(6) > -1 ? 'strikethrough' : '' }") Codecademy's HTML & CSS track
|
a(href="/challenges/6", class="#{ cc[6] > 0 ? 'strikethrough' : '' }") Codecademy's HTML & CSS track
|
||||||
| (7 hrs)
|
| (7 hrs)
|
||||||
li
|
li
|
||||||
a(href="/challenges/7", class="#{ cc.indexOf(7) > -1 ? 'strikethrough' : '' }") Experiment with HTML and CSS in CodePen
|
a(href="/challenges/7", class="#{ cc[7] > 0 ? 'strikethrough' : '' }") Experiment with HTML and CSS in CodePen
|
||||||
| (10 mins)
|
| (10 mins)
|
||||||
li
|
li
|
||||||
a(href="/challenges/8", class="#{ cc.indexOf(8) > -1 ? 'strikethrough' : '' }") Codecademy's jQuery track
|
a(href="/challenges/8", class="#{ cc[8] > 0 ? 'strikethrough' : '' }") Codecademy's jQuery track
|
||||||
| (3 hrs)
|
| (3 hrs)
|
||||||
li
|
li
|
||||||
a(href="/challenges/9", class="#{ cc.indexOf(9) > -1 ? 'strikethrough' : '' }") Code School's Try jQuery
|
a(href="/challenges/9", class="#{ cc[9] > 0 ? 'strikethrough' : '' }") Code School's Try jQuery
|
||||||
| (4 hrs)
|
| (4 hrs)
|
||||||
li
|
li
|
||||||
a(href="/challenges/10", class="#{ cc.indexOf(10) > -1 ? 'strikethrough' : '' }") Code School's Discover DevTools
|
a(href="/challenges/10", class="#{ cc[10] > 0 ? 'strikethrough' : '' }") Code School's Discover DevTools
|
||||||
| (2 hrs)
|
| (2 hrs)
|
||||||
li
|
li
|
||||||
a(href="/challenges/11", class="#{ cc.indexOf(11) > -1 ? 'strikethrough' : '' }") jQuery Exercises
|
a(href="/challenges/11", class="#{ cc[11] > 0 ? 'strikethrough' : '' }") jQuery Exercises
|
||||||
| (1 hr)
|
| (1 hr)
|
||||||
li
|
li
|
||||||
a(href="/challenges/12", class="#{ cc.indexOf(12) > -1 ? 'strikethrough' : '' }") Customize Bootstrap with Bootswatch
|
a(href="/challenges/12", class="#{ cc[12] > 0 ? 'strikethrough' : '' }") Customize Bootstrap with Bootswatch
|
||||||
| (10 mins)
|
| (10 mins)
|
||||||
li
|
li
|
||||||
a(href="/challenges/13", class="#{ cc.indexOf(13) > -1 ? 'strikethrough' : '' }") Inject Life with CSS Transformations
|
a(href="/challenges/13", class="#{ cc[13] > 0 ? 'strikethrough' : '' }") Inject Life with CSS Transformations
|
||||||
| (15 mins)
|
| (15 mins)
|
||||||
h4 Computer Science and JavaScript
|
h4 Computer Science and JavaScript
|
||||||
li
|
li
|
||||||
a(href="/challenges/14", class="#{ cc.indexOf(14) > -1 ? 'strikethrough' : '' }") Codecademy's JavaScript track
|
a(href="/challenges/14", class="#{ cc[14] > 0 ? 'strikethrough' : '' }") Codecademy's JavaScript track
|
||||||
| (10 hrs)
|
| (10 hrs)
|
||||||
li
|
li
|
||||||
a(href="/challenges/15", class="#{ cc.indexOf(15) > -1 ? 'strikethrough' : '' }") Stanford's Introduction to Computer Science
|
a(href="/challenges/15", class="#{ cc[15] > 0 ? 'strikethrough' : '' }") Stanford's Introduction to Computer Science
|
||||||
| (24 hrs)
|
| (24 hrs)
|
||||||
li
|
li
|
||||||
a(href="/challenges/16", class="#{ cc.indexOf(16) > -1 ? 'strikethrough' : '' }") Get Help The Hacker Way with RSAP
|
a(href="/challenges/16", class="#{ cc[16] > 0 ? 'strikethrough' : '' }") Get Help The Hacker Way with RSAP
|
||||||
| (30 mins)
|
| (30 mins)
|
||||||
li
|
li
|
||||||
a(href="/challenges/17", class="#{ cc.indexOf(17) > -1 ? 'strikethrough' : '' }") Learn Regular Expressions
|
a(href="/challenges/17", class="#{ cc[17] > 0 ? 'strikethrough' : '' }") Learn Regular Expressions
|
||||||
| (1 hr)
|
| (1 hr)
|
||||||
li
|
li
|
||||||
a(href="/challenges/18", class="#{ cc.indexOf(18) > -1 ? 'strikethrough' : '' }") Start Your First Pair Programming Session
|
a(href="/challenges/18", class="#{ cc[18] > 0 ? 'strikethrough' : '' }") Start Your First Pair Programming Session
|
||||||
| (30 mins | Pair)
|
| (30 mins | Pair)
|
||||||
li
|
li
|
||||||
a(href="/challenges/19", class="#{ cc.indexOf(19) > -1 ? 'strikethrough' : '' }") Easy Algorithm Scripting Challenges on Coderbyte
|
a(href="/challenges/19", class="#{ cc[19] > 0 ? 'strikethrough' : '' }") Easy Algorithm Scripting Challenges on Coderbyte
|
||||||
| (15 hrs | Pair)
|
| (15 hrs | Pair)
|
||||||
li
|
li
|
||||||
a(href="/challenges/20", class="#{ cc.indexOf(20) > -1 ? 'strikethrough' : '' }") Stanford's Relational Databases Mini-course
|
a(href="/challenges/20", class="#{ cc[20] > 0 ? 'strikethrough' : '' }") Stanford's Relational Databases Mini-course
|
||||||
| (1 hr)
|
| (1 hr)
|
||||||
li
|
li
|
||||||
a(href="/challenges/21", class="#{ cc.indexOf(21) > -1 ? 'strikethrough' : '' }") Stanford's SQL Mini-course
|
a(href="/challenges/21", class="#{ cc[21] > 0 ? 'strikethrough' : '' }") Stanford's SQL Mini-course
|
||||||
| (4 hrs | Pair)
|
| (4 hrs | Pair)
|
||||||
li
|
li
|
||||||
a(href="/challenges/22", class="#{ cc.indexOf(22) > -1 ? 'strikethrough' : '' }") Stanford's JSON Mini-course
|
a(href="/challenges/22", class="#{ cc[22] > 0 ? 'strikethrough' : '' }") Stanford's JSON Mini-course
|
||||||
| (1 hrs | Pair)
|
| (1 hrs | Pair)
|
||||||
li
|
li
|
||||||
a(href="/challenges/23", class="#{ cc.indexOf(23) > -1 ? 'strikethrough' : '' }") Medium Algorithm Scripting Challenges on Coderbyte
|
a(href="/challenges/23", class="#{ cc[23] > 0 ? 'strikethrough' : '' }") Medium Algorithm Scripting Challenges on Coderbyte
|
||||||
| (15 hrs | Pair)
|
| (15 hrs | Pair)
|
||||||
li
|
li
|
||||||
a.disabled(href="/challenges/24", class="#{ cc.indexOf(24) > -1 ? 'strikethrough' : '' }") Build an Interview Question Machine
|
a.disabled(href="/challenges/24", class="#{ cc[24] > 0 ? 'strikethrough' : '' }") Build an Interview Question Machine
|
||||||
| (5 hrs | Pair)
|
| (5 hrs | Pair)
|
||||||
li
|
li
|
||||||
a.disabled(href="/challenges/25", class="#{ cc.indexOf(25) > -1 ? 'strikethrough' : '' }") Build a Text-based Adventure
|
a.disabled(href="/challenges/25", class="#{ cc[25] > 0 ? 'strikethrough' : '' }") Build a Text-based Adventure
|
||||||
| (5 hrs | Pair)
|
| (5 hrs | Pair)
|
||||||
li
|
li
|
||||||
a.disabled(href="/challenges/26", class="#{ cc.indexOf(26) > -1 ? 'strikethrough' : '' }") Hard Algorithm Scripting Challenges on Coderbyte
|
a.disabled(href="/challenges/26", class="#{ cc[26] > 0 ? 'strikethrough' : '' }") Hard Algorithm Scripting Challenges on Coderbyte
|
||||||
| (15 hrs | Pair)
|
| (15 hrs | Pair)
|
||||||
h4 Full Stack JavaScript Development
|
h4 Full Stack JavaScript Development
|
||||||
li
|
li
|
||||||
a.disabled(href="/challenges/27", class="#{ cc.indexOf(27) > -1 ? 'strikethrough' : '' }") Code School's Try Git
|
a.disabled(href="/challenges/27", class="#{ cc[27] > 0 ? 'strikethrough' : '' }") Code School's Try Git
|
||||||
| (30 mins)
|
| (30 mins)
|
||||||
li
|
li
|
||||||
a.disabled(href="/challenges/28", class="#{ cc.indexOf(28) > -1 ? 'strikethrough' : '' }") Install Node.js
|
a.disabled(href="/challenges/28", class="#{ cc[28] > 0 ? 'strikethrough' : '' }") Install Node.js
|
||||||
| (1 hr)
|
| (1 hr)
|
||||||
li
|
li
|
||||||
a.disabled(href="/challenges/29", class="#{ cc.indexOf(29) > -1 ? 'strikethrough' : '' }") Clone a Github Repo
|
a.disabled(href="/challenges/29", class="#{ cc[29] > 0 ? 'strikethrough' : '' }") Clone a Github Repo
|
||||||
| (15 mins)
|
| (15 mins)
|
||||||
li
|
li
|
||||||
a.disabled(href="/challenges/30", class="#{ cc.indexOf(30) > -1 ? 'strikethrough' : '' }") Deploy an app to Heroku
|
a.disabled(href="/challenges/30", class="#{ cc[30] > 0 ? 'strikethrough' : '' }") Deploy an app to Heroku
|
||||||
| (15 mins)
|
| (15 mins)
|
||||||
li
|
li
|
||||||
a.disabled(href="/challenges/31", class="#{ cc.indexOf(31) > -1 ? 'strikethrough' : '' }") Code School's Real-time web with Node.JS
|
a.disabled(href="/challenges/31", class="#{ cc[31] > 0 ? 'strikethrough' : '' }") Code School's Real-time web with Node.JS
|
||||||
| (5 hrs)
|
| (5 hrs)
|
||||||
li
|
li
|
||||||
a.disabled(href="/challenges/32", class="#{ cc.indexOf(32) > -1 ? 'strikethrough' : '' }") Try MongoDB
|
a.disabled(href="/challenges/32", class="#{ cc[32] > 0 ? 'strikethrough' : '' }") Try MongoDB
|
||||||
| (30 mins)
|
| (30 mins)
|
||||||
li
|
li
|
||||||
a.disabled(href="/challenges/33", class="#{ cc.indexOf(33) > -1 ? 'strikethrough' : '' }") Explore your Network with the LinkedIn API
|
a.disabled(href="/challenges/33", class="#{ cc[33] > 0 ? 'strikethrough' : '' }") Explore your Network with the LinkedIn API
|
||||||
| (1 hr)
|
| (1 hr)
|
||||||
li
|
li
|
||||||
a.disabled(href="/challenges/34", class="#{ cc.indexOf(34) > -1 ? 'strikethrough' : '' }") Build your first API
|
a.disabled(href="/challenges/34", class="#{ cc[34] > 0 ? 'strikethrough' : '' }") Build your first API
|
||||||
| (10 hrs | Pair)
|
| (10 hrs | Pair)
|
||||||
li
|
li
|
||||||
a.disabled(href="/challenges/35", class="#{ cc.indexOf(35) > -1 ? 'strikethrough' : '' }") Aggregate Data with Chron Jobs and Screen Scraping
|
a.disabled(href="/challenges/35", class="#{ cc[35] > 0 ? 'strikethrough' : '' }") Aggregate Data with Chron Jobs and Screen Scraping
|
||||||
| (10 hrs | Pair)
|
| (10 hrs | Pair)
|
||||||
li
|
li
|
||||||
a.disabled(href="/challenges/36", class="#{ cc.indexOf(36) > -1 ? 'strikethrough' : '' }") Code School's Shaping up with Angular.JS
|
a.disabled(href="/challenges/36", class="#{ cc[36] > 0 ? 'strikethrough' : '' }") Code School's Shaping up with Angular.JS
|
||||||
| (5 hrs)
|
| (5 hrs)
|
||||||
li
|
li
|
||||||
a.disabled(href="/challenges/37", class="#{ cc.indexOf(37) > -1 ? 'strikethrough' : '' }") Reverse Engineer SnapChat
|
a.disabled(href="/challenges/37", class="#{ cc[37] > 0 ? 'strikethrough' : '' }") Reverse Engineer SnapChat
|
||||||
| (50 hrs | Pair)
|
| (50 hrs | Pair)
|
||||||
li
|
li
|
||||||
a.disabled(href="/challenges/38", class="#{ cc.indexOf(38) > -1 ? 'strikethrough' : '' }") Reverse Engineer Reddit
|
a.disabled(href="/challenges/38", class="#{ cc[38] > 0 ? 'strikethrough' : '' }") Reverse Engineer Reddit
|
||||||
| (50 hrs | Pair)
|
| (50 hrs | Pair)
|
||||||
li
|
li
|
||||||
a.disabled(href="/challenges/39", class="#{ cc.indexOf(39) > -1 ? 'strikethrough' : '' }") Reverse Engineer Pintrest
|
a.disabled(href="/challenges/39", class="#{ cc[39] > 0 ? 'strikethrough' : '' }") Reverse Engineer Pintrest
|
||||||
| (50 hrs | Pair)
|
| (50 hrs | Pair)
|
||||||
li
|
li
|
||||||
a.disabled(href="/challenges/40", class="#{ cc.indexOf(40) > -1 ? 'strikethrough' : '' }") Help a Nonprofit: Team Project
|
a.disabled(href="/challenges/40", class="#{ cc[40] > 0 ? 'strikethrough' : '' }") Help a Nonprofit: Team Project
|
||||||
| (150 hrs | Pair)
|
| (150 hrs | Pair)
|
||||||
li
|
li
|
||||||
a.disabled(href="/challenges/41", class="#{ cc.indexOf(41) > -1 ? 'strikethrough' : '' }") Help a Nonprofit: Solo Project
|
a.disabled(href="/challenges/41", class="#{ cc[41] > 0 ? 'strikethrough' : '' }") Help a Nonprofit: Solo Project
|
||||||
| (150 hrs | Pair)
|
| (150 hrs | Pair)
|
||||||
li
|
li
|
||||||
a.disabled(href="/challenges/42", class="#{ cc.indexOf(42) > -1 ? 'strikethrough' : '' }") Crack the Coding Interview
|
a.disabled(href="/challenges/42", class="#{ cc[42] > 0 ? 'strikethrough' : '' }") Crack the Coding Interview
|
||||||
| (5 hrs)
|
| (5 hrs)
|
@ -34,6 +34,7 @@
|
|||||||
ul
|
ul
|
||||||
p.landing-p It takes about 1,000 hours of coding to develop the skills you'll need to get an entry level software engineering job. Many in-person coding bootcamps jam all this into 12 weeks of intensive study. Free Code Camp is fully online, and there will always be other people at your skill level that you can pair program with, so you can learn at your own pace. Here are some example coding schedules:
|
p.landing-p It takes about 1,000 hours of coding to develop the skills you'll need to get an entry level software engineering job. Many in-person coding bootcamps jam all this into 12 weeks of intensive study. Free Code Camp is fully online, and there will always be other people at your skill level that you can pair program with, so you can learn at your own pace. Here are some example coding schedules:
|
||||||
table.table
|
table.table
|
||||||
|
thead
|
||||||
th Time budgeted
|
th Time budgeted
|
||||||
th Hours per week
|
th Hours per week
|
||||||
th Weeks to complete
|
th Weeks to complete
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
img(src='#{user.profile.picture}')
|
img(src='#{user.profile.picture}')
|
||||||
else
|
else
|
||||||
img(src='#{user.gravatar(60)}')
|
img(src='#{user.gravatar(60)}')
|
||||||
| #{user.profile.name || user.email || user.id} [ #{user.challengesCompleted.length} ]
|
| #{user.profile.name || user.email || user.id} [ #{user.points} ]
|
||||||
i.caret
|
i.caret
|
||||||
ul.dropdown-menu
|
ul.dropdown-menu
|
||||||
li
|
li
|
||||||
|
Reference in New Issue
Block a user