diff --git a/blogContent/posts/hardware/2018-rochester-maker-faire.md b/blogContent/posts/hardware/2018-rochester-maker-faire.md
index 5c28f9f..87afc5e 100644
--- a/blogContent/posts/hardware/2018-rochester-maker-faire.md
+++ b/blogContent/posts/hardware/2018-rochester-maker-faire.md
@@ -1,78 +1,102 @@
![Rochester Maker Faire RITlug table.](media/makerFaire/20181117_091159.jpg)
# Introduction
-A few weeks ago I presented my [musical floppy drives](https://jrtechs.net/projects/musical-floppy-drive-build-log)
-at the [Rochester Maker Faire](https://rochester.makerfaire.com/) with [RITlug](https://ritlug.com/).
-Wow, that sentence had a ton of links-- you should check them out. This post is a
-quick recap of my experience at the Maker Faire and a project update for my musical floppy drive project. For those of you who
-don't know, [Maker Faires](https://makerfaire.com/) are community gatherings where people "celebrate arts, crafts,
-engineering, science projects and the Do-It-Yourself (DIY) mindset".
-I would like to give a huge thanks to [Christian](https://ctmartin.me/)
- for providing me with some of these pictures and [RITlug](https://ritlug.com/)
-for giving me the opportunity to present at the Maker Faire.
+A few weeks ago I presented my [musical floppy
+drives](https://jrtechs.net/projects/musical-floppy-drive-build-log)
+at the [Rochester Maker Faire](https://rochester.makerfaire.com/) with
+[RITlug](https://ritlug.com/). Wow, that sentence had a ton of
+links-- you should check them out. This post is a quick recap of my
+experience at the Maker Faire and a project update for my musical
+floppy drive project. For those of you who don't know, [Maker
+Faires](https://makerfaire.com/) are community gatherings where people
+"celebrate arts, crafts, engineering, science projects and the
+Do-It-Yourself (DIY) mindset".
+
+I would like to give a huge thanks to
+[Christian](https://ctmartin.me/) for providing me with some of these
+pictures and [RITlug](https://ritlug.com/) for giving me the
+opportunity to present at the Maker Faire.
# Project Background
-Musical floppy drives are floppy drives wired to an Arduino to play music. I initially started with two floppy drives;
-however, that grew to 8 drives very fast.
+Musical floppy drives are floppy drives wired to an Arduino to play
+music. I initially started with two floppy drives; however, that grew
+to 8 drives very fast.
-I currently have 10 floppy drives stacked together in a tower like structure to make it easier to take to places
-like the Maker Faire and [Imagine RIT](https://www.rit.edu/imagine/).
+I currently have 10 floppy drives stacked together in a tower like
+structure to make it easier to take to places like the Maker Faire and
+[Imagine RIT](https://www.rit.edu/imagine/).
![Rochester Maker Faire RITlug table.](media/makerFaire/20181117_092417.jpg)
# Future Project Upgrades
-Although the 10 floppy drives are quite loud in a small room, people typically found it difficult to hear at the
-Maker Faire. This was largely due to the noisiness of the hundreds of people at the convention center. To fix this
-in the future I want to bring a small amplifier for the floppy drives.
+Although the 10 floppy drives are quite loud in a small room, people
+typically found it difficult to hear at the Maker Faire. This was
+largely due to the noisiness of the hundreds of people at the
+convention center. To fix this in the future I want to bring a small
+amplifier for the floppy drives.
-The second improvement which I plan on making is creating some form of web application where people can
-request music for the floppy drives to play. The potential down side of this is that it is often difficult connecting
-to the internet at conventions.
+The second improvement which I plan on making is creating some form of
+web application where people can request music for the floppy drives
+to play. The potential down side of this is that it is often difficult
+connecting to the internet at conventions.
-I have a ton of old IDE hard drives that I plan on incorporating into my musical orchestra. The tricky part of that
-upgrade would be to somehow incorporate those into my current floppy drive structure so that it is easy to take places.
- My current plan is to have the hard drives completely separate from the floppy drives and run it on its own Arduino board.
+I have a ton of old IDE hard drives that I plan on incorporating into
+my musical orchestra. The tricky part of that upgrade would be to
+somehow incorporate those into my current floppy drive structure so
+that it is easy to take places. My current plan is to have the hard
+drives completely separate from the floppy drives and run it on its
+own Arduino board.
# Cool Projects at the Maker Faire
-Although there were a ton of really cool projects at the Maker Faire, I did not have the time explore everything
-and take a lot of pictures. However, I want to share some of the really cool projects that I saw at the Maker Faire.
+Although there were a ton of really cool projects at the Maker Faire,
+I did not have the time explore everything and take a lot of
+pictures. However, I want to share some of the really cool projects
+that I saw at the Maker Faire.
## HatChan
![HatChan](media/makerFaire/20181117_095844.jpg)
-This is a project that one person is calling "HatChan". This is a hat equipped with a ton of LED lights, and
-a fully functioning wireless access point. When you connect to his access point, the captcha portal takes you
-to a 4chan esk site where you can upload pictures -- mostly memes.
+This is a project that one person is calling "HatChan". This is a hat
+equipped with a ton of LED lights, and a fully functioning wireless
+access point. When you connect to his access point, the captcha portal
+takes you to a 4chan esk site where you can upload pictures -- mostly
+memes.
## 8-bit Computer
![Rochester Maker Faire](media/makerFaire/20181117_120948.jpg)
-This one person brought a home made 8-bit computer to the Maker Faire. What I find the most impressive
-about this project was that the person who made it was only a sophomore in high school.
+This one person brought a home made 8-bit computer to the Maker Faire.
+What I find the most impressive about this project was that the person
+who made it was only a sophomore in high school.
## Foss@Magic
![Rochester Maker Faire](media/makerFaire/MVIMG_20181117_151211.jpg)
*Photo provided by [Christian](https://ctmartin.me/)*
-FOSS@Magic is a organization at RIT which aims to promote
-free and open source software-- i'm also a part of this group. This year the FOSS group demoed their colorful MAGIC letters. On
-a tablet beneath the letters, there is a web site open where you can select the color of each individual
-RGB letter.
+FOSS@Magic is a organization at RIT which aims to promote free and
+open source software-- i'm also a part of this group. This year the
+FOSS group demoed their colorful MAGIC letters. On a tablet beneath
+the letters, there is a web site open where you can select the color
+of each individual RGB letter.
## RITlug
![Rochester Maker Faire](media/makerFaire/MVIMG_20181117_151247.jpg)
*Photo provided by [Christian](https://ctmartin.me/)*
-The RIT Linux Users Group (RITlug) is a student-led organization aimed to promote and teach students about Linux and open source.
-This year we presented my Floppy Drive project, a Raspberry Pi [Lakka](https://www.raspberrypi.org/magpi/easy-retro-gaming-lakka/) gaming set up, a
-[Magic Mirror](https://github.com/MichMich/MagicMirror), and [Tiger OS](https://ritlug.com/tigeros).
+The RIT Linux Users Group (RITlug) is a student-led organization aimed
+to promote and teach students about Linux and open source. This year
+we presented my Floppy Drive project, a Raspberry Pi
+[Lakka](https://www.raspberrypi.org/magpi/easy-retro-gaming-lakka/)
+gaming set up, a [Magic
+Mirror](https://github.com/MichMich/MagicMirror), and [Tiger
+OS](https://ritlug.com/tigeros).
diff --git a/blogContent/posts/java/gremlin-in-10-minutes.md b/blogContent/posts/java/gremlin-in-10-minutes.md
index ed696d1..830d7f2 100644
--- a/blogContent/posts/java/gremlin-in-10-minutes.md
+++ b/blogContent/posts/java/gremlin-in-10-minutes.md
@@ -1,44 +1,57 @@
# What is Gremlin?
-Gremlin is a graph traversal language: think of Gremlin as the SQL for graph databases. Gremlin is not
-a graph database server, it is a language; but, there is a Gremlin Server and a Gremlin Console available for
-interacting with graph databases. It is possible to use Gremlin on large database platforms
-like [Titan](https://www.digitalocean.com/community/tutorials/how-to-set-up-the-titan-graph-database-with-cassandra-and-elasticsearch-on-ubuntu-16-04)
- and [HBase](https://docs.janusgraph.org/latest/hbase.html).
+Gremlin is a graph traversal language: think of Gremlin as the SQL for
+graph databases. Gremlin is not a graph database server, it is a
+language; but, there is a Gremlin Server and a Gremlin Console
+available for interacting with graph databases. It is possible to use
+Gremlin on large database platforms like
+[Titan](https://www.digitalocean.com/community/tutorials/how-to-set-up-the-titan-graph-database-with-cassandra-and-elasticsearch-on-ubuntu-16-04)
+and [HBase](https://docs.janusgraph.org/latest/hbase.html).
# Graph Data Base Basics
-A graph database is based on graph theory. A graph is composed of nodes, edges, and properties. A key
-object/component in a graph database is stored as a node. Nodes are connected via edges representing
-relationships. For example, you may represent people as nodes and have edges representing friendships.
-You can assign properties to both nodes and edges. A person (node) may have the properties of age and name,
-where a friendship (edge) may have a start date property.
+A graph database is based on graph theory. A graph is composed of
+nodes, edges, and properties. A key object/component in a graph
+database is stored as a node. Nodes are connected via edges
+representing relationships. For example, you may represent people as
+nodes and have edges representing friendships. You can assign
+properties to both nodes and edges. A person (node) may have the
+properties of age and name, where a friendship (edge) may have a
+start date property.
## Why Graph Databases?
-Graph databases are great for modeling data where the value lies in the shape of the graph. Graph databases
-also allow to to model more complex relationships which would be difficult to model in a normal table-based
-database.
+Graph databases are great for modeling data where the value lies in
+the shape of the graph. Graph databases also allow to to model more
+complex relationships which would be difficult to model in a normal
+table-based database.
## Gremlin Installation
-Download and extract the following:
+Download and extract the following:
+
- [Gremlin Console](https://www.apache.org/dyn/closer.lua/tinkerpop/3.3.3/apache-tinkerpop-gremlin-console-3.3.3-bin.zip)
- [Gremlin Server](https://www.apache.org/dyn/closer.lua/tinkerpop/3.3.3/apache-tinkerpop-gremlin-server-3.3.3-bin.zip)
-Start the Gremlin server by running it with the start script in the bin folder. As a prerequisite for running gremlin, you
-must have Java installed on your computer.
-```
+Start the Gremlin server by running it with the start script in the
+bin folder. As a prerequisite for running gremlin, you must have Java
+installed on your computer.
+
+```bash
./gremlin-server.sh
```
-Start the Gremlin console by running the gremlin.sh or gremlin.bat script in the bin folder.
-```
+
+Start the Gremlin console by running the gremlin.sh or gremlin.bat
+script in the bin folder.
+
+```bash
./gremlin.sh
```
-Now you need to instantiate a new graph on the server to use. To to that, execute the following commands in
-the Gremlin console.
+Now you need to instantiate a new graph on the server to use. To to
+that, execute the following commands in the Gremlin console.
+
```java
#Creates a empty graph
gremlin> graph = EmptyGraph.instance()
@@ -56,26 +69,32 @@ gremlin> g = graph.traversal().withRemote(DriverRemoteConnection.using(cluster,
# Gremlin Syntax
-Now that you have your gremlin server and console set up, you are ready to start executing Gremlin queries.
+Now that you have your gremlin server and console set up, you are
+ready to start executing Gremlin queries.
## Adding a Vertex
-In Gremlin nodes are referred to as "Vertexes". To add a node/vertex to the graph, you simply use the
-command addV() on your graph traversal source. For consistency, most people
-use "g" as their default graph traversal source. To append properties to your your vertex, you add a series of
-".property('property_name', 'property_value')" strings to the add vertex query.
+In Gremlin nodes are referred to as "Vertexes". To add a node/vertex
+to the graph, you simply use the command addV() on your graph
+traversal source. For consistency, most people use "g" as their
+default graph traversal source. To append properties to your your
+vertex, you add a series of ".property('property_name',
+'property_value')" strings to the add vertex query.
+
+EX:
-EX:
```java
g.addV('student').property('name', 'Jeffery').property('GPA', 4.0);
```
## Updating a Property
-Unlike SQL, you are not limited to a specific schema in a graph database. If you want to add or change
-a property on a vertex or edge, you simply use the property command again.
-The "g.V(1)" in the following example refers to a specific vertex with the primary id of 1-- the graph database auto assigns these ids.
-You can replace "g.V(1)" with a command to select a specific vertex or edge.
+Unlike SQL, you are not limited to a specific schema in a graph
+database. If you want to add or change a property on a vertex or
+edge, you simply use the property command again. The "g.V(1)" in the
+following example refers to a specific vertex with the primary id of
+1-- the graph database auto assigns these ids. You can replace
+"g.V(1)" with a command to select a specific vertex or edge.
```java
g.V(1).property('name', 'Jeffery R');
@@ -83,29 +102,38 @@ g.V(1).property('name', 'Jeffery R');
## Selection
-Selecting nodes and edges is the most complicated part of Gremlin. The concept is not particularly hard, but, there
-are dozens of ways to do graph traversals and selections. I will cover the most common aways to traverse a graph.
+Selecting nodes and edges is the most complicated part of Gremlin. The
+concept is not particularly hard, but, there are dozens of ways to do
+graph traversals and selections. I will cover the most common aways to
+traverse a graph.
+
+This example will select all vertexes which have the label "student".
+The ".valueMap()" command appended to the end of the query makes
+Gremlin return a map of all the objects it returns with their
+properties.
-This example will select all vertexes which have the label "student". The ".valueMap()" command appended to the end of the query
-makes Gremlin return a map of all the objects it returns with their properties.
```java
g.V().hasLabel('student').valueMap();
```
-In this following example, instead of returning a ValueMap of values, we are just returning the names of the students
-in the graph.
+In this following example, instead of returning a ValueMap of values,
+we are just returning the names of the students in the graph.
+
```java
g.V().hasLabel('student').values('name');
```
-This example will return the GPA of the student with the name "Jeffery R".
+This example will return the GPA of the student with the name "Jeffery
+R".
+
```java
g.V().hasLabel('student').has('name', 'Jeffery R').values('gpa');
```
-This command will return all the students in order of their GPA.
+This command will return all the students in order of their GPA.
+
```java
g.V().hasLabel('student').order().by('gpa', decr).value('name')
```
@@ -113,10 +141,12 @@ g.V().hasLabel('student').order().by('gpa', decr).value('name')
## Adding Edges
-The easiest way (my opinion) to add edges in Gremlin is by
-using aliasing. In this example we select two nodes and assign them a name: in this case it is "a", and "b".
-After we have selected two edges, we can add an edge to them using the "addE()" command. The syntax of this is
-nice because we know that "a" is friends with "b"-- it is easy to tell the direction of the edge.
+The easiest way (my opinion) to add edges in Gremlin is by using
+aliasing. In this example we select two nodes and assign them a name:
+in this case it is "a", and "b". After we have selected two edges, we
+can add an edge to them using the "addE()" command. The syntax of this
+is nice because we know that "a" is friends with "b"-- it is easy to
+tell the direction of the edge.
```java
g.V(0).as('a').V(1).as('b').addE('knows')
@@ -126,12 +156,15 @@ g.V(0).as('a').V(1).as('b').addE('knows')
# Using Gremlin with Java
-Now that you know the basic syntax of Gremlin, you are ready to use it somewhere other than the Gremlin console. If you
-are trying to use Gremlin with Java, there is a great Maven dependency for TinkerPop and Gremlin. If you want to quickly
-connect to your Gremlin server with Java, make sure your server is set up exactly as it was before this tutorial started discussing
-Gremlin syntax.
+Now that you know the basic syntax of Gremlin, you are ready to use it
+somewhere other than the Gremlin console. If you are trying to use
+Gremlin with Java, there is a great Maven dependency for TinkerPop and
+Gremlin. If you want to quickly connect to your Gremlin server with
+Java, make sure your server is set up exactly as it was before this
+tutorial started discussing Gremlin syntax.
## Maven dependency for Java:
+
```html
@@ -154,8 +187,10 @@ Gremlin syntax.
```
-It is helpful to wrap everything relating to the graph database connection into a single Java class. This is roughly
-the code that I usually use to interact with a Gremlin Server-- anybody is free to use it.
+It is helpful to wrap everything relating to the graph database
+connection into a single Java class. This is roughly the code that I
+usually use to interact with a Gremlin Server-- anybody is free to use
+it.
```java
public class GraphConnection
@@ -188,6 +223,8 @@ public class GraphConnection
```
## Basic GraphConnection.java Usage:
+
+
```java
RemoteConnection con = new RemoteConnection()
String query = "g.V().hasLabel('player')" +
@@ -202,6 +239,8 @@ this.con.queryGraph(query);
```
## Overly complex usage with a lambda statement
+
+
```java
/**
* Fetches the list of a player's friends.
@@ -212,11 +251,9 @@ this.con.queryGraph(query);
private List getFriendsFromGraph(String id)
{
List friends = new ArrayList<>();
-
String query = "g.V().hasLabel('player')" +
".has('id', '" + id + "')" +
".both().valueMap()";
-
this.con.queryGraph(query).stream().forEach(r ->
friends.add(new Player(
((ArrayList) (((HashMap) (r.getObject()))
@@ -228,21 +265,22 @@ private List getFriendsFromGraph(String id)
}
```
-The most important thing to do while playing around with Gremlin in Java is to keep an eye on the
-return type. From experience, I can say that it is often easier to return the vertex from your
-query rather than returning the valueMap.
+The most important thing to do while playing around with Gremlin in
+Java is to keep an eye on the return type. From experience, I can say
+that it is often easier to return the vertex from your query rather
+than returning the valueMap.
+
+Without returning the valueMap in the query, you can directly access
+the vertex in the result rather than doing some voodoo witchcraft and
+casting between ArrayLists and HashMaps.
-Without returning the valueMap in the query, you can directly access the vertex
-in the result rather than doing some voodoo witchcraft and casting between ArrayLists and HashMaps.
+The previous example could be re-written as this:
-The previous example could be re-written as this:
```java
List friends = new ArrayList<>();
-
String query = "g.V().hasLabel('player')" +
".has('id', '" + id + "')" +
".both()";
-
for(Result r: this.con.queryGraph(query))
{
friends.add(new Player(r.getVertex("name").value().toString),
@@ -250,14 +288,15 @@ for(Result r: this.con.queryGraph(query))
}
```
-You now know enough about Gremlin to be dangerous with it. Yay! If you want to do more than basic things with Gremlin,
-I highly suggest that you look at the tutorial [SQL 2 Gremlin](http://sql2gremlin.com/).
-If you plan on deploying this to production, it is recommended that you use HBase for a persistent back end storage
-server.
+You now know enough about Gremlin to be dangerous with it. Yay! If you
+want to do more than basic things with Gremlin, I highly suggest that
+you look at the tutorial [SQL 2 Gremlin](http://sql2gremlin.com/). If
+you plan on deploying this to production, it is recommended that you
+use HBase for a persistent back end storage server.
# Resources
- [SQL 2 Gremlin](http://sql2gremlin.com/)
- [Practical Gremlin](http://kelvinlawrence.net/book/Gremlin-Graph-Guide.html)
- [Apache TinkerPop](http://tinkerpop.apache.org/)
-- [Steam Friends Graph (Personal Gremlin Project)](https://github.com/jrtechs/SteamFriendsGraph)
\ No newline at end of file
+- [Steam Friends Graph (Personal Gremlin Project)](https://github.com/jrtechs/SteamFriendsGraph)
diff --git a/blogContent/posts/java/top-three-recommended-java-ides.md b/blogContent/posts/java/top-three-recommended-java-ides.md
index 5f4c2cb..7845672 100644
--- a/blogContent/posts/java/top-three-recommended-java-ides.md
+++ b/blogContent/posts/java/top-three-recommended-java-ides.md
@@ -1,45 +1,48 @@
-An IDE (Integrated Development Environment) is a single program that wraps
-everything you need to program with. An IDE usually consists of a code editor,
-debugger, and a compiler. A good IDE can make you more productive. Without a IDE
-you would be stuck writing all of your apps in notepad and compiling via command
-line – which is not bad for learning how to program. A good IDE has syntax
-highlighting which makes the code easier to read and error highlighting which
-makes finding that missing semi colon easier. Here is a list of three IDEs that
-work well for me.
+An IDE (Integrated Development Environment) is a single program that
+wraps everything you need to program with. An IDE usually consists of
+a code editor, debugger, and a compiler. A good IDE can make you more
+productive. Without a IDE you would be stuck writing all of your apps
+in notepad and compiling via command line – which is not bad for
+learning how to program. A good IDE has syntax highlighting which
+makes the code easier to read and error highlighting which makes
+finding that missing semi colon easier. Here is a list of three IDEs
+that work well for me.
# NetBeans
-NetBeans is the most productive IDE for large java projects. NetBeans is great
-at detecting errors in your code. You can also have multiple projects open in
-the same window which is great for anyone who is constantly flipping between
-projects – even if they are in different coding languages. This is a must have
-program for everyone looking to develop Java. This program also supports PHP,
-JavaScript and C/C++.
+NetBeans is the most productive IDE for large java projects. NetBeans
+is great at detecting errors in your code. You can also have multiple
+projects open in the same window which is great for anyone who is
+constantly flipping between projects – even if they are in different
+coding languages. This is a must have program for everyone looking to
+develop Java. This program also supports PHP, JavaScript and C/C++.
![NetBeans IDE](media/2a20326e77c3f67aa3753401ba4bc612.png)
# Eclipse
-Eclipse is a very popular programming IDE; however, it is harder to use than
-NetBeans. The largest benefit of Eclipse is that it has tons of templates for
-you to use. Eclipse also has a better GUI creation tool than NetBeans has.
+Eclipse is a very popular programming IDE; however, it is harder to
+use than NetBeans. The largest benefit of Eclipse is that it has tons
+of templates for you to use. Eclipse also has a better GUI creation
+tool than NetBeans has.
![Eclipse](media/f5cb2682e219549cb07acd1d01c2ccb1.png)
# JCreator
-I want to warn you that this is a old IDE. You hate yourself if you decide to
-use this program. The only reason I am putting this on my list is because I
-think it is great for teaching people how to program – it’s what my high school
-used. Unlike Eclipse and NetBeans, it gives you very little help when writing
-your code. There is no autocompletes or dropdowns when you are accessing members
-of an object. This does not even give you red highlights when you have a syntax
-error. What it instead shows you is the errors that you would receive in the
-command line when you compile this project. This is great for AP Computer
-Science students who have to memorize/learn what certain errors mean.
+I want to warn you that this is a old IDE. You hate yourself if you
+decide to use this program. The only reason I am putting this on my
+list is because I think it is great for teaching people how to program
+– it’s what my high school used. Unlike Eclipse and NetBeans, it gives
+you very little help when writing your code. There is no autocompletes
+or dropdowns when you are accessing members of an object. This does
+not even give you red highlights when you have a syntax error. What it
+instead shows you is the errors that you would receive in the command
+line when you compile this project. This is great for AP Computer
+Science students who have to memorize/learn what certain errors mean.
![JCreator](media/c1e712bdead908ebd72921ec2d1cbd5e.png)
@@ -48,11 +51,11 @@ Science students who have to memorize/learn what certain errors mean.
\*Update 2018
-I have converted to a full time Intellij user since writing this article in
-2015. This program is simply fantastic in every aspect – expect ram usage. If
-you have never heard of Intellij or any of the other JetBrains products I would
-highly recommend you check them out. The main reason I switched was because
-Intellij could scale nicely to 4k and NetBeans did not. The user experience
-overall feels nice.
+I have converted to a full time Intellij user since writing this
+article in 2015. This program is simply fantastic in every aspect –
+expect ram usage. If you have never heard of Intellij or any of the
+other JetBrains products I would highly recommend you check them out.
+The main reason I switched was because Intellij could scale nicely to
+4k and NetBeans did not. The user experience overall feels nice.
![Intellij](media/2a96900bae1e8946a1df243d8318e69f.png)
diff --git a/blogContent/posts/other/college-cookbook.md b/blogContent/posts/other/college-cookbook.md
index b022456..fdde287 100644
--- a/blogContent/posts/other/college-cookbook.md
+++ b/blogContent/posts/other/college-cookbook.md
@@ -1,21 +1,24 @@
-I occasionally cooked during High School, however, college was my first real experience cooking on
-a daily basis. Since I have lived to tell the tail, I want to share some of the recipes that
-I created/modified which got me through my first two years of college.
+I occasionally cooked during High School, however, college was my
+first real experience cooking on a daily basis. Since I have lived to
+tell the tail, I want to share some of the recipes that I
+created/modified which got me through my first two years of college.
# Level 1: Cooking in the Dorms
-Being stuck in a dorm room you are limited to only being able to use the microwave.
-Desperate times calls for depraved cooking solutions.
+Being stuck in a dorm room you are limited to only being able to use
+the microwave. Desperate times calls for depraved cooking solutions.
## Ramen Pizza
![Romen Pizza Final Result](media/cooking/lvl1/romenPizza.jpg)
-This recipe surprised me as to how it turned out.
-You start making this by microwaving ramen noodles for about a third of the instructed time in a bowl of water.
-When you place the noodles in the bowl, make sure to not break them apart.
-After cooking, take the romen noodles out of the bowl, dry, and place on a plate.
-Next, you slather the ramen noodles with your desired pizza toppings and place in the microwave for around 2 minutes.
+This recipe surprised me as to how it turned out. You start making
+this by microwaving ramen noodles for about a third of the instructed
+time in a bowl of water. When you place the noodles in the bowl, make
+sure to not break them apart. After cooking, take the romen noodles
+out of the bowl, dry, and place on a plate. Next, you slather the
+ramen noodles with your desired pizza toppings and place in the
+microwave for around 2 minutes.
### Ingredients
@@ -28,19 +31,22 @@ Next, you slather the ramen noodles with your desired pizza toppings and place i
![Eggs in a Mug Result](media/cooking/lvl1/eggs.jpg)
-Life hack: you can cook scrambled eggs in a microwave using a coffee mug.
-The resulting eggs are abnormally fluffy and taste a little strange, but, it makes for a quick meal.
-It just so happens that you can also cook hot dogs in the microwave.
+Life hack: you can cook scrambled eggs in a microwave using a coffee
+mug. The resulting eggs are abnormally fluffy and taste a little
+strange, but, it makes for a quick meal. It just so happens that you
+can also cook hot dogs in the microwave.
-When I stumbled upon this recipe, I clung to it since it was fast, cheep,
-and most of the dinning places on campus were closed by the time I got out of work.
-To make this, you crack and mix two eggs in a coffee cup.
-You then microwave the coffee mug, mixing the eggs every 30 seconds.
-Half way through cooking the eggs, you add a diced hotdog and some shredded cheese.
-Once your eggs have all cooked, you can add a healthy dosage of salsa.
-Voila, you have an omelet which can compete with whatever they are serving at the dinning hall.
+When I stumbled upon this recipe, I clung to it since it was fast,
+cheep, and most of the dinning places on campus were closed by the
+time I got out of work. To make this, you crack and mix two eggs in a
+coffee cup. You then microwave the coffee mug, mixing the eggs every
+30 seconds. Half way through cooking the eggs, you add a diced hotdog
+and some shredded cheese. Once your eggs have all cooked, you can add
+a healthy dosage of salsa. Voila, you have an omelet which can compete
+with whatever they are serving at the dinning hall.
## Ingredients
+
- 1-2 Eggs
- 1 Hotdog
- Cheese
@@ -48,19 +54,24 @@ Voila, you have an omelet which can compete with whatever they are serving at th
# Level 2: Cooking With no Time
-Time is *very* scarce as a college student, I found the following recipes to be fast and easy.
-These recipes are very forgiving in the sense that you can change the directions and ingredients and still end up with something resembling food.
+Time is *very* scarce as a college student, I found the following
+recipes to be fast and easy. These recipes are very forgiving in the
+sense that you can change the directions and ingredients and still end
+up with something resembling food.
## Chili
![Chili with rice and cheese](media/cooking/lvl2/chili.jpg)
-It is *very* hard to make a bad chili.
-All you essentially have to do is gather/prep all the ingredients and plop them in a crock pot and cook for 6-8 hours on low.
-You don't have to cook this in a crock pop, however, it takes more time to prepare on the stove since you have to monitor it while it cooks for an hour on medium heat.
-I usually saute the onions while I cook the ground beef so that it cooks in the grease of the beef.
-The average prep time for this recipe is around 20-30 minutes.
-However, if you made this vegetarian you can probably cut the prep time down to a mere 10 minutes.
+It is *very* hard to make a bad chili. All you essentially have to do
+is gather/prep all the ingredients and plop them in a crock pot and
+cook for 6-8 hours on low. You don't have to cook this in a crock pop,
+however, it takes more time to prepare on the stove since you have to
+monitor it while it cooks for an hour on medium heat. I usually saute
+the onions while I cook the ground beef so that it cooks in the grease
+of the beef. The average prep time for this recipe is around 20-30
+minutes. However, if you made this vegetarian you can probably cut
+the prep time down to a mere 10 minutes.
### Ingredients
@@ -86,12 +97,15 @@ However, if you made this vegetarian you can probably cut the prep time down to
![Poor mans Chicken Parmesan Serving Picture](media/cooking/lvl2/chickenParm.jpg)
-I call this poor man's chicken parmesan only because it uses chicken patties, this actually tastes really good.
-To prepare this you slather chicken patties with pasta sauce and cheese and then cook normally in the oven.
-While the chicken patties bake, you can cook your normal pasta noodles and sauce.
-You serve the pasta noodles with the sauce topped with the cheesy chicken pattie.
+I call this poor man's chicken parmesan only because it uses chicken
+patties, this actually tastes really good. To prepare this you slather
+chicken patties with pasta sauce and cheese and then cook normally in
+the oven. While the chicken patties bake, you can cook your normal
+pasta noodles and sauce. You serve the pasta noodles with the sauce
+topped with the cheesy chicken pattie.
### Ingredients
+
- Chicken Patties
- Pasta Sauce
- Pasta Noodles
@@ -101,16 +115,21 @@ You serve the pasta noodles with the sauce topped with the cheesy chicken pattie
![Chicken Soup Served with Mozzarella Cheese](media/cooking/lvl2/chickenSoup.jpg)
-This is an easy recipe which has *so* many combinations.
-I usually make some form of chicken soup, the rest of the ingredients are entirely dependent on what I have in the kitchen.
-You will have to play around with my recommenced ingredient list to find the perfect combination for you, however, I have not found a combination which did not work with me-- yet.
-Similar to chili, you just put all the ingredients in a crock pot and let simmer on low for 6-8 hours.
-I would recommend putting in spices like garlic and basil during the last hour of cooking to keep their flavors sharp.
-You want to add the salt and pepper to the soup in the beginning.
+This is an easy recipe which has *so* many combinations. I usually
+make some form of chicken soup, the rest of the ingredients are
+entirely dependent on what I have in the kitchen. You will have to
+play around with my recommenced ingredient list to find the perfect
+combination for you, however, I have not found a combination which did
+not work with me-- yet. Similar to chili, you just put all the
+ingredients in a crock pot and let simmer on low for 6-8 hours. I
+would recommend putting in spices like garlic and basil during the
+last hour of cooking to keep their flavors sharp. You want to add the
+salt and pepper to the soup in the beginning.
![Chicken Soup with a red sauce](media/cooking/lvl2/redSoup.jpg)
### Ingredients
+
- Bag of Frozen Chicken Strips
- 3-4 Diced Potatoes
- Chicken Stock
@@ -135,14 +154,17 @@ You want to add the salt and pepper to the soup in the beginning.
![Potato Casserole](media/cooking/lvl2/cheesePotatoes.jpg)
-For this recipe you cut all the vegetables and place them in a large baking pan with the chicken strips.
-If you want, you can also mix in some seasonings like salt, garlic, pepper, and basil.
-You then then mix everything together with some canola or vegetable oil.
-Cook this casserole in a 350 degrease oven for around 30 minutes.
-Briefly take this out of the oven and top with cheese and ranch dressing and place back in oven for another 10-15 minutes.
-If you are really cheap, you can make this with hot dogs rather than pre-cooked chicken strips.
+For this recipe you cut all the vegetables and place them in a large
+baking pan with the chicken strips. If you want, you can also mix in
+some seasonings like salt, garlic, pepper, and basil. You then then
+mix everything together with some canola or vegetable oil. Cook this
+casserole in a 350 degrease oven for around 30 minutes. Briefly take
+this out of the oven and top with cheese and ranch dressing and place
+back in oven for another 10-15 minutes. If you are really cheap, you
+can make this with hot dogs rather than pre-cooked chicken strips.
### Ingredients
+
- 4-6 Peeled and Cubed Potatoes
- 1-2 Diced Onions
- Bag of Chicken Strips
@@ -156,20 +178,25 @@ If you are really cheap, you can make this with hot dogs rather than pre-cooked
# Level 3 Cooking
-Once you master the art of sauteing onions and making soups, you are ready to advance to level three.
-Nothing I will present is incredibly difficult, but, there is more room for mistakes and takes longer to prepare.
+Once you master the art of sauteing onions and making soups, you are
+ready to advance to level three. Nothing I will present is incredibly
+difficult, but, there is more room for mistakes and takes longer to
+prepare.
## Fried Rice
![Fried Rice Final Result](media/cooking/lvl3/friedRice.jpg)
-The challenging part of this recipe is getting the correct timing.
-To finish this dish in 40 minutes, you want to cook 2 cups of rice, brown ground beef with onions and cook 3 scrambled eggs all simultaneously.
-You then combine all these ingredients in a large fry pan with vegetables and soy sauce.
-If you want to prevent the dish from turning out sticky, you should use left over rice.
-Or, cook the rice first and then let if cool in the fridge for a few hours.
+The challenging part of this recipe is getting the correct timing. To
+finish this dish in 40 minutes, you want to cook 2 cups of rice, brown
+ground beef with onions and cook 3 scrambled eggs all simultaneously.
+You then combine all these ingredients in a large fry pan with
+vegetables and soy sauce. If you want to prevent the dish from turning
+out sticky, you should use left over rice. Or, cook the rice first
+and then let if cool in the fridge for a few hours.
### Ingredients
+
- 1-2 Cups of Rice
- 1/2 lbs of Ground Beef
- 1 Onion
@@ -180,17 +207,22 @@ Or, cook the rice first and then let if cool in the fridge for a few hours.
![Chicken Right Out of Oven](media/cooking/lvl3/ovenChicken.jpg)
-Cooking raw chicken is definitely not on the syllabus for most college students.
-When cooking the chicken I would strongly recommend using a meat thermometer to make sure that the chicken reaches 165 degrease.
-Either buy chicken breasts or cut a whole chicken-- use the left over chicken spine and wings for chicken stock.
-On a baking pan lather the chicken in the marinara sauce that you just mixed (ingredients below) and sprinkle some salt and pepper on the chicken.
-Let the chicken cook for around 30 minutes in a oven that is 400 degrease (until the chicken reaches 165).
-After the chicken comes out of the oven, sear it on a ripping hot skillet with some more of the marinara sauce.
-Cooking the chicken this way will keep the chicken juicy and the skin crispy.
+Cooking raw chicken is definitely not on the syllabus for most college
+students. When cooking the chicken I would strongly recommend using a
+meat thermometer to make sure that the chicken reaches 165 degrease.
+Either buy chicken breasts or cut a whole chicken-- use the left over
+chicken spine and wings for chicken stock. On a baking pan lather the
+chicken in the marinara sauce that you just mixed (ingredients below)
+and sprinkle some salt and pepper on the chicken. Let the chicken cook
+for around 30 minutes in a oven that is 400 degrease (until the
+chicken reaches 165). After the chicken comes out of the oven, sear it
+on a ripping hot skillet with some more of the marinara sauce. Cooking
+the chicken this way will keep the chicken juicy and the skin crispy.
![Chicken Searing](media/cooking/lvl3/chickenSear.jpg)
### Marinara Sauce Ingredients
+
- 4 TBSP Oil
- 3 TBSP Honey
- Minced Garlic
@@ -201,17 +233,22 @@ Cooking the chicken this way will keep the chicken juicy and the skin crispy.
![Ingredients for Stock](media/cooking/lvl3/stockIngredients.jpg)
-If you happen to cook with a whole chicken and end up with some chicken bones, you are in the perfect position to make chicken stock.
-Essentially all you need to do is put your chicken bones, onions, carrots, and basil in a crock pot cook for 8-12 hours on low.
-Periodically you should skim off the fat that surfaces to the top.
-At the end of the 12 hours you use a fine mesh skimmer to filter out all the chicken and vegetables.
-If you want a darker flavor to the stock, roast the chicken parts and vegetables in the oven before adding them to the crock pot.
+If you happen to cook with a whole chicken and end up with some
+chicken bones, you are in the perfect position to make chicken stock.
+Essentially all you need to do is put your chicken bones, onions,
+carrots, and basil in a crock pot cook for 8-12 hours on low.
+Periodically you should skim off the fat that surfaces to the top. At
+the end of the 12 hours you use a fine mesh skimmer to filter out all
+the chicken and vegetables. If you want a darker flavor to the stock,
+roast the chicken parts and vegetables in the oven before adding them
+to the crock pot.
![Cooking Chicken Stock](media/cooking/lvl3/cookingBroth.jpg)
![Stock Final Result](media/cooking/lvl3/ChickenBroth.jpg)
### Ingredients
+
- Chicken Bones
- 1-2 Quartered Onions
- 2-3 Carrots
@@ -226,16 +263,19 @@ If you want a darker flavor to the stock, roast the chicken parts and vegetables
![Chicken and Rice Plate Picture](media/cooking/lvl3/chickenAndRice.jpg)
-My version of chicken and rice may not be orthodox.
-This recipe came into existence because I needed something to make which shared ingredients with the other dishes that I frequently make.
+My version of chicken and rice may not be orthodox. This recipe came
+into existence because I needed something to make which shared
+ingredients with the other dishes that I frequently make.
-Essentially, you make rice and put a thick red sauce with chicken, onions, peppers over it.
-You prepare the rice like normal.
-In a large sauce pan you saute onions and peppers.
-Once the onions start to brown, you add diced tomatoes, corn, minced garlic, basil, brown sugar, frozen chicken strips and mustard.
-Once the chicken has thawed, you are ready to serve this dish.
+Essentially, you make rice and put a thick red sauce with chicken,
+onions, peppers over it. You prepare the rice like normal. In a large
+sauce pan you saute onions and peppers. Once the onions start to
+brown, you add diced tomatoes, corn, minced garlic, basil, brown
+sugar, frozen chicken strips and mustard. Once the chicken has thawed,
+you are ready to serve this dish.
### Ingredients
+
- 2 Cups Rice
- Bag of Grilled Chicken Strips
- 1-2 Onions
@@ -245,4 +285,4 @@ Once the chicken has thawed, you are ready to serve this dish.
- 1 Can Corn
- Minced Garlic
- Brown Sugar
-- Basil
\ No newline at end of file
+- Basil
diff --git a/blogContent/posts/programming/cs-theory-exam-2-review.md b/blogContent/posts/programming/cs-theory-exam-2-review.md
index 7931e31..b9659c6 100644
--- a/blogContent/posts/programming/cs-theory-exam-2-review.md
+++ b/blogContent/posts/programming/cs-theory-exam-2-review.md
@@ -1,19 +1,26 @@
-This a very high level review post that I am making for myself and other people reviewing CS Theory.
-If you want to lean more about content in this blog post I recommend cracking open a text book-- I know, gross.
-This hastily thrown together post will cover how to solve typical problems relating to topics covered by my second CS Theory exam.
+This a very high level review post that I am making for myself and
+other people reviewing CS Theory. If you want to lean more about
+content in this blog post I recommend cracking open a text book-- I
+know, gross. This hastily thrown together post will cover how to solve
+typical problems relating to topics covered by my second CS Theory
+exam.
# Myhill-Nerode Theorem
## Definition
-L is regular if and only if it has a finite index. The index is the maximum number of elements that are pairwise distinguishable.
-Two strings are said to be pairwise distinguishable if you can append something to both of the strings and it makes one string
-accepted by the language and the other string rejected.
-The size of an index set X equals the number of equivalence classes it has and the minimum number of states required to represent it
-using a DFA. Each element in the language is accepted by only one equivalence class.
+
+L is regular if and only if it has a finite index. The index is the
+maximum number of elements that are pairwise distinguishable. Two
+strings are said to be pairwise distinguishable if you can append
+something to both of the strings and it makes one string accepted by
+the language and the other string rejected. The size of an index set
+X equals the number of equivalence classes it has and the minimum
+number of states required to represent it using a DFA. Each element in
+the language is accepted by only one equivalence class.
## Problem Approach
-Prove that language L is regular.
+Prove that language L is regular.
1) Define a set X which is infinite in size - this doesn't have to be in the language.
@@ -23,13 +30,13 @@ the other is not in the language.
## Example
-Prove the following language is non-regular:
+Prove the following language is non-regular:
$$
L={ww^r | w \in {0,1}^*}
$$
-answer:
+answer:
1)
@@ -37,13 +44,14 @@ $$
X = {(01)^i | i \geq 0}
$$
-Pick any 2 elements of X and show pairwise distinguishable
+Pick any 2 elements of X and show pairwise distinguishable
$$
x = (01)^i, y = (01)^j | i \neq j
$$
-suppose we pick
+suppose we pick
+
$$
z = (10)^i\\
xz \in L\\
@@ -53,78 +61,91 @@ $$
# DFA minimization algorithm
-Types of Problems:
+Types of Problems:
+
- Prove DFA is minimal
- Minimize the DFA
-The argument for DFA minimization comes from the Myhill-Nerode theorem. Given
-a DFA, if you can form a set of strings which represent each state and they are all
-pairwise distinguishable, then the DFA is minimal with that many states.
+The argument for DFA minimization comes from the Myhill-Nerode
+theorem. Given a DFA, if you can form a set of strings which represent
+each state and they are all pairwise distinguishable, then the DFA is
+minimal with that many states.
## Prove DFA is minimal
-For these types of problems you construct a table and show that each state is pairwise distinguishable.
-To show pairwise distinguishably you have to show that there exists a string where if appended to one element
-makes it accepted by the language but pushes the other string out of the language.
+For these types of problems you construct a table and show that each
+state is pairwise distinguishable. To show pairwise distinguishably
+you have to show that there exists a string where if appended to one
+element makes it accepted by the language but pushes the other string
+out of the language.
### Example
-Prove the following DFA is minimal.
+Prove the following DFA is minimal.
![DFA Example](media/CSTHEORY/DFAMinimalProof.png)
-Find a set of strings which represent the minimal path to each state in the DFA.
+Find a set of strings which represent the minimal path to each state
+in the DFA.
$$
X = \{\epsilon, b, bb, ba\}
$$
-Show that each state is pairwise distinguishable.
+Show that each state is pairwise distinguishable.
![DFA Example](media/CSTHEORY/DFAMinimalTable.png)
## Minimize the DFA
-To use the concept of being indistinguishable to minimize a DFA, you can use a table to keep track which
-states are distinguishable from each other. The states which are not indistinguishable can
-be combined. To solve one of these problems you start by creating a table which compares each of the
-states in the DFA. You then go through and mark the states which are indistinguishable -- start with
-the ones with different accepting statuses. Then you continue marking off states where if you transition with
-a symbol on the DFA you are distinguishable and the other state is non-distinguishable according to the table.
+To use the concept of being indistinguishable to minimize a DFA, you
+can use a table to keep track which states are distinguishable from
+each other. The states which are not indistinguishable can be
+combined. To solve one of these problems you start by creating a table
+which compares each of the states in the DFA. You then go through and
+mark the states which are indistinguishable -- start with the ones
+with different accepting statuses. Then you continue marking off
+states where if you transition with a symbol on the DFA you are
+distinguishable and the other state is non-distinguishable according
+to the table.
### Example
-Minify the Following DFA:
+Minify the Following DFA:
![DFA Example](media/CSTHEORY/DFAMinification.png)
-After marking the states with different accepting criteria as being distinguishable you get this table:
+After marking the states with different accepting criteria as being
+distinguishable you get this table:
![Half Complete Table](media/CSTHEORY/MinificationTable.svg)
-After looping through all pairs and marking them on the table if there exists symbol which results in one state
-to be distinguishable and one to be indistinguishable you get this table:
+After looping through all pairs and marking them on the table if there
+exists symbol which results in one state to be distinguishable and
+one to be indistinguishable you get this table:
![Min TableTable](media/CSTHEORY/MinTable2.svg)
-According to the table you are able to combine {D, A, B}, {C, F}, and {E, G}.
+According to the table you are able to combine {D, A, B}, {C, F}, and
+{E, G}.
-Minimal DFA:
+Minimal DFA:
![Min DFA](media/CSTHEORY/MinimalDFA.svg)
# Pumping lemma for regular languages
-The pumping lemma cannot prove that a language is regular, however, you can use it
-to show that some languages are non-regular. This theory gets at the idea that if
-a regular language is long enough/infinite, it will have a state somewhere which is
-repeated on the path that accepts the string.
+The pumping lemma cannot prove that a language is regular, however,
+you can use it to show that some languages are non-regular. This
+theory gets at the idea that if a regular language is long
+enough/infinite, it will have a state somewhere which is repeated on
+the path that accepts the string.
-The accepted strings can be divided into three parts:
+The accepted strings can be divided into three parts:
- Symbols leading up to the loop
- Symbols which complete a loop and come back to start of loop
@@ -134,7 +155,7 @@ The accepted strings can be divided into three parts:
-To Show that a language L is not regular using pumping lemma:
+To Show that a language L is not regular using pumping lemma:
- Use a proof by contradiction
- Assume L is regular
@@ -148,52 +169,53 @@ To Show that a language L is not regular using pumping lemma:
## Example
-Show that the following language is non-regular.
+Show that the following language is non-regular.
$$
{0^n1^n | n \geq 0}
$$
-Proof by contradiction
+Proof by contradiction
-Assume that L is regular.
+Assume that L is regular.
-Let p be the pumping length associated with L
+Let p be the pumping length associated with L
$$
S = o^p1^p
$$
-S is valid since
+S is valid since
$$
|s| \geq p, S \in L
$$
-For any valid decomposition
+For any valid decomposition
-S = xyz
+S = xyz
-such that |xy| <= p and |y| > 0
+such that |xy| <= p and |y| > 0
-Consider:
+Consider:
$$
xy^2z
$$
-By the pumping lemma this should be in the language but it is not. Therefore our assumption that the
-language is regular is false.
+By the pumping lemma this should be in the language but it is not.
+Therefore our assumption that the language is regular is false.
![Min DFA](media/CSTHEORY/PumpingLemmaExample.svg)
# Context-free grammars, closure properties for CFLs
-The context-free grammars are a super-set of the regular languages. This means that CFG's can represent
-some non-regular languages and every regular language. Contest-free Languages are defined by Context-Free Grammars and accepted using
-Push-down Automata machines.
+The context-free grammars are a super-set of the regular languages.
+This means that CFG's can represent some non-regular languages and
+every regular language. Contest-free Languages are defined by
+Context-Free Grammars and accepted using Push-down Automata machines.
-Context Free Grammars are Represented using:
+Context Free Grammars are Represented using:
- **Terminals** = Set of symbols in that language
- **Variables** = Set of symbols representing categories
@@ -202,7 +224,7 @@ Context Free Grammars are Represented using:
## Example 1
-Grammar G:
+Grammar G:
$$
A \rightarrow 0A1 \\
@@ -211,7 +233,7 @@ B \rightarrow \# \\
$$
-This grammar describes the following language:
+This grammar describes the following language:
$$
L = \{0^k\#1^k | k \geq 0\}
@@ -219,7 +241,7 @@ $$
## Example 2
-Give CFG for non-Palindromes
+Give CFG for non-Palindromes
$$
S \rightarrow aXb | bXa | aSa | bSb | ab | ba \\
@@ -227,13 +249,14 @@ X \rightarrow aX | bX | a | b \\
$$
-In this example, the S rule recursively applies itself until something that is not a palindrome is added.
-Once you exit the S state, you can finish by appending anything to the middle of the string.
+In this example, the S rule recursively applies itself until something
+that is not a palindrome is added. Once you exit the S state, you can
+finish by appending anything to the middle of the string.
## Example 3
-Give CFG for the following language:
+Give CFG for the following language:
$$
\{a^ib^jc^kd^l | i+k = j + l\}
@@ -248,28 +271,32 @@ $$
## Closure
-CFLs are closed under union, concatenation, and Kleene star.
+CFLs are closed under union, concatenation, and Kleene star.
+
- Union: Create a new starting variable which goes to either branch.
-Kleene Star: We can repeatedly concat the derivations of the string. However, we also need to make sure that epsilon occurs in the string.
- Concatenation: From start variable we force the concatenation of two variables representing each state sub CFG
# Parse trees, ambiguity
-Parse Trees are simply graphical means to illustrate a deviation of a string from a grammar.
-The root of the tree will be the start variable, interior nodes are other variables. Leaf nodes are
-terminal symbols.
+Parse Trees are simply graphical means to illustrate a deviation of a
+string from a grammar. The root of the tree will be the start
+variable, interior nodes are other variables. Leaf nodes are terminal
+symbols.
-A CFG is said to be ambiguous if there is at least one string with two or more distinct derivations.
-Leftmost and rightmost derivations are not ambiguous.
+A CFG is said to be ambiguous if there is at least one string with two
+or more distinct derivations. Leftmost and rightmost derivations are
+not ambiguous.
-To remove ambiguity try to force order or break CFG into cases.
+To remove ambiguity try to force order or break CFG into cases.
# Chomsky Normal Form
-Useful form for CFGs since they allow you to easily identify if a string is in a language.
+Useful form for CFGs since they allow you to easily identify if a
+string is in a language.
-Form:
+Form:
$$
A \rightarrow BC\\
@@ -277,7 +304,7 @@ A \rightarrow a\\
S \rightarrow \epsilon
$$
-Convert CFG to CNF (Chomsky Normal Form).
+Convert CFG to CNF (Chomsky Normal Form).
- Add new start variable
@@ -289,7 +316,7 @@ Convert CFG to CNF (Chomsky Normal Form).
## Example
-Convert the following CFG to a CNF
+Convert the following CFG to a CNF
$$
S \rightarrow ASA | aB\\
@@ -297,7 +324,7 @@ A \rightarrow B | S\\
B \rightarrow b | \epsilon
$$
-Step 1: Add new start variable.
+Step 1: Add new start variable.
$$
S_0 \rightarrow S\\
@@ -306,7 +333,7 @@ A \rightarrow B | S\\
B \rightarrow b | \epsilon
$$
-Step 2: Remove epsilon rules.
+Step 2: Remove epsilon rules.
$$
S_0 \rightarrow S\\
@@ -323,7 +350,7 @@ A \rightarrow B | S\\
B \rightarrow b
$$
-Step 3: Remove unit rules
+Step 3: Remove unit rules
(Remove A -> B)
@@ -354,12 +381,14 @@ $$
# Push-Down automata
-These are NFAs but they also have a stack. This allows us to solve any problem which
-can be represented with a CFG.
+These are NFAs but they also have a stack. This allows us to solve any
+problem which can be represented with a CFG.
-The stack has it's own alphabet. The dollar symbol typically represents the empty stack.
+The stack has it's own alphabet. The dollar symbol typically
+represents the empty stack.
-With each transition you can examine the stack, push to the stack and move to a new state.
+With each transition you can examine the stack, push to the stack and
+move to a new state.
## Example
@@ -373,16 +402,18 @@ $$
# Construction to convert CFG to a PDA
-Basic idea: use stack to hold progressive derivations of a string using rules of grammar.
+Basic idea: use stack to hold progressive derivations of a string
+using rules of grammar.
## Example
-Convert the following CFG to a PDA:
+Convert the following CFG to a PDA:
$$
S \rightarrow aTb | b \\
T \rightarrow Ta | \epsilon
$$
+
![](media/CSTHEORY/PDAConstruction.svg)
diff --git a/blogContent/posts/programming/everything-fibonacci.md b/blogContent/posts/programming/everything-fibonacci.md
index 2ff26eb..1258512 100644
--- a/blogContent/posts/programming/everything-fibonacci.md
+++ b/blogContent/posts/programming/everything-fibonacci.md
@@ -1,19 +1,19 @@
-If you have ever taken a computer science class you probably
-know what the fibonacci sequence is and how to calculate it.
-For those who don't know: [Fibonacci](https://en.wikipedia.org/wiki/Fibonacci)
-is a sequence of numbers starting with 0,1 whose next number is the sum
-of the two previous numbers. After having multiple of my CS classes
-give lectures and homeworks on the Fibonacci sequence; I decided
- to write a blog post going over
-the 4 main ways of calculating the nth term of the Fibonacci sequence.
-In addition to providing the python code for calculating the nth perm of the sequence, a proof for their validity
-and an analysis of their time complexities both mathematically and empirically will
-be examined.
+If you have ever taken a computer science class you probably know what
+the fibonacci sequence is and how to calculate it. For those who don't
+know: [Fibonacci](https://en.wikipedia.org/wiki/Fibonacci) is a
+sequence of numbers starting with 0,1 whose next number is the sum of
+the two previous numbers. After having multiple of my CS classes give
+lectures and homeworks on the Fibonacci sequence; I decided to write
+a blog post going over the 4 main ways of calculating the nth term of
+the Fibonacci sequence. In addition to providing the python code for
+calculating the nth perm of the sequence, a proof for their validity
+and an analysis of their time complexities both mathematically and
+empirically will be examined.
# Slow Recursive Definition
-By the definition of the Fibonacci sequence, it is the most natural to write it as
-a recursive definition.
+By the definition of the Fibonacci sequence, it is the most natural to
+write it as a recursive definition.
```Python
def fib(n):
@@ -24,17 +24,19 @@ def fib(n):
##Time Complexity
-Observing that each call has two recursive calls we can place an upper bound on this
-function as $O(2^n)$. However, if we solve this recurrence we can place a tight bound for time complexity.
+Observing that each call has two recursive calls we can place an upper
+bound on this function as $O(2^n)$. However, if we solve this
+recurrence we can place a tight bound for time complexity.
-We can write a recurrence for the number of times fib is called:
+We can write a recurrence for the number of times fib is called:
$$
F(1) = 1\\
F(n) = F(n-1) + F(n-2)\\
$$
-Next, we replace F(n) with $a^n$ since we want to find rate of exponential growth.
+Next, we replace F(n) with $a^n$ since we want to find rate of
+exponential growth.
$$
a^n = a^{n-1} + a^{n-2}\\
@@ -43,25 +45,28 @@ $$
a = \frac{1 \pm sqrt(5)}{2}\\
$$
-From this calculation we can conclude that F(n) $\in \Theta 1.681^n$. We don't have to worry about
-the negative root since it would not be asymptotically relevant by the definition of $\Theta$.
+From this calculation we can conclude that F(n) $\in \Theta 1.681^n$.
+We don't have to worry about the negative root since it would not be
+asymptotically relevant by the definition of $\Theta$.
## Measured Performance
-Here is a graph of the actual performance that I observed from this recursive definition of Fibonacci.
+Here is a graph of the actual performance that I observed from this
+recursive definition of Fibonacci.
![Recursive Definition](media/fibonacci/RecursiveDefinition.png)
# Accumulation Solution
-The problem with the previous recursive solution is that you had to recalculate certain
-terms of fibonacci a ton of times. A summation variable would help us avoid this problem.
-You could write this solution using a simple loop or dynamic programming
-, however, I chose to use recursion to demonstrate that it's recursion which made the first
-problem slow.
+The problem with the previous recursive solution is that you had to
+recalculate certain terms of fibonacci a ton of times. A summation
+variable would help us avoid this problem. You could write this
+solution using a simple loop or dynamic programming , however, I chose
+to use recursion to demonstrate that it's recursion which made the
+first problem slow.
```Python
@@ -70,23 +75,26 @@ def fibHelper(n, a, b):
return a
elif n == 1:
return b
- return fibHelper(n-1, b, a+b)
-
+ return fibHelper(n-1, b, a+b)
+```
+```python
def fibIterative(n):
return fibHelper(n, 0, 1)
```
-In this code example, fibHelper is a method which accumulates the previous two terms.
-The fibIterative is a wrapper method which sets the two initial terms equal to 0 and 1
-representing the fibonacci sequence. At first it may not be obvious that fibIterative(n)
-is equivalent to fib(n). To demonstrate that these two are in fact equivalent, I broke this
-into two inductive proofs.
+In this code example, fibHelper is a method which accumulates the
+previous two terms. The fibIterative is a wrapper method which sets
+the two initial terms equal to 0 and 1 representing the fibonacci
+sequence. At first it may not be obvious that fibIterative(n) is
+equivalent to fib(n). To demonstrate that these two are in fact
+equivalent, I broke this into two inductive proofs.
## Proof for Fib Helper
+
**Lemma:** For any n $\epsilon$ N if n $>$ 1 then
$fibHelper(n, a, b) = fibHelper(n - 1, a, b) + fibHelper(n - 2, a, b)$.
-
+
**Proof via Induction**
**Base Case**: n = 2:
@@ -99,7 +107,7 @@ $$
**Inductive Step:**
-Assume proposition is true for all n and show n+1 follows.
+Assume proposition is true for all n and show n+1 follows.
$$
RHS=fibHelper(n+1;a,b)\\
@@ -114,7 +122,7 @@ $\Box$
## Proof That fibIterative = Fib
**Lemma:** For any n $\in$ N, $fib(n)$ = $fibIterative(n, 0, 1)$
-
+
**Proof via Strong Induction**
**Base Case**: n = 0:
@@ -131,7 +139,7 @@ $$
**Inductive Step:**
-Assume proposition is true for all n and show n+1 follows.
+Assume proposition is true for all n and show n+1 follows.
$$
fib(n+1) = fib(n) + fib(n-1)\\
@@ -144,9 +152,10 @@ $\Box$
## Time Complexity
-Suppose that we wish to solve for the time complexity in terms of the number of additions needed to be
-computed. Based on fibHelper we can see that it performs one addition every recursive call.
-We can now form a recurrence for time complexity.
+Suppose that we wish to solve for the time complexity in terms of the
+number of additions needed to be computed. Based on fibHelper we can
+see that it performs one addition every recursive call. We can now
+form a recurrence for time complexity.
$$
T(0) = 0\\
@@ -155,12 +164,12 @@ $$
T(n) = n-1\\
$$
-From this recurrence we can say that fibHelper $\in \Theta(n)$.
+From this recurrence we can say that fibHelper $\in \Theta(n)$.
## Measured Performance
-Notice how much faster this solution is compared to the original recursive solution for
-Fibonacci.
+Notice how much faster this solution is compared to the original
+recursive solution for Fibonacci.
![Iterative Performance](media/fibonacci/Iterative.png)
@@ -168,8 +177,9 @@ Fibonacci.
# Matrix Solution
-We can actually get better than linear for performance for Fibonacci while still using
-recursion. However, to do so we need to know this fact:
+We can actually get better than linear for performance for Fibonacci
+while still using recursion. However, to do so we need to know this
+fact:
$$
\begin{bmatrix}
@@ -183,10 +193,12 @@ F_n & F{n-1}
$$
Without any tricks, raising a matrix to a power n times would not get
-us better than linear performance. However, if we use the [Exponentiation by Squaring](https://en.wikipedia.org/wiki/Exponentiation_by_squaring)
-method, we can expect to see logarithmic time. Since two spots in the matrix are always equal,
-I represented the matrix as an array with only three elements to reduce the space and
-computations required.
+us better than linear performance. However, if we use the
+[Exponentiation by
+Squaring](https://en.wikipedia.org/wiki/Exponentiation_by_squaring)
+method, we can expect to see logarithmic time. Since two spots in the
+matrix are always equal, I represented the matrix as an array with
+only three elements to reduce the space and computations required.
```Python
@@ -196,8 +208,9 @@ def multiply(a,b):
product[1] = a[0]*b[1] + a[1]*b[2]
product[2] = a[1]*b[1] + a[2]*b[2]
return product
+```
-
+```python
def power(l, k):
if k == 1:
return l
@@ -206,8 +219,9 @@ def power(l, k):
return multiply(temp, temp)
else:
return multiply(l, multiply(temp, temp))
+```
-
+```python
def fibPower(n):
l = [1,1,0]
return power(l, n)[1]
@@ -216,15 +230,19 @@ def fibPower(n):
## Time Complexity
-For this algorithm, lets solve for the time complexity as the number of additions and multiplications required.
+For this algorithm, lets solve for the time complexity as the number
+of additions and multiplications required.
-Since we are always multiplying two 2x2 matrices, that operation is constant time.
+Since we are always multiplying two 2x2 matrices, that operation is
+constant time.
$$
T_{multiply} = 9
$$
-Solving for the time complexity of fib power is slightly more complicated.
+Solving for the time complexity of fib power is slightly more
+complicated.
+
$$
T_{power}(1) = 0\\
T_{power}(n) = T(\left\lfloor\dfrac{n}{2}\right\rfloor) + T_{multiply}\\
@@ -234,7 +252,8 @@ $$
T_{power}(n) = T(\left\lfloor\dfrac{n}{2^k}\right\rfloor) + 9k\\
$$
-let $k=k_0$ such that $\left\lfloor\dfrac{n}{2^{k_0}}\right\rfloor = 1$
+let $k=k_0$ such that $\left\lfloor\dfrac{n}{2^{k_0}}\right\rfloor =
+1$
$$
\left\lfloor\dfrac{n}{2^{k_0}}\right\rfloor = 1 \rightarrow 1 \leq \frac{n}{2^{k_0}} < 2\\
@@ -246,13 +265,14 @@ $$
T_{fibPower}(n) = T_{power}(n)\\
$$
-Now we can state that $fibPower(n) \in \Theta(log(n))$.
+Now we can state that $fibPower(n) \in \Theta(log(n))$.
## Inductive Proof for Matrix Method
-I would like to now prove that this matrix identity is valid since it is not at first obvious.
+I would like to now prove that this matrix identity is valid since it
+is not at first obvious.
**Lemma:** For any n $\epsilon$ N if n $>$ 0 then
$$
@@ -266,7 +286,7 @@ I would like to now prove that this matrix identity is valid since it is not at
\end{bmatrix}^n
$$
-Let
+Let
$$
A=
@@ -317,26 +337,29 @@ $\Box$
![FibPower Performance](media/fibonacci/FibPower.png)
-As expected by our mathematical calculations, the algorithm appears to be running in
-logarithmic time.
+As expected by our mathematical calculations, the algorithm appears to
+be running in logarithmic time.
## Measured Performance With Large Numbers
![FibPower Performance](media/fibonacci/FibPowerBigPicture.png)
-When calculating the fibonacci term for extremely large numbers despite having a polynomial
-time complexity, the space required to compute each Fibonacci term grows exponentially. Since our
-performance is only pseudo-polynomial we see a degrade in our performance when calculating
-large terms of the fibonacci sequence.
+When calculating the fibonacci term for extremely large numbers
+despite having a polynomial time complexity, the space required to
+compute each Fibonacci term grows exponentially. Since our performance
+is only pseudo-polynomial we see a degrade in our performance when
+calculating large terms of the fibonacci sequence.
-The one amazing thing to point out here is that despite calculating the 10,000 term of Fibonacci,
-this algorithm is nearly 400 times faster than the recursive algorithm when calculating
-the 30th term of Fibonacci.
+The one amazing thing to point out here is that despite calculating
+the 10,000 term of Fibonacci, this algorithm is nearly 400 times
+faster than the recursive algorithm when calculating the 30th term of
+Fibonacci.
# Closed Form Definition
-It is actually possible to calculate Fibonacci in constant time using Binet's Formula.
+It is actually possible to calculate Fibonacci in constant time using
+Binet's Formula.
$$
F_n = \frac{(\frac{1+\sqrt{5}}{2})^n-(\frac{1-\sqrt{5}}{2})^n}{\sqrt{5}}
@@ -351,8 +374,9 @@ def fibClosedFormula(n):
## Derivation of Binet's Formula
-Similar to when we were calculating the time complexity of the basic recursive definition
-, we want to start by finding the two roots of the equation in terms of exponents.
+Similar to when we were calculating the time complexity of the basic
+recursive definition , we want to start by finding the two roots of
+the equation in terms of exponents.
$$
a^n = a^{n-1} + a^{n-2}\\
@@ -362,15 +386,15 @@ $$
a = \frac{1 \pm sqrt(5)}{2}\\
$$
-Since there are two roots to the equation, the solution of $F_n$ is going to be
-a linear combination of the two roots.
+Since there are two roots to the equation, the solution of $F_n$ is
+going to be a linear combination of the two roots.
$$
F_n = c_1(\frac{1 + \sqrt{5}}{2})^n + c_2(\frac{1 - \sqrt{5}}{2})^n
$$
-Fact: $F_1$ = 1
+Fact: $F_1$ = 1
$$
F_1 = 1\\
@@ -378,8 +402,7 @@ $$
= \frac{c_1}{2} + \frac{c_2}{2} + \frac{c_1\sqrt{5}}{2} - \frac{c_2\sqrt{5}}{2}\\
$$
-Let $c_1 = \frac{1}{\sqrt{5}}$,
-Let $c_2 = \frac{-1}{\sqrt{5}}$
+Let $c_1 = \frac{1}{\sqrt{5}}$, Let $c_2 = \frac{-1}{\sqrt{5}}$
$$
F_n = \frac{1}{\sqrt(5)}((\frac{1+\sqrt{5}}{2})^n-(\frac{1-\sqrt{5}}{2})^n)\\
@@ -388,8 +411,9 @@ $$
## Time Complexity
-Since we managed to find the closed form of the fibonacci sequence we can expect to see constant performance.
+Since we managed to find the closed form of the fibonacci sequence we
+can expect to see constant performance.
## Measured Performance
-![FibPower Performance](media/fibonacci/ConstantTimeComplexity.png)
\ No newline at end of file
+![FibPower Performance](media/fibonacci/ConstantTimeComplexity.png)