Monthly Archives: March 2013

Node JS Internet Service Providers

So I am shopping around for a place to put my project when all is said and done. So far I have liked Nodejisu (https://www.nodejitsu.com/) and Heroku (http://www.heroku.com/) the best. The latter seems to have a pretty good pricing structure at $3 for a node of computing power and a month free to test it out while I am building the early stages of my project. The former seems to have a lot of tutorials on how to set it up, one of which is listed below:
http://www.youtube.com/watch?v=PACwQ632jIE

Basically at this point I am leaning toward nodejisu because it is free for the first month, however I know for one worker dyno, Heroku is also free, so I may be able to try it out too, but I have to better understand how much of my project will use the worker dyno vs. node in nodejisu computing power units. But I do welcome ideas from other and their experiences.

Recipe Finder Schema

So in order to build a single recipe we need to come up with several classes and properties that will make up the structure of my database. Most of my decisions concerning the format of the schema were named to follow the microformat outlined on the following page:
http://microformats.org/wiki/hrecipe
I have decided to come up with 4 key classifications to deliver this project. Three of them come under building recipes, namely Recipe, Ingredient and Nutrition. The final classification is for an Account because I would like to immediately tie in recipes to users in order to bind them as ownership for a user. I believe ownership, editing, and enhancing other user’s recipes can be a cornerstone to the success of this project. Some of the extra properties, or those items not in the microformat, highlighted below will display this option of editing existing recipes. In any case, here are the properties I have decided to use for the project:

Nutrition

  • value: number value of nutrition item.
  • unit: type of value – ounces, teaspoons, ect.
  • nutrition: nutrition information.

Ingredient

  • value: number value of ingredient.
  • unit: type of value – ounces, teaspoons, ect.
  • ingredient: name of ingredient.

Recipe

  • fn: name of recipe.
  • ingredients: an array of ingredients to be used in the recipe.
  • secretIngredients: an array of ingredients to be marked as secret. This extra feature enables a user to mark certain ingredients as secret or marked for special display.
  • addedIngredients: This property may be used for adding items to an existing recipe or one owned by a different account user. (This property may necessitate another classification of Borrowed Recipe).
  • removedIngredients: like the last property, you can also mark ingredients to take them off a particular recipe.
  • instructions: details about constructing the recipe.
  • additionalInstructions: adding the ability to edit instructions for a particular recipe. For example – skip 400 degrees, cook at 450 degrees for 5 minutes faster cooking time.
  • yield: marks the amount of servings created by a recipe.
  • duration: time for recipe from start to finish.
  • prepDuration: time for preparation of recipe (marinate overnight).
  • photo: image link of recipe.
  • video: video link for recipe (bring out the inner Julia Child).
  • summary: quick description of recipe.
  • author: link to an Account to bind ownership.
  • published: original source of recipe.
  • nutrition: array of nutritional elements making up the nutrition information.
  • tag: tagging a recipe with other keywords for searching capabilities.
  • rating:not quite sure where I will take the rating, thumbs up thumbs down, 1-5, ect. I do like the Facebook approach of keeping ratings simple as possible. It promotes more voting interaction. However, I don’t want to copy cat Facebook too much. Possibly also similar to Stack Overflow where you can also record negative feedback is interesting.

Account

  • email: a unique email account that cannot be duplicated in the database.
  • password: a password chosen by the user.
  • name:
  • first: first name of the account’s owner.
  • last: last name of the account’s owner.
  • photoUrl: a photo of the user.
  • biography: any other cooking related accolades a user wants to associate with their account.
  • recipes: array of recipes that belong to the account.
  • borrowedRecipes: array of recipes the user has altered.

 

Research for Project

This post is to define the research I have done to attempt to get a REST application up and running in a simple way. Node and the other technologies listed have proven to be a little more involved than I first thought, but any web program is going to be difficult to build up simply because of the multitude of ways in which sites can be built. In any case most of the books I have chosen to follow are O’Reilly books, which I have still found to be well constructed resources for my task. In any case, here are the books assisting my case:

Building Node Applications with Mongodb and Backbone: This has been my number one resource as I navigate through building a project with these technologies. It starts with a basic breakdown of each technology, including an extensive group of calls for mongodb in chapter 4. Chapters 5, 6, and 7 are my main focus for getting my project up and online. It starts with a model, moves into a authenticating users, and finally works with a user interface for an application. The authentication chapter is outstanding in that it highlights many security flaws or traps to look out for when creating user accounts, which my application will need.

Developing Backbone.js Applications:  this book has been used to get information on the syntax for each of backbone.js call.

Mongodb the Definitive Guide: I wanted to have a backup book to be able to make calls to mongodb and create my own queries.

Professional Node.js: this book started as my main book, but because it had condensed information on the technologies I wanted to use, I decided to look around and found the O’Reilly book that went more in depth.

Node JS and Accessories

I am working through Node JS tutorials and books. I have a lot more to look through but this post should prove an early explanation for my tooling decisions.
First Node JS: I originally chose to use Node because I wanted to streamline the code that I had to learn. I am looking to learn more JavaScript, and node would certainly put me more in the drivers seat of understanding how to code JavaScript. In addition, I am hoping to streamline the passing of data objects. Using the same type of code, should prove to be an easy smooth process of passing objects from a database, through to the front end of a site with JSON objects. So far, my research has been able to support my original thoughts on this.

NPM: The Node Packaging Manager is very impressive. Almost too impressive, being able to search thousands of third party applications is daunting, but powerful. Most of the packages that are in the tutorials I have researched include jade and Express. In addition another tutorial showed how to search for facebook applications – interesting how many fb applications were out in the public domain for NPM. Very powerful, but for the purposes of this project I will most likely be using Express to make creating REST applications with Node easier.

Express: As previously stated, Express makes things easier to get this project into a RESTful state. So I will most likely be using this package to simplify this part of the process.

Database access with Node: So far I am choosing Mongo DB, because it looks to be easy to implement, but I still have some more research to put forth with this project. I would like to compare the simplicity of Couch DB to Mongo, but I am interested at the moment for using one of those two.

Service Provider: I have found a few tutorials talking about Heroku Cloud Services, but in the lead at the moment is Nodejitsu. Mostly because I have had prior fellow employees suggest that provider, but I still need to find out which provider may be best for my needs with this project.

Main competition for my application

Almost all of the competition I have found are ahead of where I am currently, but it is interesting trying to find out the features of applications that may fall along the same lines as my project. The success of my project will be in finding features the competitors do not have, or find a niche where I may even be able to use their applications going forward. In any case, here is what I have found so far:

Favorite Recipes (Android Application) – key features: recent, browse, favorite (star favorite recipes), Popular, add recipe.

Recipe Search (allthecooks.com) – searches recipes (title, ingredients, directions), categories, bookmark, whats new?, social

BigOven.com 250,000+ recipes – get ideas (recent, random, search, use up leftovers – three ingredients, near me, menus), my kitchen, grocery list (definitely closest to my goal)

I feel that BigOven may be the best of these applications. In addition from their mailing list, they have been nominated for one of the best recipe apps of the year. Others included in the link, I will need to investigate as well:

http://ipod.about.com/library/RCA-2013/bl-RCA-2013-Finalists-Recipe.htm

Cook4Lyfe already has some features I am interested in figuring out – I love the idea of cooking with ingredients already in the kitchen. Also cooking for speed – short cooking time for meals. These are things that always plague me. However, Cook4Lyfe is a paid app, I will initially be a free app.

Node JS, Express, Mongo DB

I have been taking some tutorials on the following three technologies. The main tutorial I am checking out is:

http://coenraets.org/blog/2012/10/creating-a-rest-api-using-node-js-express-and-mongodb/

What I see so far is very good. I am looking for a setup that is clean to work with objects similar in nature from db to front end. So far, mongoDB gives me this ability with its use of BSON objects.

In addition, I have found Express a very nice package for creating REST applications with node js. I still want to finish some other tutorials, but most likely will start building my front end interface and test building an application with these technologies.