diff --git a/.gitignore b/.gitignore
index 1d74e21..54166b9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,5 @@
+# Miscelleaneous
+.DS_Store
+
+# Editors
.vscode/
diff --git a/README.md b/README.md
index 903ba74..1264254 100644
--- a/README.md
+++ b/README.md
@@ -1,23 +1,16 @@
-
+[](https://lecoupa.github.io/awesome-cheatsheets/)
[](https://awesome.re) [](https://github.com/LeCoupa/awesome-cheatsheets/blob/master/LICENSE)
+**WEBSITE DIRECTORY**: [Available here](https://lecoupa.github.io/awesome-cheatsheets/).
+
> š Awesome cheatsheets for popular programming languages, frameworks and development tools. They include everything you should know in one single file.
-> ā¤ļø **If you like this repository, [you can click here to tweet it and make it spread](https://ctt.ec/PHba4).**
-
-
## š¤ Why Awesome-Cheatsheets?
-I always make a cheatsheet when I want to improve my skills on a programming language, a framework or a development tool. [I started doing these kind of things a long time ago on Gist](https://gist.github.com/LeCoupa) To better keep track of the history and to let people contribute to them, I reorganized everything into this single repository. Most of the content is coming from official documentations and some books I have read.
-
-Feel free to browse each cheatsheet to learn new things and to keep them at hand when you forgot about one command. They have been designed to provide a quick way to assess your knowledge and to save you time.
-
-
-## šš¼ How to Contribute?
-
-You are more than welcome to contribute and build your own cheatsheet for your favorite programming language, framework or development tool. Just submit changes via pull request and I will review them before merging.
+I usually make a cheatsheet when I want to improve my skills on a programming language, a framework or a development tool. [I started doing these kind of things a long time ago on Gist](https://gist.github.com/LeCoupa). To better keep track of the history and to let people contribute, I reorganized all of them into this single repository. Most of the content is coming from official documentations and some books I have read.
+Feel free to take a look. You might learn new things. They have been designed to provide a quick way to assess your knowledge and to save you time.
## š Table of Contents
@@ -28,17 +21,19 @@ You are more than welcome to contribute and build your own cheatsheet for your f
#### Command line interface
-* [Bash](languages/bash.sh)
+- [Bash](languages/bash.sh)
#### Imperative
-* [PHP](languages/php.php)
+- [C](languages/C.txt)
+- [C#](languages/C%23.txt)
+- [PHP](languages/php.php)
#### Functional
-* [JavaScript](languages/javascript.js)
-
+- [JavaScript](languages/javascript.js)
+
### š¦ Backend
@@ -47,15 +42,15 @@ You are more than welcome to contribute and build your own cheatsheet for your f
#### Python
-* [Django](backend/django.py)
+- [Django](backend/django.py)
#### Javascript
-
-* [Feathers.js](backend/feathers.js)
-* [Moleculer](backend/moleculer.js)
-* [Node.js](backend/node.js)
-
+- [Feathers.js](backend/feathers.js)
+- [Moleculer](backend/moleculer.js)
+- [Node.js](backend/node.js)
+- [Sails.js](backend/sails.js)
+
### š Frontend
@@ -64,13 +59,16 @@ You are more than welcome to contribute and build your own cheatsheet for your f
#### Basics
-* [HTML5](frontend/html5.html)
+- [HTML5](frontend/html5.html)
#### Frameworks
-* [Vue.js](frontend/vue.js)
-
-
+- [React.js](frontend/react.js)
+- [Vue.js](frontend/vue.js)
+- [Ember.js](frontend/ember.js)
+- [Angular (2+)](frontend/angular.js)
+- [AngularJS](frontend/angularjs.js)
+
### šļø Databases
@@ -79,9 +77,8 @@ You are more than welcome to contribute and build your own cheatsheet for your f
#### NoSQL
-* [Redis](databases/redis.sh)
-
-
+- [Redis](databases/redis.sh)
+
### š§ Tools
@@ -90,27 +87,30 @@ You are more than welcome to contribute and build your own cheatsheet for your f
#### Development
-* [VIM](tools/vim.txt)
-* [Xcode](tools/xcode.txt)
+- [VIM](tools/vim.txt)
+- [Xcode](tools/xcode.txt)
#### Infrastructure
-* [Docker](tools/docker.sh)
-* [Kubernetes](tools/kubernetes.sh)
-* [Nanobox Boxfile](tools/nanobox_boxfile.yml)
-* [Nanobox CLI](tools/nanobox_cli.sh)
-
+- [Docker](tools/docker.sh)
+- [Kubernetes](tools/kubernetes.sh)
+- [Nanobox Boxfile](tools/nanobox_boxfile.yml)
+- [Nanobox CLI](tools/nanobox_cli.sh)
+
+## šš¼ How to Contribute?
+
+You are more than welcome to contribute and build your own cheatsheet for your favorite programming language, framework or development tool. Just submit changes via pull request and I will review them before merging.
## šš» Contribution
-
+
-
+
@@ -118,6 +118,9 @@ You are more than welcome to contribute and build your own cheatsheet for your f
+
+
+
diff --git a/_design/Awesome Cheatsheets.sketch b/_design/Awesome Cheatsheets.sketch
new file mode 100644
index 0000000..4a6444f
Binary files /dev/null and b/_design/Awesome Cheatsheets.sketch differ
diff --git a/_design/awesome_cheatsheets_logo.png b/_design/awesome_cheatsheets_logo.png
new file mode 100644
index 0000000..b40d174
Binary files /dev/null and b/_design/awesome_cheatsheets_logo.png differ
diff --git a/_design/awesome_cheatsheets_logo.psd b/_design/awesome_cheatsheets_logo.psd
new file mode 100644
index 0000000..d00b5e2
Binary files /dev/null and b/_design/awesome_cheatsheets_logo.psd differ
diff --git a/_design/awesome_cheatsheets_logo@2x.png b/_design/awesome_cheatsheets_logo@2x.png
new file mode 100644
index 0000000..ef691c2
Binary files /dev/null and b/_design/awesome_cheatsheets_logo@2x.png differ
diff --git a/_design/awesome_cheatsheets_logo@4x.png b/_design/awesome_cheatsheets_logo@4x.png
new file mode 100644
index 0000000..e8c39e9
Binary files /dev/null and b/_design/awesome_cheatsheets_logo@4x.png differ
diff --git a/_design/cover_github@2x.png b/_design/cover_github@2x.png
new file mode 100644
index 0000000..970c5b3
Binary files /dev/null and b/_design/cover_github@2x.png differ
diff --git a/_images/awesome_cheatsheets_logo.png b/_images/awesome_cheatsheets_logo.png
deleted file mode 100644
index 33f33de..0000000
Binary files a/_images/awesome_cheatsheets_logo.png and /dev/null differ
diff --git a/_images/awesome_cheatsheets_logo.psd b/_images/awesome_cheatsheets_logo.psd
deleted file mode 100644
index 564a2db..0000000
Binary files a/_images/awesome_cheatsheets_logo.psd and /dev/null differ
diff --git a/_images/awesome_cheatsheets_logo@2x.png b/_images/awesome_cheatsheets_logo@2x.png
deleted file mode 100644
index 91d9a9e..0000000
Binary files a/_images/awesome_cheatsheets_logo@2x.png and /dev/null differ
diff --git a/backend/feathers.js b/backend/feathers.js
index fb72c45..c1cd63e 100644
--- a/backend/feathers.js
+++ b/backend/feathers.js
@@ -15,7 +15,7 @@
* ******************************************************************************************* */
-```bash
+```
# Provides the ability to initialize new application instances
npm install @feathersjs/feathers --save
@@ -185,7 +185,7 @@ app.on('login', (payload, info) => {}) // sent by the authentication module and
* ******************************************************************************************* */
-```bash
+```
# Contains Express framework integrations
npm install @feathersjs/express --save
@@ -252,7 +252,7 @@ app.configure(primus(options, callback)) // sets up the Primus transport with t
* ******************************************************************************************* */
-```bash
+```
# Bundles the separate Feathers client side modules into one providing the code as ES5 (compatible with modern browsers)
# You do not have to install or load any of the other modules listed below
npm install @feathersjs/client --save
@@ -299,7 +299,7 @@ primus(socket, options) // initialize the Primus client using a given socket an
* ******************************************************************************************* */
-```bash
+```
#Ā Assists in using JWT for authentication
npm install @feathersjs/authentication --save
@@ -562,7 +562,7 @@ app.service('authentication').hooks({
* ******************************************************************************************* */
-```bash
+```
# [MEMORY/FILESYSTEM] In-memory database adapter
npm install feathers-memory --save
diff --git a/backend/sails.js b/backend/sails.js
new file mode 100644
index 0000000..0b61e28
--- /dev/null
+++ b/backend/sails.js
@@ -0,0 +1,734 @@
+/********************************************************************************************
+ * SAILS.JS CHEATSHEET
+ * REFERENCE: https://sailsjs.com/documentation/reference
+ * CONCEPTS: https://sailsjs.com/documentation/concepts
+ * APP STRUCTURE: https://sailsjs.com/documentation/anatomy
+ *
+ * 1. APPLICATION
+ * 2. BLUEPRINT API
+ * 3. COMMAND-LINE INTERFACE
+ * 4. CONFIGURATION
+ * 5. REQUEST
+ * 6. RESPONSE
+ * 7. WATERLINE ORM
+ * 8. WEBSOCKETS
+ ********************************************************************************************/
+
+/********************************************************************************************
+ * 1. APPLICATION
+ * https://sailsjs.com/documentation/reference/application
+ ********************************************************************************************/
+
+// A dictionary of all loaded Sails models, indexed by their identity.
+sails.models
+
+// A dictionary of all accessible helpers, including organics.
+sails.helpers
+
+// A dictionary of all loaded Sails hooks, indexed by their identity.
+sails.hooks
+
+// The full set of configuration options for the Sails instance
+// It is assembled automatically when Sails loads your app
+// merging together command-line arguments, environment variables, your .sailsrc file,
+// and the configuration objects exported from any and all modules in your app's config/ directory.
+sails.config
+
+// The runtime values of your app's custom configuration settings.
+sails.config.custom
+
+// A set of convenience methods for low - level interaction with connected websockets.
+sails.sockets
+
+// Talk to Socket.io directly.
+sails.io
+
+// A regular expression designed for use in identifying URL paths that seem like they are probably
+// for a static asset of some kind (e.g. image, stylesheet, favicon.ico, robots.txt, etc).
+sails.LOOKS_LIKE_ASSET_RX
+
+// Return a dictionary of Sails actions.
+sails.getActions()
+
+// Look up the first route pointing at the specified target (e.g. MeController.login)
+// and return a dictionary containing its method and URL.
+sails.getRouteFor(target)
+
+// Look up the first route pointing at the specified target (e.g. entrance/view-login)
+// and return its URL.
+sails.getUrlFor(target)
+
+// Lift a Sails app programmatically.
+// This does exactly what you might be used to seeing by now when you run sails lift.
+sailsApp.lift(configOverrides, function(err) {})
+
+// Load a Sails app into memory-- but without lifting an HTTP server.
+// Useful for writing tests, command - line scripts, and scheduled jobs.
+sailsApp.load(configOverrides, function(err) {})
+
+// Shut down a lifted Sails app and have it cease listening for / responding to any future requests.
+sails.lower(callback)
+
+// Register a new Sails action that can then be bound to a route.
+sails.registerAction(action, name)
+
+// Register a new action middleware function that will be applied to actions
+// with the specified identities.
+sails.registerActionMiddleware(actionMiddlewareFns, actionIdentities)
+
+// Flush and reload all Sails actions.
+sails.reloadActions()
+
+// Compile a view into an HTML template.
+sails.renderView(pathToView, templateData)
+
+// Make a virtual request to a running Sails instance.
+sails.request(request)
+sails.request(url, body)
+sails.request(url, callback)
+sails.request(url, body, callback)
+
+// Access a particular datastore, or the default datastore.
+sails.getDatastore(datastoreName)
+
+// Log a message or some data at the "debug" log level using Sails' built-in logger.
+sails.log(message)
+
+/********************************************************************************************
+ * 2. BLUEPRINT API
+ * https://sailsjs.com/documentation/reference/blueprint-api
+ ********************************************************************************************/
+
+// Find a list of records that match the specified criteria
+// and (if possible) subscribe to each of them.
+GET /:model
+
+// Look up the record with the specified id from the database
+// and (if possible) subscribe to the record to hear about any future changes.
+GET /:model/:id
+
+// Populate and return foreign record(s) for the given association of this record.
+GET /:model/:id/:association
+
+// Create a new record in your database
+// and notify subscribed sockets that a newly record is created
+POST /:model
+
+// Update an existing record in the database
+// and notify subscribed sockets that it has changed.
+PATCH /:model/:id
+
+// Replace all of the foreign records in one of this record's collections
+// and notify subscribed sockets to the parent record.
+PUT /:model/:id/:association
+
+// Add a foreign record to one of this record's collections
+// and notify subscribed sockets to the parent record.
+PUT /:model/:id/:association/:fk
+
+// Delete the record specified by id from the database forever
+// and notify subscribed sockets that a record has been deleted
+DELETE /:model/:id
+
+// Remove a foreign record from one of this record's collections
+// and notify subscribed sockets about this removed child
+DELETE /:model/:id/:association/:fk
+
+/********************************************************************************************
+ * 3. COMMAND-LINE INTERFACE
+ * https://sailsjs.com/documentation/reference/command-line-interface
+ ********************************************************************************************/
+
+// Lift your Node.js/Sails.js app in interactive mode, and enter the REPL.
+// Useful for trying out Waterline queries, quickly managing your data, and checking
+// out your project's runtime configuration.
+sails console [--dontLift]
+
+// Generate api/models/Foo.js, including attributes with the specified types if provided.
+sails generate model
+
+// Generate a standalone action.
+sails generate action
+
+// Generate a helper at api/helpers/foo.js.
+sails generate helper
+
+// Generate api/controllers/FooController.js, including actions with the specified names if provided.
+sails generate controller
+
+// Generate a project hook in api/hooks/foo/.
+sails generate hook
+
+// Generate a foo folder containing the files necessary for building a new generator.
+sails generate generator
+
+// Generate a custom response at api/responses/foo.js
+sails generate response
+
+// Generate a api/adapters/foo/ folder containing the files necessary for building a new adapter.
+sails generate adapter
+
+// Generate a sails.io.js file at the specified location, overwriting the default sails.io.js if applicable.
+sails generate sails.io.js
+
+// Generate api/models/Foo.js and api/controllers/FooController.js.
+sails generate api
+
+// Alias for sails new.
+sails generate new
+
+// Experimental. Adds the following files to your app:
+// .gitignore, .jshintrc, .editorconfig, .npmignore, .travis.yml, .appveyor.yml
+sails generate etc
+
+// Attach the node debugger and lift the sails app; similar to running node--inspect app.js.
+// You can then use a tool like the Chrome DevTools to interactively debug your apps.
+sails inspect
+
+// Run the Sails app in the current dir
+// (if node_modules/sails exists, it will be used instead of the globally installed Sails)
+sails lift [--prod] [--port ] [--verbose] [--silly]
+
+// Create a new sails project.
+sails new [--no-frontend] [--minimal] [--without=package,package,package]
+
+// Get the version of your computer's globally installed Sails command-line tool
+// (i.e. the version you installed with npm install -g sails).
+sails version
+
+/********************************************************************************************
+ * 4. CONFIGURATION
+ * https://sailsjs.com/documentation/reference/configuration
+ ********************************************************************************************/
+
+// Determines which TCP port your Sails app will use to listen for incoming requests.
+sails.config.port
+
+// Declare the host name of your Sails app (By default, Sails will assume localhost).
+sails.config.explicitHost
+
+// The runtime āenvironmentā of your Sails app (usually either development or production).
+sails.config.environment
+
+// A time limit, in milliseconds, imposed on all hooks in your app (default to 20000)
+sails.config.hookTimeout
+
+// Configure SSL settings for HTTPs and WSS
+sails.config.ssl
+
+// These configurable settings allow you to configure the blueprint API in Sails.
+sails.config.blueprints
+
+// Asynchronous bootstrap function that runs before your Sails app gets lifted (i.e. starts up).
+// Can be used for setting up baseline data, running sanity checks on the status of your database...
+sails.config.bootstrap
+
+// Custom configuration for your app (one-off settings specific to your application)
+// Things like the domain to use when sending emails, or 3rd party API keys for Stripe, Mailgun...
+sails.config.custom
+
+// Datastore configurations(or simply datastores) are like "saved settings" for your adapters.
+sails.config.datastores
+
+// Configuration for the global variables that Sails exposes by default.
+sails.config.globals
+
+// Configuration for your app's underlying HTTP server.
+sails.config.http
+
+// Configuration for Sails' built-in internationalization & localization features.
+sails.config.i18n
+
+// Configuration for the logger in your Sails app.
+sails.config.log
+
+// Your default project-wide model settings.
+sails.config.models
+
+// Dictionary that maps policies to an appās actions.
+sails.config.policies
+
+// Configuration for custom (aka "explicit") routes.
+sails.config.routes
+
+// Configuration for your app's security settings.
+sails.config.security
+
+// Configuration for Sails's built-in session support.
+sails.config.session
+
+// Provide transparent access to Socket.io
+sails.config.sockets
+
+// Configuration for your app's server-side views.
+sails.config.views
+
+/********************************************************************************************
+ * 5. REQUEST
+ * https://sailsjs.com/documentation/reference/request-req
+ ********************************************************************************************/
+
+// The moment that Sails started processing the request, as a Javascript Date object.
+req._startTime
+
+// An object containing text parameters from the parsed request body, defaulting to {}.
+// If a request contains one or more file uploads, only the text parameters sent before
+// the first file parameter will be available in req.body.
+req.body
+
+// An object containing all of the unsigned cookies from this request (req).
+req.cookies
+
+// A flag indicating the user-agent sending this request (req) wants "fresh" data
+// (as indicated by the "if-none-match", "cache-control", and/or "if-modified-since" request headers.)
+req.fresh
+
+// An object containing pre-defined/custom header given in the current request.
+req.headers
+
+// Returns the hostname supplied in the host HTTP header.
+// This header may be set either by the client or by the proxy.
+req.hostname
+
+// The IP address of the client who sent this request (req).
+req.ip
+
+// Contains the IP addresses in this request's "X-Forwarded-For" header
+// as an array of the IP address strings.
+req.ips
+
+// A flag indicating whether or not this request (req) originated from a Socket.io connection.
+req.isSocket
+
+// The request method (aka "verb".)
+// All requests to a Sails server have a "method", even via WebSockets.
+req.method
+
+// Dictionary (plain JavaScript object) of request-agnostic settings available in your app's actions.
+req.options
+
+// Retains the original request URL allowing you to rewrite req.url freely for internal routing purposes.
+// In almost all cases, youāll want to use req.url instead.
+req.originalUrl
+
+// An object containing parameter values parsed from the URL path.
+req.params
+
+// The URL pathname from the request URL string of the current request (req).
+req.path
+
+// The protocol used to send this request (req).
+req.protocol
+
+// A dictionary containing the parsed query-string, defaulting to {}.
+req.query
+
+// Indicates whether or not the request was sent over a secure TLS connection (i.e. https:// or wss://).
+req.secure
+
+// A dictionary containing all of the signed cookies from this request (req).
+req.signedCookies
+
+// If the current Request (req) originated from a connected Socket.io client,
+// req.socket refers to the raw Socket.io socket instance.
+req.socket
+
+// An array of all the subdomains in this request's URL.
+req.subdomains
+
+// Like req.path, but also includes the query string suffix.
+req.url
+
+// A flag indicating whether the requesting client would prefer a JSON response
+// (as opposed to some other format, like XML or HTML.)
+req.wantsJSON
+
+// A flag indicating whether the current request (req) appears to be an AJAX request.
+req.xhr
+
+// Return whether this request (req) advertises that it understands the specified media type.
+req.accepts(mediaType)
+
+// Return whether this request (req) advertises that it is able to handle any of the specified
+// character set(s), and if so, which one.
+req.acceptsCharsets(charset1, charset2, ā¦)
+
+// Return whether this request (req) advertises that it understands any of the specified
+// language(s), and if so, which one.
+req.acceptsLanguages(language1, language2, ā¦)
+
+// Returns the value of all parameters sent in the request, merged together into a single dictionary
+req.allParams()
+
+// Build and return a Skipper Upstream representing an incoming multipart file upload from the specified field.
+req.file(field)
+
+// Returns the value of the specified header field in this request (req). Note that header names are case-insensitive.
+req.get(header)
+
+// Returns true if this request's declared "Content-Type" matches the specified media/mime type.
+req.is(type)
+
+// Returns the value of the parameter with the specified name.
+req.param(name[, defaultValue])
+
+// Override the inferred locale for this request.
+req.setLocale(override)
+
+// Time out this request if a response is not sent within the specified number of milliseconds.
+req.setTimeout(numMilliseconds)
+
+/********************************************************************************************
+ * 6. RESPONSE
+ * https://sailsjs.com/documentation/reference/response-res
+ ********************************************************************************************/
+
+// Indicate to a web browser or other user agent that an outgoing file download sent
+// in this response should be "Saved as..." rather than "Opened", and optionally specify the
+// name for the newly downloaded file on disk.
+res.attachment([filename])
+
+// This method is used to send a 200 ("OK") response back down to the client.
+res.ok(data)
+
+// This method is used to send a 400 ("Bad Request") response back down
+// to the client indicating that the request is invalid.
+res.badRequest(data)
+
+// This method is used to send a 403 ("Forbidden") response back down
+// to the client indicating that the request is not allowed.
+res.forbidden()
+
+// This method is used to send a 404 ("Not Found") response using either res.json() or res.view().
+res.notFound()
+
+// This method is used to send a 500 ("Server Error") response back down to the client indicating
+// that some kind of server error occurred (i.e. the error is not the requesting user agent's fault).
+res.serverError(err)
+res.serverError()
+
+// Sets a cookie with name (name) and value (value) to be sent along with the response.
+res.cookie(name, value[, options])
+
+// Clears cookie (name) in the response.
+res.clearCookie(name[, options])
+
+// Returns the current value of the specified response header (header).
+res.get(header)
+
+// Sets specified response header (header) to the specified value (value).
+res.set(header, value)
+res.set(headers)
+
+// Sends a JSON response composed of a stringified version of the specified data.
+res.json([statusCode,] data)
+
+// Send a JSON or JSONP response.
+res.jsonp()
+
+// Sets the "Location" response header to the specified URL expression(url).
+res.location(url)
+
+// Redirect the requesting user-agent to the given absolute or relative url.
+res.redirect(url)
+res.redirect(statusCode, url)
+
+// Send a string response in a format other than JSON (XML, CSV, plain text, etc.
+// If you want to send a dictionary or JSON, use res.json().
+// If you want to send a custom status code, call req.status() first.
+res.send([string])
+
+// Set the status code of this response.
+res.status(statusCode)
+
+// Sets the "Content-Type" response header to the specified type.
+res.type(type)
+
+// Respond with an HTML page.
+res.view(pathToView, locals)
+res.view(pathToView)
+res.view(locals)
+res.view()
+
+/********************************************************************************************
+ * 7. WATERLINE ORM
+ * https://sailsjs.com/documentation/reference/waterline-orm
+ ********************************************************************************************/
+
+// --> DATASTORE <--
+
+// Return the default datastore
+var datastore = sails.getDatastore()
+
+// The generic, stateless, low-level driver for this datastore (if the adapter supports it).
+datastore.driver
+
+// The live connection manager for this datastore.
+datastore.manager
+
+// Lease a new connection from the datastore for use in running multiple queries
+// on the same connection (i.e. so that the logic provided in during can reuse the db connection).
+await datastore.leaseConnection(during)
+
+// Execute a raw SQL query using this datastore.
+await datastore.sendNativeQuery(sql, valuesToEscape)
+
+// Fetch a preconfigured deferred object hooked up to the sails-mysql or sails-postgresql adapter
+// (and consequently the appropriate driver)
+await datastore.transaction(during)
+
+// --> MODELS <--
+
+// Add one or more existing child records to the specified collection.
+MyModel.addToCollection(parentId, association).members(childIds)
+
+// Remove one or more members from the specified collection
+MyModel.removeFromCollection()
+
+// Replace all members of the specified collection
+MyModel.replaceCollection()
+
+// Archive ("soft-delete") records that match the specified criteria,
+// saving them as new records in the built-in Archive model, then destroying the originals.
+MyModel.archive(criteria)
+
+// Archive ("soft-delete") the record that matches the specified criteria,
+// saving it (if it exists) as a new record in the built-in Archive model, then destroying the original.
+MyModel.archiveOne(criteria);
+
+// Get the total number of records matching the specified criteria.
+MyModel.count(criteria)
+
+// Get the aggregate mean of the specified attribute across all matching records.
+MyModel.avg(numericAttrName, criteria)
+
+// Get the aggregate sum of the specified attribute across all matching records.
+MyModel.sum(numericAttrName, criteria)
+
+// Find records in your database that match the given criteria.
+MyModel.find(criteria)
+
+// Attempt to find a particular record in your database that matches the given criteria.
+MyModel.findOne(criteria)
+
+// Find the record matching the specified criteria.
+// If no such record exists, create one using the provided initial values.
+MyModel.findOrCreate(criteria, initialValues)
+
+// Create a record in the database.
+MyModel.create(initialValues)
+MyModel.create(initialValues).fetch() // Created record will be returned
+
+// Create a set of records in the database.
+MyModel.createEach(initialValues)
+MyModel.createEach(initialValues).fetch() // Created records will be returned
+
+// Update all records matching criteria.
+MyModel.update(criteria, valuesToSet)
+MyModel.update(criteria, valuesToSet).fetch() // Updated records will be returned
+
+// Update the record that matches the given criteria, if one exists.
+MyModel.updateOne(criteria).set(valuesToSet);
+
+// Destroy records in your database that match the given criteria.
+MyModel.destroy(criteria)
+MyModel.destroy(criteria).fetch() // Destroyed record will be returned
+
+// Destroy the record in your database that matches the given criteria, if one exists.
+MyModel.destroyOne(criteria);
+
+// Access the datastore for a particular model.
+MyModel.getDatastore()
+
+// Stream records from your database one at a time or in batches,
+// without first having to buffer the entire result set in memory.
+MyModel.stream(criteria)
+
+// Verify that a value would be valid for a given attribute, then return it, loosely coerced.
+MyModel.validate(attrName, value)
+
+// --> QUERIES <--
+
+// Set the maximum number of records to retrieve when executing a query instance.
+query.limit(maximum)
+
+// Indicate a number of records to skip before returning the results from executing a query instance.
+query.skip(numRecordsToSkip)
+
+// Set the order in which retrieved records should be returned when executing a query instance.
+query.sort(sortClause)
+
+// Specify a where clause for filtering a query.
+query.where(whereClause)
+
+// Tell Waterline (and the underlying database adapter) to send back records that were
+// updated/destroyed/created when performing an .update(), .create(), .createEach() or .destroy()
+// query. Otherwise, no data will be returned (or if you are using callbacks, the second argument
+// to the .exec() callback will be undefined.)
+// This is just a shortcut for .meta({fetch: true})
+// Warning: This is not recommended for update/destroy queries that affect large numbers of records.
+query.fetch()
+
+// Modify a query instance so that, when executed, it will populate child records for the
+// specified collection, optionally filtering by subcriteria. Populate may be called more than
+// once on the same query, as long as each call is for a different association.
+query.populate()
+
+// Decrypt any auto-encrypted attributes in the records returned for this particular query.
+// This is just a shortcut for .meta({decrypt: true})
+query.decrypt()
+
+// Execute a Waterline query instance.
+query.exec(function (err, result) {})
+
+// Begin executing a Waterline query instance and return a promise.
+// This is an alternative to .exec().
+query.toPromise()
+
+// Capture and intercept the specified error, automatically modifying and re-throwing it,
+// or specifying a new Error to be thrown instead. (Still throws.)
+query.intercept(filter, handler)
+query.intercept(handler)
+
+// Provide additional options to Waterline when executing a query instance.
+query.meta(options)
+
+// Execute a Waterline query instance using promises.
+// Whenever possible, it is recommended that you use await instead of calling this method.
+// This is an alternative to .exec(). When combined with .catch(), it provides the same functionality.
+query.then(callback)
+
+// Execute a Waterline query instance using promises.
+// Whenever possible, it is recommended that you use await instead of calling this method.
+// This is an alternative to .exec(). When combined with .then(), it provides the same functionality.
+query.catch(callback)
+
+// Tolerate (swallow) the specified error, and return a new result value (or undefined) instead. (Don't throw.)
+query.tolerate(filter, handler)
+query.tolerate(filter)
+query.tolerate(handler)
+
+// Specify an existing database connection to use for this query.
+query.usingConnection(connection)
+
+/********************************************************************************************
+ * 8. WEB SOCKETS
+ * https://sailsjs.com/documentation/reference/web-sockets
+ ********************************************************************************************/
+
+// --> RESOURCEFUL PUBSUB (HIGHER LEVEL ABSTRACTION WHICH ARE USED BY SAILS BLUEPRINT API) <--
+
+// Retrieve the name of the PubSub āroomā for a given record.
+MyModel.getRoomName(id)
+
+// Broadcast an arbitrary message to socket clients subscribed to one or more of this model's records.
+// Be sure and check req.isSocket === true before passing in req to refer to the requesting socket.
+// If used, the provided req must be from a socket request, not just any old HTTP request.
+// Is like sails.sockets.broadcast()
+MyModel.publish(ids, data, req)
+
+// Subscribe the requesting client socket to changes/deletions of one or more database records.
+// Is like sails.sockets.join()
+MyModel.subscribe(req, ids)
+
+// Unsubscribe the requesting client socket from one or more database records.
+// Is like sails.sockets.leave()
+MyModel.unsubscribe(req, ids)
+
+// --> SAILS.SOCKETS <--
+
+// Subscribe all members of a room to one or more additional rooms.
+// In a multi-server environment, the callback function (cb) will be executed when the
+// .addRoomMembersToRooms() call completes on the current server. This does not guarantee that
+// other servers in the cluster have already finished running the operation.
+sails.sockets.addRoomMembersToRooms(sourceRoom, destRooms, cb)
+
+// Broadcast a message to all sockets connected to the server (or any server in the cluster,
+// if you have a multi-server deployment using Redis).
+sails.sockets.blast(data)
+sails.sockets.blast(eventName, data)
+sails.sockets.blast(data, socketToOmit)
+sails.sockets.blast(eventName, data, socketToOmit)
+
+// Broadcast a message to all sockets in a room (or to a particular socket).
+sails.sockets.broadcast(roomNames, data)
+sails.sockets.broadcast(roomNames, eventName, data)
+sails.sockets.broadcast(roomNames, data, socketToOmit)
+sails.sockets.broadcast(roomNames, eventName, data, socketToOmit)
+
+// Parse the socket ID from an incoming socket request (req).
+sails.sockets.getId(req)
+
+// Subscribe a socket to a room.
+sails.sockets.join(socket, roomName)
+sails.sockets.join(socket, roomName, cb)
+
+// Unsubscribe a socket from a room.
+sails.sockets.leave(socket, roomName)
+sails.sockets.leave(socket, roomName, cb)
+
+// Unsubscribe all members of a room (e.g. chatroom7) from that room and every other room
+// they are currently subscribed to; except the automatic room associated with their socket ID.
+sails.sockets.leaveAll(roomName, cb)
+
+// Unsubscribe all members of a room from one or more other rooms.
+sails.sockets.removeRoomMembersFromRooms(sourceRoom, destRooms, cb)
+
+// --> SOCKET CLIENT <--
+
+// Home of global configuration options for the sails.io.js library, as well as any sockets it creates.
+io.sails
+
+// Wait one cycle of the event loop after loading and then attempt to create a new SailsSocket
+// and connect it to the URL specified by io.sails.url.
+io.sails.autoConnect
+
+// Sockets will automatically (and continuously) attempt to reconnect to the server
+// if they become disconnected unexpectedly.
+io.sails.reconnection
+
+// Dictionary of headers to be sent by default with every request from this socket.
+// Can be overridden via the headers option in .request().
+io.sails.headers
+
+// Set an environment for sails.io.js, which affects how much information is logged to the console.
+// Valid values are development (full logs) and production (minimal logs).
+io.sails.environment
+
+// The URL that the socket is connected to, or will attempt to connect to.
+io.sails.url
+
+// The transports that the socket will attempt to connect using.
+io.sails.transports
+
+// Used for creating new socket connections manually.
+io.sails.connect([url], [options])
+
+// Unbind the specified event handler (opposite of .on()).
+// To force a client socket to stop receiving broadcasted messages, do not use this method.
+// Instead, unsubscribe the socket in your server-side code:
+// In order to use .off(), you will need to store the handlerFn argument you passed in to .on() in a variable.
+io.socket.off(eventIdentity, handlerFn)
+
+// Start listening for socket events from Sails with the specified eventName.
+// Will trigger the provided callback function when a matching event is received.
+// This happens when the server broadcasts a message to this socket directly, or to a room of which it is a member.
+io.socket.on(eventName, function (msg) { })
+
+// Send a virtual DELETE request to a Sails server using Socket.io.
+io.socket.delete(url, data, function (data, jwres) {})
+
+// Send a socket request(virtual GET) to a Sails server using Socket.io.
+io.socket.get(url, data, function (resData, jwres) {})
+
+// Send a socket request (virtual PATCH) to a Sails server using Socket.io.
+io.socket.patch(url, data, function (resData, jwres) {})
+
+// Send a socket request (virtual POST) to a Sails server using Socket.io.
+io.socket.post(url, data, function (resData, jwres) {})
+
+// Send a socket request (virtual PUT) to a Sails server using Socket.io.
+io.socket.put(url, data, function (resData, jwres) {})
+
+// Send a virtual request to a Sails server using Socket.io.
+io.socket.request(options, function (resData, jwres) {})
diff --git a/databases/redis.sh b/databases/redis.sh
index fcd1f4c..5665af4 100644
--- a/databases/redis.sh
+++ b/databases/redis.sh
@@ -49,6 +49,7 @@ LINSERT key BEFORE|AFTER pivot value # insert an element before or after anothe
LLEN key # return the current length of the list
LPOP key # remove the first element from the list and returns it
LSET key index value # set the value of an element in a list by its index
+LREM key number_of_occurrences value # delete occurrences of value if the list stored in key
LTRIM key start stop # trim a list to the specified range
RPOP key # remove the last element from the list and returns it
RPOPLPUSH source destination # remove the last element in a list, prepend it to another list and return it
diff --git a/frontend/angular.js b/frontend/angular.js
new file mode 100644
index 0000000..4ef1427
--- /dev/null
+++ b/frontend/angular.js
@@ -0,0 +1,443 @@
+/* *******************************************************************************************
+ * ANGULAR (2+) CHEATSHEET
+ * BASED ON https://angular.io/guide/cheatsheet
+ * DOCUMENTATION: https://angular.io/docs
+ * STYLE GUIDE: https://angular.io/guide/styleguide
+ * ******************************************************************************************* */
+
+
+```
+npm install --save @angular/cli // install command line interface (CLI) for Angular apps
+ng serve // serve the app
+ng build // build the release
+```
+
+
+/* *******************************************************************************************
+ * BOOSTRAPPING
+ * https://angular.io/guide/bootstrapping
+ * ******************************************************************************************* */
+
+
+import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
+
+// Bootstraps the app, using the root component from the specified NgModule.
+platformBrowserDynamic().bootstrapModule(AppModule);
+
+
+/* *******************************************************************************************
+ * NG MODULES
+ * https://angular.io/guide/ngmodules
+ * ******************************************************************************************* */
+
+
+import { NgModule } from '@angular/core';
+
+@NgModule({
+ declarations: ...,
+ imports: ...,
+ exports: ...,
+ providers: ...,
+ bootstrap: ...
+})
+
+// Defines a module that contains components, directives, pipes, and providers.
+class MyModule {}
+
+// List of components, directives, and pipes that belong to this module.
+declarations: [MyRedComponent, MyBlueComponent, MyDatePipe]
+
+// List of modules to import into this module. Everything from the imported modules is available
+// to declarations of this module.
+imports: [BrowserModule, SomeOtherModule]
+
+// List of components, directives, and pipes visible to modules that import this module.
+exports: [MyRedComponent, MyDatePipe]
+
+// List of dependency injection providers visible both to the contents of this module and to
+// importers of this module.
+providers: [MyService, { provide: ... }]
+
+// List of components to bootstrap when this module is bootstrapped.
+bootstrap: [MyAppComponent]
+
+
+/* *******************************************************************************************
+ * TEMPLATE SYNTAX
+ * https://angular.io/guide/template-syntax
+ * ******************************************************************************************* */
+
+
+// Binds property value to the result of expression firstName.
+//
+
+// Binds attribute role to the result of expression myAriaRole.
+//
+
+// Binds the presence of the CSS class extra-sparkle on the element to the truthiness of the
+// expression isDelightful.
+//
+
+// Binds style property width to the result of expression mySize in pixels. Units are optional.
+//
+
+// Calls method readRainbow when a click event is triggered on this button element (or its
+// children) and passes in the event object.
+//