About me

My name is Daniel Curda. This page is a selection of web projects I've put together. Take a look around.

I originally started out as a chemist professionally, but worked my way into the I.T. sphere via a LIMS (Laboratory Information Management System). The system I used has a scripting language built into it that can be used to provide customized solutions, but it also provides out of the box templates that can be used. The data (laboratory data as well as configuration) is stored in a relational database. I've spent the last 12ish years working in that realm and am now trying to get into some aspect of web development.

These projects use html, css, php, and javascript (predominantly vanilla, but I have used JQuery for a few things). In my previous work, I queried databases (both oracle and sql server) quite extensively and am quite comfortable doing so. I have used a connection to a database in the Recipe and FRS/URS projects.

Somewhat by design, but mostly by blind stumbling, these projects each build on each other in complexity. I can't say that any of these are "done", but I generally took them as far as I could and then moved onto something else. In this process, I'd sometimes figure out how to resolve some of the previous roadblocks and I'd go back and tackle those.

This portfolio is very much a work in progress.

You can also check out my git: Adruc-robot

Please feel free to contact me at dgcurda@gmail.com.

Recipes

After being frustrated with all of the recipe sites that consist of the author's thoughts on why the recipe is personally important to her or what his child did today, I decided to put together a site that would STRICTLY be a recipe site. This is also the first project I started with.

The recipes are stored in a database. I set up tables to contain the recipe name, the recipe steps, and recipe ingredients. There is also a stock table of ingredients to force some sort of consistency between the recipes. I use MySQL Workbench to maintain the database. WampServer allows me to emulate a webserver on my local machine. The actual page is driven by PHP.

I used an excel spreadsheet to help formulate the SQL insert statements to get the recipes into the database. Needless to say, adding recipes was pretty tedious.

  1. PHP
    1. PDO
    2. Prepared Statements
  2. MySQL Database
  3. JQuery
  4. CSS
  1. Add more searching/filtering capabilities
    1. Filter by "tag" such as "vegetarian" or "vegan"
    2. Filter by ingredient list (a way to recommend a recipe based on available ingredients)
    3. Capability to "tag" recipes
  2. Generate shopping list
  3. Force special characters to display correctly ("jalapeño" doesn't display correctly)
  1. No previous exposure to PHP
    1. PHP syntax
    2. PDO
  2. No previous exposure to CSS
  3. Limited Javascript exposure
Recipes (click me)
Snake

"Snake" is an attempt at an idea I had from college. A large portion of organic chemistry is dedicated to naming organic molecules. To practice, I would make flash cards with the molecule drawn on the front and the name on the back. This was EXTREMELY time consuming and really only trained me on recognizing molecules and not necessarily learning the rules that govern the naming convention.

The idea is to have a program that creates the flash cards rather than a person. Back then I had no clue how to tackle the problem (let alone finding a program that would visually represent a molecule). At one point, I dabbled quite a bit with Flash and gave this idea a go, but didn't get very far.

I picked it up again when I started to work on my website and found that some portions could be implemented somewhat easily. Apparently, grid is a decent stand-in for a coordinate system (see the Guitar Chords project).

The project in its current state generates a molecule that consists of single-bonded carbons based on a numeric input (the numeric input translates to the number of C's displayed - provided the molecule does not collide with itself). The larger the molecule, the more likely the molecule will have a collision. Basically, the molecule is like the snake from the snake game - it will grow as long as possible before it collides with itself or it reaches the number of carbons in the input box.

The portion implemented is not even close to a finished product. It's been many years since I took organic chemistry, but I might have implemented the first 2 classes of the semester.

  1. Vanilla Javascript
  2. CSS
  1. Implement naming rules for the molecules
  2. Add the ability to add generate different types of molecules (alcohols, for example)
  1. Originally, I started by creating distinct grid-column and grid-row classes for the x and y coordinates, but this relies on having those classes pre-made*. Additionally, the output wasn't centered.
    *There is probably a way around this (such as in-line styles)
  2. My code picks a direction and increments/decrements the grid-area accordingly. This approach is fine outside of a couple of instances:
    1. 0 does not work in grid-area. As much as I wanted it to, that's just not the way it works.
    2. grid-area 1/1/1/1, -1/-1/-1/-1, -1/1/-1/1, and 1/-1/1/-1 are all the same row/column. This also translates to 0,0 if you think about it in terms of an X,Y coordinate system.
    3. 1/2/1/2 and -1/2/-1/2 are the same row/column.
  3. Collision detection
    1. querySelector is your friend. Did you know you can search for specific inline styles? Did you know that I couldn't figure out the right questions to ask the internet to arrive at this conclusion? So, I just kept trying different things until I found something that worked: "[style*='grid-area: "+gridArea+"']" where gridArea is a generated string.
    2. The collision code needed to control for "1" in any portion of the grid-area.
    3. It also needed to be able to determine when there were no more choices that wouldn't result in a collision.
Snake (click me)
Lapse

Lapse is a project I put together using a couple of raspberry pi zero's and a desktop PC. One pi took a picture every 15 minutes from my living room window, the other pi processed the pictures to more manageable sizes, moved them to a shared folder, and the PC synced the shared folder to my website. The webpage originally showed the current month's days (up to the current day) and a single picture from each day. Clicking a day shows a time lapse (the pictures shown for a fraction of time in sequence from just after midnight to just before midnight). Clicking on the green triangle at the end of the week displays the time lapse for the week.

I used JQuery for this and I suspect it's because I was able to find an example online that was a rough approximation of what I was trying to do: load a random picture from a days worth of pictures for each day in the month at roughly the same time (achieved via AJAX).

This project also taught me a valuable lesson about documenting my own home projects (I definitely didn't record why I used JQuery). I did a PC upgrade and realized a few months later that my pictures weren't getting uploaded. I had forgotten the bit about using the PC to sync the picture contents to my website and completely forgot how to set that bit up again. So, I have roughly 8 months of pictures and that's it.

I always thought the idea of having a website that changes almost every time its visited without having to perform manual updates was really cool. This project really allowed me to do that. Even the calendar is generated when the page loads. Well, that's technically not true any more since I've capped it from January 2020 to August 2020. But every new real life day would add a new day to the calendar. A new month would do the same. Additionally, each day that has at least 2 pictures will show a random picture on every load (or refresh).

  1. JQuery
  2. CSS
  1. Update the display for small screens so the display is not the mess it currently is - looking at this on a phone is very painful
  2. End AJAX requests for pictures that are no longer relevant. The queued AJAX requests will continue even if there is no way for a user to see the downloaded pictures. For example, if a request is not completed and the user navigates to a new month, the existing AJAX requests will continue.
  3. Perform testing on more browsers.
  4. Address the display of the time lapse in firefox (there's a white flash between the pictures loading)
  1. Linux. I won't list out the myriad of challenges Linux presents to someone that has never really used a command line interface because there are a lot of them.
  2. Understanding the nuances of the javascript date object. I believe January is 0 and December is 11. Looking back at the code, I'm pretty sure I still don't understand the date object.
  3. I clearly blocked any AJAX problems from my mind because I don't even remember using it.
  4. Testing on different browsers
    1. Apparently Chrome more lenient on initializing a date object in javascript
    2. The time lapse display differs drastically between Chrome and Firefox - at this point, look at it in Chrome for the optimal experience
  5. CORS issues in certain instances - I think I addressed this by updating .htaccess, but if pictures don't load, holler at me!
Open Lapse (click me)
Guitar Chords

After tinkering around with grid layouts for a bit, it seemed like grid could be used to represent the neck of a guitar. I'm not sure if this is ultimately a good idea, but here it is.

I use an excel spreadsheet to do the html formatting for me.

excel chord helper

In trying to explain what I have implemented, it seems extremely convoluted. Using a table format probably would have been easier to implement and I don't know that grid offers a much larger advantage.

  1. CSS
  1. Make the display actually look like a guitar neck.
  2. Add filtering based on chord
  1. Barre chords - I tried a few different approaches and found this implementation to be a good compromise between what I envisioned and what I could actually achieve. Meaning, I couldn't quite get what I pictured in my mind and found this would convey the idea appropriately.
  2. The chord structures are grid displays, but they are inside a flex container. Since chords can vary in how many frets are used, I ultimately had to standardize how many frets are displayed (6) to force a standard display across all chords. I'm sure there is a way to finagle the display to achieve what's in my head, but like the barre chords, I found something I'm comfortable with.
  3. Setting up the excel sheet properly was quite a chore, but it has made formatting the HTML much easier.
Guitar Chords (click me)
Recipe Maintenance

My vision for the recipe portion of my website has always included a way to add recipes from a webpage. This process would include data validation and pull from data already in the database (from a list of ingredients for example). However, when I put the recipe page together, I lacked the knowledge to accomplish this task.

After tackling other problems, my skills got to a point where I could give it a go and this is the result.

It's not very elegant, but it works.

  1. PHP
    1. PDO
    2. Prepared Statements
  2. MySQL Database
  3. JQuery
  4. CSS
  1. User login - right now, anybody can add recipes and this is not ideal.
  2. Bad word filters (until this is in place, I have recipe creation pointed to a shadow database to prevent naughty words from showing up on the recipe page)
  3. Add error checking to ensure recipes are build in the correct order (recipe name entered before ingredients, for example)
  4. A way to update:
    1. Recipe names
    2. Recipe Ingredients
    3. Recipe Steps
    4. Ingredients
    5. Units
  1. Coming up with an interface that is somewhat intuitive and I had the technical capabilities to put together. When I first started attempting this, I was very focused on what could be done with javascript to display fields to input data and completely ignored the portion that actually wrote to the database. Once I started to dig into that side of the problem, I realized I needed to rethink my approach
  2. Authoring a general PHP function that would allow me to reuse the code for any insert statement. I could have just managed them as a separate function for each table, but that didn't seem right.
Recipe Maintenance (click me)
Recipes on Rails

Apparently Ruby on Rails has been around 20 years, so I'm 20 years late to the party. I dug into it because I saw some job postings looking for people with experience using it and immediately felt so so old.

That said, I was able to implement an actual functioning login system in a couple of hours where the one I built from scratch doesn't really function very well and it took me about a month to implement.

Having a login system takes care of` my concerns about people creating recipes with bad words in them by restricting created recipes to the user. I was also able to put together a much better recipe creation method.

  1. Ruby on Rails
    1. Ruby version 3.0.3
    2. Rails version 7.0.2.2
  2. Postgres
  3. JQuery
  4. CSS
  5. Git
  6. Heroku Hosting
  7. Heroku CLI
  1. Rendering views in modals
  2. A creation process that is actually intuitive. I'm clearly not there based on the limited feedback I've gotten. Rendering views in modals will certainly help.
  3. Either hosting it on my web host or setting up a subdomain. Both of these require a new host.
  1. Working around the $(document).ready JQuery function. Since the document is only loaded once, anything set up using that (or the vanilla javascript equivalent) is lost when navigating within the site. I'm not sure what the proper way (the Rails Way) of doing this is, but it works. I put in a controller to manage the main page's javascript, but everything else is kept together with bailing wire.
  2. Wrapping my head around the way databases are implemented. I mean, it's not terribly different, but I'm used to working in SSMS or MySQL Workbench. And the equivalent of a migration is more straight-forward (in my opinion).
  3. Querying. I started out by making it more complicated than necessary. Then I struggled with more "complex" things (left outer joins where the bit on the right is null, for example) that are very simple in regular old SQL.
  4. Knowing what kinds of questions to ask the internet when I hit a roadblock. I'm 100% certain I'm not the only person hitting these snags, but I'm just not asking the correct question.
  5. Rails 7 is relatively new
    1. Importmaps are really cool, but I couldn't find much guidance on actually having the assets I brought in via the importmap available for use downstream (JQuery, for example), but I couldn't seem to find anything that would help me bridge that gap. However, I found lots of stuff about previous versions using webpacker.
    2. Many gems either don't work in version 7 or require a new installation process to work. Whatever the case, documentation is sparse.
    3. I found a few guides specific for version 7 that I was unable to get to work.
Recipes on Rails (click me)
Satisfactory

"Satisfactory is a first-person open-world factory building game with a dash of exploration and combat." At least according to the website. It's a game where you make things that opens up new things to make so you can make them and open up new things to make

After running across the map multiple times only to find out I didn't bring enough resources with me, I thought "gee, it sure would be nice if there was a tool to help me remember what I needed" and decided to jump right in and make one (instead of looking on the internet to see if one already existed). Before those of you that play the game get fired up about the To Do List that already exists in game, that tool only seems to work for buildings.

I poked around the game files to see if icons lived in a convenient folder, but I was not lucky. I did, however, find a massive JSON document that held all the information I needed (even paths to icons within the game).

After exploring the JSON doc and a lot of banging my head against the wall, I come up with an approach and started taking screenshots of in game items. I quickly realized that was dumb. I asked the internet "extract satisfactory game icons" and found a tutorial that explained everything I needed to do.

  1. HTML
  2. CSS
  3. Javascript
  4. Ue Viewer
  1. Ability to add/remove items to/from the To Do List by entering an integer. Clicking the plus sign 500 times is no fun.
  2. Ability to add/remove tier requirements to the To Do List with a single click.
  3. A more expansive view of needed materials. For example, a way to see how many of more basic materials (iron ingots, for example) are needed.
  4. Ability to switch between game versions (currently it's set to the "experimental" version).
  5. A way to make icon extraction more streamlined. Right now, I have to delete extraneous files from the extraction and that is very painful.
  6. Streamline the code. I have been avoiding rebuilding portions, but it needs to be done. I also have a nagging suspicion there are easier ways to achieve what I'm doing.
  1. JSON
    1. Iterating over JSON. This is independent of the actual file contents - it's just understanding how to do it using Javascript.
    2. Understanding the structure of the of the game's JSON file (Docs.json - it's a little over 2MB). I feel very confident that I still don't really understand how it's done, but I have gotten consistent results over the last two version upgrades.
  2. Async Await - I've previously used AJAX to achieve the same thing (see the LAPSE project). Async Await is much more streamlined, but it definitely took me a while to wrap my head around it.
Satisfactory (click me)