Update routes for all static pages and leave redirects for existing routes to get to new wiki routes
This commit is contained in:
127
app.js
127
app.js
@ -234,57 +234,121 @@ app.use(express.static(__dirname + '/public', { maxAge: 86400000 }));
|
||||
*/
|
||||
|
||||
app.get('/', homeController.index);
|
||||
app.get('/privacy', resourcesController.privacy);
|
||||
|
||||
app.get('/privacy', function(req, res) {
|
||||
res.redirect(301, "/wiki/free-code-camp's-privacy-policy");
|
||||
});
|
||||
|
||||
app.get('/nonprofit-project-instructions', function(req, res) {
|
||||
res.redirect(301, "/wiki/free-code-camp's-privacy-policy");
|
||||
});
|
||||
|
||||
app.get('/jquery-exercises', resourcesController.jqueryExercises);
|
||||
|
||||
app.get('/chat', resourcesController.chat);
|
||||
app.get('/live-pair-programming', resourcesController.livePairProgramming);
|
||||
app.get('/install-screenhero', resourcesController.installScreenHero);
|
||||
app.get('/javascript-in-your-inbox', resourcesController.javaScriptInYourInbox);
|
||||
app.get('/guide-to-our-nonprofit-projects', resourcesController.guideToOurNonprofitProjects);
|
||||
app.get('/chromebook', resourcesController.chromebook);
|
||||
app.get('/deploy-a-website', resourcesController.deployAWebsite);
|
||||
app.get('/gmail-shortcuts', resourcesController.gmailShortcuts);
|
||||
app.get('/nodeschool-challenges', resourcesController.nodeSchoolChallenges);
|
||||
|
||||
app.get('/live-pair-programming', function(req, res) {
|
||||
res.redirect(301, '/wiki/live-stream-pair-programming-on-twitch.tv');
|
||||
});
|
||||
|
||||
app.get('/install-screenhero', function(req, res) {
|
||||
res.redirect(301, '/wiki/install-screenhero');
|
||||
});
|
||||
|
||||
app.get('/guide-to-our-nonprofit-projects', function(req, res) {
|
||||
res.redirect(301, '/wiki/a-guide-to-our-nonprofit-projects');
|
||||
});
|
||||
|
||||
app.get('/chromebook', function(req, res) {
|
||||
res.redirect(301, '/wiki/chromebook');
|
||||
});
|
||||
|
||||
app.get('/deploy-a-website', function(req, res) {
|
||||
res.redirect(301, '/wiki/deploy-a-website');
|
||||
});
|
||||
|
||||
app.get('/gmail-shortcuts', function(req, res) {
|
||||
res.redirect(301, '/wiki/gmail-shortcuts');
|
||||
});
|
||||
|
||||
app.get('/nodeschool-challenges', function(req, res) {
|
||||
res.redirect(301, '/wiki/nodeschool-challenges');
|
||||
});
|
||||
|
||||
app.get('/stats', function(req, res) {
|
||||
res.redirect(301, '/learn-to-code');
|
||||
});
|
||||
app.get('/news', function(req, res) {
|
||||
res.redirect(301, '/stories/hot');
|
||||
});
|
||||
app.get('/learn-to-code', resourcesController.about);
|
||||
|
||||
app.get('/about', function(req, res) {
|
||||
res.redirect(301, '/learn-to-code');
|
||||
});
|
||||
|
||||
app.get('/learn-to-code', resourcesController.about);
|
||||
|
||||
app.get('/news', function(req, res) {
|
||||
res.redirect(301, '/stories/hot');
|
||||
});
|
||||
|
||||
app.get('/signin', userController.getSignin);
|
||||
|
||||
app.get('/login', function(req, res) {
|
||||
res.redirect(301, '/signin');
|
||||
});
|
||||
|
||||
app.post('/signin', userController.postSignin);
|
||||
|
||||
app.get('/signout', userController.signout);
|
||||
|
||||
app.get('/logout', function(req, res) {
|
||||
res.redirect(301, '/signout');
|
||||
});
|
||||
|
||||
app.get('/forgot', userController.getForgot);
|
||||
|
||||
app.post('/forgot', userController.postForgot);
|
||||
|
||||
app.get('/reset/:token', userController.getReset);
|
||||
|
||||
app.post('/reset/:token', userController.postReset);
|
||||
|
||||
app.get('/email-signup', userController.getEmailSignup);
|
||||
|
||||
app.get('/email-signin', userController.getEmailSignin);
|
||||
|
||||
app.post('/email-signup', userController.postEmailSignup);
|
||||
|
||||
app.post('/email-signin', userController.postSignin);
|
||||
|
||||
/**
|
||||
* Nonprofit Project routes.
|
||||
*/
|
||||
|
||||
app.get('/nonprofits', contactController.getNonprofitsForm);
|
||||
|
||||
app.post('/nonprofits', contactController.postNonprofitsForm);
|
||||
|
||||
app.get('/nonprofits/home', nonprofitController.nonprofitsHome);
|
||||
|
||||
app.get('/nonprofits/are-you-with-a-registered-nonprofit', nonprofitController.areYouWithARegisteredNonprofit);
|
||||
|
||||
app.get('/nonprofits/are-there-people-that-are-already-benefiting-from-your-services', nonprofitController.areTherePeopleThatAreAlreadyBenefitingFromYourServices);
|
||||
|
||||
app.get('/nonprofits/in-exchange-we-ask', nonprofitController.inExchangeWeAsk);
|
||||
|
||||
app.get('/nonprofits/ok-with-javascript', nonprofitController.okWithJavaScript);
|
||||
|
||||
app.get('/nonprofits/how-can-free-code-camp-help-you', nonprofitController.howCanFreeCodeCampHelpYou);
|
||||
|
||||
app.get('/nonprofits/what-does-your-nonprofit-do', nonprofitController.whatDoesYourNonprofitDo);
|
||||
|
||||
app.get('/nonprofits/link-us-to-your-website', nonprofitController.linkUsToYourWebsite);
|
||||
|
||||
app.get('/nonprofits/tell-us-your-name', nonprofitController.tellUsYourName);
|
||||
|
||||
app.get('/nonprofits/tell-us-your-email', nonprofitController.tellUsYourEmail);
|
||||
|
||||
app.get('/nonprofits/your-nonprofit-project-application-has-been-submitted', nonprofitController.yourNonprofitProjectApplicationHasBeenSubmitted);
|
||||
|
||||
app.get('/nonprofits/other-solutions', nonprofitController.otherSolutions);
|
||||
|
||||
app.get(
|
||||
@ -297,11 +361,6 @@ app.post(
|
||||
passportConf.isAuthenticated,
|
||||
contactController.postDoneWithFirst100Hours
|
||||
);
|
||||
app.get(
|
||||
'/nonprofit-project-instructions',
|
||||
passportConf.isAuthenticated,
|
||||
resourcesController.nonprofitProjectInstructions
|
||||
);
|
||||
app.post(
|
||||
'/update-progress',
|
||||
passportConf.isAuthenticated,
|
||||
@ -309,7 +368,7 @@ app.post(
|
||||
);
|
||||
|
||||
/**
|
||||
* Main routes.
|
||||
* Camper News routes.
|
||||
*/
|
||||
app.get(
|
||||
'/stories/hotStories',
|
||||
@ -395,6 +454,7 @@ app.post(
|
||||
);
|
||||
|
||||
app.all('/account', passportConf.isAuthenticated);
|
||||
|
||||
app.get('/account/api', userController.getAccountAngular);
|
||||
|
||||
/**
|
||||
@ -402,7 +462,9 @@ app.get('/account/api', userController.getAccountAngular);
|
||||
*/
|
||||
|
||||
app.get('/api/github', resourcesController.githubCalls);
|
||||
|
||||
app.get('/api/blogger', resourcesController.bloggerCalls);
|
||||
|
||||
app.get('/api/trello', resourcesController.trelloCalls);
|
||||
|
||||
/**
|
||||
@ -410,16 +472,24 @@ app.get('/api/trello', resourcesController.trelloCalls);
|
||||
*/
|
||||
|
||||
app.get('/bonfires/getBonfireList', bonfireController.showAllBonfires);
|
||||
|
||||
app.get('/playground', bonfireController.index);
|
||||
|
||||
app.get('/bonfires', bonfireController.returnNextBonfire);
|
||||
|
||||
app.get('/bonfire-json-generator', bonfireController.returnGenerator);
|
||||
|
||||
app.post('/bonfire-json-generator', bonfireController.generateChallenge);
|
||||
|
||||
app.get('/bonfire-challenge-generator', bonfireController.publicGenerator);
|
||||
|
||||
app.post('/bonfire-challenge-generator', bonfireController.testBonfire)
|
||||
|
||||
app.get(
|
||||
'/bonfires/:bonfireName',
|
||||
bonfireController.returnIndividualBonfire
|
||||
);
|
||||
|
||||
app.get('/bonfire', function(req, res) {
|
||||
res.redirect(301, '/playground');
|
||||
});
|
||||
@ -445,24 +515,36 @@ app.post('/completed-bonfire/', bonfireController.completedBonfire);
|
||||
*/
|
||||
|
||||
app.get('/challenges/', coursewareController.returnNextCourseware);
|
||||
|
||||
app.get('/challenges/getCoursewareList', coursewareController.showAllCoursewares);
|
||||
|
||||
app.get(
|
||||
'/challenges/:coursewareName',
|
||||
coursewareController.returnIndividualCourseware
|
||||
);
|
||||
|
||||
app.post('/completed-courseware/', coursewareController.completedCourseware);
|
||||
|
||||
app.post('/completed-zipline-or-basejump',
|
||||
coursewareController.completedZiplineOrBasejump);
|
||||
|
||||
// Unique Check API route
|
||||
app.get('/api/checkUniqueUsername/:username', userController.checkUniqueUsername);
|
||||
|
||||
app.get('/api/checkExistingUsername/:username', userController.checkExistingUsername);
|
||||
|
||||
app.get('/api/checkUniqueEmail/:email', userController.checkUniqueEmail);
|
||||
|
||||
app.get('/account', userController.getAccount);
|
||||
|
||||
app.post('/account/profile', userController.postUpdateProfile);
|
||||
|
||||
app.post('/account/password', userController.postUpdatePassword);
|
||||
|
||||
app.post('/account/delete', userController.postDeleteAccount);
|
||||
|
||||
app.get('/account/unlink/:provider', userController.getOauthUnlink);
|
||||
|
||||
app.get('/sitemap.xml', resourcesController.sitemap);
|
||||
/**
|
||||
* OAuth sign-in routes.
|
||||
@ -474,6 +556,7 @@ var passportOptions = {
|
||||
};
|
||||
|
||||
app.get('/auth/twitter', passport.authenticate('twitter'));
|
||||
|
||||
app.get(
|
||||
'/auth/twitter/callback',
|
||||
passport.authenticate('twitter', {
|
||||
@ -507,6 +590,7 @@ app.get(
|
||||
);
|
||||
|
||||
app.get('/auth/github', passport.authenticate('github'));
|
||||
|
||||
app.get(
|
||||
'/auth/github/callback',
|
||||
passport.authenticate('github', passportOptions), function (req, res) {
|
||||
@ -518,6 +602,7 @@ app.get(
|
||||
'/auth/google',
|
||||
passport.authenticate('google', {scope: 'profile email'})
|
||||
);
|
||||
|
||||
app.get(
|
||||
'/auth/google/callback',
|
||||
passport.authenticate('google', passportOptions), function (req, res) {
|
||||
@ -525,10 +610,6 @@ app.get(
|
||||
}
|
||||
);
|
||||
|
||||
app.get('/induce-vomiting', function(req, res, next) {
|
||||
next(new Error('vomiting induced'));
|
||||
});
|
||||
|
||||
// put this route last
|
||||
app.get(
|
||||
'/:username',
|
||||
|
@ -78,87 +78,18 @@ module.exports = {
|
||||
});
|
||||
},
|
||||
|
||||
deployAWebsite: function deployAWebsite(req, res) {
|
||||
res.render('resources/deploy-a-website', {
|
||||
title: 'Deploy a Dynamic Website in 7 Minutes'
|
||||
});
|
||||
},
|
||||
|
||||
chat: function chat(req, res) {
|
||||
res.render('resources/chat', {
|
||||
title: "Enter Free Code Camp's Chat Rooms"
|
||||
});
|
||||
},
|
||||
|
||||
nonprofitProjectInstructions: function nonprofitProjectInstructions(req, res) {
|
||||
res.render('resources/nonprofit-project-instructions', {
|
||||
title: 'Nonprofit Project Instructions'
|
||||
});
|
||||
},
|
||||
|
||||
gmailShortcuts: function gmailShortcuts(req, res) {
|
||||
res.render('resources/gmail-shortcuts', {
|
||||
title: 'These Gmail Shortcuts will save you Hours'
|
||||
});
|
||||
},
|
||||
|
||||
guideToOurNonprofitProjects: function guideToOurNonprofitProjects(req, res) {
|
||||
res.render('resources/guide-to-our-nonprofit-projects', {
|
||||
title: 'A guide to our Nonprofit Projects'
|
||||
});
|
||||
},
|
||||
|
||||
chromebook: function chromebook(req, res) {
|
||||
res.render('resources/chromebook', {
|
||||
title: 'Win a Chromebook'
|
||||
});
|
||||
},
|
||||
|
||||
jqueryExercises: function jqueryExercises(req, res) {
|
||||
res.render('resources/jquery-exercises', {
|
||||
title: 'jQuery Exercises'
|
||||
});
|
||||
},
|
||||
|
||||
livePairProgramming: function(req, res) {
|
||||
res.render('resources/live-pair-programming', {
|
||||
title: 'Live Pair Programming'
|
||||
});
|
||||
},
|
||||
|
||||
installScreenHero: function(req, res) {
|
||||
res.render('resources/install-screenhero', {
|
||||
title: 'Install ScreenHero'
|
||||
});
|
||||
},
|
||||
|
||||
javaScriptInYourInbox: function(req, res) {
|
||||
res.render('resources/javascript-in-your-inbox', {
|
||||
title: 'JavaScript in your Inbox'
|
||||
});
|
||||
},
|
||||
|
||||
nodeSchoolChallenges: function(req, res) {
|
||||
res.render('resources/nodeschool-challenges', {
|
||||
title: 'NodeSchool Challenges'
|
||||
});
|
||||
},
|
||||
|
||||
trelloCalls: function(req, res, next) {
|
||||
request('https://trello.com/1/boards/BA3xVpz9/cards?key=' + secrets.trello.key, function(err, status, trello) {
|
||||
if (err) { return next(err); }
|
||||
trello = (status && status.statusCode == 200) ? (JSON.parse(trello)) : "Can't connect to to Trello";
|
||||
res.end(JSON.stringify(trello));
|
||||
});
|
||||
},
|
||||
bloggerCalls: function(req, res, next) {
|
||||
request('https://www.googleapis.com/blogger/v3/blogs/2421288658305323950/posts?key=' + secrets.blogger.key, function (err, status, blog) {
|
||||
if (err) { return next(err); }
|
||||
blog = (status && status.statusCode == 200) ? JSON.parse(blog) : "Can't connect to Blogger";
|
||||
res.end(JSON.stringify(blog));
|
||||
});
|
||||
},
|
||||
|
||||
githubCalls: function(req, res) {
|
||||
var githubHeaders = {headers: {'User-Agent': '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'}, port:80 };
|
||||
request('https://api.github.com/repos/freecodecamp/freecodecamp/pulls?client_id=' + secrets.github.clientID + '&client_secret=' + secrets.github.clientSecret, githubHeaders, function(err, status1, pulls) {
|
||||
@ -177,6 +108,7 @@ module.exports = {
|
||||
res.end(JSON.stringify(trello));
|
||||
});
|
||||
},
|
||||
|
||||
bloggerCalls: function(req, res, next) {
|
||||
request('https://www.googleapis.com/blogger/v3/blogs/2421288658305323950/posts?key=' + secrets.blogger.key, function (err, status, blog) {
|
||||
if (err) { return next(err); }
|
||||
@ -270,7 +202,6 @@ module.exports = {
|
||||
});
|
||||
},
|
||||
|
||||
|
||||
randomPhrase: function() {
|
||||
var phrases = resources.phrases;
|
||||
return phrases[Math.floor(Math.random() * phrases.length)];
|
||||
@ -300,6 +231,7 @@ module.exports = {
|
||||
return elem._id;
|
||||
});
|
||||
},
|
||||
|
||||
allBonfireNames: function() {
|
||||
return bonfires.map(function(elem) {
|
||||
return {
|
||||
@ -319,6 +251,25 @@ module.exports = {
|
||||
});
|
||||
},
|
||||
|
||||
allBonfireNames: function() {
|
||||
return bonfires.map(function(elem) {
|
||||
return {
|
||||
name: elem.name,
|
||||
difficulty: elem.difficulty,
|
||||
_id: elem._id
|
||||
}
|
||||
})
|
||||
.sort(function(a, b) {
|
||||
return a.difficulty - b.difficulty;
|
||||
})
|
||||
.map (function(elem) {
|
||||
return {
|
||||
name : elem.name,
|
||||
_id: elem._id
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
getAllCourses: function() {
|
||||
"use strict";
|
||||
return coursewares;
|
||||
@ -338,6 +289,7 @@ module.exports = {
|
||||
return elem._id;
|
||||
});
|
||||
},
|
||||
|
||||
allCoursewareNames: function() {
|
||||
return coursewares.map(function(elem) {
|
||||
return {
|
||||
@ -356,9 +308,11 @@ module.exports = {
|
||||
};
|
||||
});
|
||||
},
|
||||
|
||||
whichEnvironment: function() {
|
||||
return process.env.NODE_ENV;
|
||||
},
|
||||
|
||||
getURLTitle: function(url, callback) {
|
||||
(function () {
|
||||
var result = {title: '', image: '', url: '', description: ''};
|
||||
@ -379,6 +333,7 @@ module.exports = {
|
||||
});
|
||||
})();
|
||||
},
|
||||
|
||||
updateUserStoryPictures: function(userId, picture, username, cb) {
|
||||
|
||||
var counter = 0,
|
||||
|
@ -21,5 +21,281 @@
|
||||
" </h3>",
|
||||
"</div><a href=\"/login\" class=\"btn btn-cta signup-btn btn-primary\">Start learning to code (it's free)<br/></a>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"_id": "bd7158d9c443eddfaeb5bdef",
|
||||
"name": "Win a Chromebook for Christmas",
|
||||
"description": [
|
||||
"<h2 class=\"text-center\">Thanks to everyone who participated in our Chromebook giveaway.</h2>",
|
||||
"<script src=\"//widget-prime.rafflecopter.com/launch.js\"></script><a id=\"rcwidget_a7khonhd\" href=\"http://www.rafflecopter.com/rafl/display/d70901b10/\" rel=\"nofollow\" data-raflid=\"d70901b10\" data-theme=\"classic\" data-template=\"\" class=\"rcptr\">a Rafflecopter giveaway</a>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"_id": "bd7158d9c445eddfaeb5bdef",
|
||||
"name": "Gmail Zero Inbox Shortcuts",
|
||||
"description": [
|
||||
"<h2 class='text-center'>These Gmail Shortcuts will save you hours and help you get to Zero Inbox</h2><br/>",
|
||||
"<div class=\"embed-responsive embed-responsive-16by9\">",
|
||||
" <iframe src=\"//player.vimeo.com/video/115194016\" class=\"embed-responsive-item\"></iframe>",
|
||||
"</div>",
|
||||
"<div class=\"col-xs-12 col-sm-10 col-sm-offset-1 text-left\">",
|
||||
" <h3>The shortcuts:",
|
||||
" <ul>",
|
||||
" <li>j - move down</li>",
|
||||
" <li>k - move up</li>",
|
||||
" <li>o - open</li>",
|
||||
" <li>r - reply</li>",
|
||||
" <li>a - reply all</li>",
|
||||
" <li>f - forward</li>",
|
||||
" <li>c - compose</li>",
|
||||
" <li>x - select</li>",
|
||||
" <li>e - archive</li>",
|
||||
" <li>! - mark spam</li>",
|
||||
" <li>z - undo</li>",
|
||||
" </ul>",
|
||||
" </h3>",
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"_id": "bd7158d9c446eddfaeb5bdef",
|
||||
"name": "A Guide to our Nonprofit Projects",
|
||||
"description": [
|
||||
"<div class='col-xs-12 col-sm-10 col-sm-offset-1'>",
|
||||
"<h2>Building nonprofit projects is the main way that our campers learn full stack JavaScript and agile software development. Once you complete the Free Code Camp challenges and Bonfire challenges, you'll begin this process.</p>",
|
||||
"<p>Once you've finished all the challenges, click the \"I'm done with all the challenges\" button, which will become enabled. We will prompt you for your email address, then give you further instructions on our  <a href=\"http://www.freecodecamp.com/nonprofit-project-instructions\">Nonprofit Projects Instructions page</a>.</p>",
|
||||
"<p>We will add you to our  <a href=\"https://trello.com/b/BA3xVpz9/nonprofit-projects\">Nonprofit Project Trello board</a>.</p>",
|
||||
"<h2>Starting with the end in mind</h2>",
|
||||
"<p>Our goal at Free Code Camp is to help you land a job as a junior software developer (or, if you prefer, a 'pivot job' that leads your current career in a more technical direction).</p>",
|
||||
"<p>You'll continue to work on nonprofit projects until you've built a sufficiently impressive portfolio and references to start your job search. Your portfolio will ultimately have three to five nonprofit projects. We estimate that the 900 hours of nonprofit projects you're going to complete, in addition to the 100 hours of challenges you've already completed, will be enough to qualify you for your first coding job. This will produce a much broader portfolio than a traditional coding bootcamp, which generally only has one or two capstone projects.</p>",
|
||||
"<h2>Choosing your first Nonprofit Project</h2>",
|
||||
"<p>We've categorized all the nonprofit projects by estimated time investment per camper: 100 hours, 200 hours, and 300 hours. These are only rough estimates.</p>",
|
||||
"<p>Example: if you and the camper you're paired up with (your pair) each stated you could work 20 hours per week (on the  <a href=\"http://goo.gl/forms/f61dLt67t8\">form you filled out</a>). If the project is a 100 hour per camper project, you should be able to complete it in about 5 weeks.</p>",
|
||||
"<p>Our team of nonprofit project camp counselors will match you and your pair based on:",
|
||||
" <ol>",
|
||||
" <li>Your estimated time commitment (10, 20 or 40 hours per week)</li>",
|
||||
" <li>Your time zone</li>",
|
||||
" <li>The nonprofit projects you've chosen</li>",
|
||||
" <li>Prior coding experience (we'd like both campers to be able to contribute equally)</li>",
|
||||
" </ol>",
|
||||
"</p>",
|
||||
"<p>We won't take age or gender into account. This will provide you with valuable experience in meshing with diverse teams, which is a reality of the contemporary workplace.</p>",
|
||||
"<p>You'll only work on one project at a time. Once you start a nonprofit project, we'll remove you from all other nonprofit project Trello cards. There's a good chance those projects will no longer be available when you finish your current project, anyway. Don't worry, though - we get new nonprofit project requests every day, so there will be plenty more projects for you to consider after you finish your current one.</p>",
|
||||
"<h2>Finalizing the Project</h2>",
|
||||
"<p>Before you can start working on the project, our team of Nonprofit Project Coordinators will go through the following process:",
|
||||
" <ol>",
|
||||
" <li>We'll wait until there are two campers who have chosen the same project and look like they're a good match for one another based on the factors mentioned above.</li>",
|
||||
" <li>We'll call the stakeholder to confirm once again that he or she agrees with our  <a href=\"freecodecamp.com/nonprofits\">terms  </a>and has signed our  <a href=\"http://goo.gl/forms/0YKkd9bpcR\">Nonprofit Project Stakeholder Pledge</a>.</li>",
|
||||
" <li>We'll set an initial meeting with representatives from Free Code Camp, the two campers, and the stakeholder.</li>",
|
||||
" <li>If the stakeholder and both campers shows up promptly, and seem enthusiastic and professional, we'll start the project.</li>",
|
||||
" </ol>",
|
||||
"</p>",
|
||||
"<p>This lengthy process serves an important purpose: it reduces the likelihood that any of our campers or stakeholders will waste their precious time.</p>",
|
||||
"<h2>Nonprofit Stakeholders</h2>",
|
||||
"<p>Each nonprofit project was submitted by a nonprofit. A representative from this nonprofit has agreed to serve as a \"stakeholder\" - an authorative person who understands the organization and its needs for this particular project.</p>",
|
||||
"<p>Stakeholders have a deep understanding of their organizations' needs. Campers will work with them to figure out the best solutions to these needs.</p>",
|
||||
"<p>When you and your pair first speak with your nonprofit stakeholder, you'll:",
|
||||
" <ul>",
|
||||
" <li>talk at length to better understand their needs.</li>",
|
||||
" <li>create a new Trello board and use it to prioritize what needs to be built.</li>",
|
||||
" <li>and establish deadlines based on your weekly time commitment, and how long you think each task will take.</li>",
|
||||
" </ul>",
|
||||
"</p>",
|
||||
"<p>It's notoriously difficult to estimate how long building software projects will take, so feel free to ask camp counselors for help.</p>",
|
||||
"<p>You'll continue to meet with your stakeholder at least twice a month in your project's Gitter channel.</p>",
|
||||
"<p>You should also ask questions in your project's Gitter channel as they come up throughout the week, and your stakeholder can answer them asynchronously.</p>",
|
||||
"<p>Getting \"blocked\" on a task can take away your sense of forward momentum, so be sure to proactively seek answers to any ambiguities you encounter.</p>",
|
||||
"<p>Ultimately, the project will be considered complete once both the stakeholder's needs have been met, and you and your pair are happy with the project. Then you can add it to your portfolio!</p>",
|
||||
"<h2>Working with your Pair</h2>",
|
||||
"<p>You and your pair will pair program (code together on the same computer virtually) about half of the time, and work independently the other half of the time.</p>",
|
||||
"<p>Here are our recommended ways of collaborating:",
|
||||
" <ul>",
|
||||
" <li>• Gitter has robust private messaging functionality. It's the main way our team communicates, and we recommend it over email.</li>",
|
||||
" <li>• Trello is great for managing projects. Work with your stakeholder to create Trello cards, and update these cards regularly as you make progress on them.</li>",
|
||||
" <li>• Screen Hero or Team Viewer - These are the ideal way to pair program. Tools like TMUX are good, but difficult to use. We discourage you from using screen sharing tools where only one person has control of the keyboard and mouse - that isn't real pair programming.</li>",
|
||||
" <li>• Write clear and readable code, commit messages, branch names, and pull request messages.</li>",
|
||||
" </ul>",
|
||||
"</p>",
|
||||
"<h2>Setting up your Development Environment</h2>",
|
||||
"<p>We've created a custom virtual machine image with Ubuntu Linux, Git, Team Viewer, the MEAN Stack and all its dependencies. You can run this virtual image on any computer with at least 2 gigabytes of RAM and 16 gigabytes of hard drive space.</p>",
|
||||
"<p>The benefits of using this virtual machine are as follows:</p>",
|
||||
"<ul>",
|
||||
" <li>• Everyone else on Free Code Camp is using this image, so we can all help you troubleshoot various problems that may arise.</li>",
|
||||
" <li>• When you pair program, you and your pair will have the exact same environment, which means you will both feel comfortable on each other's machines.</li>",
|
||||
" <li>• You can install the image on any computer without worrying about messing up the computer's original data or configuration.</li>",
|
||||
" <li>• Even if you end up using Windows or Mac OSX for development later, your server will almost certainly run Linux, so it's worth getting used to Linux.</li>",
|
||||
" <li>• Even experienced developers encounter hangups when setting up a development environment. This virtual machine image will remove this tedious process.</li>",
|
||||
"</ul>",
|
||||
"<p>Install a bit torrent client, then  <a href=\"http://mgnet.me/ZOQk0rd\">download our virtual machine image</a>.</p>",
|
||||
"<p>Please note that even though Bit Torrent is often used to download content illegally, all the content on our image is open source and perfectly legal to redistribute.</p>",
|
||||
"<p>Once you've downloaded the file,  <a href=\"https://www.virtualbox.org/wiki/Downloads\">download VirtualBox  </a>and follow  <a href=\"http://techathlon.com/how-to-run-a-vmdk-file-in-oracle-virtualbox/\">this tutorial  </a>to open the image in VirtualBox. You'll want to assign the virtual machine at least two gigabytes of ram.</p>",
|
||||
"<p>Now you have your own Linux development environment. You can shut it down when you're not using it and it will save its state. Please continue to seed the file in bit torrent so that other campers can download it as well. Enjoy!</p>",
|
||||
"<h2>Hosting Apps</h2>",
|
||||
"<p>Unless your stakeholder has an existing modern host (AWS, Digital Ocean), you'll need to transition them over to a new platform. We believe Heroku is the best choice for a vast majority of web projects. It's free, easy to use, and has both browser and command line interfaces. It's owned by Salesforce and used by a ton of companies, so it's accountable and unlikely to go away.</p>",
|
||||
"<p>If you need help convincing your stakeholder that Heroku is the ideal platform, we'll be happy to talk with them.</p>",
|
||||
"<h2>Maintaining Apps</h2>",
|
||||
"<p>Once you complete a nonprofit project, your obligation to its stakeholder is finished. You goal is to leave behind a well documented solution that can be easily maintained by a contract JavaScript developer (or even a less-technical \"super user\").</p>",
|
||||
"<p>While you will no longer need to help with feature development, we encourage you to consider helping your stakeholder with occasional patches down the road. After all, this project will be an important piece of your portfolio, and you'll want it to remain in good shape for curious future employers.</p>",
|
||||
"<h2>Office Hours</h2>",
|
||||
"<p>Quincy Larson and/or Michael Johnson will be in the  <a href=\"https://gitter.im/FreeCodeCamp/NonprofitProjects\">Gitter Nonprofit Project Channel  </a>every Monday and Thursday from 9 - 10 p.m. EST.</p>",
|
||||
"<p>Our goal is to make the discussion as public as possible so all our campers can benefit from each camper’s questions.</p>",
|
||||
"<p>If necessary, we can also hop on Screen Hero with you to help you with issues more specific to your project.</p>",
|
||||
"<h2>Pledging to finish the project</h2>",
|
||||
"<p>Your nonprofit stakeholder, your pair, and the volunteer camp counselor team are all counting on you to finish your nonprofit project. If you walk away from an unfinished nonprofit project, you'll become ineligible to ever be assigned another one.</p>",
|
||||
"<p>To confirm that you understand the seriousness of this commitment, we require that all campers  <a href=\"http://goo.gl/forms/ZMn96z2QqY\">sign this pledge  </a>before starting on their nonprofit projects.</p>",
|
||||
"<p>There will likely be times of confusion or frustration. This is normal in software development. The most important thing is that you do not give up and instead persevere through these setbacks. As Steve Jobs famously said, \"Real artists ship.\" And you are going to ship one successful nonprofit project after another until you feel ready to take the next step in your promising career.</p>",
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"_id": "bd7158d9c447eddfaeb5bdef",
|
||||
"name": "Install Screenhero",
|
||||
"description": [
|
||||
"<div class='text-center'>",
|
||||
"<h2><a href=\"http://links.screenhero.com/e/c/eyJlbWFpbF9pZCI6Ik1qQTNNem9XQkNJQ1pBQUNjd0FYQVZrVEdnRkxNamtfX0JWZEdGVEpSZkVCWlRwbFpXRTBNamM0WVMxaE56SmlMVEV4WlRRdE9HUXpZUzFpWXpVNE1HRTJNalkxTldNNk1UUTJNVEEyQUE9PSIsInBvc2l0aW9uIjowLCJocmVmIjoiaHR0cDovL2RsLnNjcmVlbmhlcm8uY29tL3NtYXJ0ZG93bmxvYWQvZklYQU1UUUJBTEtQQkhQTC9TY3JlZW5oZXJvLnppcD9zb3VyY2U9d2ViIn0=\">Download for Mac</a></h2>",
|
||||
"<h2><a href=\"http://links.screenhero.com/e/c/eyJlbWFpbF9pZCI6Ik1qQTNNem9XQkNJQ1pBQUNjd0FYQVZrVEdnRkxNamtfX0JWZEdGVEpSZkVCWlRwbFpXRTBNamM0WVMxaE56SmlMVEV4WlRRdE9HUXpZUzFpWXpVNE1HRTJNalkxTldNNk1UUTJNVEEyQUE9PSIsInBvc2l0aW9uIjoxLCJocmVmIjoiaHR0cDovL2RsLnNjcmVlbmhlcm8uY29tL3NtYXJ0ZG93bmxvYWQvZklYQU1UUUJBTEtQQkhQTC9TY3JlZW5oZXJvLXNldHVwLmV4ZSJ9\"> Download for Windows</a></h2>",
|
||||
"<p>You can learn more about using Screen Hero by taking  <a href=\"http://www.freecodecamp.com/challenges/34\">Challenge 34.</a></p>",
|
||||
"<p>Screen Hero was recently acquired by a collaboration tool called Slack.</p>",
|
||||
"It's still available and free, but will go away in the indefinite future. We'll replace it.</p>",
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"_id": "bd7158d9c448eddfaeb5bdef",
|
||||
"name": "Live Stream Pair Programming on Twitch.tv",
|
||||
"description": [
|
||||
"<div class=\"text-center\">",
|
||||
" <h1>Live Pair Programming</h1>",
|
||||
" <h2 id=\"next-session\"></h2>",
|
||||
" <h2>Watch the live stream below or on our  <a href=\"http://twitch.tv/freecodecamp\" target=\"_blank\">Twitch.tv channel</a>.</h2>",
|
||||
" <div class=\"row\">",
|
||||
" <div class=\"col-md-8 col-xs-12\">",
|
||||
" <div class=\"embed-responsive embed-responsive-16by9\">",
|
||||
" <iframe src=\"http://www.twitch.tv/freecodecamp/embed\" frameborder=\"0\" scrolling=\"no\"></iframe>",
|
||||
" </div>",
|
||||
" </div>",
|
||||
" <div class=\"col-md-4 col-xs-12\">",
|
||||
" <div class=\"visible-sm visible-xs\">",
|
||||
" <div class=\"embed-responsive embed-responsive-16by9\">",
|
||||
" <iframe src=\"http://www.twitch.tv/freecodecamp/chat?popout=\" frameborder=\"0\" scrolling=\"no\"></iframe>",
|
||||
" </div>",
|
||||
" </div>",
|
||||
" <div class=\"visible-md visible-lg\">",
|
||||
" <div class=\"embed-responsive embed-responsive-twitch-chat\">",
|
||||
" <iframe src=\"http://www.twitch.tv/freecodecamp/chat?popout=\" frameborder=\"0\" scrolling=\"no\"></iframe>",
|
||||
" </div>",
|
||||
" </div>",
|
||||
" </div>",
|
||||
" </div>",
|
||||
" <h1>Previous Live Pair Programming Sessions</h1>",
|
||||
" <div class=\"col-xs-12\">",
|
||||
" <div class=\"embed-responsive embed-responsive-16by9 big-break\">",
|
||||
" <iframe src=\"//www.youtube.com/embed/_BErpDdmBOw\" class=\"embed-responsive-item\"></iframe>",
|
||||
" </div>",
|
||||
" <h3 class=\"wrappable\">link:  <a href=\"http://www.youtube.com/watch/_BErpDdmBOw\">http://www.youtube.com/watch/_BErpDdmBOw</a></h3>",
|
||||
" <div class=\"embed-responsive embed-responsive-16by9 big-break\">",
|
||||
" <iframe src=\"//www.youtube.com/embed/Fn9HMn79KH0\" class=\"embed-responsive-item\"></iframe>",
|
||||
" </div>",
|
||||
" <h3 class=\"wrappable\">link:  <a href=\"http://www.youtube.com/watch/Fn9HMn79KH0\">http://www.youtube.com/watch/Fn9HMn79KH0</a></h3>",
|
||||
" <div class=\"embed-responsive embed-responsive-16by9 big-break\">",
|
||||
" <iframe src=\"//www.youtube.com/embed/S7iRBZJwOAs\" class=\"embed-responsive-item\"></iframe>",
|
||||
" </div>",
|
||||
" <h3 class=\"wrappable\">link:  <a href=\"http://www.youtube.com/watch/S7iRBZJwOAs\">http://www.youtube.com/watch/S7iRBZJwOAs</a></h3>",
|
||||
" <div class=\"embed-responsive embed-responsive-16by9 big-break\">",
|
||||
" <iframe src=\"//www.youtube.com/embed/BHNRg39ZblE\" class=\"embed-responsive-item\"></iframe>",
|
||||
" </div>",
|
||||
" <h3 class=\"wrappable\">link:  <a href=\"http://www.youtube.com/watch/BHNRg39ZblE\">http://www.youtube.com/watch/BHNRg39ZblE</a></h3>",
|
||||
" <div class=\"embed-responsive embed-responsive-16by9 big-break\">",
|
||||
" <iframe src=\"//www.youtube.com/embed/YDfkHlDmehA\" class=\"embed-responsive-item\"></iframe>",
|
||||
" </div>",
|
||||
" <h3 class=\"wrappable\">link:  <a href=\"http://www.youtube.com/watch/YDfkHlDmehA\">http://www.youtube.com/watch/YDfkHlDmehA</a></h3>",
|
||||
" </div>",
|
||||
" <script src=\"/js/lib/moment/moment.js\"></script>",
|
||||
" <script src=\"/js/lib/moment/nextTuesday.js\"></script>",
|
||||
" <script>$('#next-session').text(nextSession());</script>",
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"_id": "bd7158d9c449eddfaeb5bdef",
|
||||
"name": "Nodeschool Challenges",
|
||||
"description": [
|
||||
"<h2 class='text-center'>Learn Node.js, NPM, Express.js, and advanced JavaScript like Functional Programming and Promises</h2><br/>",
|
||||
"<div class=\"embed-responsive embed-responsive-16by9\">",
|
||||
" <iframe src=\"//player.vimeo.com/video/122719685\" class=\"embed-responsive-item\"></iframe>",
|
||||
"</div>",
|
||||
"<div class=\"text-left col-xs-12 col-sm-10 col-sm-offset-1\">",
|
||||
" <h3>Here are the NodeSchool courses you should complete:",
|
||||
" <ol>",
|
||||
" <li><a href=\"http://runnable.com/VQuO_Y4BbkhaOOsV/nodeschool-io-s-learnyounode-course-available-in-your-browser-for-node-js-and-freecodecamp\" target=\"_blank\">NodeSchool.io's LearnYouNode course</a></li>",
|
||||
" <li><a href=\"http://runnable.com/VQt7deuMe6RZ3Gcl/nodeschool-io-s-learn-to-npm-course-running-in-your-browser-for-node-js-and-hello-world\" target=\"_blank\">NodeSchool.io's Learn-to-NPM course</a></li>",
|
||||
" <li><a href=\"http://runnable.com/VQufnaRAlaNc9JuM/nodeschool-io-s-express-js-course-available-in-your-browser-for-node-js-and-freecodecamp\" target=\"_blank\">NodeSchool.io's Express.js course</a></li>",
|
||||
" <li><a href=\"http://runnable.com/VQuZjvia8Gxcqkpy/nodeschool-io-s-functional-programming-in-javascript-course-available-in-your-browser-for-node-js-and-freecodecamp\" target=\"_blank\">NodeSchool.io's Functional Programming in JavaScript course</a></li>",
|
||||
" <li><a href=\"http://runnable.com/VQunH26qdytcbLBg/nodeschool-io-s-promise-it-won-t-hurt-promises-course-available-in-your-browser-for-node-js-javascript-and-freecodecamp\" target=\"_blank\">NodeSchool.io's Promise It Won't Hurt Promises course</a></li>",
|
||||
" </ol>",
|
||||
" </h3>",
|
||||
"</div><br/>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"_id": "bd7158d9c450eddfaeb5bdef",
|
||||
"name": "Nonprofit Project Instructions",
|
||||
"description": [
|
||||
"<div class='col-xs-12 col-sm-10 col-sm-offset-1'>",
|
||||
"<h3>It's time to apply what you've learned here at Free Code Camp.</h3>",
|
||||
"<h3>By the end of this process, you'll have a portfolio of live apps being used by real people.</h3>",
|
||||
"<h3>Please do the following immediately:</h3>",
|
||||
"<h4>",
|
||||
" <ol>",
|
||||
" <li>Complete this form:  <a href=\"http://goo.gl/forms/f61dLt67t8\" target=\"_blank\">http://goo.gl/forms/f61dLt67t8</a>.</li>",
|
||||
" <li>Read this document, which will answer many questions you may have about our nonprofit projects:  <a href=\"/wiki/guide-to-our-nonprofit-projects\" target=\"_blank\">http://freecodecamp.com/wiki/guide-to-our-nonprofit-projects</a>.</li>",
|
||||
" <li>We'll send you an invite to our Nonprofit Projects Trello board. Once we do, go there and add yourself to at least 3 nonprofit projects that interest you.</li>",
|
||||
" <li>Finish any unfinished Bonfire challenges. These challenges serve as the Free Code Camp \"exit test\". You must complete these before you can start working on nonprofit projects. If you completed CoderByte or CodeWars challenges instead of Bonfire, email us and we'll take a look: <a href=\"mailto:team@freecodecamp.com\">team@freecodecamp.com</a>.</li>",
|
||||
" </ol>",
|
||||
" <h4>Please email us if you have further questions:  <a href=\"mailto:team@freecodecamp.com\">team@freecodecamp.com</a>.</h4>",
|
||||
"</h4>",
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"_id": "bd7158d9c451eddfaeb5bdef",
|
||||
"name": "Free Code Camp's Privacy Policy",
|
||||
"description": [
|
||||
"<div class='col-xs-12 col-sm-10 col-sm-offset-1'>",
|
||||
"<p>Free Code Camp is committed to respecting the privacy of visitors to our web sites and web applications. The guidelines below explain how we protect the privacy of visitors to FreeCodeCamp.com and its features.</p>",
|
||||
"<h3>Personally Identifiable Information</h3>",
|
||||
"<p>Free Code Camp protects the identity of visitors to FreeCodeCamp.com by limiting the collection of personally identifiable information.</p>",
|
||||
"<p>Free Code Camp does not knowingly collect or solicit personally identifiable information from or about children under 13, except as permitted by law. If we discover we have received any information from a child under 13 in violation of this policy, we will delete that information immediately. If you believe Free Code Camp has any information from or about anyone under 13, please e-mail us at <a href=\"mailto:team@freecodecamp.com\" target=\"_blank\">team@freecodecamp.com</a>.</p>",
|
||||
"<p>All personally identifiable information you provide to us is used by Free Code Camp and its team to process and manage your account, analyze the demographic of our users, or to deliver services through the site. </p>",
|
||||
"<p>If you choose to provide personally identifiable information to us, you may receive occasional e-mails from us that are relevant to Free Code Camp, getting a job, or learning to code in general.</p>",
|
||||
"<p>Free Code Camp may also use other third-party providers to facilitate the delivery of the services described above, and these third-party providers may be supplied with or have access to personally identifiable information for the sole purpose of providing these services, to you on behalf of Free Code Camp.</p>",
|
||||
"<p>Free Code Camp may also disclose personally identifiable information in special legal circumstances. For instance, such information may be used where it is necessary to protect our copyright or intellectual property rights, or if the law requires us to do so.</p>",
|
||||
"<h3>Anonymous Information</h3>",
|
||||
"<p>Anonymous aggregated data may be provided to other organizations we associate with for statistical purposes. For example, we may report to an organization that a certain percentage of our site's visitors are adults between the ages of 25 and 35.</p>",
|
||||
"<h3>Cookies and Beacons—Use by Free Code Camp; Opting Out</h3>",
|
||||
"<p>We use cookies and software logs to monitor the use of FreeCodeCamp.com and to gather non-personal information about visitors to the site. Cookies are small files that Free Code Camp transfers to the hard drives of visitors for record-keeping purposes. These monitoring systems allow us to track general information about our visitors, such as the type of browsers (for example, Firefox or Internet Explorer), the operating systems (for instance, Windows or Macintosh), or the Internet providers (for instance, Comcast) they use. This information is used for statistical and market research purposes to tailor content to usage patterns and to provide services requested by our customers. To delete these cookies, please see your browser's privacy settings.</p>",
|
||||
"<p>A beacon is an electronic file object (typically a transparent image) placed in the code of a Web page. We use third party beacons to monitor the traffic patterns of visitors from one Free Code Camp.com page to another and to improve site performance.</p>",
|
||||
"<p>None of the information we gather in this way can be used to identify any individual who visits our site.</p>",
|
||||
"<h3>Security</h3>",
|
||||
"<p>Any personally identifiable information collected through this site is stored on limited-access servers. We will maintain safeguards to protect these servers and the information they store.</p>",
|
||||
"<h3>Surveys</h3>",
|
||||
"<p>We may occasionally conduct on-line surveys. All surveys are voluntary and you may decline to participate.</p>",
|
||||
"<h3>Copyright</h3>",
|
||||
"<p>All of the content on FreeCodeCamp.com is copyrighted by Free Code Camp. If you'd like to redistribute it beyond simply sharing it through social media, please contact us at <a href=\"mailto:team@freecodecamp.com\" target=\"_blank\">team@freecodecamp.com</a>.</p>",
|
||||
"<h3>Contacting Us</h3>",
|
||||
"<p>If you have questions about Free Code Camp, or to correct, update, or remove personally identifiable information, please email us at <a href=\"mailto:team@freecodecamp.com\" target=\"_blank\">team@freecodecamp.com</a>.</p>",
|
||||
"<h3>Links to Other Web sites</h3>",
|
||||
"<p>Free Code Camp's sites each contain links to other Web sites. Free Code Camp is not responsible for the privacy practices or content of these third-party Web sites. We urge all FreeCodeCamp.com visitors to follow safe Internet practices: Do not supply Personally Identifiable Information to these Web sites unless you have verified their security and privacy policies.</p>",
|
||||
"<h3>Data Retention</h3>",
|
||||
"<p>We retain your information for as long as necessary to permit us to use it for the purposes that we have communicated to you and comply with applicable law or regulations.</p>",
|
||||
"<h3>Business Transfers</h3>",
|
||||
"<p>As we continue to develop our business, we might sell or buy subsidiaries, or business units. In such transactions, customer information generally is one of the transferred business assets but remains subject to the promises made in any pre-existing Privacy Policy (unless, of course, the customer consents otherwise). Also, in the unlikely event that Free Code Camp, or substantially all of its assets are acquired, customer information will be one of the transferred assets, and will remain subject to our Privacy Policy.</p>",
|
||||
"<h3>Your California Privacy Rights</h3>",
|
||||
"<p>If you are a California resident, you are entitled to prevent sharing of your personal information with third parties for their own marketing purposes through a cost-free means. If you send a request to the address above, Free Code Camp will provide you with a California Customer Choice Notice that you may use to opt-out of such information sharing. To receive this notice, submit a written request to <a href=\"mailto:team@freecodecamp.com\" target=\"_blank\">team@freecodecamp.com</a>, specifying that you seek your "California Customer Choice Notice." Please allow at least thirty (30) days for a response.</p>",
|
||||
"<h3>Acceptance of Privacy Policy Terms and Conditions</h3>",
|
||||
"<p>By using this site, you signify your agreement to the terms and conditions of this FreeCodeCamp.com Privacy Policy. If you do not agree to these terms, please do not use this site. We reserve the right, at our sole discretion, to change, modify, add, or remove portions of this policy at any time. All amended terms automatically take effect 30 days after they are initially posted on the site. Please check this page periodically for any modifications. Your continued use of FreeCodeCamp.com following the posting of any changes to these terms shall mean that you have accepted those changes.</p>",
|
||||
"<p>If you have any questions or concerns, please send an e-mail to <a href=\"mailto:team@freecodecamp.com\" target=\"_blank\">team@freecodecamp.com</a>.</p>",
|
||||
"</div>"
|
||||
]
|
||||
}
|
||||
]
|
||||
|
@ -1,10 +0,0 @@
|
||||
extends ../layout
|
||||
block content
|
||||
.jumbotron.text-center
|
||||
h1.hug-top Win a Chromebook
|
||||
h2 Thanks to everyone who participated in our Chromebook giveaway.
|
||||
script(src='//widget-prime.rafflecopter.com/launch.js')
|
||||
a#rcwidget_a7khonhd.rcptr(href='http://www.rafflecopter.com/rafl/display/d70901b10/', rel='nofollow', data-raflid='d70901b10', data-theme='classic', data-template='') a Rafflecopter giveaway
|
||||
h2 Ready to learn to code?
|
||||
a.btn.btn-cta.signup-btn.btn-primary(href="/login") Start learning to code (it's free)
|
||||
br
|
@ -1,25 +0,0 @@
|
||||
extends ../layout
|
||||
block content
|
||||
.jumbotron.text-center
|
||||
h1.hug-top Deploy a Dynamic Website in 7 Minutes
|
||||
h2 Here's a fast and easy way to deploy a dynamic website to the internet
|
||||
br
|
||||
.embed-responsive.embed-responsive-16by9
|
||||
iframe.embed-responsive-item(src='//player.vimeo.com/video/115194017')
|
||||
.text-left
|
||||
h3 Use these links:
|
||||
ul
|
||||
li
|
||||
a(href='http://www.atom.io' target='_blank') http://www.atom.io
|
||||
|   - free text editor
|
||||
li
|
||||
a(href='http://www.startbootstrap.com' target='_blank') http://www.startbootstrap.com
|
||||
|   - free responsive (Bootstrap) templates
|
||||
li
|
||||
a(href='http://www.powr.io' target='_blank') http://www.powr.io
|
||||
|   - great plugins
|
||||
li
|
||||
a(href='http://www.bitballoon.com' target='_blank') http://www.bitballoon.com
|
||||
|   - drag-and-drop deployment
|
||||
a.btn.btn-cta.signup-btn.btn-primary(href="/login") Start learning to code (it's free)
|
||||
br
|
@ -1,24 +0,0 @@
|
||||
extends ../layout
|
||||
block content
|
||||
.jumbotron.text-center
|
||||
h1.hug-top Gmail Shortcuts
|
||||
h2 These Gmail Shortcuts will save you hours and help you get to Zero Inbox
|
||||
br
|
||||
.embed-responsive.embed-responsive-16by9
|
||||
iframe.embed-responsive-item(src='//player.vimeo.com/video/115194016')
|
||||
.text-left
|
||||
h3 The shortcuts:
|
||||
ul
|
||||
li j - move down
|
||||
li k - move up
|
||||
li o - open
|
||||
li r - reply
|
||||
li a - reply all
|
||||
li f - forward
|
||||
li c - compose
|
||||
li x - select
|
||||
li e - archive
|
||||
li ! - mark spam
|
||||
li z - undo
|
||||
a.btn.btn-cta.signup-btn.btn-primary(href="/login") Start learning to code (it's free)
|
||||
br
|
@ -1,98 +0,0 @@
|
||||
extends ../layout
|
||||
block content
|
||||
.jumbotron
|
||||
h1.hug-top.text-center A Guide to our Nonprofit Projects
|
||||
br
|
||||
p Building nonprofit projects is the main way that our campers learn full stack JavaScript and agile software development. Once you complete the Free Code Camp challenges and Bonfire challenges, you'll begin this process.
|
||||
p Once you've finished all the challenges, click the "I'm done with all the challenges" button, which will become enabled. We will prompt you for your email address, then give you further instructions on our  
|
||||
a(href="http://www.freecodecamp.com/nonprofit-project-instructions") Nonprofit Projects Instructions page
|
||||
| .
|
||||
p We will add you to our  
|
||||
a(href="https://trello.com/b/BA3xVpz9/nonprofit-projects") Nonprofit Project Trello board
|
||||
| .
|
||||
h2 Starting with the end in mind
|
||||
p Our goal at Free Code Camp is to help you land a job as a junior software developer (or, if you prefer, a 'pivot job' that leads your current career in a more technical direction).
|
||||
p You'll continue to work on nonprofit projects until you've built a sufficiently impressive portfolio and references to start your job search. Your portfolio will ultimately have three to five nonprofit projects. We estimate that the 900 hours of nonprofit projects you're going to complete, in addition to the 100 hours of challenges you've already completed, will be enough to qualify you for your first coding job. This will produce a much broader portfolio than a traditional coding bootcamp, which generally only has one or two capstone projects.
|
||||
h2 Choosing your first Nonprofit Project
|
||||
p We've categorized all the nonprofit projects by estimated time investment per camper: 100 hours, 200 hours, and 300 hours. These are only rough estimates.
|
||||
p Example: if you and the camper you're paired up with (your pair) each stated you could work 20 hours per week (on the  
|
||||
a(href="http://goo.gl/forms/f61dLt67t8") form you filled out
|
||||
| ). If the project is a 100 hour per camper project, you should be able to complete it in about 5 weeks.
|
||||
p Our team of nonprofit project camp counselors will match you and your pair based on:
|
||||
ol
|
||||
li Your estimated time commitment (10, 20 or 40 hours per week)
|
||||
li Your time zone
|
||||
li The nonprofit projects you've chosen
|
||||
li Prior coding experience (we'd like both campers to be able to contribute equally)
|
||||
p We won't take age or gender into account. This will provide you with valuable experience in meshing with diverse teams, which is a reality of the contemporary workplace.
|
||||
p You'll only work on one project at a time. Once you start a nonprofit project, we'll remove you from all other nonprofit project Trello cards. There's a good chance those projects will no longer be available when you finish your current project, anyway. Don't worry, though - we get new nonprofit project requests every day, so there will be plenty more projects for you to consider after you finish your current one.
|
||||
h2 Finalizing the Project
|
||||
p Before you can start working on the project, our team of Nonprofit Project Coordinators will go through the following process:
|
||||
ol
|
||||
li We'll wait until there are two campers who have chosen the same project and look like they're a good match for one another based on the factors mentioned above.
|
||||
li We'll call the stakeholder to confirm once again that he or she agrees with our  
|
||||
a(href="freecodecamp.com/nonprofits") terms  
|
||||
| and has signed our  
|
||||
a(href="http://goo.gl/forms/0YKkd9bpcR") Nonprofit Project Stakeholder Pledge
|
||||
| .
|
||||
li We'll set an initial meeting with representatives from Free Code Camp, the two campers, and the stakeholder.
|
||||
li If the stakeholder and both campers shows up promptly, and seem enthusiastic and professional, we'll start the project.
|
||||
p This lengthy process serves an important purpose: it reduces the likelihood that any of our campers or stakeholders will waste their precious time.
|
||||
h2 Nonprofit Stakeholders
|
||||
p Each nonprofit project was submitted by a nonprofit. A representative from this nonprofit has agreed to serve as a "stakeholder" - an authorative person who understands the organization and its needs for this particular project.
|
||||
p Stakeholders have a deep understanding of their organizations' needs. Campers will work with them to figure out the best solutions to these needs.
|
||||
p When you and your pair first speak with your nonprofit stakeholder, you'll:
|
||||
ul
|
||||
li talk at length to better understand their needs.
|
||||
li create a new Trello board and use it to prioritize what needs to be built.
|
||||
li and establish deadlines based on your weekly time commitment, and how long you think each task will take.
|
||||
p It's notoriously difficult to estimate how long building software projects will take, so feel free to ask camp counselors for help.
|
||||
p You'll continue to meet with your stakeholder at least twice a month in your project's Gitter channel.
|
||||
p You should also ask questions in your project's Gitter channel as they come up throughout the week, and your stakeholder can answer them asynchronously.
|
||||
p Getting "blocked" on a task can take away your sense of forward momentum, so be sure to proactively seek answers to any ambiguities you encounter.
|
||||
p Ultimately, the project will be considered complete once both the stakeholder's needs have been met, and you and your pair are happy with the project. Then you can add it to your portfolio!
|
||||
h2 Working with your Pair
|
||||
p You and your pair will pair program (code together on the same computer virtually) about half of the time, and work independently the other half of the time.
|
||||
p Here are our recommended ways of collaborating:
|
||||
ul
|
||||
li • Gitter has robust private messaging functionality. It's the main way our team communicates, and we recommend it over email.
|
||||
li • Trello is great for managing projects. Work with your stakeholder to create Trello cards, and update these cards regularly as you make progress on them.
|
||||
li • Screen Hero or Team Viewer - These are the ideal way to pair program. Tools like TMUX are good, but difficult to use. We discourage you from using screen sharing tools where only one person has control of the keyboard and mouse - that isn't real pair programming.
|
||||
li • Write clear and readable code, commit messages, branch names, and pull request messages.
|
||||
h2 Setting up your Development Environment
|
||||
p We've created a custom virtual machine image with Ubuntu Linux, Git, Team Viewer, the MEAN Stack and all its dependencies. You can run this virtual image on any computer with at least 2 gigabytes of RAM and 16 gigabytes of hard drive space.
|
||||
p The benefits of using this virtual machine are as follows:
|
||||
ul
|
||||
li • Everyone else on Free Code Camp is using this image, so we can all help you troubleshoot various problems that may arise.
|
||||
li • When you pair program, you and your pair will have the exact same environment, which means you will both feel comfortable on each other's machines.
|
||||
li • You can install the image on any computer without worrying about messing up the computer's original data or configuration.
|
||||
li • Even if you end up using Windows or Mac OSX for development later, your server will almost certainly run Linux, so it's worth getting used to Linux.
|
||||
li • Even experienced developers encounter hangups when setting up a development environment. This virtual machine image will remove this tedious process.
|
||||
p Install a bit torrent client, then  
|
||||
a(href="http://mgnet.me/ZOQk0rd") download our virtual machine image
|
||||
| .
|
||||
p Please note that even though Bit Torrent is often used to download content illegally, all the content on our image is open source and perfectly legal to redistribute.
|
||||
p Once you've downloaded the file,  
|
||||
a(href="https://www.virtualbox.org/wiki/Downloads") download VirtualBox  
|
||||
| and follow  
|
||||
a(href="http://techathlon.com/how-to-run-a-vmdk-file-in-oracle-virtualbox/") this tutorial  
|
||||
| to open the image in VirtualBox. You'll want to assign the virtual machine at least two gigabytes of ram.
|
||||
p Now you have your own Linux development environment. You can shut it down when you're not using it and it will save its state. Please continue to seed the file in bit torrent so that other campers can download it as well. Enjoy!
|
||||
h2 Hosting Apps
|
||||
p Unless your stakeholder has an existing modern host (AWS, Digital Ocean), you'll need to transition them over to a new platform. We believe Heroku is the best choice for a vast majority of web projects. It's free, easy to use, and has both browser and command line interfaces. It's owned by Salesforce and used by a ton of companies, so it's accountable and unlikely to go away.
|
||||
p If you need help convincing your stakeholder that Heroku is the ideal platform, we'll be happy to talk with them.
|
||||
h2 Maintaining Apps
|
||||
p Once you complete a nonprofit project, your obligation to its stakeholder is finished. You goal is to leave behind a well documented solution that can be easily maintained by a contract JavaScript developer (or even a less-technical "super user").
|
||||
p While you will no longer need to help with feature development, we encourage you to consider helping your stakeholder with occasional patches down the road. After all, this project will be an important piece of your portfolio, and you'll want it to remain in good shape for curious future employers.
|
||||
h2 Office Hours
|
||||
p Quincy Larson and/or Michael Johnson will be in the  
|
||||
a(href="https://gitter.im/FreeCodeCamp/NonprofitProjects") Gitter Nonprofit Project Channel  
|
||||
| every Monday and Thursday from 9 - 10 p.m. EST.
|
||||
p Our goal is to make the discussion as public as possible so all our campers can benefit from each camper’s questions.
|
||||
p If necessary, we can also hop on Screen Hero with you to help you with issues more specific to your project.
|
||||
h2 Pledging to finish the project
|
||||
p Your nonprofit stakeholder, your pair, and the volunteer camp counselor team are all counting on you to finish your nonprofit project. If you walk away from an unfinished nonprofit project, you'll become ineligible to ever be assigned another one.
|
||||
p To confirm that you understand the seriousness of this commitment, we require that all campers  
|
||||
a(href="http://goo.gl/forms/ZMn96z2QqY") sign this pledge  
|
||||
| before starting on their nonprofit projects.
|
||||
p There will likely be times of confusion or frustration. This is normal in software development. The most important thing is that you do not give up and instead persevere through these setbacks. As Steve Jobs famously said, "Real artists ship." And you are going to ship one successful nonprofit project after another until you feel ready to take the next step in your promising career.
|
@ -1,13 +0,0 @@
|
||||
extends ../layout
|
||||
block content
|
||||
.jumbotron.text-center
|
||||
h1.hug-top Install ScreenHero
|
||||
h2
|
||||
a(href="http://links.screenhero.com/e/c/eyJlbWFpbF9pZCI6Ik1qQTNNem9XQkNJQ1pBQUNjd0FYQVZrVEdnRkxNamtfX0JWZEdGVEpSZkVCWlRwbFpXRTBNamM0WVMxaE56SmlMVEV4WlRRdE9HUXpZUzFpWXpVNE1HRTJNalkxTldNNk1UUTJNVEEyQUE9PSIsInBvc2l0aW9uIjowLCJocmVmIjoiaHR0cDovL2RsLnNjcmVlbmhlcm8uY29tL3NtYXJ0ZG93bmxvYWQvZklYQU1UUUJBTEtQQkhQTC9TY3JlZW5oZXJvLnppcD9zb3VyY2U9d2ViIn0=") Download for Mac
|
||||
h2
|
||||
a(href="http://links.screenhero.com/e/c/eyJlbWFpbF9pZCI6Ik1qQTNNem9XQkNJQ1pBQUNjd0FYQVZrVEdnRkxNamtfX0JWZEdGVEpSZkVCWlRwbFpXRTBNamM0WVMxaE56SmlMVEV4WlRRdE9HUXpZUzFpWXpVNE1HRTJNalkxTldNNk1UUTJNVEEyQUE9PSIsInBvc2l0aW9uIjoxLCJocmVmIjoiaHR0cDovL2RsLnNjcmVlbmhlcm8uY29tL3NtYXJ0ZG93bmxvYWQvZklYQU1UUUJBTEtQQkhQTC9TY3JlZW5oZXJvLXNldHVwLmV4ZSJ9") Download for Windows
|
||||
p You can learn more about using Screen Hero by taking  
|
||||
a(href="http://www.freecodecamp.com/challenges/34") Challenge 34.
|
||||
p Screen Hero was recently acquired by a collaboration tool called Slack. It's still available and free, but will go away in the indefinite future. Discuss alternatives on our  
|
||||
a(href="http://forum.freecodecamp.com/t/replacing-screen-hero/992") Screen Hero replacement thread
|
||||
| .
|
@ -1,12 +0,0 @@
|
||||
extends ../layout
|
||||
block content
|
||||
.jumbotron.text-center
|
||||
h1.hug-top Win a Chromebook
|
||||
h2 Sign up for Inbox.js - JavaScript challenges in your inbox - and enter to win a Chromebook!
|
||||
img.image-responsive(src="https://s3.amazonaws.com/freecodecamp/chromebook.jpg" alt="HP Chromebook 11")
|
||||
script(src='//widget-prime.rafflecopter.com/launch.js')
|
||||
a#rcwidget_a7khonhd.rcptr(href='http://www.rafflecopter.com/rafl/display/d70901b10/', rel='nofollow', data-raflid='d70901b10', data-theme='classic', data-template='') a Rafflecopter giveaway
|
||||
.animated.zoomInDown.delay-10
|
||||
p Finished signing up for the giveaway?
|
||||
a.btn.btn-cta.signup-btn.btn-primary(href="/login") Start learning to code (it's free)
|
||||
br
|
@ -1,56 +0,0 @@
|
||||
extends ../layout-wide
|
||||
block content
|
||||
|
||||
.text-center
|
||||
h1 Live Pair Programming
|
||||
|
||||
|
||||
h2#next-session
|
||||
|
||||
h2 Watch the live stream below or on our  
|
||||
a(href="http://twitch.tv/freecodecamp", target='_blank') Twitch.tv channel
|
||||
| .
|
||||
.row
|
||||
.col-md-8.col-xs-12
|
||||
.embed-responsive.embed-responsive-16by9
|
||||
iframe(src='http://www.twitch.tv/freecodecamp/embed', frameborder='0', scrolling='no')
|
||||
.col-md-4.col-xs-12
|
||||
.visible-sm.visible-xs
|
||||
.embed-responsive.embed-responsive-16by9
|
||||
iframe(src='http://www.twitch.tv/freecodecamp/chat?popout=', frameborder='0', scrolling='no')
|
||||
.visible-md.visible-lg
|
||||
.embed-responsive.embed-responsive-twitch-chat
|
||||
iframe(src='http://www.twitch.tv/freecodecamp/chat?popout=', frameborder='0', scrolling='no')
|
||||
h1 Previous Live Pair Programming Sessions
|
||||
.col-xs-12
|
||||
.embed-responsive.embed-responsive-16by9.big-break
|
||||
iframe.embed-responsive-item(src='//www.youtube.com/embed/_BErpDdmBOw')
|
||||
h3.wrappable link:  
|
||||
a(href="http://www.youtube.com/watch/_BErpDdmBOw") http://www.youtube.com/watch/_BErpDdmBOw
|
||||
.embed-responsive.embed-responsive-16by9.big-break
|
||||
iframe.embed-responsive-item(src='//www.youtube.com/embed/Fn9HMn79KH0')
|
||||
h3.wrappable link:  
|
||||
a(href="http://www.youtube.com/watch/Fn9HMn79KH0") http://www.youtube.com/watch/Fn9HMn79KH0
|
||||
.embed-responsive.embed-responsive-16by9.big-break
|
||||
iframe.embed-responsive-item(src='//www.youtube.com/embed/S7iRBZJwOAs')
|
||||
h3.wrappable link:  
|
||||
a(href="http://www.youtube.com/watch/S7iRBZJwOAs") http://www.youtube.com/watch/S7iRBZJwOAs
|
||||
.embed-responsive.embed-responsive-16by9.big-break
|
||||
iframe.embed-responsive-item(src='//www.youtube.com/embed/BHNRg39ZblE')
|
||||
h3.wrappable link:  
|
||||
a(href="http://www.youtube.com/watch/BHNRg39ZblE") http://www.youtube.com/watch/BHNRg39ZblE
|
||||
.embed-responsive.embed-responsive-16by9.big-break
|
||||
iframe.embed-responsive-item(src='//www.youtube.com/embed/YDfkHlDmehA')
|
||||
h3.wrappable link:  
|
||||
a(href="http://www.youtube.com/watch/YDfkHlDmehA") http://www.youtube.com/watch/YDfkHlDmehA
|
||||
h3 Got 3 minutes? Learn to code with us!
|
||||
a.btn.btn-cta.signup-btn.btn-primary(href="/login") Start learning to code (it's free)
|
||||
br
|
||||
br
|
||||
br
|
||||
br
|
||||
br
|
||||
script(src="/js/lib/moment/moment.js")
|
||||
script(src="/js/lib/moment/nextTuesday.js")
|
||||
script.
|
||||
$('#next-session').text(nextSession());
|
@ -1,22 +0,0 @@
|
||||
extends ../layout
|
||||
block content
|
||||
.jumbotron.text-center
|
||||
h1.hug-top NodeSchool Challenges
|
||||
h2 Learn Node.js, NPM, Express.js, and advanced JavaScript like Functional Programming and Promises
|
||||
br
|
||||
.embed-responsive.embed-responsive-16by9
|
||||
iframe.embed-responsive-item(src='//player.vimeo.com/video/122719685')
|
||||
.text-left
|
||||
h3 Here are the NodeSchool courses you should complete:
|
||||
ol
|
||||
li
|
||||
a(href='http://runnable.com/VQuO_Y4BbkhaOOsV/nodeschool-io-s-learnyounode-course-available-in-your-browser-for-node-js-and-freecodecamp' target='_blank') NodeSchool.io's LearnYouNode course
|
||||
li
|
||||
a(href='http://runnable.com/VQt7deuMe6RZ3Gcl/nodeschool-io-s-learn-to-npm-course-running-in-your-browser-for-node-js-and-hello-world' target='_blank') NodeSchool.io's Learn-to-NPM course
|
||||
li
|
||||
a(href='http://runnable.com/VQufnaRAlaNc9JuM/nodeschool-io-s-express-js-course-available-in-your-browser-for-node-js-and-freecodecamp' target='_blank') NodeSchool.io's Express.js course
|
||||
li
|
||||
a(href='http://runnable.com/VQuZjvia8Gxcqkpy/nodeschool-io-s-functional-programming-in-javascript-course-available-in-your-browser-for-node-js-and-freecodecamp' target='_blank') NodeSchool.io's Functional Programming in JavaScript course
|
||||
li
|
||||
a(href='http://runnable.com/VQunH26qdytcbLBg/nodeschool-io-s-promise-it-won-t-hurt-promises-course-available-in-your-browser-for-node-js-javascript-and-freecodecamp' target='_blank') NodeSchool.io's Promise It Won't Hurt Promises course
|
||||
br
|
@ -1,23 +0,0 @@
|
||||
extends ../layout
|
||||
block content
|
||||
.jumbotron
|
||||
.col-sm-offset-1
|
||||
h1 Nonprofit projects
|
||||
h3 It's time to apply what you've learned here at Free Code Camp.
|
||||
h3 By the end of this process, you'll have a portfolio of live apps being used by real people.
|
||||
h3 Please do the following immediately:
|
||||
h4
|
||||
ol
|
||||
li Complete this form:  
|
||||
a(href="http://goo.gl/forms/f61dLt67t8" target="_blank") http://goo.gl/forms/f61dLt67t8
|
||||
| .
|
||||
li Read this document, which will answer many questions you may have about our nonprofit projects:  
|
||||
a(href="/guide-to-our-nonprofit-projects" target="_blank") http://freecodecamp.com/guide-to-our-nonprofit-projects
|
||||
| .
|
||||
li We'll send you an invite to our Nonprofit Projects Trello board. Once we do, go there and add yourself to at least 3 nonprofit projects that interest you.
|
||||
li Finish any unfinished Bonfire challenges. These challenges serve as the Free Code Camp "exit test". You must complete these before you can start working on nonprofit projects. If you completed CoderByte or CodeWars challenges instead of Bonfire, email us and we'll take a look: 
|
||||
a(href="mailto:team@freecodecamp.com") team@freecodecamp.com
|
||||
| .
|
||||
h4 Please email us if you have further questions:  
|
||||
a(href="mailto:team@freecodecamp.com") team@freecodecamp.com
|
||||
| .
|
@ -1,40 +0,0 @@
|
||||
extends ../layout
|
||||
block content
|
||||
.jumbotron
|
||||
h2.big-text Privacy
|
||||
html.
|
||||
<p>Free Code Camp is committed to respecting the privacy of visitors to our web sites and web applications. The guidelines below explain how we protect the privacy of visitors to FreeCodeCamp.com and its features.</p>
|
||||
<h3>Personally Identifiable Information</h3>
|
||||
<p>Free Code Camp protects the identity of visitors to FreeCodeCamp.com by limiting the collection of personally identifiable information.</p>
|
||||
<p>Free Code Camp does not knowingly collect or solicit personally identifiable information from or about children under 13, except as permitted by law. If we discover we have received any information from a child under 13 in violation of this policy, we will delete that information immediately. If you believe Free Code Camp has any information from or about anyone under 13, please e-mail us at <a href="mailto:team@freecodecamp.com" target="_blank">team@freecodecamp.com</a>.</p>
|
||||
<p>All personally identifiable information you provide to us is used by Free Code Camp and its team to process and manage your account, analyze the demographic of our users, or to deliver services through the site. </p>
|
||||
<p>If you choose to provide personally identifiable information to us, you may receive occasional e-mails from us that are relevant to Free Code Camp, getting a job, or learning to code in general.</p>
|
||||
<p>Free Code Camp may also use other third-party providers to facilitate the delivery of the services described above, and these third-party providers may be supplied with or have access to personally identifiable information for the sole purpose of providing these services, to you on behalf of Free Code Camp.</p>
|
||||
<p>Free Code Camp may also disclose personally identifiable information in special legal circumstances. For instance, such information may be used where it is necessary to protect our copyright or intellectual property rights, or if the law requires us to do so.</p>
|
||||
<h3>Anonymous Information</h3>
|
||||
<p>Anonymous aggregated data may be provided to other organizations we associate with for statistical purposes. For example, we may report to an organization that a certain percentage of our site's visitors are adults between the ages of 25 and 35.</p>
|
||||
<h3>Cookies and Beacons—Use by Free Code Camp; Opting Out</h3>
|
||||
<p>We use cookies and software logs to monitor the use of FreeCodeCamp.com and to gather non-personal information about visitors to the site. Cookies are small files that Free Code Camp transfers to the hard drives of visitors for record-keeping purposes. These monitoring systems allow us to track general information about our visitors, such as the type of browsers (for example, Firefox or Internet Explorer), the operating systems (for instance, Windows or Macintosh), or the Internet providers (for instance, Comcast) they use. This information is used for statistical and market research purposes to tailor content to usage patterns and to provide services requested by our customers. To delete these cookies, please see your browser's privacy settings.</p>
|
||||
<p>A beacon is an electronic file object (typically a transparent image) placed in the code of a Web page. We use third party beacons to monitor the traffic patterns of visitors from one Free Code Camp.com page to another and to improve site performance.</p>
|
||||
<p>None of the information we gather in this way can be used to identify any individual who visits our site.</p>
|
||||
<h3>Security</h3>
|
||||
<p>Any personally identifiable information collected through this site is stored on limited-access servers. We will maintain safeguards to protect these servers and the information they store.</p>
|
||||
<h3>Surveys</h3>
|
||||
<p>We may occasionally conduct on-line surveys. All surveys are voluntary and you may decline to participate.</p>
|
||||
<h3>Copyright</h3>
|
||||
<p>All of the content on FreeCodeCamp.com is copyrighted by Free Code Camp. If you'd like to redistribute it beyond simply sharing it through social media, please contact us at <a href="mailto:team@freecodecamp.com" target="_blank">team@freecodecamp.com</a>.</p>
|
||||
<h3>Contacting Us</h3>
|
||||
<p>If you have questions about Free Code Camp, or to correct, update, or remove personally identifiable information, please email us at <a href="mailto:team@freecodecamp.com" target="_blank">team@freecodecamp.com</a>.</p>
|
||||
<h3>Links to Other Web sites</h3>
|
||||
<p>Free Code Camp's sites each contain links to other Web sites. Free Code Camp is not responsible for the privacy practices or content of these third-party Web sites. We urge all FreeCodeCamp.com visitors to follow safe Internet practices: Do not supply Personally Identifiable Information to these Web sites unless you have verified their security and privacy policies.</p>
|
||||
<h3>Data Retention</h3>
|
||||
<p>We retain your information for as long as necessary to permit us to use it for the purposes that we have communicated to you and comply with applicable law or regulations.</p>
|
||||
<h3>Business Transfers</h3>
|
||||
<p>As we continue to develop our business, we might sell or buy subsidiaries, or business units. In such transactions, customer information generally is one of the transferred business assets but remains subject to the promises made in any pre-existing Privacy Policy (unless, of course, the customer consents otherwise). Also, in the unlikely event that Free Code Camp, or substantially all of its assets are acquired, customer information will be one of the transferred assets, and will remain subject to our Privacy Policy.</p>
|
||||
<h3>Your California Privacy Rights</h3>
|
||||
<p>If you are a California resident, you are entitled to prevent sharing of your personal information with third parties for their own marketing purposes through a cost-free means. If you send a request to the address above, Free Code Camp will provide you with a California Customer Choice Notice that you may use to opt-out of such information sharing. To receive this notice, submit a written request to <a href="mailto:team@freecodecamp.com" target="_blank">team@freecodecamp.com</a>, specifying that you seek your "California Customer Choice Notice." Please allow at least thirty (30) days for a response.</p>
|
||||
<h3>Acceptance of Privacy Policy Terms and Conditions</h3>
|
||||
<p>By using this site, you signify your agreement to the terms and conditions of this FreeCodeCamp.com Privacy Policy. If you do not agree to these terms, please do not use this site. We reserve the right, at our sole discretion, to change, modify, add, or remove portions of this policy at any time. All amended terms automatically take effect 30 days after they are initially posted on the site. Please check this page periodically for any modifications. Your continued use of FreeCodeCamp.com following the posting of any changes to these terms shall mean that you have accepted those changes.</p>
|
||||
<p>If you have any questions or concerns, please send an e-mail to <a href="mailto:team@freecodecamp.com" target="_blank">team@freecodecamp.com</a>.</p>
|
||||
script.
|
||||
var challengeName = 'Privacy';
|
@ -1,202 +0,0 @@
|
||||
extends ../layout
|
||||
block content
|
||||
script.
|
||||
$(document).ready(function () {
|
||||
var directions = {
|
||||
0: "To get started, open your Chrome DevTools. The #next-exercise button is disabled below. Try using jQuery's .attr() method to turn the disabled attribute to false.",
|
||||
1: "Move the .target element from #location1 to #location2.",
|
||||
2: "Change the background color of .target to red.",
|
||||
3: "Change the background color of the even-numbered targets to red.",
|
||||
4: "Change the background color of the target4 to red.",
|
||||
5: "Clone the target2 in #location1 so that it also exists in #location2.",
|
||||
6: "Remove the target3 from element from #location1.",
|
||||
7: "Check the following checkboxes using jQuery.",
|
||||
8: "Make the text input field read-only.",
|
||||
9: "Select the target2 option in the select box.",
|
||||
10: "Add the following css classes to .target: 'animated' and 'hinge'.",
|
||||
11: "Use jQuery to read the data of .target.",
|
||||
12: "Use 'length' to count the number of child elements in #location1, then display that value in #location2.",
|
||||
13: "There's an element hidden in #location1. Show it using jQuery, and then click on it."
|
||||
};
|
||||
var hint = {
|
||||
0: "$('#next-exercise').attr('disabled', false);",
|
||||
1: "$('.target').appendTo('#location2');",
|
||||
2: "$('.target').css('background', 'red');",
|
||||
3: "$('.target:even').css('background', 'red');",
|
||||
4: "$('.target:nth-child(4)').css('background', 'red');",
|
||||
5: "$('.target:nth-child(2)').clone().appendTo($('#location2'));",
|
||||
6: "$('.target:nth-child(3)').remove();",
|
||||
7: "$('#location1 input').attr('checked', 'true')",
|
||||
8: "$('#location1 input').attr('readonly', 'true')",
|
||||
9: "$('#location1 select').val('target2');",
|
||||
10: "$('.target').addClass('animated hinge');",
|
||||
11: "$('.target').data();",
|
||||
12: "$('#location2').text($('#location1').children().length)",
|
||||
13: "$('#finished-button').show().click();"
|
||||
};
|
||||
var elements = {
|
||||
0: "",
|
||||
1: "<div class='btn btn-default target'>.target</div>",
|
||||
2: "<div class='btn btn-default target'>.target</div>",
|
||||
3: "<div class='btn btn-default target'>target0</div><div class='btn btn-default target'>target1</div><div class='btn btn-default target'>target2</div><div class='btn btn-default target'>target3</div><div class='btn btn-default target'>target4</div>",
|
||||
4: "<div class='btn btn-default target'>target1</div><div class='btn btn-default target'>target2</div><div class='btn btn-default target'>target3</div><div class='btn btn-default target'>target4</div><div class='btn btn-default target'>target5</div>",
|
||||
5: "<div class='btn btn-default target'>target1</div><div class='btn btn-default target'>target2</div><div class='btn btn-default target'>target3</div><div class='btn btn-default target'>target4</div><div class='btn btn-default target'>target5</div>",
|
||||
6: "<div class='btn btn-default target'>target1</div><div class='btn btn-default target'>target2</div><div class='btn btn-default target'>target3</div><div class='btn btn-default target'>target4</div><div class='btn btn-default target'>target5</div>",
|
||||
7: "<input type='checkbox'>checkbox1</input><br><input type='checkbox'>checkbox2</input>",
|
||||
8: "<input type='text' value='target'>",
|
||||
9: "<select><option value='target0'>target0</option><option value='target1'>target1</option><option value='target2'>target2</option><option value='target3'>target3</option></select>",
|
||||
10: "<div class='btn btn-default target'>.target</div>",
|
||||
11: "<div class='btn btn-default target' data-lookAtMe='This is some super secret data hidden in the DOM!'>.target</div>",
|
||||
12: "<div class='btn btn-default target'>target1</div><div class='btn btn-default target'>target2</div><div class='btn btn-default target'>target3</div><div class='btn btn-default target'>target4</div><div class='btn btn-default target'>target5</div>",
|
||||
13: "<div class='btn btn-default target' id='finished-button'>Finish!</div>"
|
||||
};
|
||||
|
||||
function refreshEverything() {
|
||||
$('#directions').text("Exercise " + currentExercise + ": " + directions[currentExercise]);
|
||||
$('#location1').html(elements[currentExercise]);
|
||||
$('#hint').text(hint[currentExercise]);
|
||||
handleExerciseTransition();
|
||||
}
|
||||
|
||||
$('#exercise-directory').on('click', 'li', event, function () {
|
||||
currentExercise = $(this).index();
|
||||
event.preventDefault();
|
||||
refreshEverything(event);
|
||||
});
|
||||
$('#next-exercise').on('click', event, function () {
|
||||
++currentExercise;
|
||||
event.preventDefault();
|
||||
refreshEverything(event);
|
||||
});
|
||||
$('#solution-button').on('click', function () {
|
||||
$('#hint-modal').modal({backdrop: "static"});
|
||||
});
|
||||
$('#location1').on('click', '#finished-button', function () {
|
||||
$('#finished-modal').modal({backdrop: "static"});
|
||||
});
|
||||
function handleExerciseTransition() {
|
||||
if (currentExercise === 0) {
|
||||
$('#next-exercise').attr('disabled', true);
|
||||
} else {
|
||||
$('#next-exercise').attr('disabled', false);
|
||||
}
|
||||
if (currentExercise === 2 || currentExercise === 6) {
|
||||
$('#location2 .target').remove();
|
||||
}
|
||||
if (currentExercise === 13) {
|
||||
$('#location2').text('');
|
||||
$('#finished-button').hide();
|
||||
$('#next-exercise').attr('disabled', true);
|
||||
}
|
||||
}
|
||||
|
||||
var currentExercise = 0;
|
||||
refreshEverything(currentExercise);
|
||||
});
|
||||
style.
|
||||
#directions {
|
||||
text-align: left;
|
||||
font-size: 15px;
|
||||
}
|
||||
|
||||
.well {
|
||||
text-align: left;
|
||||
height: 200px;
|
||||
}
|
||||
|
||||
#exercise-directory {
|
||||
font-size: 20px;
|
||||
}
|
||||
|
||||
#current-exercise {
|
||||
text-size: 250px;
|
||||
}
|
||||
html.
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class=" col-xs-12 col-sm-8">
|
||||
<div class="jumbotron">
|
||||
<div class="row">
|
||||
<div class="col-xs-12 text-center">
|
||||
<img src="http://3.bp.blogspot.com/-vgd3mMqeBzk/VGzEmodGqmI/AAAAAAAAAZY/OCcbFvYKzF0/s780/logo4.0LG.png" alt="free code learning at freecodecamp.com" class="img-responsive">
|
||||
<h1>jQuery Exercises</h1>
|
||||
</div>
|
||||
</div>
|
||||
<br>
|
||||
<div class="text-primary" id="directions">
|
||||
</div>
|
||||
<br>
|
||||
<div class="row">
|
||||
<div class="col-xs-6">#location1</div>
|
||||
<div class="col-xs-6">#location2</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-xs-6 well" id="location1"></div>
|
||||
<div class="col-xs-6 well" id="location2"></div>
|
||||
</div>
|
||||
<div class="btn btn-primary btn-lg btn-block" id="next-exercise">
|
||||
#next-exercise
|
||||
</div>
|
||||
<br>
|
||||
<button class="btn btn-block btn-lg btn-info" id="solution-button">
|
||||
#solution-button
|
||||
</button>
|
||||
</br>
|
||||
<div class="text-center">
|
||||
Created for <a href="http://www.FreeCodeCamp.com">Free Code Camp</a><br/>by <a href="https://twitter.com/ossia">Quincy Larson</a>,
|
||||
<a href="https://www.twitter.com/terakilobyte">Nathan Leniz</a>, <a href="https://twitter.com/iheartkode"> Mark Howard</a> and <a href="https://twitter.com/ryanmalm">Ryan Malm</a>. Please <a href="http://codepen.io/ossia/pen/raVEgN">fork this.</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-xs-12 col-sm-4" id="exercise-directory">
|
||||
<div class="panel panel-primary">
|
||||
<div class="panel panel-heading">List of Exercises</div>
|
||||
<div class="panel-body">
|
||||
<ol start="0">
|
||||
<li> <a href='#'>Re-enable an element</a></li>
|
||||
<li> <a href='#'>Change an element's parent</a></li>
|
||||
<li> <a href='#'>Change an element's CSS</a></li>
|
||||
<li> <a href='#'>Use jQuery filters to modify even elements</a></li>
|
||||
<li> <a href='#'>Change nth child</a></li>
|
||||
<li> <a href='#'>Clone an element</a></li>
|
||||
<li> <a href='#'>Remove an element</a></li>
|
||||
<li> <a href='#'>Check checkboxes</a></li>
|
||||
<li> <a href='#'>Make text read-only</a></li>
|
||||
<li> <a href='#'>Select an option in a select box</a></li>
|
||||
<li> <a href='#'>Add a CSS class to an element</a></li>
|
||||
<li> <a href='#'>Lookup an element's data attribute</a></li>
|
||||
<li> <a href='#'>Count child elements</a></li>
|
||||
<li> <a href='#'>Show an element and click on it</a></li>
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal fade" id="hint-modal" tabindex="-1" role="dialog" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button>
|
||||
<h4 class="modal-title" id="myModalLabel">Your hint</h4>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div id="hint">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal fade" id="finished-modal" tabindex="-1" role="dialog" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button>
|
||||
<h4 class="modal-title" id="myModalLabel">Congratulations! You've finished our jQuery exercises! <a href="http://www.freecodecamp.com/">Go back to Free Code Camp </a> and mark this challenge complete.</h4>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div id="hint"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
@ -1,3 +0,0 @@
|
||||
extends ../layout
|
||||
block content
|
||||
include ../partials/stats
|
@ -7,4 +7,10 @@ block content
|
||||
.panel-heading.text-center
|
||||
h1= title
|
||||
.panel-body
|
||||
h1!= description
|
||||
div!= description
|
||||
.row
|
||||
.col-xs-12.text-center
|
||||
if !user
|
||||
h3 Got 3 minutes? Learn to code with us!
|
||||
a.btn.btn-cta.signup-btn.btn-primary(href="/login") Start learning to code (it's free)
|
||||
.spacer
|
||||
|
Reference in New Issue
Block a user