Minimal and fast micro blogging app. Watch a preview of your post update in real ime and use remarkable syntax to quickly add formatting.
The micro blog app is built with React. All data is stored via Firebase and secured behind a login. The styling follows Google's Material guidlines for beauty and speed.
Feel free to check it out.
Technologies Used:
Simple, no-frills recipe app for storing a list of recipes and needed ingredients. Check each ingredient you have on hand and never forget the instructions.
The recipe app is 100% front end. All data is stored via localstorage in your device's browser. Data is updated and stored in real time, including if you have multiple tabs open.
Feel free to check it out.
Technologies Used:
See the Pen FCC: Tribute Page #2 by Taylor Stauss (@ttstauss) on CodePen.
I had a lot of fun building this tribute page for my dad. I spent quite a bit of time looking at a lot of design examples to establish the look and feel. I selected blue because it's his favorite color followed by a split complementary color. The background image is blurred in order to not take the focus away from the profile. It's of Yosemite, one of our favorite places to visit growing up.
Technologies Used:
Key Techniques Used:
See the Pen FCC: Survey Form #2 by Taylor Stauss (@ttstauss) on CodePen.
I had a lot of fun building this survey form. I've spent a good part of my career in digital marketing and know how important surveys are and making sure the form looks good and works properly. The data can be invaluable. I also really like Google's Material Design principles. I'm a sucker for clean design.
Technologies Used:
Key Techniques Used:
See the Pen FCC: Product Landing Page #2 by Taylor Stauss (@ttstauss) on CodePen.
I had a good time designing this page. I've been wanting to design a website for my sister's makeup business for a while and this was a great exercise to do it. I also got to put some of my digital marketing background into play for copy and cta's. There's still a bit more to be done before it's ready for prime-time, but I think it's a good start.
Technologies Used:
Key Techniques Used:
See the Pen FCC: Technical Documentation Page #2 by Taylor Stauss (@ttstauss) on CodePen.
This was a fun page to create. I chose the R documentation because both of my brothers are data scientists who use R extensively. We always joke about how ugly their documentation pages are. I think a well formatted/designed doc page makes for a much more pleasant developer experience and is important for productivity.
Technologies Used:
Key Techniques Used:
See the Pen Personal Portfolio Webpage #2 by Taylor Stauss (@ttstauss) on CodePen.
I had already worked on a portfolio page before starting the bootcamp (the site you're currently on), so most of this page is a repeat of what I already had. The biggest difference is that I had used Bootstrap outright originally, in this project I attempted to mimic the look without relying on Bootstrap at all.
Technologies Used:
Key Techniques Used:
function palindrome(str) {
// set string to lowercase and remove non-alphanumeric characters
let newStr = str.toLowerCase().replace(/[^a-z0-9]/g, '')
// reverse string for comparison
let checkStr = newStr.split('').reverse().join('')
// check if strictly equal
return newStr === checkStr
}
palindrome("eye");
function convertToRoman(num) {
// set up an array for ones, tens, and hundreds
let ones = ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX']
let tens = ['X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC']
let hundreds = ['C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM']
let res = ''
// Add 'M' for every 1000
while (num >= 1000) {
res += 'M'
num -= 1000
}
// add appropriate hundreds value
while (num >= 100) {
res += hundreds[Math.floor(num/100 - 1)]
num = num % 100
}
// add appropriate tens value
while (num >= 10) {
res += tens[Math.floor(num/10 - 1)]
num = num % 10
}
// add appropriate ones value
while (num >= 1) {
res += ones[Math.floor(num - 1)]
num = 0
}
return res
}
function rot13(str) {
return (
str
// split string into array
.split('')
// map array to new array
.map(item => {
// if item was non-alphabetic character ignore it
if (item.match(/[^\w+]/g)) {
return item
} else {
// return character based on result of calculation
return String.fromCharCode(
item.charCodeAt(0) < 78 // if char code is below 78
? 90 + (item.charCodeAt(0) - 12 - 65) // find offset from char code 90
: item.charCodeAt(0) - 13 // find offset from base code
)
}
})
.join('')
)
}
// Change the inputs below to test
rot13("SERR PBQR PNZC")
function telephoneCheck(str) {
return !!str.match(/^(1\s?)?(\([0-9]{3}\)|[0-9]{3})\-?\s?[0-9]{3}\-?\s?[0-9]{4}$/)
}
telephoneCheck("555-555-5555");
function checkCashRegister(price, cash, cid) {
// calculate change
let change = cash - price
// set up default result object
let res = {}
// convert cid to object and add up total
// use .reduce with default object and total prop
let till = cid.reduce((obj, prop) => {
obj[prop[0]] = prop[1]
obj.total += prop[1]
return obj
}, { total: 0 })
// check if total is less than change due
if (till.total < change) {
res.status = 'INSUFFICIENT_FUNDS'
res.change = []
return res
}
// check is total equals change due
if (till.total === change) {
res.status = 'CLOSED'
res.change = cid
return res
}
// set up denominations array
// reverse to make it easier to work with below
let denomsArr = [
['PENNY', 0.01],
['NICKEL', 0.05],
['DIME', 0.1],
['QUARTER', 0.25],
['ONE', 1],
['FIVE', 5],
['TEN', 10],
['TWENTY', 20],
['ONE HUNDRED', 100],
].reverse()
// track change by denomination
let changeByDenom = []
// set up empty array for use in loop
let changeDenom = []
// loop through each denomination
for (let i = 0; i < denomsArr.length; i++) {
// set initial change item
changeDenom = [denomsArr[i][0], 0]
// loop until change is smaller than denomination
// and if till would dip below zero
while (change >= denomsArr[i][1] && till[denomsArr[i][0]] > 0) {
// decrement change by the denomination value
change -= denomsArr[i][1]
// decrement the till by the denomination value
till[denomsArr[i][0]] -= denomsArr[i][1]
// increment the change value
changeDenom[1] += denomsArr[i][1]
// fix precision issues
change = Math.round(change * 100) / 100
}
// only return change for denomination if greater than zero
if (changeDenom[1] > 0) {
changeByDenom.push(changeDenom)
}
}
// check if there is leftover change
if (change > 0) {
res.status = 'INSUFFICIENT_FUNDS'
res.change = []
return res
}
// set status and change
res.status = 'OPEN'
res.change = changeByDenom
return res
}
checkCashRegister(19.5, 20, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]])
See the Pen FCC: Random Quote Machine by Taylor Stauss (@ttstauss) on CodePen.
I had a good time working on this project. A few years ago I made it partway through FCC and remember doing this project without React. It's amazing how far tech has come. I'm really liking React.
Technologies Used:
Key Techniques Used:
See the Pen FCC Markdown Previewer by Taylor Stauss (@ttstauss) on CodePen.
Good project. I've used Remarkable in a past project here. It was fun to learn a new library.
Technologies Used:
Key Techniques Used:
See the Pen FCC: Drum Machine by Taylor Stauss (@ttstauss) on CodePen.
This was a cool project. I can see how you could use some of these techniques to get really creative.
Technologies Used:
Key Techniques Used:
See the Pen FCC: JavaScrip Calculator by Taylor Stauss (@ttstauss) on CodePen.
This was a challenging project. There are definitely holes in my calculator, but I got it to pass all test cases. My main concern is the use of the eval() method. I know that there are risks and performance considerations. In the future I'd like to practice my algorithm scripting and build my own eval method (and fix some of the fringe cases on this calculator).
Technologies Used:
Key Techniques Used:
See the Pen FCC: Pomodoro Clock by Taylor Stauss (@ttstauss) on CodePen.
I remember trying this project a few years ago (my first time trying to go through FCC—I think this is the project I stopped on—life does that to you), I very much enjoyed using React/Redux to do this as opposed to vanilla JavaScript. This exercise got me very familiar with some of the nuances of the two technologies.
Technologies Used:
Key Techniques Used:
See the Pen FCC: Bar Chart by Taylor Stauss (@ttstauss) on CodePen.
See the Pen FCC: Scatter Plot by Taylor Stauss (@ttstauss) on CodePen.
See the Pen FCC: Heatmap by Taylor Stauss (@ttstauss) on CodePen.
See the Pen FCC: Choropleth Map by Taylor Stauss (@ttstauss) on CodePen.
See the Pen FCC: Tree Map by Taylor Stauss (@ttstauss) on CodePen.
GET [project_url]/api/timestamp/:date_string?
new Date(date_string)
(JS) . Note that the unix timestamp needs to be an integer (not a string) specifying milliseconds. In our test we will use date strings compliant with ISO-8601 (e.g. "2016-11-20") because this will ensure an UTC timestamp.new Date()
, i.e. the service uses the current timestamp.{"unix": <date.getTime()>, "utc" : <date.toUTCString()> }
e.g. {"unix": 1479663089000 ,"utc": "Sun, 20 Nov 2016 17:31:29 GMT"}
.{"unix": null, "utc" : "Invalid Date" }
. It is what you get from the date manipulation functions used above.{ "unix": 1450137600, "natural": "December 15, 2015" }
Accept-Language
) and system infos (from header User-Agent
) for my device.{"ipaddress":"159.20.14.100","language":"en-US,en;q=0.5","software":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:50.0) Gecko/20100101 Firefox/50.0"}
https://fcc-api-project-url-shortener-microservice.glitch.me/api/shorturl/new
and I will receive a shortened URL in the JSON response. Example : {"original_url":"www.google.com","short_url":1}
valid http(s)://www.example.com(/more/routes)
format, the JSON response will contain an error like {"error":"invalid URL"}
. HINT: to be sure that the submitted url points to a valid site you can use the function dns.lookup(host, cb)
from the dns
core module.POST https://fcc-api-project-url-shortener-microservice.glitch.me/api/shorturl/new
: url=https://www.freecodecamp.com
https://fcc-api-project-url-shortener-microservice.glitch.me/api/shorturl/0
userId(_id)
, description, duration, and optionally date to /api/exercise/add
. If no date supplied it will use current date. Returned will the the user object with also with the exercise fields added./api/exercise/log
with a parameter of userId(_id)
. Return will be the user object with added array log and count (total exercise count).https://fcc-api-project-exercise-tracker-rest-api.glitch.me/
https://fcc-api-project-file-metadata-microservice.glitch.me/
GET /api/convert
with a single parameter containing an accepted number and unit and have it converted.{initNum}
{initial_Units}
converts to {returnNum}
{return_Units}
with the result rounded to 5 decimals.{initNum: 3.1, initUnit: 'mi', returnNum: 5.0000008, returnUnit: 'km', string: '3.1 miles converts to 5.00002 kilometers'}
POST /api/issues/{projectname}
with form data containing required issue_title
, issue_text
, created_by
, and optional assigned_to
and status_text
.created_on
(date/time), updated_on
(date/time), open
(boolean, true for open, false for closed), and _id
.PUT /api/issues/{projectname}
with a _id
and any fields in the object with a value to object said object. Returned will be 'successfully updated' or 'could not update '+_id. This should always update updated_on
. If no fields are sent return 'no updated field sent'.DELETE /api/issues/{projectname}
with a _id
to completely delete an issue. If no _id
is sent return '_id error', success: 'deleted '+_id, failed: 'could not delete '+_id.GET /api/issues/{projectname}
for an array of all issues on that specific project with all the information for each issue as was returned when posted./api/issues/{project}?open=false
). I can pass along as many fields/values as I want.[{"_id":"5871dda29faedc3491ff93bb","issue_title":"Fix error in posting data","issue_text":"When we post data it has an error.","created_on":"2017-01-08T06:35:14.240Z","updated_on":"2017-01-08T06:35:14.240Z","created_by":"Joe","assigned_to":"Joe","open":true,"status_text":"In QA"},...]
POST
a title to /api/books
to add a book and returned will be the object with the title
and a unique _id
.GET
/api/books
to retrieve an aray of all books containing title
, _id
, & commentcount
.GET
/api/books/{_id}
to retrieve a single object of a book containing title
, _id
, & an array
of comments (empty array if no comments present).POST
a comment to /api/books/{_id}
to add a comment to a book and returned will be the books object similar to GET
/api/books/{_id}
.DELETE
/api/books/{_id} to delete a book from the collection. Returned will be 'delete successful' if successful.DELETE
request to /api/books
to delete all books in the database. Returned will be 'complete delete successful' if successful.GET /api/stock-prices
with form data containing a Nasdaq stock ticker and recieve back an object stockData
.stock
(string, the ticker), price
(decimal in string format), and likes
(int).like
as true
(boolean) to have my like added to the stock(s). Only 1 like per ip should be accepted.likes
, it will display rel_likes
(the difference between the likes on both) on both.https://finance.google.com/finance/info?q=NASDAQ%3aGOOG
{"stockData":{"stock":"GOOG","price":"786.90","likes":1}}
{"stockData":[{"stock":"MSFT","price":"62.30","rel_likes":-1}
{"stock":"GOOG","price":"786.90","rel_likes":1}]}
POST
a thread to a specific message board by passing form data text
and delete_password
to /api/threads/{board}
.(Recomend res.redirect
to board page /b/{board}
) Saved will be _id
, text
, created_on
(date&time), bumped_on
(date&time, starts same as created_on), reported
(boolean), delete_password
, & replies
(array).POST
a reply to a thead on a specific board by passing form data text
, delete_password
, & thread_id
to /api/replies/{board}
and it will also update the bumped_on
date to the comments date.(Recomend res.redirect
to thread page /b/{board}/{thread_id}
) In the thread's 'replies' array will be saved _id
, text
, created_on
, delete_password
, & reported
.GET
an array of the most recent 10 bumped threads on the board with only the most recent 3 replies from /api/threads/{board}
. The reported
and delete_passwords
fields will not be sent.GET
an entire thread with all it's replies from /api/replies/{board}?thread_id={thread_id}
. Also hiding the same fields.DELETE
request to /api/threads/{board}
and pass along the thread_id
& delete_password
. (Text response will be 'incorrect password' or 'success')DELETE
request to /api/replies/{board}
and pass along the thread_id
, reply_id
, & delete_password
. (Text response will be 'incorrect password' or 'success')PUT
request to /api/threads/{board}
and pass along the thread_id
. (Text response will be 'success')PUT
request to /api/replies/{board}
and pass along the thread_id
& reply_idM
. (Text response will be 'success')