From 5a2de8c47b52357a8a76645b9d9316a3b46431a4 Mon Sep 17 00:00:00 2001 From: Michael Q Larson Date: Sun, 2 Nov 2014 12:24:37 -0800 Subject: [PATCH] start grooming the challenges --- app.js | 5 +- controllers/challenges.js | 143 ++++++++---------- public/css/styles.less | 4 + public/js/main.js | 5 +- .../modify-and-redeploy-your-website.jade | 7 + views/challenges/partials/challenge.jade | 33 ++-- views/partials/challenges.jade | 55 +++---- 7 files changed, 128 insertions(+), 124 deletions(-) create mode 100644 views/challenges/modify-and-redeploy-your-website.jade diff --git a/app.js b/app.js index 3228a33259..a014a3d828 100644 --- a/app.js +++ b/app.js @@ -119,10 +119,11 @@ app.use(express.static(path.join(__dirname, 'public'), { maxAge: week })); */ app.get('/', homeController.index); -app.get('challenges/a-one-minute-introduction-to-free-code-camp', challengesController.aOneMinuteIntroToFreeCodeCamp); +app.get('/challenges/a-one-minute-introduction-to-free-code-camp', challengesController.aOneMinuteIntroToFreeCodeCamp); app.get('/challenges/enter-the-free-code-camp-chat-room', challengesController.enterTheFreeCodeCampChatRoom); -app.get('/challenges/install-github-atom-text-editor', challengesController.installGithubAtomTextEditor); app.get('/challenges/create-and-deploy-a-website', challengesController.createAndDeployAWebsite); +app.get('/challenges/install-github-atom-text-editor', challengesController.installGithubAtomTextEditor); +app.get('/challenges/modify-and-redeploy-your-website', challengesController.modifyAndRedeployYourWebsite); app.get('/challenges/start-a-pair-programming-session', challengesController.startAPairProgrammingSession); app.get('/challenges/add-dynamic-content-to-your-website', challengesController.addDynamicContentToYourWebsite); app.get('/challenges/codecademy-html-and-css-track', challengesController.codecademyHtmlAndCssTrack) diff --git a/controllers/challenges.js b/controllers/challenges.js index ac75529b05..dd3d4e4460 100644 --- a/controllers/challenges.js +++ b/controllers/challenges.js @@ -8,9 +8,8 @@ exports.aOneMinuteIntroToFreeCodeCamp = function(req, res) { res.render('challenges/a-one-minute-introduction-to-free-code-camp', { name: 'A one-minute introduction to Free Code Camp', video: "109134466", - time: "5 minutes", - directions: ["Link up with the Free Code Camp community in our HipChat chat room."], - links: ["https://www.hipchat.com/invite/178107/cc2f6ea4dfac9e48b9a88b305adae48a"] + time: "1 minute", + steps: ["Watch this video.", "When you're done, click the \"I've completed this challenge\" button to move on to your next challenge."] }); }; @@ -19,18 +18,7 @@ exports.enterTheFreeCodeCampChatRoom = function(req, res) { name: 'Enter the Free Code Camp Chat Room', video: "109134466", time: "5 minutes", - directions: ["Link up with the Free Code Camp community in our HipChat chat room."], - links: ["https://www.hipchat.com/invite/178107/cc2f6ea4dfac9e48b9a88b305adae48a"] - }); -}; - -exports.installGithubAtomTextEditor = function(req, res) { - res.render('challenges/install-github-atom-text-editor', { - name: "Install Github's Atom Text Editor", - video: "109134466", - time: "5 minutes", - directions: [""], - links: ["http://atom.io"] + steps: ["Register for the Free Code Camp chat room at https://www.hipchat.com/invite/178107/cc2f6ea4dfac9e48b9a88b305adae48a", "Introduce yourself to our chat room by typing: \"hello world!\""] }); }; @@ -39,45 +27,55 @@ exports.createAndDeployAWebsite = function(req, res) { name: 'Create a Website and Deploy it to the Internet', video: "109134466", time: "5 minutes", - directions: ["In the next 5 minutes, you'll create a website and deploy it to the internet!"], - links: ["http://startbootstrap.com", "http://bitballoon.com"] + steps: ["Download a template from http://startbootstrap.com", "Go to http://bitballoon.com", "Find the template you downloaded in your file manager (Finder on Mac, Windows Explorer on Windows)", "Drag the entire template directory onto BitBalloon to deploy it", "Once it's deployed, share the link to it in the Free Code Camp chat room."] + }); +}; + +exports.installGithubAtomTextEditor = function(req, res) { + res.render('challenges/install-github-atom-text-editor', { + name: "Install Github's Atom Text Editor", + video: "109134466", + time: "5 minutes", + steps: ["Download the Atom editor at http://atom.io", "Unzip it and install Atom.", "Open up Atom.", "Now you have a dedicated text editor!"] + }); +}; + +exports.modifyAndRedeployYourWebsite = function(req, res) { + res.render('challenges/modify-and-redeploy-your-website', { + name: 'Modify and Redeploy Your Website', + video: "109134466", + time: "5 minutes", + steps: ["Open up the template you downloaded from http://startbootstrap.com in your file manager (Finder on Mac and Windows Explorer on Windows).", "Open up the index.html file with Atom", "Find the title tag in the HTML and change it.", "Go to http://bitballoon.com", "Drag the entire template directory onto BitBalloon to deploy it", "Verify that the title has indeed changed."] }); }; exports.startAPairProgrammingSession = function(req, res) { res.render('challenges/start-a-pair-programming-session', { name: "Start Your First Pair Programming Session", - source: "Free Code Camp", video: "109547811", time: "5 minutes", - directions: [ - "What's all this Pair Programming stuff about? Let's find out!", "We'll use a popular pair programming tool called Screen Hero. We'll also visit the Free Code Camp chat room.", "We'll show you how to launch pair programming sessions right inside the chat room.", "Once you've \"paired\" with someone, they become your \"pair\". Show your new pair the website your just created." - ], - links: ["https://screenhero.com/download.html"] + steps: [ + "Download Screen Hero, the popular pair programming tool, here: https://screenhero.com/download.html", "Register your account with the same email address you used when you registered for the Free Code Camp chat room.", "Go to the Free Code Camp chat room.", "Say hi to somebody, and ask if they can pair program with you real quick.", "Type '/hero @' and their name to start a Screen Hero session with them.", "Once you've \"paired\" with someone, they become your \"pair\". Show your new pair the website your just created." + ] }); }; exports.addDynamicContentToYourWebsite = function(req, res) { res.render('challenges/add-dynamic-content-to-your-website', { name: "Add Dynamic Content to your Website", - source: "Free Code Camp", video: "109599487", time: "10 minutes", - directions: [ - "The website you created earlier is cool, but it's not very interactive.", "Let's make it dynamic with POWr.io's drag-and-drop form and database tools!" - ], - links: ["http://startbootstrap.com", "http://www.powr.io", "http://bitballoon.com"] + steps: ["Go to http://www.powr.io", "From the dropdown menus, choose 'Contact Form' and 'HTML'", "Open up the template you downloaded from http://startbootstrap.com in your file manager (Finder on Mac and Windows Explorer on Windows).", "Open up the index.html file with Atom", "Copy the lines of HTML from the POWr tutorial to your index.html file, being careful to put them where they belong.", "Drag the entire template directory onto BitBalloon to deploy it", "Go to http://bitballoon.com", "Verify that the form works by filling it out and submitting it. You can then go back to POWr.io and view the new database record that the form created."] }); }; exports.codecademyHtmlAndCssTrack = function(req, res) { res.render('challenges/codecademy-html-and-css-track', { name: "Codecademy's HTML & CSS Track", - links: ["http://www.codecademy.com/tracks/web"], + video: "109599487", time: "7 hours", - directions: [ - "Let's learn HTML and CSS! Then we'll understand the structure (HTML) and the style (CSS) that makes up all webpages.", - "More than 5 million people have worked their way through this short, interactive course. Once you finish it, you'll be able create your own webpages from scratch." + steps: [ + "Go to http://www.codecademy.com/tracks/web and complete the course." ] }); }; @@ -85,26 +83,21 @@ exports.codecademyHtmlAndCssTrack = function(req, res) { exports.experimentWithHtmlAndCssInCodepen = function(req, res) { res.render('challenges/experiment-with-html-and-css-in-codepen', { name: "Experiment with HTML and CSS in CodePen", - source: "Free Code Camp", video: "109611164", time: "30 minutes", - directions: [ - "Let's put those HTML and CSS skills to work!", + steps: [ "You'll learn bootstrap and see how you can build websites right in your browser with CodePen.", "Load the HealthCare.gov page in CodePen.", "Find some cat pictures online, copy their image URLs, and change the HealthCare.gov page to use these cat pictures instead of its normal images.", "HealthCare.gov uses a multi-column bootstrap layout. See if you can change the layout to be a single-column layout at all widths, not just mobile width. Hint: the \"row\" and \"col-\" classes control this. Check the Bootstrap documentation linked to above if you get stuck." - ], - links: ["http://getbootstrap.com/", "http://www.usatoday.com/", "http://codepen.io/"] + ] }); }; exports.codeSchoolTryJqueryCourse = function(req, res) { res.render('challenges/code-school-try-jquery-course', { name: "Code School's Try jQuery Course", - links: ["https://www.codeschool.com/courses/try-jquery"], - time: "2 hours", - directions: [ - "jQuery gives you an easy way to modify your HTML and CSS without reloading your page.", - "Code School's interactive jQuery course will help you understand how to manipulate page elements and capture information that your users give you." + time: "3 hours", + steps: [ + "Go to https://www.codeschool.com/courses/try-jquery and complete the course." ] }); }; @@ -114,8 +107,8 @@ exports.completeJqueryExercises = function(req, res) { name: "Complete jQuery Exercises", links: ["http://jqexercise.droppages.com/"], time: "3 hours", - directions: [ - "jQuery gives you an easy way to modify your HTML and CSS without reloading your page." + steps: [ + "Go to http://jqexercise.droppages.com/ and complete all of the exercises.", "The person who created it was not a native English speaker, so please excuse the spelling and grammar mistakes.", "This will be a lot more fun if you pair program with someone from the Free Code Camp chat room." ] }); }; @@ -125,10 +118,8 @@ exports.codeSchoolDiscoverDevtoolsCourse = function(req, res) { name: "Code School's Discover DevTools", links: ["http://discover-devtools.codeschool.com/"], time: "2 hours", - directions: [ - "Did you know you can change the HTML and CSS on this page? You can even inject JavaScript. In fact, you can do this on any webpage!", - "Chrome has built in DevTools that allow you to debug webpages, right in your browser. This is a super handy tool when you're building web applications.", - "This course will walk you through using these tools, and test your new skills with 75 exercises." + steps: [ + "Go to http://discover-devtools.codeschool.com/ and complete the course." ] }); }; @@ -138,7 +129,7 @@ exports.customizeBootstrapWithBootswatch = function(req, res) { name: "Customize Bootstrap with Bootswatch", time: "15 minutes", links: ["http://bootswatch.com/"], - directions: [] + steps: [] }); }; @@ -147,7 +138,7 @@ exports.injectLifeWithCssTransformations = function(req, res) { name: "Inject Life with CSS Transformations", links: [""], time: "15 minutes", - directions: [ + steps: [ ] }); }; @@ -157,7 +148,7 @@ exports.codecademyJavascriptTrack = function(req, res) { name: "Codecademy JavaScript Track", links: [ "http://www.codecademy.com/tracks/javascript"], time: "10 hours", - directions: [ + steps: [ "All right, now let's start coding!", "Codecademy's popular JavaScript track will teach you some basic syntax and common programming data structures in just a few hours." ] @@ -169,7 +160,7 @@ exports.getHelpTheHackerWayWithRsap = function(req, res) { name: "Get Help the Hacker Way with RSAP", links: ["http://webchat.freenode.net/", "http://stackoverflow.com/"], time: "30 minutes", - directions: [ + steps: [ ] }); }; @@ -179,7 +170,7 @@ exports.easyAlgorithmScriptingChallengesOnCoderbyte = function(req, res) { name: "Easy Algorithm Scripting Challenges on Coderbyte", links: [""], time: "15 hours", - directions: [ + steps: [ ] }); }; @@ -189,7 +180,7 @@ exports.harvardIntroductionToComputerScienceCs50Course = function(req, res) { name: "Introduction to Computer Science", links: ["https://www.edx.org/course/harvardx/harvardx-cs50x-introduction-computer-1022#.VDWSfSldWpQ"], time: "150 hours", - directions: [ + steps: [ "Harvard's CS50 course is one of the most popular online courses of all time. It will give you a solid programming foundation.", "This course will introduce you to algorithms, databases, data structures, and a ton of theory.", "It's a long course, so be sure to mix it up with frequent pair programming sessions on FreeCodeCamp challenges." @@ -202,7 +193,7 @@ exports.mediumAlgorithmScriptingChallengesOnCoderbyte = function(req, res) { name: "Medium Algorithm Scripting Challenges on Coderbyte", links: [""], time: "15 hours", - directions: [ + steps: [ ] }); }; @@ -212,7 +203,7 @@ exports.stanfordsRelationalDatabasesMiniCourse = function(req, res) { name: "Stanford's Relational Databases Mini-course", links: [""], time: "10 hours", - directions: [ + steps: [ ] }); }; @@ -222,7 +213,7 @@ exports.stanfordsJsonMiniCourse = function(req, res) { name: "Stanford's JSON Mini-course", links: [""], time: "2 hours", - directions: [ + steps: [ ] }); }; @@ -232,7 +223,7 @@ exports.buildATextBasedAdventure = function(req, res) { name: "Build a Text-based Adventure", links: [""], time: "5 hours", - directions: [ + steps: [ ] }); }; @@ -242,7 +233,7 @@ exports.hardAlgorithmScriptingChallengesOnCoderbyte = function(req, res) { name: "Hard Algorithm Scripting Challenges on Coderbyte", links: [""], time: "15 hours", - directions: [ + steps: [ ] }); }; @@ -252,7 +243,7 @@ exports.stanfordsSqlMiniCourse = function(req, res) { name: "Stanford's SQL Mini-course", links: [""], time: "10 hours", - directions: [ + steps: [ ] }); }; @@ -262,7 +253,7 @@ exports.buildAnInterviewQuestionMachine = function(req, res) { name: "Build an Interview Question Machine", links: [""], time: "5 hours", - directions: [ + steps: [ ] }); }; @@ -272,7 +263,7 @@ exports.codeSchoolTryGitCourse = function(req, res) { name: "Code School's Try Git Course", links: ["https://www.codeschool.com/courses/try-git"], time: "15 minutes", - directions: [ + steps: [ "Have you ever accidentally deleted something? With Git, you will never have that problem again.", "Git is a Version Control System. It will track all changes to your files. That way you don't have to worry about your code breaking. You can just rewind time to back when your code worked right.", "This short course will help you install git and learn how it works." @@ -285,7 +276,7 @@ exports.installNodeJs = function(req, res) { name: "Install Node.js", links: [""], time: "15 minutes", - directions: [ + steps: [ ] }); }; @@ -295,7 +286,7 @@ exports.cloneAGithubRepo = function(req, res) { name: "Clone a Github Repo", links: [""], time: "15 minutes", - directions: [ + steps: [ ] }); }; @@ -305,7 +296,7 @@ exports.deployAnAppToHeroku = function(req, res) { name: "Deploy an app to Heroku", links: [""], time: "15 minutes", - directions: [ + steps: [ ] }); }; @@ -315,7 +306,7 @@ exports.codeSchoolRealTimeWithNodeJsCourse = function(req, res) { name: "Code School's Real-time web with Node.JS", links: ["https://www.codeschool.com/courses/real-time-web-with-node-js"], time: "5 hours", - directions: [ + steps: [ "Learn NodeJS, the web server that makes the MEAN Stack possible.", "You'll also get exposure to related technologies, like the web development framework ExpressJS, Redis and WebSockets.", "Only the first section of this course is free, but you can use your two-day Code School free trial to finish it." @@ -328,7 +319,7 @@ exports.tryMongoDb = function(req, res) { name: "Try MongoDB", links: ["http://try.mongodb.org/"], time: "30 minutes", - directions: [ + steps: [ ] }); @@ -339,7 +330,7 @@ exports.exploreYourNetworkWithTheLinkedInApi = function(req, res) { name: "Explore Your Network with the LinkedIn API", links: ["http://developers.linkedin.com/"], time: "2 hours", - directions: [ + steps: [ ] }); }; @@ -349,7 +340,7 @@ exports.buildYourFirstApi = function(req, res) { name: "Build Your First API", links: [""], time: "5 hours", - directions: [ + steps: [ ] }); }; @@ -359,7 +350,7 @@ exports.aggregateDataWithChronJobsAndScreenScraping = function(req, res) { name: "Aggregate Data with Chron Jobs and Screen Scraping", links: [""], time: "5 hours", - directions: [ + steps: [ ] }); }; @@ -369,7 +360,7 @@ exports.codeSchoolShapingUpWithAngularJsCourse = function(req, res) { name: "Codeschool's Shaping up with Angular.js", links: ["https://www.codeschool.com//courses/shaping-up-with-angular-js"], time: "5 hours", - directions: [ + steps: [ "AngularJS is a powerful front end JavaScript framework. It's more powerful than jQuery, but it's also more challenging to master.", "AngularJS is used heavily by Google and many other high tech companies. As such, it is a hot skill, and employers are looking for software engineers who are good with AngularJS." ] @@ -381,7 +372,7 @@ exports.reverseEngineerSnapchat = function(req, res) { name: "Reverse Engineer Snapchat", links: [""], time: "50 hours", - directions: [ + steps: [ ] }); }; @@ -391,7 +382,7 @@ exports.reverseEngineerReddit = function(req, res) { name: "Reverse Engineer Reddit", links: [""], time: "50 hours", - directions: [ + steps: [ ] }); }; @@ -401,7 +392,7 @@ exports.reverseEngineerPintrest = function(req, res) { name: "Reverse Engineer Pintrest", links: [""], time: "50 hours", - directions: [ + steps: [ ] }); }; @@ -411,7 +402,7 @@ exports.helpANonprofitTeamProject = function(req, res) { name: "Help a Nonprofit Team Project", links: [""], time: "200 hours", - directions: [ + steps: [ ] }); }; @@ -421,7 +412,7 @@ exports.helpANonprofitSoloProject = function(req, res) { name: "Help a Nonprofit Solo Project", links: [""], time: "200 hours", - directions: [ + steps: [ ] }); }; @@ -431,7 +422,7 @@ exports.crackTheCodingInterview = function(req, res) { name: "Crack the Coding Interview", links: [""], time: "20 hours", - directions: [ + steps: [ ] }); }; \ No newline at end of file diff --git a/public/css/styles.less b/public/css/styles.less index c62f13afd2..68be8e87d0 100644 --- a/public/css/styles.less +++ b/public/css/styles.less @@ -127,6 +127,10 @@ ul { font-size: 40px; } +.panel-heading { + font-size: 25px; +} + .navbar-brand { font-size: 26px; } diff --git a/public/js/main.js b/public/js/main.js index fb94cd549d..798ccf708d 100644 --- a/public/js/main.js +++ b/public/js/main.js @@ -1,8 +1,7 @@ $(document).ready(function() { $('.start-challenge').on("click", function() { - $(this).addClass('animated zoomOut'); - $('.completed-challenge').removeClass('hidden-element').addClass('animated zoomIn delay-1'); - $('.skip-challenge').removeClass('hidden-element').addClass('animated zoomIn delay-1'); + $(this).parent().remove(); + $('.challenge-content').removeClass('hidden-element').addClass('animated fadeInDown'); }); $('.completed-challenge').on("click", function() { $('#complete-dialog').modal('show'); diff --git a/views/challenges/modify-and-redeploy-your-website.jade b/views/challenges/modify-and-redeploy-your-website.jade new file mode 100644 index 0000000000..3464508724 --- /dev/null +++ b/views/challenges/modify-and-redeploy-your-website.jade @@ -0,0 +1,7 @@ +extends ../layout +block content + .row + .col-sm-12.col-md-8.col-xs-12 + include partials/challenge + .col-sm-12.col-md-4.col-xs-12 + include ../partials/challenges diff --git a/views/challenges/partials/challenge.jade b/views/challenges/partials/challenge.jade index ba985c1bfb..a1b2a46f2c 100644 --- a/views/challenges/partials/challenge.jade +++ b/views/challenges/partials/challenge.jade @@ -1,27 +1,26 @@ .panel.panel-primary .panel-heading Challenge: #{name} .panel.panel-body - .responsive-container.animated.zoomIn.delay-1 - iframe(src='//player.vimeo.com/video/#{video}?autoplay=1', frameborder='0', webkitallowfullscreen='', mozallowfullscreen='', allowfullscreen='') - .animated.fadeIn.delay-2 - h3 Instructions: - for direction in directions - p= direction - - h3 Links You'll need: + .challenge-brief + h3.text-center + span.ion-android-clock + span Takes about #{time} + .btn.btn-primary.btn-large.btn-block.start-challenge Start the challenge + .challenge-content.hidden-element + .responsive-container + iframe(src='//player.vimeo.com/video/#{video}', frameborder='0', webkitallowfullscreen='', mozallowfullscreen='', allowfullscreen='') + h3 Steps: ol - for link in links - li - a(href=link, target="blank")= link - .button-container - .btn.btn-primary.btn-large.btn-block.start-challenge Start my challenge and open these links in new tabs - .btn.btn-success.btn-large.btn-block.completed-challenge.hidden-element I've completed this challenge - .ten-pixel-break - .btn.btn-primary.btn-large.btn-block.skip-challenge.hidden-element I want to skip this challenge + for step in steps + li!= step + .btn.btn-success.btn-large.btn-block.completed-challenge I've completed this challenge + .ten-pixel-break + .text-center + a.skip-challenge(href="#") I want to skip this challenge for now .panel-footer.text-center span Need a break?   a(href="http://blog.freecodecamp.com", target="_blank") Check out our blog - |   and   + |   and   a(href="https://twitter.com/freecodecamp", target="_blank") our recent tweets | . diff --git a/views/partials/challenges.jade b/views/partials/challenges.jade index 7b9da5c5a9..4170057c56 100644 --- a/views/partials/challenges.jade +++ b/views/partials/challenges.jade @@ -3,11 +3,15 @@ .panel-body ol li - a(href="challenges/enter-the-free-code-camp-chat-room") Enter the Free Code Camp Chat Room + a(href="/challenges/a-one-minute-introduction-to-free-code-camp") A One-minute Introduction to Free Code Camp li - a(href="challenges/install-github-atom-text-editor") Install Github's Atom Text Editor + a(href="/challenges/enter-the-free-code-camp-chat-room") Enter the Free Code Camp Chat Room li a(href="/challenges/create-and-deploy-a-website") Create a Website and Deploy it to the Internet + li + a(href="/challenges/install-github-atom-text-editor") Install Github's Atom Text Editor + li + a(href="/challenges/modify-and-redeploy-your-website") Modify and Redeploy Your Website li a(href="/challenges/start-a-pair-programming-session") Start Your First Pair Programming Session li @@ -19,63 +23,62 @@ li a(href="/challenges/code-school-try-jquery-course") Code School's Try jQuery li - a(href="challenges/complete-jquery-exercises") Complete these jQuery Exercises + a(href="/challenges/complete-jquery-exercises") Complete these jQuery Exercises li a(href="/challenges/code-school-discover-devtools-course") Code School's Discover DevTools li - a.disabled(href="challenges/customize-bootstrap-with-bootswatch") Customize Bootstrap with Bootswatch + a(href="/challenges/customize-bootstrap-with-bootswatch") Customize Bootstrap with Bootswatch li - a.disabled(href="challenges/inject-life-with-css-transformations") Inject Life with CSS Transformations + a(href="/challenges/inject-life-with-css-transformations") Inject Life with CSS Transformations li a(href="/challenges/codecademy-javascript-track") Codecademy's JavaScript track li - a(href="challenges/get-help-the-hacker-way-with-rsap") Get Help The Hacker Way with RSAP + a(href="/challenges/get-help-the-hacker-way-with-rsap") Get Help The Hacker Way with RSAP li - a(href="challenges/easy-algorthim-scripting-challenges-on-coderbyte") Easy Algorithm Scripting Challenges on Coderbyte + a(href="/challenges/easy-algorthim-scripting-challenges-on-coderbyte") Easy Algorithm Scripting Challenges on Coderbyte li a(href="/challenges/harvard-introduction-to-computer-science-cs50-course") Harvard's CS50: Introduction to Computer Science li - a(href="challenges/medium-algorthim-scripting-challenges-on-coderbyte") Medium Algorithm Scripting Challenges on Coderbyte + a(href="/challenges/medium-algorthim-scripting-challenges-on-coderbyte") Medium Algorithm Scripting Challenges on Coderbyte li - a(href="challenges/stanfords-json-mini-course") Stanford's JSON Mini-course + a(href="/challenges/stanfords-json-mini-course") Stanford's JSON Mini-course li - a.disabled(href="challenges/build-a-text-based-adventure") Build a Text-based Adventure + a(href="/challenges/build-a-text-based-adventure") Build a Text-based Adventure li - a.disabled(href="challenges/hard-algorthim-scripting-challenges-on-coderbyte") Hard Algorithm Scripting Challenges on Coderbyte + a(href="/challenges/hard-algorthim-scripting-challenges-on-coderbyte") Hard Algorithm Scripting Challenges on Coderbyte li - a.disabled(href="challenges/stanfords-sql-mini-course") Stanford's SQL Mini-course + a(href="/challenges/stanfords-sql-mini-course") Stanford's SQL Mini-course li - a.disabled(href="#") Build an Interview Question Machine - + a(href="/challenges/build-an-interview-question-machine") Build an Interview Question Machine li a(href="/challenges/code-school-try-git-course") Code School's Try Git li a(href="/challenges/install-node-js") Install Node.js li - a(href="/clone-a-github-repo") Clone a Github Repo + a(href="/challenges/clone-a-github-repo") Clone a Github Repo li - a.disabled(href="challenges/deploy-an-app-to-heroku") Deploy an app to Heroku + a(href="/challenges/deploy-an-app-to-heroku") Deploy an app to Heroku li a(href="/challenges/code-school-real-time-with-node-js-course") Code School's Real-time web with Node.JS li - a(href="challenges/try-mongodb") Try MongoDB + a(href="/challenges/try-mongodb") Try MongoDB li - a.disabled(href="challenges/explore-your-network-with-the-linkedin-api") Explore your Network with the LinkedIn API + a(href="/challenges/explore-your-network-with-the-linkedin-api") Explore your Network with the LinkedIn API li - a.disabled(href="challenges/build-your-first-api") Build your first API + a(href="/challenges/build-your-first-api") Build your first API li - a.disabled(href="challenges/aggregate-data-with-chron-jobs-and-screen-scraping") Aggregate Data with Chron Jobs and Screen Scraping + a(href="/challenges/aggregate-data-with-chron-jobs-and-screen-scraping") Aggregate Data with Chron Jobs and Screen Scraping li a(href="/challenges/code-school-shaping-up-with-angular-js-course") Code School's Shaping up with Angular.JS li - a.disabled(href="challenges/reverse-engineer-snapchat") Reverse Engineer SnapChat + a.disabled(href="/challenges/reverse-engineer-snapchat") Reverse Engineer SnapChat li - a.disabled(href="challenges/reverse-engineer-reddit") Reverse Engineer Reddit + a.disabled(href="/challenges/reverse-engineer-reddit") Reverse Engineer Reddit li - a.disabled(href="challenges/reverse-engineer-pintrest") Reverse Engineer Pintrest + a.disabled(href="/challenges/reverse-engineer-pintrest") Reverse Engineer Pintrest li - a.disabled(href="challenges/help-a-nonprofit-team-project") Help a Nonprofit: Team Project + a.disabled(href="/challenges/help-a-nonprofit-team-project") Help a Nonprofit: Team Project li - a.disabled(href="challenges/help-a-nonprofit-solo-project") Help a Nonprofit: Solo Project + a.disabled(href="/challenges/help-a-nonprofit-solo-project") Help a Nonprofit: Solo Project li - a.disabled(href="challenges/crack-the-coding-interview") Crack the Coding Interview \ No newline at end of file + a.disabled(href="/challenges/crack-the-coding-interview") Crack the Coding Interview \ No newline at end of file