From 75821c4db3b02e4413fdade48493332742609136 Mon Sep 17 00:00:00 2001 From: Berkeley Martinez Date: Thu, 3 Dec 2015 15:51:12 -0800 Subject: [PATCH 01/36] Change hikes order --- server/services/hikes.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/services/hikes.js b/server/services/hikes.js index 10b5221729..d8344fe91a 100644 --- a/server/services/hikes.js +++ b/server/services/hikes.js @@ -11,7 +11,7 @@ export default function hikesService(app) { read: (req, resource, params, config, cb) => { const query = { where: { challengeType: '6' }, - order: 'difficulty ASC' + order: 'suborder ASC' }; debug('params', params); From 9f922310ea276104f43215c478bf55e8a88bd002 Mon Sep 17 00:00:00 2001 From: Berkeley Martinez Date: Fri, 4 Dec 2015 20:55:12 -0800 Subject: [PATCH 02/36] Add recursive file seeding --- .../computer-basics.json} | 327 +---------------- seed/challenges/hikes/programming.json | 332 ++++++++++++++++++ seed/getChallenges.js | 19 +- 3 files changed, 351 insertions(+), 327 deletions(-) rename seed/challenges/{hikes.json => hikes/computer-basics.json} (54%) create mode 100644 seed/challenges/hikes/programming.json diff --git a/seed/challenges/hikes.json b/seed/challenges/hikes/computer-basics.json similarity index 54% rename from seed/challenges/hikes.json rename to seed/challenges/hikes/computer-basics.json index 0e9dbb56a4..7172c145c6 100644 --- a/seed/challenges/hikes.json +++ b/seed/challenges/hikes/computer-basics.json @@ -1,5 +1,5 @@ { - "name": "Hikes", + "name": "Computer Basics", "order": 0.050, "time": "3h", "challenges": [ @@ -479,331 +479,6 @@ "descriptionEs": [], "namePt": "", "descriptionPt": [] - }, - { - "id": "bd712bd8c441eddfbeb5bddf", - "title": "What Do Programmers Do?", - "challengeSeed": [ - "133166912" - ], - "description": [ - "Programmers (a.k.a. coders, developers, or software engineers) solve problems by turning big ideas into tiny steps that a computer can understand.", - "In this video, we'll discuss what programmers do.", - "Programmers can also be called coders, developers, or software engineers, and what all of these peple do is take ideas and turn them into functional code.", - "It's not just creating that code, but also maintaining it.", - "Let's look at how the computer looks at code, specifically javascript.", - "The computer looks at code one line at a time, and as you're writing code, you will notice numbers on the left hand side.", - "The computer literally goes down line by line, making sense of what each line has to say.", - "Everything is done sequentially, just straight down, so refrencing something that is below and hasn't happened yet will lead to a problem.", - "Computers just read straight down like you would read a book.", - "Programmers are the ones responsible for breaking their ideas down into the little tiny steps and writing them in a way that computers can understand them." - ], - "type": "hike", - "challengeType": 6, - "tests": [ - ["Computers look at code one line at a time", true], - ["Programmers and developers are totally different professions with very little in common.", false, "Those titles are so similar they could even describe the same job position."], - ["Programmers take ideas and break them down into little tiny steps the computer can understand", true] - ], - "nameCn": "", - "descriptionCn": [], - "nameFr": "", - "descriptionFr": [], - "nameRu": "", - "descriptionRu": [], - "nameEs": "", - "descriptionEs": [], - "namePt": "", - "descriptionPt": [] - }, - { - "id": "bd712ad8c441eddfbeb5bddf", - "title": "Console and Logging", - "challengeSeed": [ - "133170880" - ], - "description": [ - "We discuss what (and where) the console is, why it's useful, and show a little of how it works.", - "The console: what it is, where you can find it, and what you use it for.", - "The console is very commonly used to display system adminstrative messages.", - "Your browser and your computer both have their own consoles.", - "Once you become famlliar with it, you will find it to be a very useful and powerful tool.", - "In Javascript, the console is used as a great tool for debugging and finding out where in your code there's a problem.", - "One of the most important terms you'll need to remember is \"console.log()\".", - "The process of doing this can be put anywhere in the lines of code to help find, identify, and ultimately fix specific issues.", - "Using the Chrome browser and the Chrome console, if we type in \"console.log(\"Free Code Camp rocks!\");\", the console will literally display \"Free Code Camp rocks!\".", - "This will also work with numbers and booleans, which are true/false statements.", - "When consoling words, it's important to put it inside of quotations so it recognizes it's a string." - ], - "type": "hike", - "challengeType": 6, - "tests": [ - ["The console serves only small, unnecessary purposes.", false, "The console's main purpose is to debug, which is a vital step in creating code."], - ["You can console strings (sets of words), numbers, and booleans (true/false statements)", true] - ], - "nameCn": "", - "descriptionCn": [], - "nameFr": "", - "descriptionFr": [], - "nameRu": "", - "descriptionRu": [], - "nameEs": "", - "descriptionEs": [], - "namePt": "", - "descriptionPt": [] - }, - { - "id": "bd7119d8c441eddfbeb5bddf", - "title": "Variables In Code", - "challengeSeed": [ - "133172920" - ], - "description": [ - "Variables are used frequently in Javascript and many other coding languages.", - "In this video, we're going to talk about variables in code.", - "Variables, just like in Algebra, are when you have a letter or a word and it represents something else.", - "Here we're doing var x = \"Briana\". When we reference \"x\" later on, it's going to know that's Briana.", - "When we console.log(x), it's going to output \"Briana\".", - "But be careful - if we put console.log(\"x\"), with the x in quotation marks, it will output the letter \"x\".", - "What I want you to take away from this video is that variables exist in code, and you can store everything from a simple string all the way up to a function, all within a simple name." - ], - "type": "hike", - "challengeType": 6, - "tests": [ - ["Variables are useful in coding languages like JavaScript.", true], - ["Variables can't stand for anything that isn't a string, number, or boolean.", false, "Variables can stand for things ranging from simple to very complex"] - ], - "nameCn": "", - "descriptionCn": [], - "nameFr": "", - "descriptionFr": [], - "nameRu": "", - "descriptionRu": [], - "nameEs": "", - "descriptionEs": [], - "namePt": "", - "descriptionPt": [] - }, - { - "id": "bd7029d8c441eddfbeb5bddf", - "title": "Source Code", - "challengeSeed": [ - "133177129" - ], - "description": [ - "In this video we discuss what source code is, interpreters and compilers, and what open source means.", - "Let's talk about source code: what source code is, where you'll see it, and how the computer makes sense of it.", - "Source code itself is the actual text document that the programmer creates: they type it up, it's letters, numbers, and symbols.", - "If you give that to somebody and have them look at that document on their computer, that's not going to help them view their email, it's not going to be a browser, it's just a text document.", - "The computer has to have a way of interpreting that and making something really powerful run from it.", - "There are two main ways this is done: either by an interpreter or a compiler.", - "Every browser has an interpreter, and that's how javascript is processed.", - "Other languages, like C++, are used with a compiler.", - "Unlike an interpreter, the compiler does all of its work on the programmer's end.", - "They send out their package, their product, and it's already been compiled, it can already run on a machine.", - "Javascript, however, and other interpreter languages, you just write the javascript and the browser on the user's end has the capability to interpret it so you don't need a compiler.", - "Everyone has an opinion to which is better (interpreter or compiler), but really each has their pros and cons, and it goes on a case by case basis.", - "They're better at different things.", - "Now, let's focus on what open source means.", - "Free Code Camp is open source, meaning that all of the documentation and source code is open and accessable.", - "You may be thinking, \"so what?\", but what's awesome is that if you want to change or improve Free Code Camp, you can write that improvement and maybe get it implemented.", - "It's a great way for websites and software to grow in a strong and fast way because of the community working together to improve it.", - "One unwritten rule of contributing to open source projects is that you should generally submit your improvements to also be open source, and by giving that improvement back to the public, you let others use your improvement as well." - ], - "type": "hike", - "challengeType": 6, - "tests": [ - ["Source code is a text document.", true], - ["Javascript is a compiler language.", false, "Javascript is an interpreter language"], - ["Free Code Camp is open source.", true] - ], - "nameCn": "", - "descriptionCn": [], - "nameFr": "", - "descriptionFr": [], - "nameRu": "", - "descriptionRu": [], - "nameEs": "", - "descriptionEs": [], - "namePt": "", - "descriptionPt": [] - }, - { - "id": "bd7129d8b441eddfbeb5bddf", - "title": "Routers and Packets", - "challengeSeed": [ - "133181251" - ], - "description": [ - "In this video, we go into a little more detail about routers and packets, important concepts to understand about how the internet works.", - "Let's talk more about routers and how they relate to networking.", - "Routers are the things that connect different small area networks.", - "I want to give a metaphor for this: I'm a teacher and I work at a school.", - "Say I have a package that I need to get to someone who works in the district offices.", - "I don't know where she is, I don't know where her office is located, but I know her name.", - "I go to my secretary, like my first router, and I say \"Hey, I need to get this to so-and-so at the district office, can you please help me?\", and she'll say \"Sure, I don't know exactly where her office is either, but I know the next step, I can get it to the district\".", - "So she goes on and sends it to the secretary at the district office, the next router.", - "That secretary has no idea who I am or where I am, but she sees the name on the package and knows the end location.", - "What I'm trying to get across here is that each router only has to know its own little network, the stops right next to it.", - "It doesn't have to know the whole internet, but just its own connections.", - "It can take information and say, alright, I don't know exactly where that's going, but I'll pass it along in the right direction.", - "That's really all it takes.", - "Routers can be different sizes, different capacities, but what they do is know their own neighborhood, take the information, and pass it in the right direction.", - "Another thing we'll get into a little later is that the routers don't even have to have the full package of information.", - "If one comptuer is trying to send information to another, the data might get split up between different routers and that's okay.", - "The computers still know how to put the information back together correctly.", - "The little pieces of information that are sent are called packets.", - "Packets are actually little pieces of binary code (drawn on board).", - "This is an example of what packets might look like, a visual representation of the electrical current that the computer can translate into 1's and 0's, which we all know is binary that can represent literally any digital data.", - "These little packets are sent across through routers, and if a file is too large for one packet, it can be broken up into frames (smaller little packets).", - "The frames don't have to take the same route to the end destination.", - "They can take whichever route is open, whichever is fastest, and since they have the end IP address, all of the routers know where to send them.", - "Once they get to the end destination, that computer knows how to put all of the information back together." - ], - "type": "hike", - "challengeType": 6, - "tests": [ - ["Routers have to know the whole internet.", false, "Routers just have to know the stops around them to send information in the right direction."], - ["Packets are little peices of binary code.", true], - ["Packets have to be sent in one piece.", false, "packets can be broken up into frames."] - ], - "nameCn": "", - "descriptionCn": [], - "nameFr": "", - "descriptionFr": [], - "nameRu": "", - "descriptionRu": [], - "nameEs": "", - "descriptionEs": [], - "namePt": "", - "descriptionPt": [] - }, - { - "id": "bd7129d8a441eddfbeb5bddf", - "title": "Hardware: Chips and Moore's Law", - "challengeSeed": [ - "133182057" - ], - "description": [ - "We discuss what constitutes a chip and why technology gets cheaper every year.", - "In this video we are going to be talking about chips and something called Moore's Law.", - "You've probably noticed over the last 10 or so years, if you're going to go buy an MP3 player, you can get a lot more storage for a lot lower price.", - "You probably have even done the thing where you're at the store and you think, \"Well, I can get one now, or I could wait 6 months and see how far the price has dropped\", which might sound ridiculous but this is actually a trend that's been happening for a long time.", - "Let's talk about what makes a chip.", - "A chip is full of these little things called transistors, which are switches that can either be a 1 or a 0 (noticing a theme here?).", - "All of these transistors fit onto a chip, and that's how it stores information.", - "What makes these chips larger/faster is the amount of transistors on a single chip.", - "Moore's Law is the observation that the amount of transistors fit on each chip has doubled every two years since 1965.", - "This is important because it's making technology more affordable and accessible." - ], - "type": "hike", - "challengeType": 6, - "tests": [ - ["Chips have transistors, little switches that can store a 1 or a 0.", true], - ["Moore's Law is the observation that technology doubles in speed every year.", false, "Moore's Law is the observation that the number of transistors per chip doubles every 2 years)."], - ["Moore's Law has slowed down in recent years.", false, "Somehow this continues to be true."] - ], - "nameCn": "", - "descriptionCn": [], - "nameFr": "", - "descriptionFr": [], - "nameRu": "", - "descriptionRu": [], - "nameEs": "", - "descriptionEs": [], - "namePt": "", - "descriptionPt": [] - }, - { - "id": "bd7129d80441eddfbeb5bddf", - "title": "Analog vs Digital and File Compression", - "challengeSeed": [ - "133182587" - ], - "description": [ - "How computers turn analog sound into digital files, and the pros and cons of data compression.", - "Let's discuss analog vs digital on a very basic level.", - "Most specifically, we'll talk about how computers interpret analog sound and turn it into a digital file.", - "An analog sound wave could look like anything, but for this example it's a wavy line.", - "The computer takes it and measures at lots of different points, turning them into numbers.", - "This is called sampling.", - "Later, the computer can take those numbers and turn them into sound again.", - "Let's also discuss data compression.", - "The benefit of compression is that it's a smaller file: it's easier to store, it's easier to send to someone else, and it just takes up less space.", - "One of the ways this is done in sound is that the sampling is taken less often.", - "Another way is that it takes the measurement from a median point instead of from 0, so the numbers recorded are smaller.", - "In images, it's done by measuring groups of pixels by 16 instead of individually.", - "The takeaway from this video is that you'll want to use digital files as they're a higher quality, and when you're looking at compression, you want to decide how far you are willing to go to ensure the user still has the best possible experience." - ], - "type": "hike", - "challengeType": 6, - "tests": [ - ["Digital files can be made from analog sounds and analog sounds can be made from digital files.", true], - ["Compression is not worth it, because it lessens quality.", false, "Sometimes compression is a great idea. It depends on what you're trying to do and what your end goal for the product is."] - ], - "nameCn": "", - "descriptionCn": [], - "nameFr": "", - "descriptionFr": [], - "nameRu": "", - "descriptionRu": [], - "nameEs": "", - "descriptionEs": [], - "namePt": "", - "descriptionPt": [] - }, - { - "id": "bd7129d89441eddfbeb5bddf", - "title": "Computer Security", - "challengeSeed": [ - "133186284" - ], - "description": [ - "The basics of computer security, and how to make sure you protect your information.", - "Let's cover computer security.", - "The first thing we're going to talk about is something called a dictionary attack which has to do with your passwords.", - "When creating your passwords, some sites require extremely specific and complicated passwords, which is actually a bit unnecessary.", - "The type of attacks they're trying to gaurd you from are dictionary attacks.", - "Dictionary attacks are programmed to try every word in the dictionary, or in its own database of common words and passwords, as the password for a large mass of usernames.", - "If your password is Kangaroo, they're probably going to break into your account.", - "Most passwords aren't this simple, but that doesn't matter.", - "They attack such a massive amount of accounts that they only need a few passwords that are relatively simple.", - "When creating a password, you want to use different cases, numbers, and symbols, but one of the most effective ways to create a good password is to throw some random letters in there (ex: kangarooSyCA67).", - "Also, stay away from sequential numbers.", - "Phishing, another thing to watch out for, is emails or webpages that mimic other valid sites to try and trick people into entering their personal information, though the site truly isn't connected to the site it's trying to mimic.", - "In general, two ways to safeguard from these attacks are checking the address in the browser and to open a new browser and go to the website that is claiming to contact you.", - "Let's also discuss encryption and HTTPS.", - "If you are at Starbucks trying to access your bank account, you have reason to be suspicious that someone could see and take your information.", - "You will want to look for a green HTTPS instead of HTTP at the beginning of the web address.", - "That means that the site you're sending your information to is encrypting your passwords and other information, scrambling up data according to a code that only they know.", - "In general, whenever you're showing private or sensitive information, check for HTTPS.", - "A few other general tips: don't share passwords between important accounts.", - "If a site you use gets hacked into, your password may be compromised regardless of its strength.", - "Also, don't download strange files.", - "If you don't recognise the file type like .pdf, .txt, .jpg, be wary.", - "Some of these files you download can be very powerful and even run your computer from the inside.", - "Lastly, keep your software updated, particularly software that interacts with the internet.", - "One way that information can be compromised is when 'bad guys' find holes and gaps in security of older versions of softwares.", - "Those bugs have been patched in newer versions, so if you keep everything updated, you'll avoid lots of problems.", - "These are all very basic things you should know about how to keep your information safe on your computer." - ], - "type": "hike", - "challengeType": 6, - "tests": [ - ["Passwords should be shared with all of your accounts.", false, "Don't reuse important passwords"], - ["If you don't trust a site or an email, open a new browser and re-enter the intended location.", true], - ["Keeping software updated will help protect your computer and your information.", true] - ], - "nameCn": "", - "descriptionCn": [], - "nameFr": "", - "descriptionFr": [], - "nameRu": "", - "descriptionRu": [], - "nameEs": "", - "descriptionEs": [], - "namePt": "", - "descriptionPt": [] } ] } diff --git a/seed/challenges/hikes/programming.json b/seed/challenges/hikes/programming.json new file mode 100644 index 0000000000..eb424b3283 --- /dev/null +++ b/seed/challenges/hikes/programming.json @@ -0,0 +1,332 @@ +{ + "name": "Programming", + "order": 0.050, + "time": "3h", + "challenges": [ + { + "id": "bd712bd8c441eddfbeb5bddf", + "title": "What Do Programmers Do?", + "challengeSeed": [ + "133166912" + ], + "description": [ + "Programmers (a.k.a. coders, developers, or software engineers) solve problems by turning big ideas into tiny steps that a computer can understand.", + "In this video, we'll discuss what programmers do.", + "Programmers can also be called coders, developers, or software engineers, and what all of these peple do is take ideas and turn them into functional code.", + "It's not just creating that code, but also maintaining it.", + "Let's look at how the computer looks at code, specifically javascript.", + "The computer looks at code one line at a time, and as you're writing code, you will notice numbers on the left hand side.", + "The computer literally goes down line by line, making sense of what each line has to say.", + "Everything is done sequentially, just straight down, so refrencing something that is below and hasn't happened yet will lead to a problem.", + "Computers just read straight down like you would read a book.", + "Programmers are the ones responsible for breaking their ideas down into the little tiny steps and writing them in a way that computers can understand them." + ], + "type": "hike", + "challengeType": 6, + "tests": [ + ["Computers look at code one line at a time", true], + ["Programmers and developers are totally different professions with very little in common.", false, "Those titles are so similar they could even describe the same job position."], + ["Programmers take ideas and break them down into little tiny steps the computer can understand", true] + ], + "nameCn": "", + "descriptionCn": [], + "nameFr": "", + "descriptionFr": [], + "nameRu": "", + "descriptionRu": [], + "nameEs": "", + "descriptionEs": [], + "namePt": "", + "descriptionPt": [] + }, + { + "id": "bd712ad8c441eddfbeb5bddf", + "title": "Console and Logging", + "challengeSeed": [ + "133170880" + ], + "description": [ + "We discuss what (and where) the console is, why it's useful, and show a little of how it works.", + "The console: what it is, where you can find it, and what you use it for.", + "The console is very commonly used to display system adminstrative messages.", + "Your browser and your computer both have their own consoles.", + "Once you become famlliar with it, you will find it to be a very useful and powerful tool.", + "In Javascript, the console is used as a great tool for debugging and finding out where in your code there's a problem.", + "One of the most important terms you'll need to remember is \"console.log()\".", + "The process of doing this can be put anywhere in the lines of code to help find, identify, and ultimately fix specific issues.", + "Using the Chrome browser and the Chrome console, if we type in \"console.log(\"Free Code Camp rocks!\");\", the console will literally display \"Free Code Camp rocks!\".", + "This will also work with numbers and booleans, which are true/false statements.", + "When consoling words, it's important to put it inside of quotations so it recognizes it's a string." + ], + "type": "hike", + "challengeType": 6, + "tests": [ + ["The console serves only small, unnecessary purposes.", false, "The console's main purpose is to debug, which is a vital step in creating code."], + ["You can console strings (sets of words), numbers, and booleans (true/false statements)", true] + ], + "nameCn": "", + "descriptionCn": [], + "nameFr": "", + "descriptionFr": [], + "nameRu": "", + "descriptionRu": [], + "nameEs": "", + "descriptionEs": [], + "namePt": "", + "descriptionPt": [] + }, + { + "id": "bd7119d8c441eddfbeb5bddf", + "title": "Variables In Code", + "challengeSeed": [ + "133172920" + ], + "description": [ + "Variables are used frequently in Javascript and many other coding languages.", + "In this video, we're going to talk about variables in code.", + "Variables, just like in Algebra, are when you have a letter or a word and it represents something else.", + "Here we're doing var x = \"Briana\". When we reference \"x\" later on, it's going to know that's Briana.", + "When we console.log(x), it's going to output \"Briana\".", + "But be careful - if we put console.log(\"x\"), with the x in quotation marks, it will output the letter \"x\".", + "What I want you to take away from this video is that variables exist in code, and you can store everything from a simple string all the way up to a function, all within a simple name." + ], + "type": "hike", + "challengeType": 6, + "tests": [ + ["Variables are useful in coding languages like JavaScript.", true], + ["Variables can't stand for anything that isn't a string, number, or boolean.", false, "Variables can stand for things ranging from simple to very complex"] + ], + "nameCn": "", + "descriptionCn": [], + "nameFr": "", + "descriptionFr": [], + "nameRu": "", + "descriptionRu": [], + "nameEs": "", + "descriptionEs": [], + "namePt": "", + "descriptionPt": [] + }, + { + "id": "bd7029d8c441eddfbeb5bddf", + "title": "Source Code", + "challengeSeed": [ + "133177129" + ], + "description": [ + "In this video we discuss what source code is, interpreters and compilers, and what open source means.", + "Let's talk about source code: what source code is, where you'll see it, and how the computer makes sense of it.", + "Source code itself is the actual text document that the programmer creates: they type it up, it's letters, numbers, and symbols.", + "If you give that to somebody and have them look at that document on their computer, that's not going to help them view their email, it's not going to be a browser, it's just a text document.", + "The computer has to have a way of interpreting that and making something really powerful run from it.", + "There are two main ways this is done: either by an interpreter or a compiler.", + "Every browser has an interpreter, and that's how javascript is processed.", + "Other languages, like C++, are used with a compiler.", + "Unlike an interpreter, the compiler does all of its work on the programmer's end.", + "They send out their package, their product, and it's already been compiled, it can already run on a machine.", + "Javascript, however, and other interpreter languages, you just write the javascript and the browser on the user's end has the capability to interpret it so you don't need a compiler.", + "Everyone has an opinion to which is better (interpreter or compiler), but really each has their pros and cons, and it goes on a case by case basis.", + "They're better at different things.", + "Now, let's focus on what open source means.", + "Free Code Camp is open source, meaning that all of the documentation and source code is open and accessable.", + "You may be thinking, \"so what?\", but what's awesome is that if you want to change or improve Free Code Camp, you can write that improvement and maybe get it implemented.", + "It's a great way for websites and software to grow in a strong and fast way because of the community working together to improve it.", + "One unwritten rule of contributing to open source projects is that you should generally submit your improvements to also be open source, and by giving that improvement back to the public, you let others use your improvement as well." + ], + "type": "hike", + "challengeType": 6, + "tests": [ + ["Source code is a text document.", true], + ["Javascript is a compiler language.", false, "Javascript is an interpreter language"], + ["Free Code Camp is open source.", true] + ], + "nameCn": "", + "descriptionCn": [], + "nameFr": "", + "descriptionFr": [], + "nameRu": "", + "descriptionRu": [], + "nameEs": "", + "descriptionEs": [], + "namePt": "", + "descriptionPt": [] + }, + { + "id": "bd7129d8b441eddfbeb5bddf", + "title": "Routers and Packets", + "challengeSeed": [ + "133181251" + ], + "description": [ + "In this video, we go into a little more detail about routers and packets, important concepts to understand about how the internet works.", + "Let's talk more about routers and how they relate to networking.", + "Routers are the things that connect different small area networks.", + "I want to give a metaphor for this: I'm a teacher and I work at a school.", + "Say I have a package that I need to get to someone who works in the district offices.", + "I don't know where she is, I don't know where her office is located, but I know her name.", + "I go to my secretary, like my first router, and I say \"Hey, I need to get this to so-and-so at the district office, can you please help me?\", and she'll say \"Sure, I don't know exactly where her office is either, but I know the next step, I can get it to the district\".", + "So she goes on and sends it to the secretary at the district office, the next router.", + "That secretary has no idea who I am or where I am, but she sees the name on the package and knows the end location.", + "What I'm trying to get across here is that each router only has to know its own little network, the stops right next to it.", + "It doesn't have to know the whole internet, but just its own connections.", + "It can take information and say, alright, I don't know exactly where that's going, but I'll pass it along in the right direction.", + "That's really all it takes.", + "Routers can be different sizes, different capacities, but what they do is know their own neighborhood, take the information, and pass it in the right direction.", + "Another thing we'll get into a little later is that the routers don't even have to have the full package of information.", + "If one comptuer is trying to send information to another, the data might get split up between different routers and that's okay.", + "The computers still know how to put the information back together correctly.", + "The little pieces of information that are sent are called packets.", + "Packets are actually little pieces of binary code (drawn on board).", + "This is an example of what packets might look like, a visual representation of the electrical current that the computer can translate into 1's and 0's, which we all know is binary that can represent literally any digital data.", + "These little packets are sent across through routers, and if a file is too large for one packet, it can be broken up into frames (smaller little packets).", + "The frames don't have to take the same route to the end destination.", + "They can take whichever route is open, whichever is fastest, and since they have the end IP address, all of the routers know where to send them.", + "Once they get to the end destination, that computer knows how to put all of the information back together." + ], + "type": "hike", + "challengeType": 6, + "tests": [ + ["Routers have to know the whole internet.", false, "Routers just have to know the stops around them to send information in the right direction."], + ["Packets are little peices of binary code.", true], + ["Packets have to be sent in one piece.", false, "packets can be broken up into frames."] + ], + "nameCn": "", + "descriptionCn": [], + "nameFr": "", + "descriptionFr": [], + "nameRu": "", + "descriptionRu": [], + "nameEs": "", + "descriptionEs": [], + "namePt": "", + "descriptionPt": [] + }, + { + "id": "bd7129d8a441eddfbeb5bddf", + "title": "Hardware: Chips and Moore's Law", + "challengeSeed": [ + "133182057" + ], + "description": [ + "We discuss what constitutes a chip and why technology gets cheaper every year.", + "In this video we are going to be talking about chips and something called Moore's Law.", + "You've probably noticed over the last 10 or so years, if you're going to go buy an MP3 player, you can get a lot more storage for a lot lower price.", + "You probably have even done the thing where you're at the store and you think, \"Well, I can get one now, or I could wait 6 months and see how far the price has dropped\", which might sound ridiculous but this is actually a trend that's been happening for a long time.", + "Let's talk about what makes a chip.", + "A chip is full of these little things called transistors, which are switches that can either be a 1 or a 0 (noticing a theme here?).", + "All of these transistors fit onto a chip, and that's how it stores information.", + "What makes these chips larger/faster is the amount of transistors on a single chip.", + "Moore's Law is the observation that the amount of transistors fit on each chip has doubled every two years since 1965.", + "This is important because it's making technology more affordable and accessible." + ], + "type": "hike", + "challengeType": 6, + "tests": [ + ["Chips have transistors, little switches that can store a 1 or a 0.", true], + ["Moore's Law is the observation that technology doubles in speed every year.", false, "Moore's Law is the observation that the number of transistors per chip doubles every 2 years)."], + ["Moore's Law has slowed down in recent years.", false, "Somehow this continues to be true."] + ], + "nameCn": "", + "descriptionCn": [], + "nameFr": "", + "descriptionFr": [], + "nameRu": "", + "descriptionRu": [], + "nameEs": "", + "descriptionEs": [], + "namePt": "", + "descriptionPt": [] + }, + { + "id": "bd7129d80441eddfbeb5bddf", + "title": "Analog vs Digital and File Compression", + "challengeSeed": [ + "133182587" + ], + "description": [ + "How computers turn analog sound into digital files, and the pros and cons of data compression.", + "Let's discuss analog vs digital on a very basic level.", + "Most specifically, we'll talk about how computers interpret analog sound and turn it into a digital file.", + "An analog sound wave could look like anything, but for this example it's a wavy line.", + "The computer takes it and measures at lots of different points, turning them into numbers.", + "This is called sampling.", + "Later, the computer can take those numbers and turn them into sound again.", + "Let's also discuss data compression.", + "The benefit of compression is that it's a smaller file: it's easier to store, it's easier to send to someone else, and it just takes up less space.", + "One of the ways this is done in sound is that the sampling is taken less often.", + "Another way is that it takes the measurement from a median point instead of from 0, so the numbers recorded are smaller.", + "In images, it's done by measuring groups of pixels by 16 instead of individually.", + "The takeaway from this video is that you'll want to use digital files as they're a higher quality, and when you're looking at compression, you want to decide how far you are willing to go to ensure the user still has the best possible experience." + ], + "type": "hike", + "challengeType": 6, + "tests": [ + ["Digital files can be made from analog sounds and analog sounds can be made from digital files.", true], + ["Compression is not worth it, because it lessens quality.", false, "Sometimes compression is a great idea. It depends on what you're trying to do and what your end goal for the product is."] + ], + "nameCn": "", + "descriptionCn": [], + "nameFr": "", + "descriptionFr": [], + "nameRu": "", + "descriptionRu": [], + "nameEs": "", + "descriptionEs": [], + "namePt": "", + "descriptionPt": [] + }, + { + "id": "bd7129d89441eddfbeb5bddf", + "title": "Computer Security", + "challengeSeed": [ + "133186284" + ], + "description": [ + "The basics of computer security, and how to make sure you protect your information.", + "Let's cover computer security.", + "The first thing we're going to talk about is something called a dictionary attack which has to do with your passwords.", + "When creating your passwords, some sites require extremely specific and complicated passwords, which is actually a bit unnecessary.", + "The type of attacks they're trying to gaurd you from are dictionary attacks.", + "Dictionary attacks are programmed to try every word in the dictionary, or in its own database of common words and passwords, as the password for a large mass of usernames.", + "If your password is Kangaroo, they're probably going to break into your account.", + "Most passwords aren't this simple, but that doesn't matter.", + "They attack such a massive amount of accounts that they only need a few passwords that are relatively simple.", + "When creating a password, you want to use different cases, numbers, and symbols, but one of the most effective ways to create a good password is to throw some random letters in there (ex: kangarooSyCA67).", + "Also, stay away from sequential numbers.", + "Phishing, another thing to watch out for, is emails or webpages that mimic other valid sites to try and trick people into entering their personal information, though the site truly isn't connected to the site it's trying to mimic.", + "In general, two ways to safeguard from these attacks are checking the address in the browser and to open a new browser and go to the website that is claiming to contact you.", + "Let's also discuss encryption and HTTPS.", + "If you are at Starbucks trying to access your bank account, you have reason to be suspicious that someone could see and take your information.", + "You will want to look for a green HTTPS instead of HTTP at the beginning of the web address.", + "That means that the site you're sending your information to is encrypting your passwords and other information, scrambling up data according to a code that only they know.", + "In general, whenever you're showing private or sensitive information, check for HTTPS.", + "A few other general tips: don't share passwords between important accounts.", + "If a site you use gets hacked into, your password may be compromised regardless of its strength.", + "Also, don't download strange files.", + "If you don't recognise the file type like .pdf, .txt, .jpg, be wary.", + "Some of these files you download can be very powerful and even run your computer from the inside.", + "Lastly, keep your software updated, particularly software that interacts with the internet.", + "One way that information can be compromised is when 'bad guys' find holes and gaps in security of older versions of softwares.", + "Those bugs have been patched in newer versions, so if you keep everything updated, you'll avoid lots of problems.", + "These are all very basic things you should know about how to keep your information safe on your computer." + ], + "type": "hike", + "challengeType": 6, + "tests": [ + ["Passwords should be shared with all of your accounts.", false, "Don't reuse important passwords"], + ["If you don't trust a site or an email, open a new browser and re-enter the intended location.", true], + ["Keeping software updated will help protect your computer and your information.", true] + ], + "nameCn": "", + "descriptionCn": [], + "nameFr": "", + "descriptionFr": [], + "nameRu": "", + "descriptionRu": [], + "nameEs": "", + "descriptionEs": [], + "namePt": "", + "descriptionPt": [] + } + ] +} diff --git a/seed/getChallenges.js b/seed/getChallenges.js index 771050de0d..a617cca91a 100644 --- a/seed/getChallenges.js +++ b/seed/getChallenges.js @@ -3,13 +3,30 @@ var path = require('path'); function getFilesFor(dir) { - return fs.readdirSync(path.join(__dirname, '/' + dir)); + return fs.readdirSync(path.join(__dirname, '/' + dir)) + .map(function(file) { + if (fs.statSync(path.join(__dirname, dir + '/' + file)).isFile()) { + return file; + } + return getFilesFor(dir + '/' + file) + .map(function(_file) { + return file + '/' + _file; + }); + }) + .reduce(function(files, file) { + if (!Array.isArray(file)) { + files.push(file); + return files; + } + return files.concat(file); + }, []); } module.exports = function getChallenges() { try { return getFilesFor('challenges') .map(function(file) { + console.log('fo', file); var challengeSpec = require('./challenges/' + file); challengeSpec.fileName = file; From adc0ce28e5bb7d808be22d257b56acac5d16f52e Mon Sep 17 00:00:00 2001 From: Berkeley Martinez Date: Fri, 4 Dec 2015 21:06:36 -0800 Subject: [PATCH 03/36] Add superBlock to challenge seed --- common/models/challenge.json | 4 ++++ seed/getChallenges.js | 21 +++++++++++++-------- seed/index.js | 2 ++ 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/common/models/challenge.json b/common/models/challenge.json index 10ce49a058..7d9e3822d6 100644 --- a/common/models/challenge.json +++ b/common/models/challenge.json @@ -32,6 +32,10 @@ "dashedName": { "type": "string" }, + "superBlock": { + "type": "string", + "description": "Used for ordering challenge blocks in map" + }, "block": { "type": "string" }, diff --git a/seed/getChallenges.js b/seed/getChallenges.js index a617cca91a..982ddb3d6e 100644 --- a/seed/getChallenges.js +++ b/seed/getChallenges.js @@ -5,12 +5,17 @@ var path = require('path'); function getFilesFor(dir) { return fs.readdirSync(path.join(__dirname, '/' + dir)) .map(function(file) { + let superBlock; if (fs.statSync(path.join(__dirname, dir + '/' + file)).isFile()) { - return file; + return { file: file }; } - return getFilesFor(dir + '/' + file) - .map(function(_file) { - return file + '/' + _file; + superBlock = file; + return getFilesFor(dir + '/' + superBlock) + .map(function(data) { + return { + file: superBlock + '/' + data.file, + superBlock: superBlock + }; }); }) .reduce(function(files, file) { @@ -25,10 +30,10 @@ function getFilesFor(dir) { module.exports = function getChallenges() { try { return getFilesFor('challenges') - .map(function(file) { - console.log('fo', file); - var challengeSpec = require('./challenges/' + file); - challengeSpec.fileName = file; + .map(function(data) { + var challengeSpec = require('./challenges/' + data.file); + challengeSpec.fileName = data.file; + challengeSpec.superBlock = data.superBlock; return challengeSpec; }); diff --git a/seed/index.js b/seed/index.js index 6b252a2486..fa232842f1 100644 --- a/seed/index.js +++ b/seed/index.js @@ -17,6 +17,7 @@ destroy() .flatMap(function(challengeSpec) { var order = challengeSpec.order; var block = challengeSpec.name; + var superBlock = challengeSpec.superBlock; var isBeta = !!challengeSpec.isBeta; var fileName = challengeSpec.fileName; console.log('parsed %s successfully', block); @@ -43,6 +44,7 @@ destroy() challenge.order = order; challenge.suborder = index + 1; challenge.block = block; + challenge.superBlock = superBlock; challenge.isBeta = challenge.isBeta || isBeta; challenge.time = challengeSpec.time; From 29cee8b921b5c232a0de407c4b3717b3c1885078 Mon Sep 17 00:00:00 2001 From: Quincy Larson Date: Fri, 4 Dec 2015 23:41:52 -0600 Subject: [PATCH 04/36] restructure challenges within directories --- seed/challenges/angularjs.json | 165 ---------- .../advanced-bonfires.json | 0 .../api-projects.json | 301 ++++++++++++++++++ .../automated-testing-and-debugging.json | 0 .../back-end-development-certificate.json} | 12 +- .../backend-heavy-web-apps.json} | 2 +- .../git.json | 0 .../mongodb.json | 0 .../nodejs-and-expressjs.json | 0 .../upper-intermediate-bonfires.json | 0 .../data-visualization-certificate.json | 275 ++++++++++++++++ .../data-visualization-projects.json | 112 +++++++ .../react-projects.json | 112 +++++++ .../basic-bonfires.json | 0 .../basic-javascript.json | 0 .../basic-ziplines.json | 0 .../bootstrap.json | 0 .../front-end-development-certificate.json | 0 .../html5-and-css.json | 0 .../intermediate-bonfires.json | 0 .../intermediate-ziplines.json | 0 .../jquery.json | 0 .../json-apis-and-ajax.json | 0 ...t-oriented-and-functional-programming.json | 0 seed/challenges/gear-up-for-success.json | 139 -------- .../gear-up-for-success.json} | 139 ++++---- seed/create-challenge-bundle.js | 6 + 27 files changed, 871 insertions(+), 392 deletions(-) delete mode 100644 seed/challenges/angularjs.json rename seed/challenges/{ => back-end-development-certification}/advanced-bonfires.json (100%) create mode 100644 seed/challenges/back-end-development-certification/api-projects.json rename seed/challenges/{ => back-end-development-certification}/automated-testing-and-debugging.json (100%) rename seed/challenges/{full-stack-development-certificate.json => back-end-development-certification/back-end-development-certificate.json} (94%) rename seed/challenges/{basejumps.json => back-end-development-certification/backend-heavy-web-apps.json} (99%) rename seed/challenges/{ => back-end-development-certification}/git.json (100%) rename seed/challenges/{ => back-end-development-certification}/mongodb.json (100%) rename seed/challenges/{ => back-end-development-certification}/nodejs-and-expressjs.json (100%) rename seed/challenges/{ => back-end-development-certification}/upper-intermediate-bonfires.json (100%) create mode 100644 seed/challenges/data-visualization-certification/data-visualization-certificate.json create mode 100644 seed/challenges/data-visualization-certification/data-visualization-projects.json create mode 100644 seed/challenges/data-visualization-certification/react-projects.json rename seed/challenges/{ => front-end-development-certification}/basic-bonfires.json (100%) rename seed/challenges/{ => front-end-development-certification}/basic-javascript.json (100%) rename seed/challenges/{ => front-end-development-certification}/basic-ziplines.json (100%) rename seed/challenges/{ => front-end-development-certification}/bootstrap.json (100%) rename seed/challenges/{ => front-end-development-certification}/front-end-development-certificate.json (100%) rename seed/challenges/{ => front-end-development-certification}/html5-and-css.json (100%) rename seed/challenges/{ => front-end-development-certification}/intermediate-bonfires.json (100%) rename seed/challenges/{ => front-end-development-certification}/intermediate-ziplines.json (100%) rename seed/challenges/{ => front-end-development-certification}/jquery.json (100%) rename seed/challenges/{ => front-end-development-certification}/json-apis-and-ajax.json (100%) rename seed/challenges/{ => front-end-development-certification}/object-oriented-and-functional-programming.json (100%) delete mode 100644 seed/challenges/gear-up-for-success.json rename seed/challenges/{getting-started.json => getting-started/gear-up-for-success.json} (75%) create mode 100644 seed/create-challenge-bundle.js diff --git a/seed/challenges/angularjs.json b/seed/challenges/angularjs.json deleted file mode 100644 index 54170068ba..0000000000 --- a/seed/challenges/angularjs.json +++ /dev/null @@ -1,165 +0,0 @@ -{ - "name": "AngularJS", - "order": 16, - "time": "5h", - "challenges": [ - { - "id": "bd7154d8c441eddfaeb5bdef", - "title": "Get Started with Angular.js", - "challengeSeed": ["114684726"], - "description": [ - "Code School has a short, free Angular.js course. This will give us a quick tour of Angular.js's mechanics and features.", - "In this course, we'll build a virtual shop entirely in Angular.js.", - "Go to http://campus.codeschool.com/courses/shaping-up-with-angular-js/level/1/section/1/video/1 and complete the section." - ], - "type": "waypoint", - "challengeType": 2, - "tests": [ - "assert(true, 'No test needed');" - ], - "solutions": [ - "/* no test needed */" - ], - "nameCn": "", - "descriptionCn": [], - "nameFr": "", - "descriptionFr": [], - "nameRu": "", - "descriptionRu": [], - "nameEs": "Aprendamos a usar Angular.js", - "descriptionEs": [ - "Code School tiene un curso corto gratuito sobre Angular.js. Este curso nos dará un vistazo a las características y la mecánica de Angular.js.", - "En este curso crearemos una pequeña tienda virtual completamente en Angular.js.", - "Ve a http://campus.codeschool.com/courses/shaping-up-with-angular-js/level/1/section/1/video/1 y completa esa sección." - ], - "namePt": "", - "descriptionPt": [] - }, - { - "id": "bd7155d8c441eddfaeb5bdef", - "title": "Apply Angular.js Directives", - "challengeSeed": ["114684727"], - "description": [ - "Directives serve as markers in your HTML. When Angular.js compiles your HTML, it will alter the behavior of DOM elements based on the directives you've used.", - "Let's learn how these powerful directives work, and how to use them to make your web apps more dynamic", - "Go to http://campus.codeschool.com/courses/shaping-up-with-angular-js/level/2/section/1/video/1 and complete the section." - ], - "type": "waypoint", - "challengeType": 2, - "tests": [ - "assert(true, 'No test needed');" - ], - "solutions": [ - "/* no test needed */" - ], - "nameCn": "", - "descriptionCn": [], - "nameFr": "", - "descriptionFr": [], - "nameRu": "", - "descriptionRu": [], - "nameEs": "Aplica directivas en Angular.js", - "descriptionEs": [ - "Las directivas sirven como marcadores en tu HTML. Cuando Angular.js compila tu código HTML, también altera el comportamiento de los elementos del DOM basándose en las directivas que usaste.", - "Aprendamos a utilizar el poder de estas directivas, y cómo emplearlas para hacer tus apps más dinámicas.", - "Ve a http://campus.codeschool.com/courses/shaping-up-with-angular-js/level/2/section/1/video/1 y completa esa sección." - ], - "namePt": "", - "descriptionPt": [] - }, - { - "id": "bd7156d8c441eddfaeb5bdef", - "title": "Power Forms with Angular.js", - "challengeSeed": ["114684729"], - "description": [ - "One area where Angular.js really shines is its powerful web forms.", - "Learn how to create reactive Angular.js forms, including real-time form validation.", - "Go to http://campus.codeschool.com/courses/shaping-up-with-angular-js/level/3/section/1/video/1 and complete the section." - ], - "type": "waypoint", - "challengeType": 2, - "tests": [ - "assert(true, 'No test needed');" - ], - "solutions": [ - "/* no test needed */" - ], - "nameCn": "", - "descriptionCn": [], - "nameFr": "", - "descriptionFr": [], - "nameRu": "", - "descriptionRu": [], - "nameEs": "Formularios con Angular.js", - "descriptionEs": [ - "Un área donde Angular.js muestra su verdadero poder es en sus formularios web.", - "Aprendamos ahora a crear formularios reactivos en Angular.js, incluyendo validación en tiempo real.", - "Ve a http://campus.codeschool.com/courses/shaping-up-with-angular-js/level/3/section/1/video/1 y completa esa sección." - ], - "namePt": "", - "descriptionPt": [] - }, - { - "id": "bd7157d8c441eddfaeb5bdef", - "title": "Customize Angular.js Directives", - "challengeSeed": ["114685062"], - "description": [ - "Now we'll learn how to modify existing Angular.js directives, and even build directives of your own.", - "Go to http://campus.codeschool.com/courses/shaping-up-with-angular-js/level/4/section/1/video/1 and complete the section." - ], - "type": "waypoint", - "challengeType": 2, - "tests": [ - "assert(true, 'No test needed');" - ], - "solutions": [ - "/* no test needed */" - ], - "nameCn": "", - "descriptionCn": [], - "nameFr": "", - "descriptionFr": [], - "nameRu": "", - "descriptionRu": [], - "nameEs": "Crea directivas personalizadas con Angular.js", - "descriptionEs": [ - "Ahora aprenderemos a modificar directivas existentes en Angular.js y a crear nuestras propias directivas.", - "Ve a http://campus.codeschool.com/courses/shaping-up-with-angular-js/level/4/section/1/video/1 y completa esa sección." - ], - "namePt": "", - "descriptionPt": [] - }, - { - "id": "bd7158d8c441eddfaeb5bdef", - "title": "Create Angular.js Services", - "challengeSeed": ["114685060"], - "description": [ - "Services are functions that you can use and reuse throughout your Angular.js app to get things done.", - "We'll learn how to use services in this final Code School Angular.js challenge.", - "Go to http://campus.codeschool.com/courses/shaping-up-with-angular-js/level/5/section/1/video/1 and complete the section." - ], - "type": "waypoint", - "challengeType": 2, - "tests": [ - "assert(true, 'No test needed');" - ], - "solutions": [ - "/* no test needed */" - ], - "nameCn": "", - "descriptionCn": [], - "nameFr": "", - "descriptionFr": [], - "nameRu": "", - "descriptionRu": [], - "nameEs": "Crea servicios con Angular.js", - "descriptionEs": [ - "Los servicios son funciones que puedes usar y reciclar en tu app en Angular.js para mejorar tu eficiencia.", - "Aprenderemos cómo utilizar servicios en este desafío final de Angular.js en Code School.", - "Ve a http://campus.codeschool.com/courses/shaping-up-with-angular-js/level/5/section/1/video/1 y completa esa sección." - ], - "namePt": "", - "descriptionPt": [] - } - ] -} diff --git a/seed/challenges/advanced-bonfires.json b/seed/challenges/back-end-development-certification/advanced-bonfires.json similarity index 100% rename from seed/challenges/advanced-bonfires.json rename to seed/challenges/back-end-development-certification/advanced-bonfires.json diff --git a/seed/challenges/back-end-development-certification/api-projects.json b/seed/challenges/back-end-development-certification/api-projects.json new file mode 100644 index 0000000000..0f120cdd39 --- /dev/null +++ b/seed/challenges/back-end-development-certification/api-projects.json @@ -0,0 +1,301 @@ +{ + "name": "API Projects", + "order": 20, + "time": "100h", + "challenges": [ + { + "id": "bd7158d8c443edefaeb5bcef", + "title": "Get Set for Basejumps", + "challengeSeed": [], + "description": [ + [ + "http://i.imgur.com/4IZjWZ3.gif", + "A gif showing how to create a c9.io account.", + "We recommend building our full stack Basejump challenges on c9.io, a powerful browser-based development environment. This save you hours of time that you would spend configuring your local computer to run Node.js and MongoDB - time you could instead spend coding.
Create a c9.io account by clicking the GitHub symbol in the upper right hand corner of the c9.io page. Click the big plus symbol to create a new workspace. Enter your email address when prompted.", + "http://c9.io" + ], + [ + "http://i.imgur.com/F7i5Hhi.gif", + "A gif showing how to fill out the new workspace form", + "Instead of starting from scratch, we recommend using Clementine.js, a full stack JavaScript \"boilerplate\" that already has some basic code written for you. Clementine.js has a detailed tutorial you can go through to build it yourself, but for now let's just clone its code. On c9.io, give your workspace a name, then leave \"Template\" as custom and create your workspace from this GitHub url: https://github.com/johnstonbl01/clementinejs-fcc.git", + "" + ], + [ + "http://i.imgur.com/42m1vyr.gif", + "A gif showing you how to show hidden files.", + "Click the gear in the upper right corner of c9.io's file structure. Select \"show hidden files\".", + "" + ], + [ + "http://i.imgur.com/qrE8xaK.gif", + "A gif showing you how to create a new file.", + "Right click and create a new file called .env.", + "" + ], + [ + "http://i.imgur.com/jkQX9SQ.gif", + "A gif showing you how to prep your environmental variables in your .env file.", + "Open your .env file and paste this into it, then save it:
GITHUB_KEY=
GITHUB_SECRET=
MONGO_URI=mongodb://localhost:27017/clementinejs
PORT=8080
APP_URL=http://localhost:8080/
", + "" + ], + [ + "http://i.imgur.com/f3DE7zB.gif", + "A gif showing you how to open c9.io's preview window.", + "Open up your application in a preview tab by clicking window > share > application > open.", + "" + ], + [ + "http://i.imgur.com/Ip0qUdQ.gif", + "A gif showing you how to create a GitHub app using c9.io's preview URL.", + "Create a GitHub app for authentication and choose an \"Application name\". For the homepage URL, paste the URL from your preview tab. You'll also paste the URL from your preview tab into \"Authorization callback URL\", then add to it: auth/github/callback", + "https://github.com/settings/applications/new" + ], + [ + "http://i.imgur.com/qCUVRFb.gif", + "A gif showing you how to transfer GitHub's key and secret over to your .env file, as well as your c9.io URL.", + "GitHub will create an app and present you with a Client ID and a Client Secret. Set your .env file's GITHUB_KEY equal to the Client ID, and set your .env file's GITHUB_SECRET equal to the Client Secret. Copy the URL from the your preview tab and paste it into your .env file as your APP_URL.", + "" + ], + [ + "http://i.imgur.com/2a20Vah.gif", + "A gif showing you how to start mongoDB in c9.io's terminal.", + "In your terminal, start MongoDB by entering mongod --smallfiles", + "" + ], + [ + "http://i.imgur.com/dC55pWk.gif", + "A gif showing you how to open a new tab in c9.io's terminal.", + "Open a new terminal tab with the + button above your terminal, then run npm install", + "" + ], + [ + "http://i.imgur.com/54OC2Ro.gif", + "A gif showing you how to navigate to your preview tab and sign in to your new Clementine.js app.", + "Run node server.js to start the server. Refresh your preview tab. You should see the Clementine.js logo. Click \"sign in\" and accept GitHub's prompt to authorize the application.", + "" + ], + [ + "http://i.imgur.com/2IJfyvN.gif", + "A gif showing you how to click the button to trigger an AJAX action with Clementine.js and how to look at your user profile from the GitHub authentication data.", + "Click the \"click me\" button and you'll see that it increments the number clicks. Click the profile button and you'll see that it has your GitHub information.", + "" + ], + [ + "http://i.imgur.com/bjO5pnq.gif", + "A gif showing you how to create a new GitHub repository and push your code up to it.", + "Create a new GitHub repository. Then copy its .git URL.
Return to c9.io's terminal and set your GitHub remote URL: git remote set-url origin followed by the URL you copied from GitHub.
Run git push origin master.
Now tab back to GitHub and refresh, and you'll see that your code is now on GitHub.", + "https://github.com/new" + ], + [ + "http://i.imgur.com/Qn0K65B.gif", + "A gif showing you how to add add-ons to Heroku.", + "We will soon add instructions for getting Clementine running on Heroku. For now, develop your Basejumps right on c9.io.", + "" + ] + ], + "type": "Waypoint", + "challengeType": 7, + "tests": [], + "nameCn": "", + "descriptionCn": [], + "nameFr": "", + "descriptionFr": [], + "nameRu": "", + "descriptionRu": [], + "nameEs": "Prepárate para los Basejumps", + "descriptionEs": [ + [ + "http://i.imgur.com/4IZjWZ3.gif", + "Una imagen gif que te muestra cómo crear una cuenta en c9.io.", + "Te recomendamos resolver nuestros desafíos de pila completa (full stack) en c9.io, un poderoso ambiente de desarrollo basado en tu navegador. Esto te ahorrará muchas horas que utilizarías configurando tu computadora para correr Node.js y MongoDB - tiempo que podrías utilizar escribiendo código.
Crea una cuenta en c9.io pulsando el símbolo de GitHub en la esquina superior derecha de la página de c9.io. Pulsa el botón con el símbolo de suma para crear una área de trabajo nueva. Introduce tu dirección de correo electrónico cuando se te solicite.", + "http://c9.io" + ], + [ + "http://i.imgur.com/F7i5Hhi.gif", + "Una imagen gif que te muestra cómo llenar el formulario para crear un área de trabajo nueva", + "En vez de iniciar desde cero, recomendamos utilizar Clementine.js, un modelo (bolierplate) de JavaScript pila completa (full stack) que viene con código básico ya escrito para ti. Clementine.js tiene un tutorial detallado que puedes seguir para construirlo por ti mismo, pero por ahora simplemente vamos a clonarlo. En c9.io, dale un nombre a tu área de trabajo, luego deja \"Plantilla\" (\"Template\") como personalizado y crea tu espacio de trabajo usando el siguiente url de Github: https://github.com/johnstonbl01/clementinejs-fcc.git", + "" + ], + [ + "http://i.imgur.com/42m1vyr.gif", + "Una imagen gif que te muestra cómo mostrar los archivos ocultos.", + "Pulsa el engrane en la esquina superior derecha del árbol de archivos de c9.io. Selecciona \"show hidden files\".", + "" + ], + [ + "http://i.imgur.com/qrE8xaK.gif", + "Una imagen gif que te muestra cómo crear un archivo nuevo.", + "Haciendo clic derecho, crea un nuevo archivo llamado .env.", + "" + ], + [ + "http://i.imgur.com/jkQX9SQ.gif", + "Una imagen gif que te muestra cómo preparar tus variables de ambiente en tu archivo .env.", + "Abre tu archivo .env pega el siguiente código, y luego guárdalo:
GITHUB_KEY=
GITHUB_SECRET=
MONGO_URI=mongodb://localhost:27017/clementinejs
PORT=8080
APP_URL=http://localhost:8080/
", + "" + ], + [ + "http://i.imgur.com/f3DE7zB.gif", + "Una imagen gif que te muestra cómo abir la vista previa de la ventana de c9.io.", + "Abre tu aplicación en una pestaña de vista previa pulsando window > share > application > open.", + "" + ], + [ + "http://i.imgur.com/Ip0qUdQ.gif", + "Una imagen gif que te muestra cómo crear una aplicación de GitHub usando la URL de vista previa de c9.io.", + "Crea una aplicación de GitHub para autenticación y elige un \"Nombre de aplicación\". Para la URL de inicio (homepage), pega la URL de tu pestaña de vista previa. También debes pegar la URL de tu pestaña de vista previa en Authorization callback URL, agrégale: auth/github/callback", + "https://github.com/settings/applications/new" + ], + [ + "http://i.imgur.com/qCUVRFb.gif", + "Una imagen gif que te muestra cómo transferir tu llave (key) y tu código secreto (secret) de GitHub a tu archivo .env, así como tu URL de c9.io.", + "GitHub creará una aplicación y te entregará un ID de cliente (Client ID) y un Código secreto de cliente (Client Secret). Haz que el GITHUB_KEY en tu archivo .env sea igual al ID de cliente, y haz que tu GITHUB_SECRET en el archivo .env sea igual al Código secreto de cliente. Copia la URL de tu pestaña de vista previa y pégala en tu archivo .env como tu APP_URL.", + "" + ], + [ + "http://i.imgur.com/2a20Vah.gif", + "Una imagen gif que te muestra cómo iniciar mongoDB en la terminal de c9.io.", + "En tu terminal, inicia MongoDB con el siguiente comando: mongod --smallfiles", + "" + ], + [ + "http://i.imgur.com/dC55pWk.gif", + "Una imagen gif que te muestra cómo abrir una nueva pestaña en la terminal de c9.io.", + "Abre una nueva pestaña de terminal pulsando el botón de + sobre tu terminal, luego ejecuta npm install", + "" + ], + [ + "http://i.imgur.com/54OC2Ro.gif", + "Una imagen gif que te muestra cómo navegar a tu pestaña de vista previa e ingresar a tu nueva aplicación Clementine.js.", + "Ejecuta node server.js para iniciar el servidor. Actualiza tu pestaña de vista previa. Deberías poder ver el logo de Clementine.js. Pulsa \"sign in\" y acepta la solicitud de GitHub para autorizar la aplicación.", + "" + ], + [ + "http://i.imgur.com/2IJfyvN.gif", + "Una imagen gif que te muestra cómo pulsar un botón para desencadenar una acción AJAX con Clementine.js y cómo ver tu perfil de usuario en los datos de autenticación provistos por GitHub.", + "Pulsa el botón que dice \"click me\" y verás que se incrementa el número de clics. Pulsa el botón de perfil (profile) y verás la información de tu perfil de GitHub.", + "" + ], + [ + "http://i.imgur.com/bjO5pnq.gif", + "Una imagen gif que te muestra cómo crear un nuevo repositorio de GitHub GitHub y empujar allí tu código.", + "Crea un nuevo repositorio en GitHub. Luego copia su ULR .git.
Regresa a tu terminal de c9.io y establece tu URL remota de GitHub: git remote set-url origin seguido de la URL que copiaste de GitHub.
Ejecuta git push origin master.
Ahora ve de regreso a la página de GitHub y actualízala. Verás que tu código ahora está ahora en GitHub.", + "https://github.com/new" + ], + [ + "http://i.imgur.com/Qn0K65B.gif", + "Una imagen gif que te muestra cómo agregar complementos a Heroku.", + "Pronto agregaremos instrucciones para hacer que Clementine corra en Heroku. Por ahora, desarrolla tus Basejumps en c9.io.", + "" + ] + ], + "namePt": "", + "descriptionPt": [] + }, + { + "id": "bd7158d8c443edefaeb5bdef", + "title": "API Project 1", + "challengeSeed": [], + "description": [ + ], + "type": "basejump", + "challengeType": 4, + "tests": [], + "nameCn": "", + "descriptionCn": [], + "nameFr": "", + "descriptionFr": [], + "nameRu": "", + "descriptionRu": [], + "nameEs": "Crea una aplicación de votaciones", + "descriptionEs": [ + ], + "namePt": "", + "descriptionPt": [] + }, + { + "id": "bd7158d8c443edefaeb5bdff", + "title": "API Project 2", + "challengeSeed": [], + "description": [ + ], + "type": "basejump", + "challengeType": 4, + "tests": [], + "nameCn": "", + "descriptionCn": [], + "nameFr": "", + "descriptionFr": [], + "nameRu": "", + "descriptionRu": [], + "nameEs": "Crea una aplicación de coordinación de vida nocturna", + "descriptionEs": [ + ], + "namePt": "", + "descriptionPt": [] + }, + { + "id": "bd7158d8c443edefaeb5bd0e", + "title": "API Project 3", + "challengeSeed": [], + "description": [ + ], + "type": "basejump", + "challengeType": 4, + "tests": [], + "nameCn": "", + "descriptionCn": [], + "nameFr": "", + "descriptionFr": [], + "nameRu": "", + "descriptionRu": [], + "nameEs": "Grafica el mercado de acciones", + "descriptionEs": [ + ], + "namePt": "", + "descriptionPt": [] + }, + { + "id": "bd7158d8c443edefaeb5bd0f", + "title": "API Project 4", + "challengeSeed": [], + "description": [ + ], + "type": "basejump", + "challengeType": 4, + "tests": [], + "nameCn": "", + "descriptionCn": [], + "nameFr": "", + "descriptionFr": [], + "nameRu": "", + "descriptionRu": [], + "nameEs": "Administra un club de intercambio de libros", + "descriptionEs": [ + ], + "namePt": "", + "descriptionPt": [] + }, + { + "id": "bd7158d8c443edefaeb5bdee", + "title": "API Project 5", + "challengeSeed": ["133315784"], + "description": [ + ], + "type": "basejump", + "challengeType": 4, + "tests": [], + "nameCn": "", + "descriptionCn": [], + "nameFr": "", + "descriptionFr": [], + "nameRu": "", + "descriptionRu": [], + "nameEs": "Crea un clon de Pinterest", + "descriptionEs": [ + ], + "namePt": "", + "descriptionPt": [] + } + ] +} diff --git a/seed/challenges/automated-testing-and-debugging.json b/seed/challenges/back-end-development-certification/automated-testing-and-debugging.json similarity index 100% rename from seed/challenges/automated-testing-and-debugging.json rename to seed/challenges/back-end-development-certification/automated-testing-and-debugging.json diff --git a/seed/challenges/full-stack-development-certificate.json b/seed/challenges/back-end-development-certification/back-end-development-certificate.json similarity index 94% rename from seed/challenges/full-stack-development-certificate.json rename to seed/challenges/back-end-development-certification/back-end-development-certificate.json index 7e179d3713..fba11c242f 100644 --- a/seed/challenges/full-stack-development-certificate.json +++ b/seed/challenges/back-end-development-certification/back-end-development-certificate.json @@ -1,5 +1,5 @@ { - "name": "Claim Your Full Stack Development Certificate", + "name": "Claim Your Back End Development Certificate", "order": 21, "time": "5m", "challenges": [ @@ -8,16 +8,16 @@ "title": "Claim Your Full Stack Development Certificate", "challengeSeed": [ { - "properties": ["isHonest", "isFullStackCert"], - "apis": ["/certificate/honest", "/certificate/verify/full-stack"], + "properties": ["isHonest", "isBackEndCert"], + "apis": ["/certificate/honest", "/certificate/verify/back-end"], "stepIndex": [1, 2] } ], "description": [ [ "http://i.imgur.com/sKYQhdG.jpg", - "An image of our Full Stack Development Certificate", - "This challenge will give you your verified Full Stack Development Certificate. Before we issue your certificate, we must verify that you have completed all of Bonfires, Ziplines and Basejumps. You must also accept our Academic Honesty Pledge. Click the button below to start this process.", + "An image of our Back End Development Certificate", + "This challenge will give you your verified Back End Development Certificate. Before we issue your certificate, we must verify that you have completed all of Bonfires, Ziplines and Basejumps. You must also accept our Academic Honesty Pledge. Click the button below to start this process.", "" ], [ @@ -28,7 +28,7 @@ ], [ "http://i.imgur.com/2qn7tHp.jpg", - "An image of the text \"Full Stack Development Certificate requirements\"", + "An image of the text \"Back End Development Certificate requirements\"", "Let's confirm that you have completed all of our Bonfires, Ziplines and Basejumps. Click the button below to verify this.", "#" ], diff --git a/seed/challenges/basejumps.json b/seed/challenges/back-end-development-certification/backend-heavy-web-apps.json similarity index 99% rename from seed/challenges/basejumps.json rename to seed/challenges/back-end-development-certification/backend-heavy-web-apps.json index e8e12e46f3..4161759887 100644 --- a/seed/challenges/basejumps.json +++ b/seed/challenges/back-end-development-certification/backend-heavy-web-apps.json @@ -1,7 +1,7 @@ { "name": "Full Stack JavaScript Projects", "order": 20, - "time": "300h", + "time": "200h", "challenges": [ { "id": "bd7158d8c443eddfaeb5bcef", diff --git a/seed/challenges/git.json b/seed/challenges/back-end-development-certification/git.json similarity index 100% rename from seed/challenges/git.json rename to seed/challenges/back-end-development-certification/git.json diff --git a/seed/challenges/mongodb.json b/seed/challenges/back-end-development-certification/mongodb.json similarity index 100% rename from seed/challenges/mongodb.json rename to seed/challenges/back-end-development-certification/mongodb.json diff --git a/seed/challenges/nodejs-and-expressjs.json b/seed/challenges/back-end-development-certification/nodejs-and-expressjs.json similarity index 100% rename from seed/challenges/nodejs-and-expressjs.json rename to seed/challenges/back-end-development-certification/nodejs-and-expressjs.json diff --git a/seed/challenges/upper-intermediate-bonfires.json b/seed/challenges/back-end-development-certification/upper-intermediate-bonfires.json similarity index 100% rename from seed/challenges/upper-intermediate-bonfires.json rename to seed/challenges/back-end-development-certification/upper-intermediate-bonfires.json diff --git a/seed/challenges/data-visualization-certification/data-visualization-certificate.json b/seed/challenges/data-visualization-certification/data-visualization-certificate.json new file mode 100644 index 0000000000..4a59311abc --- /dev/null +++ b/seed/challenges/data-visualization-certification/data-visualization-certificate.json @@ -0,0 +1,275 @@ +{ + "name": "Claim Your Data Visualization Certificate", + "order": 12, + "time": "5m", + "challenges": [ + { + "id": "561add10cb82ac38a17513b3", + "title": "Claim Your Data Visualization Certificate", + "challengeSeed": [ + { + "properties": ["isHonest", "isDataVisualizationCert"], + "apis": ["/certificate/honest", "/certificate/verify/data-visualization"], + "stepIndex": [1, 2] + } + ], + "description": [ + [ + "http://i.imgur.com/syJxavV.jpg", + "An image of our Front End Development Certificate", + "This challenge will give you your verified Front End Development Certificate. Before we issue your certificate, we must verify that you have completed all of our basic and intermediate Bonfires, and all our basic and intermediate Ziplines. You must also accept our Academic Honesty Pledge. Click the button below to start this process.", + "" + ], + [ + "http://i.imgur.com/HArFfMN.jpg", + "The definition of plagiarism: Plagiarism (noun) - copying someone else’s work and presenting it as your own without crediting them", + "By clicking below, you pledge that all of your submitted code A) is code you or your pair personally wrote, or B) comes from open source libraries like jQuery, or C) has been clearly attributed to its original authors. You also give us permission to audit your challenge solutions and revoke your certificate if we discover evidence of plagiarism.", + "#" + ], + [ + "http://i.imgur.com/14F2Van.jpg", + "An image of the text \"Front End Development Certificate requirements\"", + "Let's confirm that you have completed all of our basic and intermediate Bonfires, and all our basic and intermediate Ziplines. Click the button below to verify this.", + "#" + ], + [ + "http://i.imgur.com/16SIhHO.jpg", + "An image of the word \"Congratulations\"", + "Congratulations! We've added your Front End Development Certificate to your certificate to your portfolio page. Unless you choose to hide your solutions, this certificate will remain publicly visible and verifiable.", + "" + ] + ], + "type": "Waypoint", + "challengeType": 7, + "tests": [ + { + "id": "ad7123c8c441eddfaeb5bdef", + "title": "Meet Bonfire" + }, + { + "id": "a202eed8fc186c8434cb6d61", + "title": "Reverse a String" + }, + { + "id": "a302f7aae1aa3152a5b413bc", + "title": "Factorialize a Number" + }, + { + "id": "aaa48de84e1ecc7c742e1124", + "title": "Check for Palindromes" + }, + { + "id": "a26cbbe9ad8655a977e1ceb5", + "title": "Find the Longest Word in a String" + }, + { + "id": "ab6137d4e35944e21037b769", + "title": "Title Case a Sentence" + }, + { + "id": "a789b3483989747d63b0e427", + "title": "Return Largest Numbers in Arrays" + }, + { + "id": "acda2fb1324d9b0fa741e6b5", + "title": "Confirm the Ending" + }, + { + "id": "afcc8d540bea9ea2669306b6", + "title": "Repeat a string repeat a string" + }, + { + "id": "ac6993d51946422351508a41", + "title": "Truncate a string" + }, + { + "id": "a9bd25c716030ec90084d8a1", + "title": "Chunky Monkey" + }, + { + "id": "ab31c21b530c0dafa9e241ee", + "title": "Slasher Flick" + }, + { + "id": "af2170cad53daa0770fabdea", + "title": "Mutations" + }, + { + "id": "adf08ec01beb4f99fc7a68f2", + "title": "Falsy Bouncer" + }, + { + "id": "a39963a4c10bc8b4d4f06d7e", + "title": "Seek and Destroy" + }, + { + "id": "a24c1a4622e3c05097f71d67", + "title": "Where do I belong" + }, + { + "id": "a3566b1109230028080c9345", + "title": "Sum All Numbers in a Range" + }, + { + "id": "a5de63ebea8dbee56860f4f2", + "title": "Diff Two Arrays" + }, + { + "id": "a7f4d8f2483413a6ce226cac", + "title": "Roman Numeral Converter" + }, + { + "id": "a8e512fbe388ac2f9198f0fa", + "title": "Where art thou" + }, + { + "id": "a0b5010f579e69b815e7c5d6", + "title": "Search and Replace" + }, + { + "id": "aa7697ea2477d1316795783b", + "title": "Pig Latin" + }, + { + "id": "afd15382cdfb22c9efe8b7de", + "title": "DNA Pairing" + }, + { + "id": "af7588ade1100bde429baf20", + "title": "Missing letters" + }, + { + "id": "a77dbc43c33f39daa4429b4f", + "title": "Boo who" + }, + { + "id": "a105e963526e7de52b219be9", + "title": "Sorted Union" + }, + { + "id": "a6b0bb188d873cb2c8729495", + "title": "Convert HTML Entities" + }, + { + "id": "a103376db3ba46b2d50db289", + "title": "Spinal Tap Case" + }, + { + "id": "a5229172f011153519423690", + "title": "Sum All Odd Fibonacci Numbers" + }, + { + "id": "a3bfc1673c0526e06d3ac698", + "title": "Sum All Primes" + }, + { + "id": "ae9defd7acaf69703ab432ea", + "title": "Smallest Common Multiple" + }, + { + "id": "a6e40f1041b06c996f7b2406", + "title": "Finders Keepers" + }, + { + "id": "a5deed1811a43193f9f1c841", + "title": "Drop it" + }, + { + "id": "ab306dbdcc907c7ddfc30830", + "title": "Steamroller" + }, + { + "id": "a8d97bd4c764e91f9d2bda01", + "title": "Binary Agents" + }, + { + "id": "a10d2431ad0c6a099a4b8b52", + "title": "Everything Be True" + }, + { + "id": "a97fd23d9b809dac9921074f", + "title": "Arguments Optional" + }, + { + "id": "bd7158d8c442eddfbeb5bd1f", + "title": "Get Set for Ziplines" + }, + { + "id": "bd7158d8c242eddfaeb5bd13", + "title": "Build a Personal Portfolio Webpage" + }, + { + "id": "bd7158d8c442eddfaeb5bd13", + "title": "Build a Random Quote Machine" + }, + { + "id": "bd7158d8c442eddfaeb5bd0f", + "title": "Build a Pomodoro Clock" + }, + { + "id": "bd7158d8c442eddfaeb5bd17", + "title": "Build a JavaScript Calculator" + }, + { + "id": "bd7158d8c442eddfaeb5bd10", + "title": "Show the Local Weather" + }, + { + "id": "bd7158d8c442eddfaeb5bd1f", + "title": "Use the Twitch.tv JSON API" + }, + { + "id": "bd7158d8c442eddfaeb5bd18", + "title": "Stylize Stories on Camper News" + }, + { + "id": "bd7158d8c442eddfaeb5bd19", + "title": "Build a Wikipedia Viewer" + }, + { + "id": "bd7158d8c442eedfaeb5bd1c", + "title": "Build a Tic Tac Toe Game" + }, + { + "id": "bd7158d8c442eddfaeb5bd1c", + "title": "Build a Simon Game" + } + ], + "nameCn": "", + "descriptionCn": [], + "nameFr": "", + "descriptionFr": [], + "nameRu": "", + "descriptionRu": [], + "nameEs": "Reclama tu certificado de desarrollo Front End", + "descriptionEs": [ + [ + "http://i.imgur.com/syJxavV.jpg", + "Una imagen que muestra nuestro certificado de desarrollo Front End", + "Este desafío te otorga tu certificado autenticado de desarrollo Front End. Antes de que podamos emitir tu certificado, debemos verificar que has completado todos los Bonfires básicos e intermedios, y todos los Ziplines básicos e intermedios. También debes aceptar nuestro Juramento de honestidad académica. Pulsa el botón siguiente para iniciar este proceso.", + "" + ], + [ + "http://i.imgur.com/HArFfMN.jpg", + "Plagio (nombre): acción y efecto de plagiar. Plagiar (verbo) - copiar en lo sustancial obras ajenas, dándolas como propias.", + "Al pulsar el botón siguiente, juras que todo el código en tus soluciones a los desafíos A) es código que tú o tu compañero escribieron personalmente, o B) proviene de librerías de código abierto como jQuery, o C) ha sido claramente atribuido a sus autores originales. También nos otorgas el permiso para auditar tus soluciones a los desafíos y revocar tu certificado si encontramos evidencia de plagio.", + "#" + ], + [ + "http://i.imgur.com/14F2Van.jpg", + "Una imagen del texto \"Front End Development Certificate requirements\"", + "Confirmemos que has completado todos nuestros Bonfires básicos e intermedios, y todos nuestros Ziplines básicos e intermedios. Pulsa el botón siguiente para hacer la verificación.", + "#" + ], + [ + "http://i.imgur.com/16SIhHO.jpg", + "Una imagen de la palabra \"Congratulations\"", + "¡Felicitaciones! Hemos agregado tu Certificado de desarrollo Front End a tu portafolio. A menos que elijas no mostrar tus soluciones, este certificado será públicamente visible y verificable.", + "" + ] + ], + "namePt": "", + "descriptionPt": [] + } + ] +} diff --git a/seed/challenges/data-visualization-certification/data-visualization-projects.json b/seed/challenges/data-visualization-certification/data-visualization-projects.json new file mode 100644 index 0000000000..66c3bc91be --- /dev/null +++ b/seed/challenges/data-visualization-certification/data-visualization-projects.json @@ -0,0 +1,112 @@ +{ + "name": "Data Visualization Projects", + "order": 20, + "time": "200h", + "challenges": [ + { + "id": "bd7158d8c443edefaeb5bdef", + "title": "Data Visualization Project 1", + "challengeSeed": [], + "description": [ + ], + "type": "zipline", + "challengeType": 3, + "tests": [], + "nameCn": "", + "descriptionCn": [], + "nameFr": "", + "descriptionFr": [], + "nameRu": "", + "descriptionRu": [], + "nameEs": "Crea una aplicación de votaciones", + "descriptionEs": [ + ], + "namePt": "", + "descriptionPt": [] + }, + { + "id": "bd7158d8c443edefaeb5bdff", + "title": "Data Visualization Project 2", + "challengeSeed": [], + "description": [ + ], + "type": "zipline", + "challengeType": 3, + "tests": [], + "nameCn": "", + "descriptionCn": [], + "nameFr": "", + "descriptionFr": [], + "nameRu": "", + "descriptionRu": [], + "nameEs": "Crea una aplicación de coordinación de vida nocturna", + "descriptionEs": [ + ], + "namePt": "", + "descriptionPt": [] + }, + { + "id": "bd7158d8c443edefaeb5bd0e", + "title": "Data Visualization Project 3", + "challengeSeed": [], + "description": [ + ], + "type": "zipline", + "challengeType": 3, + "tests": [], + "nameCn": "", + "descriptionCn": [], + "nameFr": "", + "descriptionFr": [], + "nameRu": "", + "descriptionRu": [], + "nameEs": "Grafica el mercado de acciones", + "descriptionEs": [ + ], + "namePt": "", + "descriptionPt": [] + }, + { + "id": "bd7158d8c443edefaeb5bd0f", + "title": "Data Visualization Project 4", + "challengeSeed": [], + "description": [ + ], + "type": "zipline", + "challengeType": 3, + "tests": [], + "nameCn": "", + "descriptionCn": [], + "nameFr": "", + "descriptionFr": [], + "nameRu": "", + "descriptionRu": [], + "nameEs": "Administra un club de intercambio de libros", + "descriptionEs": [ + ], + "namePt": "", + "descriptionPt": [] + }, + { + "id": "bd7158d8c443edefaeb5bdee", + "title": "Data Visualization Project 5", + "challengeSeed": ["133315784"], + "description": [ + ], + "type": "zipline", + "challengeType": 3, + "tests": [], + "nameCn": "", + "descriptionCn": [], + "nameFr": "", + "descriptionFr": [], + "nameRu": "", + "descriptionRu": [], + "nameEs": "Crea un clon de Pinterest", + "descriptionEs": [ + ], + "namePt": "", + "descriptionPt": [] + } + ] +} diff --git a/seed/challenges/data-visualization-certification/react-projects.json b/seed/challenges/data-visualization-certification/react-projects.json new file mode 100644 index 0000000000..fbc8d42cb0 --- /dev/null +++ b/seed/challenges/data-visualization-certification/react-projects.json @@ -0,0 +1,112 @@ +{ + "name": "React Projects", + "order": 20, + "time": "200h", + "challenges": [ + { + "id": "bd7158d8c443ede1aeb5bdef", + "title": "React Project 1", + "challengeSeed": [], + "description": [ + ], + "type": "zipline", + "challengeType": 3, + "tests": [], + "nameCn": "", + "descriptionCn": [], + "nameFr": "", + "descriptionFr": [], + "nameRu": "", + "descriptionRu": [], + "nameEs": "Crea una aplicación de votaciones", + "descriptionEs": [ + ], + "namePt": "", + "descriptionPt": [] + }, + { + "id": "bd7158d8c443ede1aeb5bdff", + "title": "React Project 2", + "challengeSeed": [], + "description": [ + ], + "type": "zipline", + "challengeType": 3, + "tests": [], + "nameCn": "", + "descriptionCn": [], + "nameFr": "", + "descriptionFr": [], + "nameRu": "", + "descriptionRu": [], + "nameEs": "Crea una aplicación de coordinación de vida nocturna", + "descriptionEs": [ + ], + "namePt": "", + "descriptionPt": [] + }, + { + "id": "bd7158d8c443ede1aeb5bd0e", + "title": "React Project 3", + "challengeSeed": [], + "description": [ + ], + "type": "zipline", + "challengeType": 3, + "tests": [], + "nameCn": "", + "descriptionCn": [], + "nameFr": "", + "descriptionFr": [], + "nameRu": "", + "descriptionRu": [], + "nameEs": "Grafica el mercado de acciones", + "descriptionEs": [ + ], + "namePt": "", + "descriptionPt": [] + }, + { + "id": "bd7158d8c443ede1aeb5bd0f", + "title": "React Project 4", + "challengeSeed": [], + "description": [ + ], + "type": "zipline", + "challengeType": 3, + "tests": [], + "nameCn": "", + "descriptionCn": [], + "nameFr": "", + "descriptionFr": [], + "nameRu": "", + "descriptionRu": [], + "nameEs": "Administra un club de intercambio de libros", + "descriptionEs": [ + ], + "namePt": "", + "descriptionPt": [] + }, + { + "id": "bd7158d8c443ede1aeb5bdee", + "title": "React Project 5", + "challengeSeed": ["133315784"], + "description": [ + ], + "type": "zipline", + "challengeType": 3, + "tests": [], + "nameCn": "", + "descriptionCn": [], + "nameFr": "", + "descriptionFr": [], + "nameRu": "", + "descriptionRu": [], + "nameEs": "Crea un clon de Pinterest", + "descriptionEs": [ + ], + "namePt": "", + "descriptionPt": [] + } + ] +} diff --git a/seed/challenges/basic-bonfires.json b/seed/challenges/front-end-development-certification/basic-bonfires.json similarity index 100% rename from seed/challenges/basic-bonfires.json rename to seed/challenges/front-end-development-certification/basic-bonfires.json diff --git a/seed/challenges/basic-javascript.json b/seed/challenges/front-end-development-certification/basic-javascript.json similarity index 100% rename from seed/challenges/basic-javascript.json rename to seed/challenges/front-end-development-certification/basic-javascript.json diff --git a/seed/challenges/basic-ziplines.json b/seed/challenges/front-end-development-certification/basic-ziplines.json similarity index 100% rename from seed/challenges/basic-ziplines.json rename to seed/challenges/front-end-development-certification/basic-ziplines.json diff --git a/seed/challenges/bootstrap.json b/seed/challenges/front-end-development-certification/bootstrap.json similarity index 100% rename from seed/challenges/bootstrap.json rename to seed/challenges/front-end-development-certification/bootstrap.json diff --git a/seed/challenges/front-end-development-certificate.json b/seed/challenges/front-end-development-certification/front-end-development-certificate.json similarity index 100% rename from seed/challenges/front-end-development-certificate.json rename to seed/challenges/front-end-development-certification/front-end-development-certificate.json diff --git a/seed/challenges/html5-and-css.json b/seed/challenges/front-end-development-certification/html5-and-css.json similarity index 100% rename from seed/challenges/html5-and-css.json rename to seed/challenges/front-end-development-certification/html5-and-css.json diff --git a/seed/challenges/intermediate-bonfires.json b/seed/challenges/front-end-development-certification/intermediate-bonfires.json similarity index 100% rename from seed/challenges/intermediate-bonfires.json rename to seed/challenges/front-end-development-certification/intermediate-bonfires.json diff --git a/seed/challenges/intermediate-ziplines.json b/seed/challenges/front-end-development-certification/intermediate-ziplines.json similarity index 100% rename from seed/challenges/intermediate-ziplines.json rename to seed/challenges/front-end-development-certification/intermediate-ziplines.json diff --git a/seed/challenges/jquery.json b/seed/challenges/front-end-development-certification/jquery.json similarity index 100% rename from seed/challenges/jquery.json rename to seed/challenges/front-end-development-certification/jquery.json diff --git a/seed/challenges/json-apis-and-ajax.json b/seed/challenges/front-end-development-certification/json-apis-and-ajax.json similarity index 100% rename from seed/challenges/json-apis-and-ajax.json rename to seed/challenges/front-end-development-certification/json-apis-and-ajax.json diff --git a/seed/challenges/object-oriented-and-functional-programming.json b/seed/challenges/front-end-development-certification/object-oriented-and-functional-programming.json similarity index 100% rename from seed/challenges/object-oriented-and-functional-programming.json rename to seed/challenges/front-end-development-certification/object-oriented-and-functional-programming.json diff --git a/seed/challenges/gear-up-for-success.json b/seed/challenges/gear-up-for-success.json deleted file mode 100644 index c39f10fda2..0000000000 --- a/seed/challenges/gear-up-for-success.json +++ /dev/null @@ -1,139 +0,0 @@ -{ - "name": "Gear up for Success", - "order": 4, - "time": "20m", - "challenges": [ - { - "id": "560add65cb82ac38a17513c2", - "title": "Browse Camper News", - "challengeSeed": [], - "description": [ - [ - "http://i.imgur.com/YNwsMXM.gif", - "A gif showing how you can access our Camper News page and click the \"upvote\" button to upvote a story.", - "Click the \"News\" button in your upper right hand corner.
You can browse links on Camper News and upvote the ones that you enjoy.", - "" - ] - ], - "type": "Waypoint", - "challengeType": 7, - "tests": [], - "nameCn": "", - "descriptionCn": [], - "nameFr": "", - "descriptionFr": [], - "nameRu": "", - "descriptionRu": [], - "nameEs": "Navega por las Noticias Campistas", - "descriptionEs": [ - [ - "http://i.imgur.com/YNwsMXM.gif", - "Un gif mostrando como acceder a nuestra página de Noticias Campistas y pulsar el botón \"voto a favor\" para votar por una historia.", - "Pulsa el botón de \"Noticias\" en tu esquina superior derecha.
Puedes navegar mediante los enlaces en Noticias Campistas y votar por aquellas que disfrutes.", - "" - ] - ], - "namePt": "", - "descriptionPt": [] - }, - { - "id": "560add65cb82ac38a17513c1", - "title": "Reference our Wiki", - "challengeSeed": [], - "description": [ - [ - "http://i.imgur.com/4GO4zcI.gif", - "A gif showing how you can click the \"Wiki\" button in your upper-right corner to access the wiki.", - "Click the \"Wiki\" button in your upper right hand corner.
Our community has contributed lots of useful information to this searchable wiki.", - "" - ] - ], - "type": "Waypoint", - "challengeType": 7, - "tests": [], - "nameCn": "", - "descriptionCn": [], - "nameFr": "", - "descriptionFr": [], - "nameRu": "", - "descriptionRu": [], - "nameEs": "Referencía nuestra Wiki", - "descriptionEs": [ - [ - "http://i.imgur.com/4GO4zcI.gif", - "Un gif mostrando como puedes pulsar el botón de \"Wiki\" en tu esquina superior derecha para acceder a la wiki.", - "Pulsa el botón de \"Wiki\" en tu esquina superior derecha.
Nuestra comunidad ha contribuido información bastante útil en esta wiki.", - "" - ] - ], - "namePt": "", - "descriptionPt": [] - }, - { - "id": "570add8ccb82ac38a17513c3", - "title": "Join our LinkedIn Alumni Network", - "challengeSeed": [], - "description": [ - [ - "http://i.imgur.com/vJyiXzU.gif", - "A gif showing how you can click the link below and fill in the necessary fields to add your Free Code Camp studies to your LinkedIn profile.", - "LinkedIn recognizes Free Code Camp as a university. You can gain access to our large alumni network by adding Free Code Camp to your LinkedIn profile's education section.
Set your graduation date as next year.
For \"Degree\", type \"Full Stack Web Development Certification\".
For \"Field of study\", type \"Computer Software Engineering\".
Then click \"Save Changes\".", - "https://www.linkedin.com/profile/edit-education?school=Free+Code+Camp" - ] - ], - "type": "Waypoint", - "challengeType": 7, - "tests": [], - "nameCn": "", - "descriptionCn": [], - "nameFr": "", - "descriptionFr": [], - "nameRu": "", - "descriptionRu": [], - "nameEs": "Únete a nuestra red de alumnos en LinkedIn", - "descriptionEs": [ - [ - "http://i.imgur.com/vJyiXzU.gif", - "Un gif mostrando como puedes pulsar el enlace que está más adelante y llenar todos los campos necesarios para agregar los estudios de Free Code Camp a tu perfil de LinkedIn", - "LinkedIn reconoce a Free Code Camp como una universidad. Puedes obtener acceso a nuestra larga red de alumnos agregando Free Code Camp a la sección de educación de tu LinkedIn.
Define tu fecha de graduación para el siguiente año.
En el campo \"Grado\", escribe \"Certificación de Desarrollo Web Full Stack\".
En \"Campo de estudio\", escribe \"Ingeniería de Software\".
Después pulsa \"Guardar Cambios\".", - "https://www.linkedin.com/profile/edit-education?school=Free+Code+Camp" - ] - ], - "namePt": "", - "descriptionPt": [] - }, - { - "id": "560add8ccb81ac38a17513c4", - "title": "Commit to a Goal and a Nonprofit", - "challengeSeed": [], - "description": [ - [ - "http://i.imgur.com/Og1ifsn.gif", - "A gif showing how you can commit to a goal for your Free Code Camp studies and pledge a monthly donation to a nonprofit to give you external motivation to reach that goal.", - "You can set a goal and pledge to donate to a nonprofit each month until you achieve that goal.
This will give you external motivation in your quest to learn to code, as well as an opportunity to help nonprofits right away.
Choose your goal, then choose a monthly donation. When you click \"commit\", the nonprofit's donation page will open in a new tab.
This is completely optional, and you can change your commitment or stop it at any time.", - "/commit" - ] - ], - "type": "Waypoint", - "challengeType": 7, - "tests": [], - "nameCn": "", - "descriptionCn": [], - "nameFr": "", - "descriptionFr": [], - "nameRu": "", - "descriptionRu": [], - "nameEs": "Comprométete con una meta y con una organización sin fines de lucro", - "descriptionEs": [ - [ - "http://i.imgur.com/Og1ifsn.gif", - "Un gif mostrando como te puedes comprometer con una meta para tus estudios de Free Code Camp y prometer una donación mensual a una organización sin fines de lucro para darte motivación externa de alcanzar esa meta.", - "Puedes poner una meta y prometer donar mensualmente a una organización sin fines de lucro hasta que alcances tu meta.
Esto te dará motivación externa en tu aventura de aprender a programar, así como una oportunidad para ayudar inmediatamente a organizaciones sin fines de lucro.
Elige tu meta, después elige tu donativo mensual. Cuando pulses en \"comprometerse\", la página de donación de la organización sin fines de lucro se abrirá en una nueva pestaña.
Esto es completamente opcional, y puedes cambiar tu compromiso o detenerlo en cualquier momento.", - "/comprometerse" - ] - ], - "namePt": "", - "descriptionPt": [] - } - ] -} diff --git a/seed/challenges/getting-started.json b/seed/challenges/getting-started/gear-up-for-success.json similarity index 75% rename from seed/challenges/getting-started.json rename to seed/challenges/getting-started/gear-up-for-success.json index 765baeb81d..7b646b9a97 100644 --- a/seed/challenges/getting-started.json +++ b/seed/challenges/getting-started/gear-up-for-success.json @@ -1,7 +1,7 @@ { - "name": "Get Started with Free Code Camp", + "name": "Gear up for Success", "order": 1, - "time": "10m", + "time": "15m", "challenges": [ { "id": "560add10cb82ac38a17513be", @@ -22,7 +22,7 @@ ], [ "http://i.imgur.com/D7Y5luw.jpg", - "A graph of the rate of job growth against growth in computer science degree graduates. There are 1.4 million jobs and only 400 thousand people to fill them.", + "A graph of the rate of job growth against growth in computer science degree graduates. There are 1.4 million jobs and only 400 million people to fill them.", "There are thousands of coding jobs currently going unfilled, and the demand for coders grows every year.", "" ], @@ -189,63 +189,8 @@ "descriptionFr": [], "nameRu": "", "descriptionRu": [], - "nameEs": "Crea una Cuenta de GitHub y Únete a nuestras Salas de Chat", - "descriptionEs": [ - [ - "http://i.imgur.com/EAR7Lvh.jpg", - "Una imagen de una de nuestras salas de chat en Gitter.", - "Ahora únete a las salas de chat de Free Code Camp. Puedes venir aquí en cualquier momento para charlar, hacer preguntas, o encontrar otro campista para programar juntos. Primero necesitaras una cuenta de GitHub.", - "" - ], - [ - "http://i.imgur.com/FEImaEN.gif", - "Una imagen mostrandote como pulsar en el enlace inferior para ir a GitHub, llenar los campos necesarios y enviarlos.", - "Crea una cuenta en GitHub. Asegúrate de usar tu dirección de correo real - GitHub mantendrá esto en privado.", - "https://github.com/join" - ], - [ - "http://i.imgur.com/ALN6zPK.gif", - "Un gif mostrandote como pulsar en la imagen de perfil en la esquina superior derecha de GitHub. Sube una foto tuya o continuaras usando la imagen de pixeles generada automáticamente. Entonces llena los campos restantes y haz clic en envíar.", - "En la esquina superior derecha pulsa sobre la imagen de pixeles, entonces selecciona configuraciones.
Sube una imagen tuya. Una foto de tu cara es mejor. Así es como tus compañeros campistas te verán en nuestras salas de chat, así que toma tu mejor ángulo.
Puedes añadir tu ciudad y tu nombre si lo deseas.", - "https://github.com/settings/profile" - ], - [ - "http://i.imgur.com/pYk0wOk.gif", - "Un gif mostrandote como puedes dar una estrella a un repositorio de GitHub.", - "Ve al repositorio de código libre de Free Code Camp y dale una \"estrella\". Las \"estrellas\" son el equivalente en GitHub de los \"me gusta\".", - "https://github.com/freecodecamp/freecodecamp" - ], - [ - "http://i.imgur.com/zwYPeQT.gif", - "Un gif mostrandote como pulsar en el enlace inferior para ir a nuestra sala de chat y pulsar en el botón de \"iniciar sesión con GitHub\". Entonces puedes pulsar en el próximo campo de texto y escribir un mensaje a tus compañeros campistas.", - "Ahora que tienes una cuenta de GitHub, puedes unirte a nuestro chat principal al iniciar sesión con GitHub. Presentate diciendo \"Hello world!\".
Cuéntales a los tus compañeros campistas como encontraste Free Code Camp. Además cuéntanos porque deseas aprender a programar.", - "https://gitter.im/FreeCodeCamp/FreeCodeCamp" - ], - [ - "http://i.imgur.com/Ecs5XAd.gif", - "Un gif mostrandote como puedes pulsar en el botón de configuraciones en la esquina superior derecha y modificar tus configuraciones de notificaciones.", - "Nuestras salas de chat son extremadamente activas. Deberías cambiar tus configuraciones para ser notificado únicamente si alguien te menciona.", - "" - ], - [ - "http://i.imgur.com/T0bGJPe.gif", - "Un gif mostrandote como puedes pulsar en la imagen de perfil de un usuario para iniciar una conversación privada con ese usuario.", - "Por favor nota que todas nuestras salas de chat son visibles para el público. Si necesitas compartir información privada, como una dirección de correo o un número de teléfono, hazlo en un mensaje privado.", - "" - ], - [ - "http://i.imgur.com/vDTMJSh.gif", - "Un gif mostrandote que puedes cambiar entre desafíos y nuestras salas de chat.", - "Mantén nuestra sala de chat abierta mientras trabajas en nuestros desafíos. De esta manera, puedes pedir ayuda si quedas atascado. Además puedes socializar con otros campistas cuando quieras tomar un descanso.", - "" - ], - [ - "http://i.imgur.com/WvQvNGN.gif", - "Un gif mostrandote como puedes pulsar abajo para descargar una aplicación de chat nativa para tu computadora.", - "También puedes descargar la aplicación de chat para tu computadora o teléfono móvil.", - "https://gitter.im/apps" - ] - ], + "nameEs": "", + "descriptionEs": [], "namePt": "", "descriptionPt": [] }, @@ -270,15 +215,8 @@ "descriptionFr": [], "nameRu": "", "descriptionRu": [], - "nameEs": "Configura tu portafolio de código", - "descriptionEs": [ - [ - "http://i.imgur.com/tP2ccTE.gif", - "Un gif mostrandore como puedes pulsar en tu imagen de perfil en la esquina superior derecha conectar tu portafolio y GitHub.", - "Dale un vistazo de tu portafolio de código. Da click en tu imagen en la esquina superior derecha. Para activar tu portafolio de código, necesitaras conectar tu cuenta de GitHub con Free Code Camp.
Tu portafolio de código muestra tu progreso y cuantos Brownie Points tienes. Puedes obtener Brownie Points completando desafíos y ayudando a otros campistas en nuestras salas de chat. Si obtienes Brownie Points varios días consecutivos, obtendrás una racha.", - "" - ] - ], + "nameEs": "", + "descriptionEs": [], "namePt": "", "descriptionPt": [] }, @@ -309,21 +247,60 @@ "descriptionFr": [], "nameRu": "", "descriptionRu": [], - "nameEs": "Únete a un Campamento en Tu Ciudad", - "descriptionEs": [ + "nameEs": "", + "descriptionEs": [], + "namePt": "", + "descriptionPt": [] + }, + { + "id": "570add8ccb82ac38a17513c3", + "title": "Join our LinkedIn Alumni Network", + "challengeSeed": [], + "description": [ [ - "http://i.imgur.com/NAOFJWN.jpg", - "Una imagen de algunos de nuestros campistas compartiendo en un café local. 3 hombres y 3 mujeres estan sentados alrededor de una mesa con portátiles afuera, y estan sonriendo y programando.", - "Nuestros Campamentos te ayudan a programar con otros campistas en tu ciudad. Puedes coordinar grupos de estudio o atender eventos de programación locales juntos.", - "" - ], - [ - "http://i.imgur.com/fTFMjwf.gif", - "Un gif mostrandote como puedes pulsar en el enlace inferior, encontrar tu ciudad en la lista de Campamentos, entonces haz clic en el enlace de Facebook para tu ciudad y unirte al grupo de Facebook de tu ciudad.", - "Encuentra tu ciudad en esta lista y haz clic en esta. Esto te llevara al grupo de Facebook del Campamento de tu ciudad.
Da clic en el botón de \"Unirse al grupo\" para unirte a el grupo. Alguien del mismo campamento debería aprobarte en breve.
Si tu ciudad no esta en esta lista, ve al final del articulo de la wiki para instrucciones en como crear un campamento para tu ciudad.", - "https://github.com/FreeCodeCamp/freecodecamp/wiki/List-of-Free-Code-Camp-city-based-Campsites" + "http://i.imgur.com/vJyiXzU.gif", + "A gif showing how you can click the link below and fill in the necessary fields to add your Free Code Camp studies to your LinkedIn profile.", + "LinkedIn recognizes Free Code Camp as a university. You can gain access to our large alumni network by adding Free Code Camp to your LinkedIn profile's education section.
Set your graduation date as next year.
For \"Degree\", type \"Full Stack Web Development Certification\".
For \"Field of study\", type \"Computer Software Engineering\".
Then click \"Save Changes\".", + "https://www.linkedin.com/profile/edit-education?school=Free+Code+Camp" ] ], + "type": "Waypoint", + "challengeType": 7, + "tests": [], + "nameCn": "", + "descriptionCn": [], + "nameFr": "", + "descriptionFr": [], + "nameRu": "", + "descriptionRu": [], + "nameEs": "", + "descriptionEs": [], + "namePt": "", + "descriptionPt": [] + }, + { + "id": "560add8ccb81ac38a17513c4", + "title": "Commit to a Goal and a Nonprofit", + "challengeSeed": [], + "description": [ + [ + "http://i.imgur.com/Og1ifsn.gif", + "A gif showing how you can commit to a goal for your Free Code Camp studies and pledge a monthly donation to a nonprofit to give you external motivation to reach that goal.", + "You can set a goal and pledge to donate to a nonprofit each month until you achieve that goal.
This will give you external motivation in your quest to learn to code, as well as an opportunity to help nonprofits right away.
Choose your goal, then choose a monthly donation. When you click \"commit\", the nonprofit's donation page will open in a new tab.
This is completely optional, and you can change your commitment or stop it at any time.", + "/commit" + ] + ], + "type": "Waypoint", + "challengeType": 7, + "tests": [], + "nameCn": "", + "descriptionCn": [], + "nameFr": "", + "descriptionFr": [], + "nameRu": "", + "descriptionRu": [], + "nameEs": "", + "descriptionEs": [], "namePt": "", "descriptionPt": [] }, diff --git a/seed/create-challenge-bundle.js b/seed/create-challenge-bundle.js new file mode 100644 index 0000000000..cec37ab1f5 --- /dev/null +++ b/seed/create-challenge-bundle.js @@ -0,0 +1,6 @@ +var fs = require('fs'); +var getChallenges = require('./getChallenges'); + +var challengeSpecs = getChallenges(); + +fs.writeFileSync('seed/challenge-bundle.json', JSON.stringify(challengeSpecs)); From 4c1d84cbf44aa630debf84729d42268d1e21bf06 Mon Sep 17 00:00:00 2001 From: Quincy Larson Date: Sat, 5 Dec 2015 00:11:04 -0600 Subject: [PATCH 05/36] fix duplicate ids --- .../data-visualization-projects.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/seed/challenges/data-visualization-certification/data-visualization-projects.json b/seed/challenges/data-visualization-certification/data-visualization-projects.json index 66c3bc91be..aa87a4088b 100644 --- a/seed/challenges/data-visualization-certification/data-visualization-projects.json +++ b/seed/challenges/data-visualization-certification/data-visualization-projects.json @@ -4,7 +4,7 @@ "time": "200h", "challenges": [ { - "id": "bd7158d8c443edefaeb5bdef", + "id": "bd7158d8c443ede2aeb5bdef", "title": "Data Visualization Project 1", "challengeSeed": [], "description": [ @@ -25,7 +25,7 @@ "descriptionPt": [] }, { - "id": "bd7158d8c443edefaeb5bdff", + "id": "bd7158d8c443ede2aeb5bdff", "title": "Data Visualization Project 2", "challengeSeed": [], "description": [ @@ -46,7 +46,7 @@ "descriptionPt": [] }, { - "id": "bd7158d8c443edefaeb5bd0e", + "id": "bd7158d8c443ede2aeb5bd0e", "title": "Data Visualization Project 3", "challengeSeed": [], "description": [ @@ -67,7 +67,7 @@ "descriptionPt": [] }, { - "id": "bd7158d8c443edefaeb5bd0f", + "id": "bd7158d8c443ede2aeb5bd0f", "title": "Data Visualization Project 4", "challengeSeed": [], "description": [ @@ -88,7 +88,7 @@ "descriptionPt": [] }, { - "id": "bd7158d8c443edefaeb5bdee", + "id": "bd7158d8c443ede2aeb5bdee", "title": "Data Visualization Project 5", "challengeSeed": ["133315784"], "description": [ From ab043d1c6d0bc6eb0a9a64018a365e9d48ea7480 Mon Sep 17 00:00:00 2001 From: Berkeley Martinez Date: Fri, 4 Dec 2015 22:13:14 -0800 Subject: [PATCH 06/36] Change map logic and view --- server/boot/challenge.js | 75 +++++++++++++++--------- server/views/challengeMap/show.jade | 89 +++++++++++++++-------------- 2 files changed, 93 insertions(+), 71 deletions(-) diff --git a/server/boot/challenge.js b/server/boot/challenge.js index 390cf1b76e..e967118e06 100644 --- a/server/boot/challenge.js +++ b/server/boot/challenge.js @@ -84,6 +84,26 @@ function updateUserProgress(user, challengeId, completedChallenge) { return user; } + +// small helper function to determine whether to mark something as new +const dateFormat = 'MMM MMMM DD, YYYY'; +function shouldShowNew(element, block) { + if (element) { + return typeof element.releasedOn !== 'undefined' && + moment(element.releasedOn, dateFormat).diff(moment(), 'days') >= -30; + } + + if (block) { + const newCount = block.reduce((sum, { markNew }) => { + if (markNew) { + return sum + 1; + } + return sum; + }, 0); + return newCount / block.length * 100 === 100; + } +} + module.exports = function(app) { const router = app.loopback.Router(); @@ -113,23 +133,31 @@ module.exports = function(app) { .shareReplay(); // create a stream of challenge blocks - const blocks$ = challenge$ + const superBlocks$ = challenge$ .map(challenge => challenge.toJSON()) // group challenges by block | returns a stream of observables .groupBy(challenge => challenge.block) // turn block group stream into an array - .flatMap(block$ => block$.toArray()) + .flatMap(blocks$ => blocks$.toArray()) // turn array into stream of object .map(blockArray => ({ name: blockArray[0].block, dashedName: dasherize(blockArray[0].block), - challenges: blockArray + challenges: blockArray, + superBlock: blockArray[0].superBlock })) .filter(({ name })=> { return name !== 'Hikes'; }) + .groupBy(block => block.superBlock) + .flatMap(superBlocks$ => superBlocks$.toArray()) .shareReplay(); + const blocks$ = superBlocks$ + .flatMap(superBlock => Observable.just(superBlock)) + .shareReplay(); + + superBlocks$.subscribe(() => {}); const User = app.models.User; const userCount$ = observeMethod(User, 'count'); @@ -455,23 +483,6 @@ module.exports = function(app) { function challengeMap({ user = {} }, res, next) { - // small helper function to determine whether to mark something as new - function shouldShowNew(element, block) { - if (element) { - return (typeof element.releasedOn !== 'undefined' && - moment(element.releasedOn, 'MMM MMMM DD, YYYY') - .diff(moment(), 'days') >= -30); - } else if (block) { - const newCount = block.reduce((sum, { markNew }) => { - if (markNew) { - return sum + 1; - } - return sum; - }, 0); - return newCount / block.length * 100 === 100; - } - } - let lastCompleted; const daysRunning = moment().diff(new Date('10/15/2014'), 'days'); @@ -485,7 +496,7 @@ module.exports = function(app) { .map(camperCount => numberWithCommas(camperCount)); // create a stream of an array of all the challenge blocks - const blocks$ = challenge$ + const superBlocks$ = challenge$ // mark challenge completed .map(challengeModel => { const challenge = challengeModel.toJSON(); @@ -511,6 +522,7 @@ module.exports = function(app) { return { isBeta, name: blockArray[0].block, + superBlock: blockArray[0].superBlock, dashedName: dasherize(blockArray[0].block), markNew: shouldShowNew(null, blockArray), challenges: blockArray, @@ -521,22 +533,31 @@ module.exports = function(app) { .filter(({ name }) => name !== 'Hikes') // turn stream of blocks into a stream of an array .toArray() - .doOnNext((blocks) => { + .doOnNext(blocks => { const lastCompletedBlock = _.findLast(blocks, (block) => { return block.completed === 100; }); lastCompleted = lastCompletedBlock && lastCompletedBlock.name || null; - }); + }) + .flatMap(blocks => Observable.from(blocks, null, null, Scheduler.default)) + .groupBy(block => block.superBlock) + .flatMap(blocks$ => blocks$.toArray()) + .map(superBlockArray => ({ + name: superBlockArray[0].superBlock, + blocks: superBlockArray + })) + .toArray(); Observable.combineLatest( camperCount$, - blocks$, - (camperCount, blocks) => ({ camperCount, blocks }) + superBlocks$, + (camperCount, superBlocks) => ({ camperCount, superBlocks }) ) .subscribe( - ({ camperCount, blocks }) => { + ({ camperCount, superBlocks }) => { + console.log('sup', superBlocks); res.render('challengeMap/show', { - blocks, + superBlocks, daysRunning, globalCompletedCount: numberWithCommas( 5612952 + (Math.floor((Date.now() - 1446268581061) / 2000)) diff --git a/server/views/challengeMap/show.jade b/server/views/challengeMap/show.jade index c02ac8ab0c..495b81009a 100644 --- a/server/views/challengeMap/show.jade +++ b/server/views/challengeMap/show.jade @@ -45,35 +45,38 @@ block content .row .col-xs-12.col-sm-8.col-sm-offset-2 h3 800 Hours of Practice: - - var i = 0 - for challengeBlock in blocks - - i++ - .row - if (user) - if (challengeBlock.completed === 100) - .hidden-xs.col-sm-3.col-md-2.text-primary.ion-checkmark-circled.padded-ionic-icon.text-center.map-p.negative-10 - .col-xs-1.col-sm-1.col-md-1.map-row-numbers - span.map-p.negative-10 #{i}. - .col-xs-11.col-sm-8.col-md-9 - span.map-p.faded.negative-10 - a(href='#' + challengeBlock.dashedName)= challengeBlock.name - if challengeBlock.markNew - span.text-danger.small     - strong - em NEW - else - .hidden-xs.col-sm-3.col-md-2 - .progress.progress-bar-padding.text-center.thin-progress-bar - .progress-bar(role='progressbar', aria-valuenow=(challengeBlock.completed), aria-valuemin='0', aria-valuemax='100', style='width: ' + challengeBlock.completed + '%;') - .col-xs-1.col-sm-1.col-md-1.map-row-numbers - span.map-p.negative-10 #{i}. - .col-xs-11.col-sm-8.col-md-9 - span.map-p.negative-10 - a(href='#' + challengeBlock.dashedName)= challengeBlock.name - if challengeBlock.markNew - span.text-danger.small     - strong - em NEW + ol + for superBlock in superBlocks + h1= superBlock.name + - var i = 0 + for challengeBlock in superBlock.blocks + - i++ + .row + if (user) + if (challengeBlock.completed === 100) + .hidden-xs.col-sm-3.col-md-2.text-primary.ion-checkmark-circled.padded-ionic-icon.text-center.map-p.negative-10 + .col-xs-1.col-sm-1.col-md-1.map-row-numbers + span.map-p.negative-10 #{i}. + .col-xs-11.col-sm-8.col-md-9 + li.map-p.faded.negative-10 + a(href='#' + challengeBlock.dashedName)= challengeBlock.name + if challengeBlock.markNew + span.text-danger.small     + strong + em NEW + else + .hidden-xs.col-sm-3.col-md-2 + .progress.progress-bar-padding.text-center.thin-progress-bar + .progress-bar(role='progressbar', aria-valuenow=(challengeBlock.completed), aria-valuemin='0', aria-valuemax='100', style='width: ' + challengeBlock.completed + '%;') + .col-xs-1.col-sm-1.col-md-1.map-row-numbers + span.map-p.negative-10 #{i}. + .col-xs-11.col-sm-8.col-md-9 + li.map-p.negative-10 + a(href='#' + challengeBlock.dashedName)= challengeBlock.name + if challengeBlock.markNew + span.text-danger.small     + strong + em NEW else .hidden-xs.col-sm-3.col-md-2 .col-xs-1.col-sm-1.col-md-1.map-row-numbers @@ -117,21 +120,19 @@ block content .col-xs-10.col-sm-8.col-md-9 span.map-p.negative-10 300-hour Nonprofit Project hr + for superBlock in superBlocks + for challengeBlock in superBlock.blocks + .row + a(href='#' name=challengeBlock.dashedName) + .spacer.negative-55 - for challengeBlock in blocks - .row - a(href='#' name=challengeBlock.dashedName) - .spacer.negative-55 - - .row - .hidden-xs.col-sm-3.col-md-2 - h3.text-primary.text-right.nowrap - i.fa.fa-clock-o - = challengeBlock.time - .col-xs-12.col-sm-9.col-md-10 - h3 #{challengeBlock.name}   - - + .row + .hidden-xs.col-sm-3.col-md-2 + h3.text-primary.text-right.nowrap + i.fa.fa-clock-o + = challengeBlock.time + .col-xs-12.col-sm-9.col-md-10 + h3 #{challengeBlock.name}   - var i = 0 for challenge in challengeBlock.challenges - i++ @@ -185,4 +186,4 @@ block content }, 1000); localStorage.hideRedditNotice = "true"; }); - }); \ No newline at end of file + }); From 8037ff9038bbf887b8f4a8f56fc000cb99da6b10 Mon Sep 17 00:00:00 2001 From: Berkeley Martinez Date: Fri, 4 Dec 2015 22:18:00 -0800 Subject: [PATCH 07/36] Remove hikes from map view --- server/boot/challenge.js | 5 ++--- server/views/challengeMap/show.jade | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/server/boot/challenge.js b/server/boot/challenge.js index e967118e06..ca4c25f451 100644 --- a/server/boot/challenge.js +++ b/server/boot/challenge.js @@ -157,7 +157,6 @@ module.exports = function(app) { .flatMap(superBlock => Observable.just(superBlock)) .shareReplay(); - superBlocks$.subscribe(() => {}); const User = app.models.User; const userCount$ = observeMethod(User, 'count'); @@ -192,7 +191,7 @@ module.exports = function(app) { // find challenge return challenge$ .map(challenge => challenge.toJSON()) - .filter(({ block }) => block !== 'Hikes') + .filter(({ superBlock }) => superBlock !== 'hikes') .filter(({ id }) => id === challengeId) // now lets find the block it belongs to .flatMap(challenge => { @@ -530,7 +529,7 @@ module.exports = function(app) { time: blockArray[0] && blockArray[0].time || '???' }; }) - .filter(({ name }) => name !== 'Hikes') + .filter(({ superBlock }) => superBlock !== 'hikes') // turn stream of blocks into a stream of an array .toArray() .doOnNext(blocks => { diff --git a/server/views/challengeMap/show.jade b/server/views/challengeMap/show.jade index 495b81009a..ddf8bee17d 100644 --- a/server/views/challengeMap/show.jade +++ b/server/views/challengeMap/show.jade @@ -45,7 +45,7 @@ block content .row .col-xs-12.col-sm-8.col-sm-offset-2 h3 800 Hours of Practice: - ol + ul for superBlock in superBlocks h1= superBlock.name - var i = 0 From 8175fbb2975fbbb73326a68d6769be316f6aaaa4 Mon Sep 17 00:00:00 2001 From: Berkeley Martinez Date: Fri, 4 Dec 2015 22:18:48 -0800 Subject: [PATCH 08/36] Remove console.log --- server/boot/challenge.js | 1 - 1 file changed, 1 deletion(-) diff --git a/server/boot/challenge.js b/server/boot/challenge.js index ca4c25f451..ca18817d39 100644 --- a/server/boot/challenge.js +++ b/server/boot/challenge.js @@ -554,7 +554,6 @@ module.exports = function(app) { ) .subscribe( ({ camperCount, superBlocks }) => { - console.log('sup', superBlocks); res.render('challengeMap/show', { superBlocks, daysRunning, From c736a5c00ff6a4db3cb98b290cd03b68f020b69a Mon Sep 17 00:00:00 2001 From: Berkeley Martinez Date: Fri, 4 Dec 2015 22:37:15 -0800 Subject: [PATCH 09/36] Use regex to hide hikes Capitalize super block --- seed/index.js | 7 ++++++- server/boot/challenge.js | 11 +++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/seed/index.js b/seed/index.js index fa232842f1..6ca98c33bb 100644 --- a/seed/index.js +++ b/seed/index.js @@ -44,9 +44,14 @@ destroy() challenge.order = order; challenge.suborder = index + 1; challenge.block = block; - challenge.superBlock = superBlock; challenge.isBeta = challenge.isBeta || isBeta; challenge.time = challengeSpec.time; + challenge.superBlock = superBlock + .split('-') + .map(function(word) { + return _.capitalize(word); + }) + .join(' '); return challenge; }); diff --git a/server/boot/challenge.js b/server/boot/challenge.js index ca18817d39..063ea7a27b 100644 --- a/server/boot/challenge.js +++ b/server/boot/challenge.js @@ -146,8 +146,9 @@ module.exports = function(app) { challenges: blockArray, superBlock: blockArray[0].superBlock })) - .filter(({ name })=> { - return name !== 'Hikes'; + .filter(({ superBlock }) => { + console.log('sup', superBlock); + return challengesRegex.test(superBlock); }) .groupBy(block => block.superBlock) .flatMap(superBlocks$ => superBlocks$.toArray()) @@ -191,7 +192,7 @@ module.exports = function(app) { // find challenge return challenge$ .map(challenge => challenge.toJSON()) - .filter(({ superBlock }) => superBlock !== 'hikes') + .filter(({ superBlock }) => challengesRegex.test(superBlock)) .filter(({ id }) => id === challengeId) // now lets find the block it belongs to .flatMap(challenge => { @@ -529,7 +530,9 @@ module.exports = function(app) { time: blockArray[0] && blockArray[0].time || '???' }; }) - .filter(({ superBlock }) => superBlock !== 'hikes') + .filter(({ superBlock }) => { + return !(/hikes/i).test(superBlock); + }) // turn stream of blocks into a stream of an array .toArray() .doOnNext(blocks => { From c87737a0c5f5f5e48c1ea871c222bc3adef52b1d Mon Sep 17 00:00:00 2001 From: Berkeley Martinez Date: Sat, 5 Dec 2015 08:53:58 -0800 Subject: [PATCH 10/36] Remove 800 hour thingy --- server/views/challengeMap/show.jade | 31 ----------------------------- 1 file changed, 31 deletions(-) diff --git a/server/views/challengeMap/show.jade b/server/views/challengeMap/show.jade index ddf8bee17d..c99e28e768 100644 --- a/server/views/challengeMap/show.jade +++ b/server/views/challengeMap/show.jade @@ -88,37 +88,6 @@ block content span.text-danger.small     strong em NEW - - .row - .col-xs-12.col-sm-8.col-sm-offset-2 - h3 800 Hours of   - a(href="/nonprofits/directory") Real World Work Experience - | : - - var i = 0 - .row - .hidden-xs.col-sm-3.col-md-2.ion-locked.padded-ionic-icon.text-center.map-p.negative-10 - .col-xs-1.col-sm-1.col-md-1.map-row-numbers - span.map-p.negative-10 #{++i}. - .col-xs-10.col-sm-8.col-md-9 - span.map-p.negative-10 100-hour Nonprofit Project - .row - .hidden-xs.col-sm-3.col-md-2.ion-locked.padded-ionic-icon.text-center.map-p.negative-10 - .col-xs-1.col-sm-1.col-md-1.map-row-numbers - span.map-p.negative-10 #{++i}. - .col-xs-10.col-sm-8.col-md-9 - span.map-p.negative-10 200-hour Nonprofit Project #1 - .row - .hidden-xs.col-sm-3.col-md-2.ion-locked.padded-ionic-icon.text-center.map-p.negative-10 - .col-xs-1.col-sm-1.col-md-1.map-row-numbers - span.map-p.negative-10 #{++i}. - .col-xs-10.col-sm-8.col-md-9 - span.map-p.negative-10 200-hour Nonprofit Project #2 - .row - .hidden-xs.col-sm-3.col-md-2.ion-locked.padded-ionic-icon.text-center.map-p.negative-10 - .col-xs-1.col-sm-1.col-md-1.map-row-numbers - span.map-p.negative-10 #{++i}. - .col-xs-10.col-sm-8.col-md-9 - span.map-p.negative-10 300-hour Nonprofit Project hr for superBlock in superBlocks for challengeBlock in superBlock.blocks From 108179e72e3ea7b70c999a0e4515b8f1762073fe Mon Sep 17 00:00:00 2001 From: Berkeley Martinez Date: Sat, 5 Dec 2015 09:35:05 -0800 Subject: [PATCH 11/36] Fix react motion api change --- common/app/routes/Hikes/components/Question.jsx | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/common/app/routes/Hikes/components/Question.jsx b/common/app/routes/Hikes/components/Question.jsx index 4f7e97f149..63dd15407d 100644 --- a/common/app/routes/Hikes/components/Question.jsx +++ b/common/app/routes/Hikes/components/Question.jsx @@ -1,5 +1,5 @@ import React, { PropTypes } from 'react'; -import { Spring } from 'react-motion'; +import { Motion } from 'react-motion'; import { History, Lifecycle } from 'react-router'; import debugFactory from 'debug'; import { @@ -215,7 +215,8 @@ export default React.createClass({ }, renderQuestion(number, question, answer, shake) { - return ({ val: { x } }) => { + return ({ x: xFunc }) => { + const x = xFunc().val.x; const style = { WebkitTransform: `translate3d(${ x }px, 0, 0)`, transform: `translate3d(${ x }px, 0, 0)` @@ -252,9 +253,9 @@ export default React.createClass({ xs={ 8 } xsOffset={ 2 }> - + { this.renderQuestion(number, question, answer, shake) } - + { this.renderInfo(showInfo, info) }