This is the work I have completed on my own because I took a personal interest in the project.
Dark Nightmode For Google Chrome (theme)
One day I decided I wanted to try something I had never done before; I wanted to get a project I have made onto some web store. I figured I would try to make a Google Chrome theme since that seems pretty niche. The most interesting part of this project was that I learned Google Chrome themes are almost entirely JSON objects. I had worked with JSON before in my Reddit to Twitter project from Computer Science 2 so I felt right at home and was able to pick up how to create this theme fairly quickly. It was a lot of testing after you made changes to make sure everything looked correct. The part that took the longest was getting the Google logo in the new tab frequently visited websites to show up in color (it was otherwise entirely white); I had to lookup some documentation on how to do that since it was fairly obscure. Overall, I would say this project was a success since the theme currently has over 1000 users with some positive reviews on the Chrome Webstore.
Here is the theme if you would like to take a look.
Weather Twitter Bot
This was not my first Twitter bot, however, it was the first one I had made without building off of another application. The bot is made in Python. When the Python program is ran, it gets the latest weather conditions for a certain zip code, and then tweets it from the specific Twitter account. I have the script running on a Raspberry Pi using Cron every 30 minutes. I also have published the source code for this bot on my GitHub
One Small Tool Per Day
I wasn't particularly motivated to do anything personal for quite a bit, but I wanted to challenge myself to develop one small tool each day, for a week, on this website. You can find these tools in the tools section of the website. While these projects mostly took less than an hour to develop, it was interesting to see what problems you can run into in such a small project. Overall, I enjoyed this challenge and may do it in a different form later. It was a great feeling knowing that you accomplished something (however small) daily.
This was the project that kicked off the whole one tool per day challenge. I was in my networking class and we were dealing with IP subnet masking and it required being able to convert from an IP Address to a Binary IP Address. We had an assignment where we had to do a bunch of conversions and I decided it would be easier to code a solution to converting IP Addresses to Binary IP Addresses and vice versa. Since I was already making a small tool, it gave me inspiration to create one tool per day. On this project the main issue I ran into was creating the regular expressions to determine if the IP address or Binary IP address was valid. I had already learned a little bit about regex, so the Binary IP was quite easy to create an expression for; however, the IP address was quite a bit harder. The actual conversion calculation in code was quite easy as there were some built in functions.
My next project in the One Small Tool Per Day series is a simple word reverser. You type a word in the input, type reverse, and the bottom textbox gets the reversed input. This was really simple to code, in fact, I was able to do it in one line of code. The only issue I ran into was preventing HTML Injection/XSS. I used built in libraries to encode the input to HTML entities, and then decoded it to unicode in the bottom textbox.
I had done a palindrome detector once before in Java, so I figured an anagram detector would be simple enough. The one difference was that I wanted to make sure the anagram detector ignored whitespace and punctuation because some anagrams read better with whitespace and punctuation. The first approach I took was not efficient, I took the chars of each word and placed them into their own list, removing them one by one if a match was found inside of a loop. This worked, but I thought of an easier way after I was finished. My second attempt I took the characters of each string and output them to a new string except in alphabetical order. That means that if the two alphabetized strings were exactly the same, then the two phrases were an anagram. I next used a function to strip punctuation and whitespace from these alphabetized strings. Finally, I used a simple if statement comparing the strings to see if they matched. While I spent quite a bit of time on my first iteration, I was rather proud of my second iteration as it was much more efficient.
I thought this was going to be a relatively easy problem, and it was, but it had an interesting solution. To begin, there are two oddities. Any number less than two is automatically not prime and the number two is the only even number that is prime. Otherwise, any other prime number can only have two divisors. I first created a variable to keep track of how many divisors a number had and then started a for loop to start at one and run until it hits the number. If the number mod the increment was zero, then I incremented the divisors. I then checked if the number of divisors was greater than two, and if so, it was not a prime number. This was a fairly simple tool, but I think I have enjoyed working on this one the most so far.
The goal of the project is to pick a random object out of a list of objects. I thought this was going to be a lot harder than it ended up being pretty easy. The part I thought would be hard was using the new line character as a delimiter, but as it turns out, the C# StringReader has this built in. I originally used String.Split on newline, but for some reason that was adding in new lines between lines. Overall, this took about 15 minutes to finish.
This tool is a little different from the others in that it does not require any user input. My goal was to gather as much information about the current user of the website as possible and display it to the user. Some information is shown/hidden depending on if it actually exists, for example, if you are on a mobile device, the website will also show your device manufacturer/model. I chose to only display information that I thought would be interesting to a user, but I had the option to delve deep into HTTP packets for information. Since I now know how to see what a user is running on my website, I may be able to tweak the pages to best fit their current browser; such as having a mobile master page for navigation. Overall, I think this project has given me more knowledge than I began with, so I believe it has been a success (even though it was written in 30 minutes).
I chose to do another tool which is quite a bit different than the other ones I have made. This tool takes in a username and produces a table with that user's high scores on Oldschool Runescape. An interface is provided to look up high scores and it returns a list of numbers
on a HTML page that you can parse through. At original glance, you would think you should split the returned string on the comma character, but there are actually newline characters in the string that are hard to detect. Then I created a function which takes in the split string (on the newline character) and produces table rows. This project was fairly straight forward, but it took the longest due to learning how the provided data was structured.