- SEPTASTIC is a website and (a soon to be) mobile app. Its purpose is to provide
- information about how to ride SEPTA (and connecting transit authorities) in a
- quick and information-rich manner.
-
-
-
- This website is not run by SEPTA. As such, schedules may not be
- completely accurate.
-
-
-Click on a route to see details and a schedule. Schedules in prevailing local time.
-
-
-}
diff --git a/out/april-fools-images/amtrak.png b/out/april-fools-images/amtrak.png
new file mode 100644
index 0000000..d81cb50
Binary files /dev/null and b/out/april-fools-images/amtrak.png differ
diff --git a/out/april-fools-images/nypd.png b/out/april-fools-images/nypd.png
new file mode 100644
index 0000000..bb6a9c4
Binary files /dev/null and b/out/april-fools-images/nypd.png differ
diff --git a/out/april-fools-images/septa.png b/out/april-fools-images/septa.png
new file mode 100644
index 0000000..dfb4856
Binary files /dev/null and b/out/april-fools-images/septa.png differ
diff --git a/out/april-fools-images/uspis.png b/out/april-fools-images/uspis.png
new file mode 100644
index 0000000..36d24ee
Binary files /dev/null and b/out/april-fools-images/uspis.png differ
diff --git a/out/april-fools.html b/out/april-fools.html
new file mode 100644
index 0000000..edf8f70
--- /dev/null
+++ b/out/april-fools.html
@@ -0,0 +1,25 @@
+
+
+
+
+
+ THIS WEBSITE HAS BEEN SEIZED
+
+ This domain name has been seized by the Southeastern Pennsylvania Transportation Authority (SEPTA)
+ Police Department pursuant to a seizure warrant issued by the United States Supreme Court
+ under the authority of 18 U.S.C. § 918 and 2323.
+
+
+
+ (April fools! Continue to my website)
+
+
+
+
+
+
diff --git a/out/blog-images/NWS_SSL_Diagram.png b/out/blog-images/NWS_SSL_Diagram.png
new file mode 100644
index 0000000..3f47241
Binary files /dev/null and b/out/blog-images/NWS_SSL_Diagram.png differ
diff --git a/out/blog-images/NickVIM_Screenshot.png b/out/blog-images/NickVIM_Screenshot.png
new file mode 100644
index 0000000..9bc2038
Binary files /dev/null and b/out/blog-images/NickVIM_Screenshot.png differ
diff --git a/out/blog-images/example-blog-content.png b/out/blog-images/example-blog-content.png
new file mode 100644
index 0000000..16c61e8
Binary files /dev/null and b/out/blog-images/example-blog-content.png differ
diff --git a/out/blog-images/example-blog-list.png b/out/blog-images/example-blog-list.png
new file mode 100644
index 0000000..be1caa1
Binary files /dev/null and b/out/blog-images/example-blog-list.png differ
diff --git a/out/blog-images/fpga-tetris.mp4 b/out/blog-images/fpga-tetris.mp4
new file mode 100644
index 0000000..3ab2a9c
Binary files /dev/null and b/out/blog-images/fpga-tetris.mp4 differ
diff --git a/out/blog-images/gameboy-boot.mp4 b/out/blog-images/gameboy-boot.mp4
new file mode 100644
index 0000000..7dcdbe9
Binary files /dev/null and b/out/blog-images/gameboy-boot.mp4 differ
diff --git a/out/blog-images/the-bomb-graphical.jpg b/out/blog-images/the-bomb-graphical.jpg
new file mode 100644
index 0000000..0013078
Binary files /dev/null and b/out/blog-images/the-bomb-graphical.jpg differ
diff --git a/out/blog-images/the-bomb-text.png b/out/blog-images/the-bomb-text.png
new file mode 100644
index 0000000..02f6972
Binary files /dev/null and b/out/blog-images/the-bomb-text.png differ
diff --git a/out/blog.html b/out/blog.html
new file mode 100644
index 0000000..de33255
--- /dev/null
+++ b/out/blog.html
@@ -0,0 +1,37 @@
+
+ Nicholas Orlowsky
+
+
+
+
+
+
+
+
Blog
+
A collection of my thoughts, some of them may be interesting
+
[ FPGA Fun (CHIP-8 in hardware) ] - April 20th, 2024
+
[ NWS Postmortem 11/08/23 ] - November 16th, 2023
+
[ Side Project Log 10/20/23 ] - October 20th, 2023
+
[ Side Project Log 8/15/23 ] - August 15th, 2023
+
[ Side Project Log 8/08/23 ] - August 8th, 2023
+
[ Side Project Log 7/12/23 ] - July 12th, 2023
+
[ Side Project Log 4/29/23 ] - April 29th, 2023
+
[ Side Project Log 3/27/23 ] - March 27th, 2023
+
[ Side Project Log 3/20/23 ] - March 20th, 2023
+
[ Spring Break 2023 ] - January 20th, 2023
+
[ Doing C assignments in C# ] - March 18th, 2022
+
+
+
+
diff --git a/out/blogs/doing-c-assignments-in-csharp.html b/out/blogs/doing-c-assignments-in-csharp.html
new file mode 100644
index 0000000..732e40a
--- /dev/null
+++ b/out/blogs/doing-c-assignments-in-csharp.html
@@ -0,0 +1,79 @@
+
+ Nicholas Orlowsky
+
+
+
+
+
+
+ Doing C assignments in C#
+Thanks to Arpan Dhatt for doing most of the work on this (his blog here: https://arpan.one/posts/messing-with-gradescope/)
+At the end, he made this comment:
+
+And so, that's the end of this post. To whom it may concern, don't try doing your C assignment in C# (you know who you are).
+
+The reason for this comment (besides the fact that I talk about C# a lot) is due to the fact that C# requires a runtime to be installed for it to work. This is because C# does not compile to native bytecode but rather compiles to an intermediary language (dubbed CIL by Microsoft) and is then translated 'Just In Time' by the runtime.
+This makes running assignments in a docker container where the runtime is not already installed considerably hard. One option we have is that we could just include the runtime in our submission. Sounds easy, right? Well it would be non-trivial to do but due to the fact that the .NET runtime is very large, I wouldn't consider this a good idea (Not to mention it's super boring).
+The better solution is to use .NET's (experimental) AOT compilation feature (formerly called CoreRT). C# has had a number of attempts at an AOT compiler such as :
+
+- AOT by Mono
+- LLD2CPP built by Unity
+- Ready2Run by Microsoft
+
+We'll be using the official Ready2Run AOT compilation built by Microsoft. In order to use it, all you have to do is add the following to your nuget.config
:
+<add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
+
+and then install the package: Microsoft.DotNet.ILCompiler
. After doing that if you run the command: dotnet publish -r [Runtime] -c [Config]
and after waiting a considerable amount of time, you'll have a full-fledged C# application compiled directly to your target runtime's bytecode!
+Compiling my simple Hello, Wold test to linux-x64 (dotnet publish -r linux-x64 -c Release
) and adding it to my project files should let me run it using the same method Arpan used in his blog.
+After doing that, we can follow the instructions followed by Arpan and viola! C# runs on Gradescope!
+I don't recommend this but it was fun to do and I needed stuff to write in a blog.
+Other Interesting (Low Level) C#/.NET Features
+C# actually has many lower level features people don't expect it to have. Some of these include pointers and direct memory management. Pointers can be enabled by encasing your code in an unsafe code block.
+Example (Written by Microsoft)
+
+
+int[] a = new int[5] { 10, 20, 30, 40, 50 };
+
+unsafe
+{
+
+ fixed (int* p = &a[0])
+ {
+
+ int* p2 = p;
+ Console.WriteLine(*p2);
+
+ p2 += 1;
+ Console.WriteLine(*p2);
+ p2 += 1;
+ Console.WriteLine(*p2);
+ Console.WriteLine("--------");
+ Console.WriteLine(*p);
+
+ *p += 1;
+ Console.WriteLine(*p);
+ *p += 1;
+ Console.WriteLine(*p);
+ }
+}
+
+In .NET 6, the NativeMemory
class was introduced which you can read about here. It allows for malloc-like memory allocation and freeing which can be important for high-performance workloads.
+
+
+
+
+
+
+
+
diff --git a/out/blogs/nws-postmortem-11-8-23.html b/out/blogs/nws-postmortem-11-8-23.html
new file mode 100644
index 0000000..6ba6492
--- /dev/null
+++ b/out/blogs/nws-postmortem-11-8-23.html
@@ -0,0 +1,111 @@
+
+ Nicholas Orlowsky
+
+
+
+
+
+
+ NWS Incident Postmortem 11/08/2023
+
+
+ On November 8th, 2023 at approximately 09:47 UTC, NWS suffered
+ a complete outage. This outage resulted in the downtime of all
+ services hosted on NWS and the downtime of the NWS Management
+ Engine and the NWS dashboard.
+
+
+
+ The incident lasted 38 minutes after which it was automatically
+ resolved and all services were restored. This is NWS' first
+ outage event of 2023.
+
+
+Cause
+
+ NWS utilizes several tactics to ensure uptime. A component of
+ this is load balancing and failover. This service is currently
+ provided by Cloudflare at the DNS level. Cloudflare sends
+ health check requests to NWS servers at specified intervals. If
+ it detects that one of the servers is down, it will remove the
+ A record from entry.nws.nickorlow.com for that server (this domain
+ is where all services on NWS direct their traffic via a
+ CNAME).
+
+
+
+ At around 09:47 UTC, Cloudflare detected that our servers in
+ Texas (Austin and Hill Country) were down. It did not detect an
+ error, but rather an HTTP timeout. This is an indication that the
+ server may have lost network connectivity. When Cloudflare detected that the
+ servers were down, it removed their A records from the
+ entry.nws.nickorlow.com domain. Since NWS Pennsylvania servers
+ have been undergoing maintenance since August 2023, this left no
+ servers able to serve requests routed to entry.nws.nickorlow.com,
+ resulting in the outage.
+
+
+
+ NWS utilizes UptimeRobot for monitoring the uptime statistics of
+ services on NWS and NWS servers. This is the source of the
+ statistics shown on the NWS status page.
+
+
+
+ UptimeRobot did not detect either of the Texas NWS servers as being
+ offline for the duration of the outage. This is odd, as UptimeRobot
+ and Cloudflare did not agree on the status of NWS servers. Logs
+ on NWS servers showed that requests from UptimeRobot were being
+ served while no requests from Cloudflare were shown in the logs.
+
+
+
+ No firewall rules existed that could have blocked the healthcheck traffic from Cloudflare
+ for either of the NWS servers. There was no other configuration
+ found that would have blocked these requests. As these servers
+ are on different networks inside different buildings in different
+ parts of Texas, their networking equipment is entirely separate.
+ This rules out any failure of networking equipment owned
+ by NWS. This leads us to believe that the issue may have been
+ caused due to an internet traffic anomaly, although we are currently
+ unable to confirm that this is the cause of the issue.
+
+
+
+ This is being actively investigated to find a more concrete root
+ cause. This postmortem will be updated if any new information is
+ found.
+
+
+
+ A similar event occurred on November 12th, 2023 lasting for 2 seconds.
+
+
+Fix
+
+ The common factor between both of these servers is that they both use
+ Spectrum for their ISP and that they are located near Austin, Texas.
+ The Pennsylvania server maintenance will be expedited so that we have
+ servers online that operate with no commonalities.
+
+
+
+ NWS will also investigate other methods of failover and load
+ balancing.
+
+
+Last updated on November 16th, 2023
+
+
+
diff --git a/out/blogs/side-project-10-20-23.html b/out/blogs/side-project-10-20-23.html
new file mode 100644
index 0000000..e9d7832
--- /dev/null
+++ b/out/blogs/side-project-10-20-23.html
@@ -0,0 +1,121 @@
+
+ Nicholas Orlowsky
+
+
+
+
+
+
+ Side Project Log 10/20/2023
+This side project log covers work done from 8/15/2023 - 10/20/2023
+
+Anthracite
+[ GitHub Repo ]
+
+ Anthracite is a web server written in C++. The site you're reading this on
+ right now is hosted on Anthracite. I wrote it to deepen my knowledge of C++ and networking protocols. My
+ main focus of Anthracite is performance. While developing anthracite,
+ I have been exploring different optimization techniques and benchmarking
+ Anthracite against popular web servers such as NGINX and Apache.
+ Anthracite supports HTTP/1.1 and only supports GET requests to request
+ files stored on a server.
+
+
+
+ Anthracite currently performs on par with NGINX and Apache when making
+ 1000 requests for a 50MB file using 100 threads in a Docker container.
+ To achieve this performance, I used memory profilers to find
+ out what caused large or repeated memory copies to occur. I then updated
+ those sections of code to remove or minimize these copies. I also
+ made it so that Anthracite caches all files it can serve in memory. This
+ avoids unnecessary and costly disk reads. The implementation of this is
+ subpar, as it requires that the server be restarted whenever the files
+ it is serving are changed for the updates to be detected by Anthracite.
+
+
+
+ I intend to make further performance improvements, specifically in the request
+ parser. I also plan to implement HTTP/2.0.
+
+
+Yet Another Chip Eight Emulator (yacemu)
+[ GitHub Repo ]
+
+ YACEMU is an interpreter for the CHIP-8 instruction set written in C. My main
+ goal when writing it was to gain more insight into how emulation works. I had
+ previous experience with this from when I worked on an emulator for a slimmed-down
+ version of X86 called Y86.
+ So far, I've been able to get most instructions working. I need to work on adding
+ input support so that users can interact with programs running in yacemu. It has
+ been fairly uncomplicated and easy to write thus far. After I complete it, I would
+ like to work on an emulator for a real device such as the GameBoy (This might be
+ biting off more than I can chew).
+
+
+Nick VIM
+
+ Over the summer while I was interning, I began using VIM as my primary
+ text editor. I used a preconfigured version of it (NvChad) to save time, as
+ setting everything up can take a while. After using it for a few months, I began
+ making my own configuration for VIM, taking what I liked from NvChad and leaving
+ behind the parts that I didn't like as much.
+
+
+
+
+
+ One important part of Nick VIM was ensuring that it was portable between different
+ machines. I wanted the machine to have as few dependencies as possible so that I
+ could get NickVIM set up on any computer in a couple of minutes. This will be especially
+ useful when working on my School's lab machines and when switching to new computers
+ in the future. I achieved this by dockerizing Nick VIM. This is based on what one of
+ my co-workers does with their VIM setup. The Docker container contains
+ all the dependencies for each language server. Whenever you edit a file with Nick Vim,
+ the following script runs:
+
+
+
+echo Starting container...
+cur_dir=`pwd`
+container_name=${cur_dir////$'_'}
+container_name="${container_name:1}_$RANDOM"
+docker run --name $container_name --network host -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix --mount type=bind,source="$(pwd)",target=/work -d nick-vim &> /dev/null
+
+echo Execing into container...
+docker exec -w /work -it $container_name bash
+
+echo Stopping container in background...
+docker stop $container_name &> /dev/null &
+
+
+
+ This code creates a new container, forwards the host's clipboard to the container, and
+ mounts the current directory inside the container for editing.
+
+
+Secane
+[ Video Demo ]
+
+ Secane was a simple ChatGPT wrapper that I wrote to practice for the behavioral part of
+ job interviews. It takes your resume, information about the company, and information about
+ the role you're interviewing for. It also integrates with OpenAI's whisper, allowing you
+ to simulate talking out your answers. I made it with Next.JS.
+
+
+
+These projects had minimal/no work done on them: NWS, RingGold, SQUIRREL
+These projects I will no longer be working on: Olney
+
+
+
diff --git a/out/blogs/side-project-3-20-23.html b/out/blogs/side-project-3-20-23.html
new file mode 100644
index 0000000..9427c60
--- /dev/null
+++ b/out/blogs/side-project-3-20-23.html
@@ -0,0 +1,39 @@
+
+ Nicholas Orlowsky
+
+
+
+
+
+
+ Side Project Log 3/20/2023
+Spring break just wrapped up. I wrote a blog last week about the side projects that I was planning on
+doing. I wanted to provide an update on what I got done, and figured I'd turn it into a recurring thing.
+This side project log covers work done from 3/13/2023 - 3/20/2023
+
+I managed to move my website over to tab-based navigation pretty early on in the break. It just involved setting
+up a navbar component and then using react-navigation to navigate between pages. I also managed to
+update my projects page to be more compact and readable.
+There is still work to be done on making it look better, but I mostly believe that
+it's just going to be somewhat minor tweaks.
+
+I managed to finish this one. I learned a lot about Rust and I've gained an appreciation for
+Rust's enforcement of good programming habits, and I really like how error handling is done.
+Working with Serenity was pretty easy as it mirrored some of the other Discord SDKs I've used
+before.
+
+The below projects had minimal/no work done on them: RingGold, NWS Container Deployment Service, and VerifiedBot
+
+
+
diff --git a/out/blogs/side-project-3-27-23.html b/out/blogs/side-project-3-27-23.html
new file mode 100644
index 0000000..d783af2
--- /dev/null
+++ b/out/blogs/side-project-3-27-23.html
@@ -0,0 +1,39 @@
+
+ Nicholas Orlowsky
+
+
+
+
+
+
+ Side Project Log 3/27/2023
+This side project log covers work done from 3/20/2023 - 3/27/2023
+SEPTA Site
+I started a new project that aimed to recreate parts of SEPTA's website with a more elegant UI, and using
+SEPTA's new "SEPTA Metro" wayfinding. The main goal with this project was to help me learn Svelte. I also had
+to reverse-engineer the APIs on septakey.org in order to authenticate a user and get their trip history.
+In terms of Svelte, I really enjoyed working with it and overall I found it much more elegant and easier to work
+with than React. I didn't like the way it handled client-server interaction with its serverside functions.
+I have not made this open source yet and do not intend to until it's more polished.
+
+I made all the necessary changes and tests to get VerifiedBot working. It is now waiting on my friend Ben
+to merge my PR with the changes outlined in my spring break blog.
+
+I created some QoL features, such as using Discord's embeds instead of sending regular text messages, showing which board
+a post was on, and fixing some bugs.
+
+The below projects had minimal/no work done on them: RingGold, and NWS Container Deployment Service
+
+
+
diff --git a/out/blogs/side-project-4-29-23.html b/out/blogs/side-project-4-29-23.html
new file mode 100644
index 0000000..da8afb1
--- /dev/null
+++ b/out/blogs/side-project-4-29-23.html
@@ -0,0 +1,47 @@
+
+ Nicholas Orlowsky
+
+
+
+
+
+
+ Side Project Log 4/29/2023
+This side project log covers work done from 3/27/2023 - 4/29/2023
+This side project log is a bit late due to it being a busy month of school, but today is my last day!
+SEPTA Site
+This week, I published SEPTA Site on Github, you can find it here: github.com/nickorlow/septa-site.
+I made a few tweaks to it in terms of styling and also wrote a descriptive README to give people instructions on how to run it as I don't want
+to host it myself since it handles credentials from another service.
+SQUIRREL
+SQUIRREL, short for SQL Query Util-Izing Rust's Reliable and Efficient Logic, is a SQL database that I am writing in Rust. Currently, it can
+parse CREATE TABLE commands, and works with the data types varchar and int. I plan to implement basic CRUD operations, then add JOINs, and
+then try to make it wire-compatible with Postgres.
+This project is currently not open-sourced as I am waiting to add more features and polish it up more.
+Swole Control
+This one isn't a personal project, however it is a project that I worked on with a group. We began working on it in February as a part of a
+club at UT called Texas Convergent. We recently presented it at the club's demo day and won the prize for having the best business.
+Swole Control is an app that monitors machine usage at a gym on a machine-by-machine level, providing gym goers with information about what machines
+are free (this is a major pain point as a gym goer myself). It also provides gym owners with statistics on which machines are most popular, providing
+them valuable insights into their business.
+To achieve this, we built hardware that consisted of an ESP-32 micro controller and an ultrasonic distance sensor. This hardware is mounted on a gym machine
+and it measures the distance to the nearest object. It then sends this measurement to a Rust backend which stores it in a Firestore database (although we had
+a fork of it that worked with Postgres). The backend then uses these measurements and compares them to a baseline to determine if there is a user at a machine.
+Our mobile app then reads this from the Firestore database (it's planned to have it read this from the API to have a better-defined application boundary). The
+frontend is written in React Native.
+
+These projects had minimal/no work done on them: RingGold, and NWS Container Deployment Service
+
+
+
diff --git a/out/blogs/side-project-7-12-23.html b/out/blogs/side-project-7-12-23.html
new file mode 100644
index 0000000..2c8b645
--- /dev/null
+++ b/out/blogs/side-project-7-12-23.html
@@ -0,0 +1,92 @@
+
+ Nicholas Orlowsky
+
+
+
+
+
+
+ Side Project Log 7/12/2023
+This side project log covers work done from 4/29/2023 - 7/12/2023
+This side project log is more than a bit late due to working a busy summer internship at FUTO!
+NWS Container Deployment Service
+I have finally added SSL to NWS CDS. This was challenging, as it required handling ACME challenges and certificate
+distribution across a set of geo-distributed Kubernetes clusters. I detail the complexities of this in a previous blog
+I wrote. In order to implement auto-created/auto-renewing SSL, I implemented the below solution:
+
+First, a user creates a request to add SSL to their NWS CDS service through the web UI which calls the NWS API (not pictured)
+Then, the NWS API calls SSLiaison (in-house written software) which adds the domain to Caddy's list of domains. Caddy will then attempt to create
+an SSL certificate from an ACME server (not pictured).
+The ACME server will query NWS for the challenge response by requesting a file at /.well-known/acme-challenge
on the
+domain to be verified (this is the green arrows).
+HAProxy will re-route these requests to NWS Hill Country, which is where the NWS Management Engine (NWSME) lives (this is
+the orange arrows). (NWSME controls what's deployed on each k8s cluster on NWS)
+HAProxy in NWS Hill Country will then route this request to Caddy, which will solve the http-01 challenge, and then get the certificate
+from the ACME server. Once it does this, it will write the certificate to a directory that is bind-mounted to both Caddy
+and SSLiaison.
+SSLiaison will detect this new file, parse it into a k8s manifest file, and then add it to our GitOps repo which is
+hosted in GitHub.
+From here, the certificate will be added to all the k8s clusters via Rancher Fleet.
+
+For next steps, I'd like to revise this solution such that it doesn't have a single point of failure.
+Currently, if NWS Hill Country is down (which it is about 0.025% of the time), then SSL certificates
+won't be able to be created or renewed.
+To do this, I will have SSLiaison implement the ACME client specification so that it can create and respond do ACME HTTP challenges.
+SSLiaison will run on NWS CDS (so that it's running on all of our k8s clusters and is HA) instead of running as a standalone docker container.
+I'll have SSLiaison use some distributed database (probably CockroachDB) to store the HTTP challenges so that it doesn't matter
+which k8s cluster the challenge request from the ACME server is routed to.
+Next Steps for NWS
+
+- HA NWS Management Engine: Currently (as somewhat discussed above), the NWSME will go down when NWS Hill Country goes down. I'd like to
+make it so that this isn't the case. This would likely just require that each NWS cluster runs its own instance of Rancher Fleet instead
+of one central Rancher Fleet that manages all the clusters. It would also require the HA SSLiaison.
+
+
+- IaC for Everything: Currently, all NWS CDS services are defined in yaml files in a git repo, however the underlying infrastructure that
+it runs on is not. Ideally, I'd like every NWS machine to run Proxmox and then have Terraform & Ansible configs to define how to set up
+vms on proxmox that will run the k8s clusters that support CDS services. This should eliminate my headaches of sshing into each machine
+to apply config changes and make sure everything is standardized. It should also make the process of setting up new servers easy.
+
+
+- Monitoring: I've been working on setting up monitoring on a lot of our services at my current internship using the TIG stack (Telegraf,
+InfluxDB, and Grafana). Now that I've been exposed to the usefulness of having a bunch of metrics on hand, I think it would be nice to have
+some dashboards setup for NWS to monitor speed, resource usage, uptime, and traffic. Doing this would also make it possible to expose resource usage in the
+NWS dashboard.
+
+
+Enhanced Infrastructure: This is kind of a blanket one for things I want to do that don't fit into other categories. It includes making
+hardware upgrades (mostly adding more storage), make management more accessible (such as Dell IDRAC's WebSerial), some load testing to
+identify painpoints, run an NWS machine in a cloud VM so I can say it's cross cloud (although my friends have told me this is cheating at creating
+my own cloud), and trying to figure out how to set up an Anycast network. I don't think I can setup an Anycast network without selling
+a kidney first. Renting a /24 CIDR alone would be more than I want to spend on a side project. I may look into setting it up with ipv6 only,
+however I'd still have to jump through hoops to get an Autonomous System number from an RIR. I'll probably write a whole blog about Anycast
+in the coming weeks.
+
+Reduced External Dependence: The main goal of NWS is to have no external dependence. In theory, everything but core internet infrastructure
+should
+
+
+Olney
+Rust, ActixWeb, PostgreSQL
+Olney is a new project I am starting with my friend Sridhar Nandigam. It aims to make
+tracking your job applications easier. Most of my friends either use spreadsheets or Trello to track their job applications, I
+think that we can make something that's a bit better for the job. Some features I'd like to have are: resume version attached to
+your application, job posting notifications from job boards such as pittcsc, and watching
+your email for emails from recruiters. Currently, I have part of the backend setup with basic CRUD operations. Now that I'm done with
+the latest batch of NWS work, this is next on my list to work on.
+
+These projects had minimal/no work done on them: RingGold, SQUIRREL
+
+
+
diff --git a/out/blogs/side-project-8-15-23.html b/out/blogs/side-project-8-15-23.html
new file mode 100644
index 0000000..2d90fa4
--- /dev/null
+++ b/out/blogs/side-project-8-15-23.html
@@ -0,0 +1,82 @@
+
+ Nicholas Orlowsky
+
+
+
+
+
+
+ Side Project Log 8/15/2023
+This side project log covers work done from 8/8/2023 - 8/15/2023
+
+Olney
+
+ I added a frontend to Olney and added a feature where it can automatically keep track of your job applications
+ by monitoring your email.
+
+
+Frontend
+
+ The frontend was made with Svelte. I chose not to use any UI/CSS libraries as I wanted to keep the number of
+ dependencies low. This was another good opportunity to learn about Svelte.
+
+
+Automatic Tracking via E-Mail
+
+ This is the killer feature that I initially set out to build Olney for. This works by having the user forward their
+ E-Mail to an instance of Olney. To receive E-Mail, Olney uses Inbucket, a mailserver
+ easily hostable within Docker. It listens on a websocket for incoming mail. Whenever a new mail message is received,
+ Olney uses the OpenAI API to get a summary of the email in the following format:
+
+
+
+{
+ isRecruiting: bool, // is the message about recruiting?
+ recruitingInfo: null | {
+ location: string, // Location in City, Providence/State, Country format
+ company: string, // Casual name of company e.g: Google, Cisco, Apple
+ position: string, // Name of job position
+ type: "assessment" | "interview" | "offer" | "rejection" | "applied" // What the message is discussing
+ dateTime: string, // DateTime communication rec'd OR DateTime that is being discussed (i.e. interview date confirmation)
+ name: string // Name of event, giving more detail to type
+ } // null if message is not about recruiting, fill with values if it is
+}
+
+
+
+ Olney then takes some details from this data, namely: company, position, and location and then uses the OpenAI API to generate
+ an embedding. We then query the closest match out of the job applications
+ in the database (with pgvector). Once we have the job application, we add
+ the event to the database, using the job application's id as a fkey.
+
+
+
+ I chose embedding as the lookup method so that we don't have to worry about the data parsed out of the email being an exact
+ match for what the user inputted. This also allows the lookup to work even when certain things such as location are missing from the
+ email.
+
+
+
+ Olney should be open-sourced/released within the next week or two.
+
+
+
+These projects had minimal/no work done on them: NWS, RingGold, SQUIRREL
+
+
+
+
+
+
+
diff --git a/out/blogs/side-project-8-8-23.html b/out/blogs/side-project-8-8-23.html
new file mode 100644
index 0000000..b7ecaa7
--- /dev/null
+++ b/out/blogs/side-project-8-8-23.html
@@ -0,0 +1,87 @@
+
+ Nicholas Orlowsky
+
+
+
+
+
+
+ Side Project Log 8/8/2023
+This side project log covers work done from 7/12/2023 - 8/8/2023
+
+SQUIRREL
+
+ SQUIRREL has been updated to work with INSERT INTO and SELECT queries. I also refactored much of the codebase to do error handling more elegantly and to make the parser
+ more extensible. Here's a screenshot of table creation, data insertion, and data selection:
+
+
+
+ The biggest challenge of this part was working on the parser which has now been written three times. The approaches to the parsing were:
+
+
+
+ -
+ Stepping through whitespace:
This was my initial and naive approach to the problem. I split the input string by its whitespace
+ and then queried values by referencing their indexes in the split string.
+
+ -
+ Regex:
This approach was cleaner than the first and led to a small parser, however it required an external dependency (which I'm
+ trying to minimize), and would make it hard to add additional features to commands later down the line.
+
+ -
+ Finite state machine:
This solution was more verbose than the others, however it allows for easier development. This method works
+ by splitting the query string into tokens. Tokens are the smallest piece of data that a parser recognizes. SQUIRREL gets them by splitting
+ the input by delimiters and using the split list as tokens (excluding whitespace) SQUIRREL recognizes the following characters as delimiters:
+
+
+
+ ' ', ',', ';', '(', ')'
+
+
+
+ This means that the string "INSERT INTO test (id) VALUES (12);" would be parsed into the list: "INSERT", "INTO", "test", "(", "id", etc..
+
+
+
+ Once we have our list of tokens, we iterate through them starting at a default state and perform a certain task for the given state, which
+ usually includes switching to another state. We do this until we reach the end state.
+
+
+
+ For example, with the above insert statement, we would start in the IntoKeyword state which would ensure that "INTO" is the current token.
+ We would then transition to the TableName state which would read the table name and store it in the ParsedCommand struct we're returning. We
+ would then move to the ColumnListBegin state which would look for an opening parenthesis, and switch the state to ColumnName. This process
+ continues with the other parts of the query until the Semicolon state is reached which checks that the statement ends with a semicolon, then
+ returns the ParsedCommand struct.
+
+
+
+
+
+ Next steps for this are to add column selection to SELECT statements and add WHERE clauses to SELECT statements.
+
+
+Olney
+
+ I added a feature to the Olney API which scans the pittcsc (now Simplify) summer internships Github repo
+ and parses the data into JSON format. I parsed the markdown file they have uisng regex which was relatively simple. There were some issues during development due to the
+ changing structure of the markdown file. These issues are being fixed on a rolling basis. I expect the changes to slowdown now that the transition from pittcsc to Simplify
+ is complete. You can access the JSON at olney.nickorlow.com/jobs.
+
+
+
+These projects had minimal/no work done on them: NWS, RingGold
+
+
+
diff --git a/out/blogs/spring-break-2023.html b/out/blogs/spring-break-2023.html
new file mode 100644
index 0000000..7c2ce74
--- /dev/null
+++ b/out/blogs/spring-break-2023.html
@@ -0,0 +1,79 @@
+
+ Nicholas Orlowsky
+
+
+
+
+
+
+ Spring Break 2023
+It's Spring Break, and that means I finally have time to spend all day working on side projects without having to worry about school.
+I figured I should write out the side projects I plan to work on over the break
+RingGold
+Rust, Swift, PostgreSQL
+Last week, me and my cousin wanted to try out Apple's fitness competition feature that works with Apple Watch. It works
+by giving you 1 point for every percent you complete of your move, exercise, and stand goals with a point cap of 600
+per day. The issue with it was that it didn't work at all, not syncing on time if at all. I want to build a clone of it
+with some additional features such as:
+
+Notifications: I didn't like how it was possible to workout and gain a bunch of points and just completely blindside your opponent. Hopefully this would encourage users to workout even more.
+
+Widget/Watch Complication: Similar to the above, adding a homescreen widget or a watch complication would make it easier to keep up with your competitor's progress.
+
+Custom Competitions: I think it'd be nice to have competitions with custom rules and lengths so that you're not stuck with only one setting. Settings could include custom duration and custom caps on points.
+
+
+I'm building the web API for it in Rust and the mobile app in Swift. I chose these languages to gain more exposure to them, also
+Swift was a good choice since the app is going to be platform specific to iOS due to its need to integrate with Apple Watch.
+(this is named after New Ringgold, PA)
+NWS Container Deployment Service
+C#, Rancher
+I've created my own hosting/cloud service called Nick Web Services. It currently allows people to deploy
+dockerized applications on my geo-distributed k8s clusters running on Dell Poweredge servers. In order to actually deploy this, I
+had to manually create the Kubernetes manifest files and then ssh into each individual server and apply them. I've setup
+Rancher Fleet to automate this process by pulling the manifest from a git repo (this is something called gitops). I also
+wrote an API to generate the manifest files and then upload them to a git repo. I have a video demo of this working that
+you can watch here.
+Currently, the service works for deployment but only if you don't want to use SSL or you use Cloudflare's flexible SSL
+technology. I wrote a separate blog post here about the challenges of doing this and how I plan on implementing it.
+I'd like to complete part of this implementation during the break.
+VerifiedBot
+JavaScript, Rust
+This project isn't a personal project, as a lot of it was built by my friends Arpan and Ben.
+A little over a year ago, we wanted to make a Discord bot to verify that people on some Discord servers we ran
+went to the University of Texas. Initially, it worked by verifying you had a utexas.edu email address and then verifying
+some additional information via LDAP. A few months ago Ben found out that using the SaaS survey software that the university uses
+(qualtrics), we could have users verify themselves by using the university's SSO system. This works because qualtrics can send
+data to a webhook when a survey is complete, and it can also require signing in with the university's SSO before filling out a survey.
+It required that I write a wasm wrapper for an encryption library. I wrote almost all the code for this function last year, but
+due to a bug in qualtrics, it wasn't working properly. It seems that this bug has been fixed and we can start rolling it out.
+Personal Website Facelift
+Typescript, React
+My personal website (this one) is a little overdue for some design updates. My main focus will be making it more mobile
+friendly. Last year, I made some improvements to make it usable on mobile but it still doesn't feel quite right. I also
+think that it has some information overload in some areas such as the projects section. I think that to mitigate this I
+might just have a small summary of each project and then you can click into each to learn more about it, similar to my
+friend Raul's Website. I'm also considering a move to tab-based navigation so that I can have
+more information in each section. Further down the line, I think I might re-write it using Svelte as I'm seeing it being used more and more
+and would like to get some exposure to it.
+Mahantongo
+Rust, PostgreSQL
+I'm one of the members of the Community Team that runs some UT Computer Science community Discord servers.
+Currently, a Discord bot called Carlbot provides us a star-board, which is a specific channel where messages that 5 or more people
+react to with a star emoji get posted. It's supposed to be a collection of the funniest and best messages sent on the server.
+One of the things our server members have wanted is the addition of more '*-board' channels where you can create multiple star-board
+like channels but with custom emojis. I'm writing it in Rust and I'm just hoping to use this project to get more acquainted with the language.
+
+
+
diff --git a/out/extra.html b/out/extra.html
new file mode 100644
index 0000000..3a93bc8
--- /dev/null
+++ b/out/extra.html
@@ -0,0 +1,99 @@
+
+ Nicholas Orlowsky
+
+
+
+
+
+
+
+
Extra
+
Extra bits of information about me
+
+
Rail Photography
+
+ I take photos of trains and train stations fairly often.
+ If you would like to see these pictures, they are avaliable
+ here
+
+
+
Bowling
+
+ I go bowling with some friends regularly. We track our scores
+ down to the throw in a csv. You can check out a website where
+ that data is compiled into a readable format
+ here
+
+
+
Personal Records
+
+
+ Activity |
+ Effort |
+ Date |
+ Location |
+
+
+ 1600m (1 mile) |
+ 4:34 |
+ November 14th, 2020 |
+ Williamson County Park |
+
+
+ Milk Mile |
+ 5:41 |
+ May 20th, 2021 |
+ Lake Travis High School |
+
+
+ 3200m (2 mile) |
+ 10:11 |
+ March 20th, 2021 |
+ Carroll High School |
+
+
+ 5000m XC |
+ 16:43 |
+ September 26th, 2020 |
+ Old Settler's Park |
+
+
+ Bench Press |
+ 280.5 Lbs |
+ December 31st, 2024 |
+ Anytime Fitness - Pottsville, PA |
+
+
+ Squat |
+ 415 Lbs |
+ August 10th, 2023 |
+ FUTO HQ |
+
+
+ Deadlift |
+ 415 Lbs |
+ Augist 10th, 2023 |
+ FUTO HQ |
+
+
+ Bowling |
+ 170 |
+ April 19th, 2024 |
+ Texas Union Underground |
+
+
+
+
+
+
diff --git a/out/favicon.ico b/out/favicon.ico
new file mode 100644
index 0000000..83ed246
Binary files /dev/null and b/out/favicon.ico differ
diff --git a/out/index.html b/out/index.html
new file mode 100644
index 0000000..2551850
--- /dev/null
+++ b/out/index.html
@@ -0,0 +1,54 @@
+
+ Nicholas Orlowsky
+
+
+
+
+
+
+
+
Nicholas Orlowsky
+
Software Engineer - Austin, TX
+
+ [ Forgejo ]
+ [ GitHub (mirrors) ]
+ [ LinkedIn ]
+ [ E-Mail ]
+ [ Resume ]
+
+
+
+
+ [ Listen to me on the Azure DevOps podcast! ]
+
+
+
+ I'm a computer science student at the University of Texas at Austin. I'm particularly
+ interested in infrastructure, distributed systems, and systems programming.
+
+
+
+ I run Nick Web Services (NWS), a side project
+ that provides geo-distributed container hosting using Kubernetes on bare metal servers.
+ It achieved 100% uptime for over a year.
+
+
+
+ Outside of computers, I enjoy biking and weightlifting. I'm also a public transit enthusiast
+ and I take pictures of trains that I see, especially rare or special ones.
+
+
+
+
+
diff --git a/out/on-rails.html b/out/on-rails.html
new file mode 100644
index 0000000..cdb5687
--- /dev/null
+++ b/out/on-rails.html
@@ -0,0 +1,24 @@
+
+ Nicholas Orlowsky
+
+
+
+
+
+
+ Rail Pictures
+All photos are Copyright © Nicholas Orlowsky
+
+
+
diff --git a/out/projects.html b/out/projects.html
new file mode 100644
index 0000000..e7250f1
--- /dev/null
+++ b/out/projects.html
@@ -0,0 +1,117 @@
+
+ Nicholas Orlowsky
+
+
+
+
+
+
+
+
Projects
+
+
+
Nick Web Services (NWS)
+
C#, Kubernetes, Rancher, and HAProxy
+
[ Project Website ]
+
+ Nick Web Services is a cloud infrastructure provider service that I created and run.
+ It allows people to deploy containerized versions of their web apps across our multiple
+ servers. It provides geo-distributed high availability by default with no extra configuration
+ needed from users hosting their webapp with us.
+
+
+ Hardware-wise we use old Dell PowerEdge servers running Proxmox. We then have VMs running
+ in Proxmox that run Kubernetes clusters. We have 4 clusters currently: Austin, Hill Country,
+ Schuylkill, and Philadelphia. The deployments are managed through GitOps with Rancher Fleet.
+
+
+
+
+
Anthracite Web Server
+
C++ & Python
+
[ GitHub Repo ]
+
+ Anthracite is a simple web server written in C++. It currently supports HTTP/1.0 and HTTP/1.1.
+ The benchmarking tools for Anthracite are written in Python. Anthracite is optimized for performance
+ and rivals the performance of NGINX & Apache in our testing. It uses a thread-per-connection
+ architecture, allowing it to process many requests in paralell. Additionally, it caches all
+ files that it serves in memory to ensure that added latency from disk reads do not slow down requests.
+ Through writing Anthracite, I have learned to use different C++ profilers as well as some general
+ optimization techniques for C++.
+
+
+
+
+
CavCash
+
C#, Kubernetes, SQL Server, and MongoDB
+
[ Project Website ]
+
+ CavCash was a company that I founded which built a debit-based payment system similar to
+ PayPal and Venmo. I assembled a 5 person team and took on a technical role in the company,
+ writing most of our backend codebase. Our backend used C#, ASP.NET, Microsoft SQL Server,
+ and MongoDB. Our infrastructure changed throughout the lifetime of the company, initially
+ it was on Microsoft Azure using Azure App Service. We then pivoted to AWS using Elastic
+ Beanstalk. We also ran on Google Cloud Platform using Compute Engine. Finally, we setup our
+ own servers in-house and managed our deployments with Kubernetes.
+
+
+ We launched in 2021, with the ability to send money between real banks using the ACH network.
+ We ended up processing a few hundred dollars in transaction volume before ultimately shutting
+ down due to a lack of funding. The website is now back up and everything works as it did in
+ 2021, except adding funds from a bank account is not supported.
+
+
+
+
+
SQUIRREL
+
Rust
+
[ GitHub Repo ]
+
+ SQUIRREL stands for SQL Query Util-Izing Rust's Reliable and Efficient Logic. It is a SQL database
+ that I am writing in Rust. Currently, it can create tables, insert data into tables, and select all
+ data from a given table. The biggest challenge so far has been writing the parser. My next steps are
+ to add WHERE clauses to SELECT statements, allow column filtering in SELECT statements, and add DELETE
+ statements.
+
+
+
+
+
Olney
+
Rust, Postgres, Svelte, TypeScript, and OpenAI's API
+
[ GitHub Repo ]
+
+ Olney is a job application tracker that aims to be better than using a Trello board or a spreadsheet.
+ It allows users to create jobs and log custom events such as interviews, assessments, and other communication.
+
+
+
+
+
SEPTA Site
+
Svelte, TypeScript
+
[ GitHub Repo ]
+
+ SEPTA Site is a website that I created which can get your trip history, SEPTA Key balance,
+ and ridership statistics for your SEPTA Key. It utilizes SEPTA's new metro wayfinding instead
+ of their current wayfinding. I wrote the project to get a basic introduction to Svelte and
+ so that I could try to improve upon the UX of SEPTA's current website and mobile app.
+
+
+
+
+
+
+
+
diff --git a/out/style.css b/out/style.css
new file mode 100644
index 0000000..f0df225
--- /dev/null
+++ b/out/style.css
@@ -0,0 +1,22 @@
+* {
+ font-family: serif;
+}
+
+td {
+ text-align: center;
+}
+
+body {
+ background-color: #fefeaa;
+ margin: 20px auto;
+ max-width: 750px;
+}
+
+a {
+ text-decoration: none;
+ color: #114488;
+}
+
+img {
+ max-width: 100%;
+}
diff --git a/shell.nix b/shell.nix
deleted file mode 100644
index 005c9aa..0000000
--- a/shell.nix
+++ /dev/null
@@ -1,8 +0,0 @@
-with import {};
-stdenv.mkDerivation {
- name = "septastic_env";
- nativeBuildInputs = [ pkg-config ];
- buildInputs = [
- cryptsetup
- ];
-}
diff --git a/src/blog.filler.html b/src/blog.filler.html
new file mode 100644
index 0000000..28543ea
--- /dev/null
+++ b/src/blog.filler.html
@@ -0,0 +1,28 @@
+
+
Blog
+
A collection of my thoughts, some of them may be interesting
+
+
+
April 20th, 2024
+
+
+
November 16th, 2023
+
+
October 20th, 2023
+
+
August 15th, 2023
+
+
August 8th, 2023
+
+
July 12th, 2023
+
+
April 29th, 2023
+
+
March 27th, 2023
+
+
March 20th, 2023
+
+
January 20th, 2023
+
+
March 18th, 2022
+
diff --git a/src/blogs/doing-c-assignments-in-csharp.filler.html b/src/blogs/doing-c-assignments-in-csharp.filler.html
new file mode 100644
index 0000000..e39c224
--- /dev/null
+++ b/src/blogs/doing-c-assignments-in-csharp.filler.html
@@ -0,0 +1,57 @@
+Doing C assignments in C#
+Thanks to Arpan Dhatt for doing most of the work on this (his blog here: https://arpan.one/posts/messing-with-gradescope/)
+At the end, he made this comment:
+
+And so, that's the end of this post. To whom it may concern, don't try doing your C assignment in C# (you know who you are).
+
+The reason for this comment (besides the fact that I talk about C# a lot) is due to the fact that C# requires a runtime to be installed for it to work. This is because C# does not compile to native bytecode but rather compiles to an intermediary language (dubbed CIL by Microsoft) and is then translated 'Just In Time' by the runtime.
+This makes running assignments in a docker container where the runtime is not already installed considerably hard. One option we have is that we could just include the runtime in our submission. Sounds easy, right? Well it would be non-trivial to do but due to the fact that the .NET runtime is very large, I wouldn't consider this a good idea (Not to mention it's super boring).
+The better solution is to use .NET's (experimental) AOT compilation feature (formerly called CoreRT). C# has had a number of attempts at an AOT compiler such as :
+
+- AOT by Mono
+- LLD2CPP built by Unity
+- Ready2Run by Microsoft
+
+We'll be using the official Ready2Run AOT compilation built by Microsoft. In order to use it, all you have to do is add the following to your nuget.config
:
+<add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
+
+and then install the package: Microsoft.DotNet.ILCompiler
. After doing that if you run the command: dotnet publish -r [Runtime] -c [Config]
and after waiting a considerable amount of time, you'll have a full-fledged C# application compiled directly to your target runtime's bytecode!
+Compiling my simple Hello, Wold test to linux-x64 (dotnet publish -r linux-x64 -c Release
) and adding it to my project files should let me run it using the same method Arpan used in his blog.
+After doing that, we can follow the instructions followed by Arpan and viola! C# runs on Gradescope!
+I don't recommend this but it was fun to do and I needed stuff to write in a blog.
+Other Interesting (Low Level) C#/.NET Features
+C# actually has many lower level features people don't expect it to have. Some of these include pointers and direct memory management. Pointers can be enabled by encasing your code in an unsafe code block.
+Example (Written by Microsoft)
+
+
+int[] a = new int[5] { 10, 20, 30, 40, 50 };
+
+unsafe
+{
+
+ fixed (int* p = &a[0])
+ {
+
+ int* p2 = p;
+ Console.WriteLine(*p2);
+
+ p2 += 1;
+ Console.WriteLine(*p2);
+ p2 += 1;
+ Console.WriteLine(*p2);
+ Console.WriteLine("--------");
+ Console.WriteLine(*p);
+
+ *p += 1;
+ Console.WriteLine(*p);
+ *p += 1;
+ Console.WriteLine(*p);
+ }
+}
+
+In .NET 6, the NativeMemory
class was introduced which you can read about here. It allows for malloc-like memory allocation and freeing which can be important for high-performance workloads.
+
+
+
+
+
\ No newline at end of file
diff --git a/src/blogs/fpga-fun.filler.html b/src/blogs/fpga-fun.filler.html
new file mode 100644
index 0000000..0b54266
--- /dev/null
+++ b/src/blogs/fpga-fun.filler.html
@@ -0,0 +1,183 @@
+FPGA Fun
+
+
+This semester at school, I took Advanced Computer Architecture. This has been
+my favorite class in college so far. The class dives deeper into topics from
+the regular Computer Architecture course, especially the parts that are
+hand-waved over as being too complicated.
+
+
+
+The class is project-based (mostly) and had 2 large-sized projects. One was
+creating an out-of-order CPU in SystemVerilog, which I'll dive into in
+another blog. The other was anything we wanted to do (so long as the instructor
+approved it). My project was implementing the CHIP-8 and then GameBoy in
+SystemVerilog.
+
+
+
+The CHIP-8 part was initially easy, as I had
+previously written a CHIP-8
+emulator in C. My first stab at doing it in SV was done early in the
+semester before I was too familiar with SV and how to write it properly.
+The code resembled my C code, having one large case statement that would use
+blocking assignments to complete instructions. I used
+Verilator to simulate and test
+my design. Verilator was very nice as I could do FFI (Verilator calls it DPI)
+to talk to C++ code from my SV code. This allowed me to use SDL2 to take
+user input and to display the CHIP-8's screen on my laptop. I managed to get
+a fully working version of it done in a few days.
+
+
+
+After this, I was able to borrow an FPGA from my instructor and set out to
+run my CHIP-8 on real hardware. I ordered a ST7920 LCD display, a buzzer, and
+a 16 key keypad off of Amazon the next day.
+
+
+ST7920 Driver "The Bomb"
+
+
+The most time-consuming part of this project so far was interfacing with the
+ST7920 LCD I ordered. The display has 2 modes for data transmission: 8/4 pin
+parallel, and serial. The specification for the parallel interface seemed to
+be the most straightforward, so I went ahead with implementing my driver
+with that.
+
+
+
+The ST7920 has a
+fairly
+straightforward interface for drawing to the screen. It works by sending
+8-bit instructions to the display controller. You first send a few
+initialization instructions to clear the display's memory and reset its state.
+After that you can select a mode (text or graphics). Both modes work similarly
+to where you set the position of the cursor on the screen and then send
+instructions that write pixels or text to that coordinate and then advances
+the coordinate by one.
+
+
+
+I ran into trouble where I couldn't get anything to show up. Not even a simple
+"Hello World". To troubleshoot, I borrowed a friend's Arduino Mini which has
+proper drivers written for it for interfacing with the LCD. After hooking the
+display up to it, it also couldn't draw anything! It wasn't until I tried
+running it in serial mode that it worked. As it turns out, some manufacturers
+solder capacitors on the back that can disable certain features of the display
+(such as parallel mode), and my display's manufacturer had done just that. For
+this reason, I'd highly recommend buying from a big-name seller of electronic
+components such as Adafruit instead of random Amazon sellers.
+
+
+
+Now that I knew that only the serial interface worked, I had to rewrite my
+driver to use it. This meant instead of putting all 8 bits of an instruction
+onto 8 pins at once, I'd have 2 pins: a clock and a data pin. In order to send
+an 8 bit instruction, I'd send a clock signal and set the data pin to either
+1 or 0 based on whether the nth bit in my instruction would be a 1 or 0. There
+are additional device-specific characteristics of the ST7920's serial interface
+described in the above linked datasheet, but they're not relevant to getting
+the general idea of SPI (Serial Parallel Interface).
+
+
+
+

+

+
+
+
+I implemented a serial driver with a little demo screen (see above image), and
+then modified the code to accept a block of memory of which it would then
+draw out to the display. This left me with a general-purpose ST7920 serial driver!
+Implementing a serial driver for this display gave me a good amount of
+experience in dealing with timing outside of simulations. It also taught
+me about debouncing and metastability.
+
+
+
+The driver is hosted on GitHub
+here. The name "The Bomb"
+was coined by my girlfriend who thought all the jumper wires and exposed
+PCBs made it look like I was building a bomb. (I'd like to be clear that I have
+never nor never intend to build a bomb)
+
+
+Rewriting CHIP-8 "yayacemu"
+
+
+With my display driver finally done, I decided to try to hook my CHIP-8 code up
+to it and run it on the FPGA. I was really excited to actually run something on
+hardware. Then the build time started climbing and Intel Quartus crashed. I
+knew that this was a sign that I messed up. Through other projects in the class
+I learned a bit about Verilog and HDL best practices and knew that my giant
+blocking assignment switch statement would not run well, even if it would
+compile.
+
+
+
+Rewriting the CHIP-8 to work in a way that's more consistent with how processors
+actually work and not how emulators work was fairly easy as I had done similar
+work previously. To do so, I turned the processor into a state machine where
+there was a state for each of the
+traditional 5
+stages of the classic RISC pipeline. Each state would do what it needed
+to do and then move it into the next state. This design actually made logic
+very simple as I was able to combine the functionality for a lot of instructions.
+For example, a register to register load and an immediate to register load could use the
+same writeback logic, as by that stage they would be loading bits into a register.
+I didn't make it pipelined or do any fancy optimizations, mostly due to the fact
+that the CHIP-8 is supposed to run at ~480 Hz. It also wasn't in the scope of
+this project, as this was more about learning how different parts of a
+computer interact and how real-world ISA implementations are done.
+
+
+
+At this point, I had a working CHIP-8 implemented in hardware sans a buzzer
+and user input. These parts I was able to knock out fairly quickly. The buzzer
+was dead simple, I just set its positive pin to high whenever the sound timer
+was greater than zero. The keypad was a little more challenging, but much
+simpler than the display. The keypad has 8 pins that are split between
+4 column pins and 4 row pins. The FPGA sets 1 column pin to low and the rest
+to high on every clock cycle and reads the output from the row pins to
+determine which key is pressed. For instance if the first column pin was the
+one the FPGA had set to low, and then the FPGA read that the first row pin
+was outputting high, it would know that the pressed key was at coordinate
+(1,1) (i.e. the first key).
+
+
+
+
+
+And after doing all of that, we can play Tetris!
+
+
+
+The source code for
+yayacemu is hosted here.
+The CHIP-8 emulator I wrote in C was called yacemu (Yet Another Chip-8 Emulator),
+and the naming for this is yayacemu (Yet Another Yet Another Chip-8 Emulator).
+
+
+The GameBoy
+
+
+I started writing the GameBoy implementation around the same time as I got the
+FPGA. As such, it's code structure heavily mirrored that of my first attempt
+at the CHIP-8's. For the project, I made no commitments to running it on an
+FPGA, and much of the GameBoy is implemented, so I'm pushing forward with
+keeping that structure. So far, the GameBoy can successfully run the bootrom,
+draw the background layer to the display, and run a little bit of the Tetris
+ROM (not enough to show anything yet).
+
+
+
+
+
+The emulator booting!
+
diff --git a/src/blogs/nws-postmortem-11-8-23.filler.html b/src/blogs/nws-postmortem-11-8-23.filler.html
new file mode 100644
index 0000000..5485440
--- /dev/null
+++ b/src/blogs/nws-postmortem-11-8-23.filler.html
@@ -0,0 +1,89 @@
+NWS Incident Postmortem 11/08/2023
+
+
+ On November 8th, 2023 at approximately 09:47 UTC, NWS suffered
+ a complete outage. This outage resulted in the downtime of all
+ services hosted on NWS and the downtime of the NWS Management
+ Engine and the NWS dashboard.
+
+
+
+ The incident lasted 38 minutes after which it was automatically
+ resolved and all services were restored. This is NWS' first
+ outage event of 2023.
+
+
+Cause
+
+ NWS utilizes several tactics to ensure uptime. A component of
+ this is load balancing and failover. This service is currently
+ provided by Cloudflare at the DNS level. Cloudflare sends
+ health check requests to NWS servers at specified intervals. If
+ it detects that one of the servers is down, it will remove the
+ A record from entry.nws.nickorlow.com for that server (this domain
+ is where all services on NWS direct their traffic via a
+ CNAME).
+
+
+
+ At around 09:47 UTC, Cloudflare detected that our servers in
+ Texas (Austin and Hill Country) were down. It did not detect an
+ error, but rather an HTTP timeout. This is an indication that the
+ server may have lost network connectivity. When Cloudflare detected that the
+ servers were down, it removed their A records from the
+ entry.nws.nickorlow.com domain. Since NWS Pennsylvania servers
+ have been undergoing maintenance since August 2023, this left no
+ servers able to serve requests routed to entry.nws.nickorlow.com,
+ resulting in the outage.
+
+
+
+ NWS utilizes UptimeRobot for monitoring the uptime statistics of
+ services on NWS and NWS servers. This is the source of the
+ statistics shown on the NWS status page.
+
+
+
+ UptimeRobot did not detect either of the Texas NWS servers as being
+ offline for the duration of the outage. This is odd, as UptimeRobot
+ and Cloudflare did not agree on the status of NWS servers. Logs
+ on NWS servers showed that requests from UptimeRobot were being
+ served while no requests from Cloudflare were shown in the logs.
+
+
+
+ No firewall rules existed that could have blocked the healthcheck traffic from Cloudflare
+ for either of the NWS servers. There was no other configuration
+ found that would have blocked these requests. As these servers
+ are on different networks inside different buildings in different
+ parts of Texas, their networking equipment is entirely separate.
+ This rules out any failure of networking equipment owned
+ by NWS. This leads us to believe that the issue may have been
+ caused due to an internet traffic anomaly, although we are currently
+ unable to confirm that this is the cause of the issue.
+
+
+
+ This is being actively investigated to find a more concrete root
+ cause. This postmortem will be updated if any new information is
+ found.
+
+
+
+ A similar event occurred on November 12th, 2023 lasting for 2 seconds.
+
+
+Fix
+
+ The common factor between both of these servers is that they both use
+ Spectrum for their ISP and that they are located near Austin, Texas.
+ The Pennsylvania server maintenance will be expedited so that we have
+ servers online that operate with no commonalities.
+
+
+
+ NWS will also investigate other methods of failover and load
+ balancing.
+
+
+Last updated on November 16th, 2023
diff --git a/src/blogs/side-project-10-20-23.filler.html b/src/blogs/side-project-10-20-23.filler.html
new file mode 100644
index 0000000..daa60dc
--- /dev/null
+++ b/src/blogs/side-project-10-20-23.filler.html
@@ -0,0 +1,99 @@
+Side Project Log 10/20/2023
+This side project log covers work done from 8/15/2023 - 10/20/2023
+
+Anthracite
+[ GitHub Repo ]
+
+ Anthracite is a web server written in C++. The site you're reading this on
+ right now is hosted on Anthracite. I wrote it to deepen my knowledge of C++ and networking protocols. My
+ main focus of Anthracite is performance. While developing anthracite,
+ I have been exploring different optimization techniques and benchmarking
+ Anthracite against popular web servers such as NGINX and Apache.
+ Anthracite supports HTTP/1.1 and only supports GET requests to request
+ files stored on a server.
+
+
+
+ Anthracite currently performs on par with NGINX and Apache when making
+ 1000 requests for a 50MB file using 100 threads in a Docker container.
+ To achieve this performance, I used memory profilers to find
+ out what caused large or repeated memory copies to occur. I then updated
+ those sections of code to remove or minimize these copies. I also
+ made it so that Anthracite caches all files it can serve in memory. This
+ avoids unnecessary and costly disk reads. The implementation of this is
+ subpar, as it requires that the server be restarted whenever the files
+ it is serving are changed for the updates to be detected by Anthracite.
+
+
+
+ I intend to make further performance improvements, specifically in the request
+ parser. I also plan to implement HTTP/2.0.
+
+
+Yet Another Chip Eight Emulator (yacemu)
+[ GitHub Repo ]
+
+ YACEMU is an interpreter for the CHIP-8 instruction set written in C. My main
+ goal when writing it was to gain more insight into how emulation works. I had
+ previous experience with this from when I worked on an emulator for a slimmed-down
+ version of X86 called Y86.
+ So far, I've been able to get most instructions working. I need to work on adding
+ input support so that users can interact with programs running in yacemu. It has
+ been fairly uncomplicated and easy to write thus far. After I complete it, I would
+ like to work on an emulator for a real device such as the GameBoy (This might be
+ biting off more than I can chew).
+
+
+Nick VIM
+
+ Over the summer while I was interning, I began using VIM as my primary
+ text editor. I used a preconfigured version of it (NvChad) to save time, as
+ setting everything up can take a while. After using it for a few months, I began
+ making my own configuration for VIM, taking what I liked from NvChad and leaving
+ behind the parts that I didn't like as much.
+
+
+
+
+
+ One important part of Nick VIM was ensuring that it was portable between different
+ machines. I wanted the machine to have as few dependencies as possible so that I
+ could get NickVIM set up on any computer in a couple of minutes. This will be especially
+ useful when working on my School's lab machines and when switching to new computers
+ in the future. I achieved this by dockerizing Nick VIM. This is based on what one of
+ my co-workers does with their VIM setup. The Docker container contains
+ all the dependencies for each language server. Whenever you edit a file with Nick Vim,
+ the following script runs:
+
+
+
+echo Starting container...
+cur_dir=`pwd`
+container_name=${cur_dir////$'_'}
+container_name="${container_name:1}_$RANDOM"
+docker run --name $container_name --network host -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix --mount type=bind,source="$(pwd)",target=/work -d nick-vim &> /dev/null
+
+echo Execing into container...
+docker exec -w /work -it $container_name bash
+
+echo Stopping container in background...
+docker stop $container_name &> /dev/null &
+
+
+
+ This code creates a new container, forwards the host's clipboard to the container, and
+ mounts the current directory inside the container for editing.
+
+
+Secane
+[ Video Demo ]
+
+ Secane was a simple ChatGPT wrapper that I wrote to practice for the behavioral part of
+ job interviews. It takes your resume, information about the company, and information about
+ the role you're interviewing for. It also integrates with OpenAI's whisper, allowing you
+ to simulate talking out your answers. I made it with Next.JS.
+
+
+
+These projects had minimal/no work done on them: NWS, RingGold, SQUIRREL
+These projects I will no longer be working on: Olney
diff --git a/src/blogs/side-project-3-20-23.filler.html b/src/blogs/side-project-3-20-23.filler.html
new file mode 100644
index 0000000..c011c64
--- /dev/null
+++ b/src/blogs/side-project-3-20-23.filler.html
@@ -0,0 +1,17 @@
+Side Project Log 3/20/2023
+Spring break just wrapped up. I wrote a blog last week about the side projects that I was planning on
+doing. I wanted to provide an update on what I got done, and figured I'd turn it into a recurring thing.
+This side project log covers work done from 3/13/2023 - 3/20/2023
+
+I managed to move my website over to tab-based navigation pretty early on in the break. It just involved setting
+up a navbar component and then using react-navigation to navigate between pages. I also managed to
+update my projects page to be more compact and readable.
+There is still work to be done on making it look better, but I mostly believe that
+it's just going to be somewhat minor tweaks.
+
+I managed to finish this one. I learned a lot about Rust and I've gained an appreciation for
+Rust's enforcement of good programming habits, and I really like how error handling is done.
+Working with Serenity was pretty easy as it mirrored some of the other Discord SDKs I've used
+before.
+
+The below projects had minimal/no work done on them: RingGold, NWS Container Deployment Service, and VerifiedBot
diff --git a/src/blogs/side-project-3-27-23.filler.html b/src/blogs/side-project-3-27-23.filler.html
new file mode 100644
index 0000000..d2dac06
--- /dev/null
+++ b/src/blogs/side-project-3-27-23.filler.html
@@ -0,0 +1,17 @@
+Side Project Log 3/27/2023
+This side project log covers work done from 3/20/2023 - 3/27/2023
+SEPTA Site
+I started a new project that aimed to recreate parts of SEPTA's website with a more elegant UI, and using
+SEPTA's new "SEPTA Metro" wayfinding. The main goal with this project was to help me learn Svelte. I also had
+to reverse-engineer the APIs on septakey.org in order to authenticate a user and get their trip history.
+In terms of Svelte, I really enjoyed working with it and overall I found it much more elegant and easier to work
+with than React. I didn't like the way it handled client-server interaction with its serverside functions.
+I have not made this open source yet and do not intend to until it's more polished.
+
+I made all the necessary changes and tests to get VerifiedBot working. It is now waiting on my friend Ben
+to merge my PR with the changes outlined in my spring break blog.
+
+I created some QoL features, such as using Discord's embeds instead of sending regular text messages, showing which board
+a post was on, and fixing some bugs.
+
+The below projects had minimal/no work done on them: RingGold, and NWS Container Deployment Service
diff --git a/src/blogs/side-project-4-29-23.filler.html b/src/blogs/side-project-4-29-23.filler.html
new file mode 100644
index 0000000..f63ef67
--- /dev/null
+++ b/src/blogs/side-project-4-29-23.filler.html
@@ -0,0 +1,25 @@
+Side Project Log 4/29/2023
+This side project log covers work done from 3/27/2023 - 4/29/2023
+This side project log is a bit late due to it being a busy month of school, but today is my last day!
+SEPTA Site
+This week, I published SEPTA Site on Github, you can find it here: github.com/nickorlow/septa-site.
+I made a few tweaks to it in terms of styling and also wrote a descriptive README to give people instructions on how to run it as I don't want
+to host it myself since it handles credentials from another service.
+SQUIRREL
+SQUIRREL, short for SQL Query Util-Izing Rust's Reliable and Efficient Logic, is a SQL database that I am writing in Rust. Currently, it can
+parse CREATE TABLE commands, and works with the data types varchar and int. I plan to implement basic CRUD operations, then add JOINs, and
+then try to make it wire-compatible with Postgres.
+This project is currently not open-sourced as I am waiting to add more features and polish it up more.
+Swole Control
+This one isn't a personal project, however it is a project that I worked on with a group. We began working on it in February as a part of a
+club at UT called Texas Convergent. We recently presented it at the club's demo day and won the prize for having the best business.
+Swole Control is an app that monitors machine usage at a gym on a machine-by-machine level, providing gym goers with information about what machines
+are free (this is a major pain point as a gym goer myself). It also provides gym owners with statistics on which machines are most popular, providing
+them valuable insights into their business.
+To achieve this, we built hardware that consisted of an ESP-32 micro controller and an ultrasonic distance sensor. This hardware is mounted on a gym machine
+and it measures the distance to the nearest object. It then sends this measurement to a Rust backend which stores it in a Firestore database (although we had
+a fork of it that worked with Postgres). The backend then uses these measurements and compares them to a baseline to determine if there is a user at a machine.
+Our mobile app then reads this from the Firestore database (it's planned to have it read this from the API to have a better-defined application boundary). The
+frontend is written in React Native.
+
+These projects had minimal/no work done on them: RingGold, and NWS Container Deployment Service
diff --git a/src/blogs/side-project-7-12-23.filler.html b/src/blogs/side-project-7-12-23.filler.html
new file mode 100644
index 0000000..e025f64
--- /dev/null
+++ b/src/blogs/side-project-7-12-23.filler.html
@@ -0,0 +1,70 @@
+Side Project Log 7/12/2023
+This side project log covers work done from 4/29/2023 - 7/12/2023
+This side project log is more than a bit late due to working a busy summer internship at FUTO!
+NWS Container Deployment Service
+I have finally added SSL to NWS CDS. This was challenging, as it required handling ACME challenges and certificate
+distribution across a set of geo-distributed Kubernetes clusters. I detail the complexities of this in a previous blog
+I wrote. In order to implement auto-created/auto-renewing SSL, I implemented the below solution:
+
+First, a user creates a request to add SSL to their NWS CDS service through the web UI which calls the NWS API (not pictured)
+Then, the NWS API calls SSLiaison (in-house written software) which adds the domain to Caddy's list of domains. Caddy will then attempt to create
+an SSL certificate from an ACME server (not pictured).
+The ACME server will query NWS for the challenge response by requesting a file at /.well-known/acme-challenge
on the
+domain to be verified (this is the green arrows).
+HAProxy will re-route these requests to NWS Hill Country, which is where the NWS Management Engine (NWSME) lives (this is
+the orange arrows). (NWSME controls what's deployed on each k8s cluster on NWS)
+HAProxy in NWS Hill Country will then route this request to Caddy, which will solve the http-01 challenge, and then get the certificate
+from the ACME server. Once it does this, it will write the certificate to a directory that is bind-mounted to both Caddy
+and SSLiaison.
+SSLiaison will detect this new file, parse it into a k8s manifest file, and then add it to our GitOps repo which is
+hosted in GitHub.
+From here, the certificate will be added to all the k8s clusters via Rancher Fleet.
+
+For next steps, I'd like to revise this solution such that it doesn't have a single point of failure.
+Currently, if NWS Hill Country is down (which it is about 0.025% of the time), then SSL certificates
+won't be able to be created or renewed.
+To do this, I will have SSLiaison implement the ACME client specification so that it can create and respond do ACME HTTP challenges.
+SSLiaison will run on NWS CDS (so that it's running on all of our k8s clusters and is HA) instead of running as a standalone docker container.
+I'll have SSLiaison use some distributed database (probably CockroachDB) to store the HTTP challenges so that it doesn't matter
+which k8s cluster the challenge request from the ACME server is routed to.
+Next Steps for NWS
+
+- HA NWS Management Engine: Currently (as somewhat discussed above), the NWSME will go down when NWS Hill Country goes down. I'd like to
+make it so that this isn't the case. This would likely just require that each NWS cluster runs its own instance of Rancher Fleet instead
+of one central Rancher Fleet that manages all the clusters. It would also require the HA SSLiaison.
+
+
+- IaC for Everything: Currently, all NWS CDS services are defined in yaml files in a git repo, however the underlying infrastructure that
+it runs on is not. Ideally, I'd like every NWS machine to run Proxmox and then have Terraform & Ansible configs to define how to set up
+vms on proxmox that will run the k8s clusters that support CDS services. This should eliminate my headaches of sshing into each machine
+to apply config changes and make sure everything is standardized. It should also make the process of setting up new servers easy.
+
+
+- Monitoring: I've been working on setting up monitoring on a lot of our services at my current internship using the TIG stack (Telegraf,
+InfluxDB, and Grafana). Now that I've been exposed to the usefulness of having a bunch of metrics on hand, I think it would be nice to have
+some dashboards setup for NWS to monitor speed, resource usage, uptime, and traffic. Doing this would also make it possible to expose resource usage in the
+NWS dashboard.
+
+
+Enhanced Infrastructure: This is kind of a blanket one for things I want to do that don't fit into other categories. It includes making
+hardware upgrades (mostly adding more storage), make management more accessible (such as Dell IDRAC's WebSerial), some load testing to
+identify painpoints, run an NWS machine in a cloud VM so I can say it's cross cloud (although my friends have told me this is cheating at creating
+my own cloud), and trying to figure out how to set up an Anycast network. I don't think I can setup an Anycast network without selling
+a kidney first. Renting a /24 CIDR alone would be more than I want to spend on a side project. I may look into setting it up with ipv6 only,
+however I'd still have to jump through hoops to get an Autonomous System number from an RIR. I'll probably write a whole blog about Anycast
+in the coming weeks.
+
+Reduced External Dependence: The main goal of NWS is to have no external dependence. In theory, everything but core internet infrastructure
+should
+
+
+Olney
+Rust, ActixWeb, PostgreSQL
+Olney is a new project I am starting with my friend Sridhar Nandigam. It aims to make
+tracking your job applications easier. Most of my friends either use spreadsheets or Trello to track their job applications, I
+think that we can make something that's a bit better for the job. Some features I'd like to have are: resume version attached to
+your application, job posting notifications from job boards such as pittcsc, and watching
+your email for emails from recruiters. Currently, I have part of the backend setup with basic CRUD operations. Now that I'm done with
+the latest batch of NWS work, this is next on my list to work on.
+
+These projects had minimal/no work done on them: RingGold, SQUIRREL
diff --git a/src/blogs/side-project-8-15-23.filler.html b/src/blogs/side-project-8-15-23.filler.html
new file mode 100644
index 0000000..22ace55
--- /dev/null
+++ b/src/blogs/side-project-8-15-23.filler.html
@@ -0,0 +1,60 @@
+Side Project Log 8/15/2023
+This side project log covers work done from 8/8/2023 - 8/15/2023
+
+Olney
+
+ I added a frontend to Olney and added a feature where it can automatically keep track of your job applications
+ by monitoring your email.
+
+
+Frontend
+
+ The frontend was made with Svelte. I chose not to use any UI/CSS libraries as I wanted to keep the number of
+ dependencies low. This was another good opportunity to learn about Svelte.
+
+
+Automatic Tracking via E-Mail
+
+ This is the killer feature that I initially set out to build Olney for. This works by having the user forward their
+ E-Mail to an instance of Olney. To receive E-Mail, Olney uses Inbucket, a mailserver
+ easily hostable within Docker. It listens on a websocket for incoming mail. Whenever a new mail message is received,
+ Olney uses the OpenAI API to get a summary of the email in the following format:
+
+
+
+{
+ isRecruiting: bool, // is the message about recruiting?
+ recruitingInfo: null | {
+ location: string, // Location in City, Providence/State, Country format
+ company: string, // Casual name of company e.g: Google, Cisco, Apple
+ position: string, // Name of job position
+ type: "assessment" | "interview" | "offer" | "rejection" | "applied" // What the message is discussing
+ dateTime: string, // DateTime communication rec'd OR DateTime that is being discussed (i.e. interview date confirmation)
+ name: string // Name of event, giving more detail to type
+ } // null if message is not about recruiting, fill with values if it is
+}
+
+
+
+ Olney then takes some details from this data, namely: company, position, and location and then uses the OpenAI API to generate
+ an embedding. We then query the closest match out of the job applications
+ in the database (with pgvector). Once we have the job application, we add
+ the event to the database, using the job application's id as a fkey.
+
+
+
+ I chose embedding as the lookup method so that we don't have to worry about the data parsed out of the email being an exact
+ match for what the user inputted. This also allows the lookup to work even when certain things such as location are missing from the
+ email.
+
+
+
+ Olney should be open-sourced/released within the next week or two.
+
+
+
+These projects had minimal/no work done on them: NWS, RingGold, SQUIRREL
+
+
+
+
\ No newline at end of file
diff --git a/src/blogs/side-project-8-8-23.filler.html b/src/blogs/side-project-8-8-23.filler.html
new file mode 100644
index 0000000..b5cb8a7
--- /dev/null
+++ b/src/blogs/side-project-8-8-23.filler.html
@@ -0,0 +1,65 @@
+Side Project Log 8/8/2023
+This side project log covers work done from 7/12/2023 - 8/8/2023
+
+SQUIRREL
+
+ SQUIRREL has been updated to work with INSERT INTO and SELECT queries. I also refactored much of the codebase to do error handling more elegantly and to make the parser
+ more extensible. Here's a screenshot of table creation, data insertion, and data selection:
+
+
+
+ The biggest challenge of this part was working on the parser which has now been written three times. The approaches to the parsing were:
+
+
+
+ -
+ Stepping through whitespace:
This was my initial and naive approach to the problem. I split the input string by its whitespace
+ and then queried values by referencing their indexes in the split string.
+
+ -
+ Regex:
This approach was cleaner than the first and led to a small parser, however it required an external dependency (which I'm
+ trying to minimize), and would make it hard to add additional features to commands later down the line.
+
+ -
+ Finite state machine:
This solution was more verbose than the others, however it allows for easier development. This method works
+ by splitting the query string into tokens. Tokens are the smallest piece of data that a parser recognizes. SQUIRREL gets them by splitting
+ the input by delimiters and using the split list as tokens (excluding whitespace) SQUIRREL recognizes the following characters as delimiters:
+
+
+
+ ' ', ',', ';', '(', ')'
+
+
+
+ This means that the string "INSERT INTO test (id) VALUES (12);" would be parsed into the list: "INSERT", "INTO", "test", "(", "id", etc..
+
+
+
+ Once we have our list of tokens, we iterate through them starting at a default state and perform a certain task for the given state, which
+ usually includes switching to another state. We do this until we reach the end state.
+
+
+
+ For example, with the above insert statement, we would start in the IntoKeyword state which would ensure that "INTO" is the current token.
+ We would then transition to the TableName state which would read the table name and store it in the ParsedCommand struct we're returning. We
+ would then move to the ColumnListBegin state which would look for an opening parenthesis, and switch the state to ColumnName. This process
+ continues with the other parts of the query until the Semicolon state is reached which checks that the statement ends with a semicolon, then
+ returns the ParsedCommand struct.
+
+
+
+
+
+ Next steps for this are to add column selection to SELECT statements and add WHERE clauses to SELECT statements.
+
+
+Olney
+
+ I added a feature to the Olney API which scans the pittcsc (now Simplify) summer internships Github repo
+ and parses the data into JSON format. I parsed the markdown file they have uisng regex which was relatively simple. There were some issues during development due to the
+ changing structure of the markdown file. These issues are being fixed on a rolling basis. I expect the changes to slowdown now that the transition from pittcsc to Simplify
+ is complete. You can access the JSON at olney.nickorlow.com/jobs.
+
+
+
+These projects had minimal/no work done on them: NWS, RingGold
diff --git a/src/blogs/spring-break-2023.filler.html b/src/blogs/spring-break-2023.filler.html
new file mode 100644
index 0000000..8b48e20
--- /dev/null
+++ b/src/blogs/spring-break-2023.filler.html
@@ -0,0 +1,57 @@
+Spring Break 2023
+It's Spring Break, and that means I finally have time to spend all day working on side projects without having to worry about school.
+I figured I should write out the side projects I plan to work on over the break
+RingGold
+Rust, Swift, PostgreSQL
+Last week, me and my cousin wanted to try out Apple's fitness competition feature that works with Apple Watch. It works
+by giving you 1 point for every percent you complete of your move, exercise, and stand goals with a point cap of 600
+per day. The issue with it was that it didn't work at all, not syncing on time if at all. I want to build a clone of it
+with some additional features such as:
+
+Notifications: I didn't like how it was possible to workout and gain a bunch of points and just completely blindside your opponent. Hopefully this would encourage users to workout even more.
+
+Widget/Watch Complication: Similar to the above, adding a homescreen widget or a watch complication would make it easier to keep up with your competitor's progress.
+
+Custom Competitions: I think it'd be nice to have competitions with custom rules and lengths so that you're not stuck with only one setting. Settings could include custom duration and custom caps on points.
+
+
+I'm building the web API for it in Rust and the mobile app in Swift. I chose these languages to gain more exposure to them, also
+Swift was a good choice since the app is going to be platform specific to iOS due to its need to integrate with Apple Watch.
+(this is named after New Ringgold, PA)
+NWS Container Deployment Service
+C#, Rancher
+I've created my own hosting/cloud service called Nick Web Services. It currently allows people to deploy
+dockerized applications on my geo-distributed k8s clusters running on Dell Poweredge servers. In order to actually deploy this, I
+had to manually create the Kubernetes manifest files and then ssh into each individual server and apply them. I've setup
+Rancher Fleet to automate this process by pulling the manifest from a git repo (this is something called gitops). I also
+wrote an API to generate the manifest files and then upload them to a git repo. I have a video demo of this working that
+you can watch here.
+Currently, the service works for deployment but only if you don't want to use SSL or you use Cloudflare's flexible SSL
+technology. I wrote a separate blog post here about the challenges of doing this and how I plan on implementing it.
+I'd like to complete part of this implementation during the break.
+VerifiedBot
+JavaScript, Rust
+This project isn't a personal project, as a lot of it was built by my friends Arpan and Ben.
+A little over a year ago, we wanted to make a Discord bot to verify that people on some Discord servers we ran
+went to the University of Texas. Initially, it worked by verifying you had a utexas.edu email address and then verifying
+some additional information via LDAP. A few months ago Ben found out that using the SaaS survey software that the university uses
+(qualtrics), we could have users verify themselves by using the university's SSO system. This works because qualtrics can send
+data to a webhook when a survey is complete, and it can also require signing in with the university's SSO before filling out a survey.
+It required that I write a wasm wrapper for an encryption library. I wrote almost all the code for this function last year, but
+due to a bug in qualtrics, it wasn't working properly. It seems that this bug has been fixed and we can start rolling it out.
+Personal Website Facelift
+Typescript, React
+My personal website (this one) is a little overdue for some design updates. My main focus will be making it more mobile
+friendly. Last year, I made some improvements to make it usable on mobile but it still doesn't feel quite right. I also
+think that it has some information overload in some areas such as the projects section. I think that to mitigate this I
+might just have a small summary of each project and then you can click into each to learn more about it, similar to my
+friend Raul's Website. I'm also considering a move to tab-based navigation so that I can have
+more information in each section. Further down the line, I think I might re-write it using Svelte as I'm seeing it being used more and more
+and would like to get some exposure to it.
+Mahantongo
+Rust, PostgreSQL
+I'm one of the members of the Community Team that runs some UT Computer Science community Discord servers.
+Currently, a Discord bot called Carlbot provides us a star-board, which is a specific channel where messages that 5 or more people
+react to with a star emoji get posted. It's supposed to be a collection of the funniest and best messages sent on the server.
+One of the things our server members have wanted is the addition of more '*-board' channels where you can create multiple star-board
+like channels but with custom emojis. I'm writing it in Rust and I'm just hoping to use this project to get more acquainted with the language.
diff --git a/src/extra.filler.html b/src/extra.filler.html
new file mode 100644
index 0000000..6fb9429
--- /dev/null
+++ b/src/extra.filler.html
@@ -0,0 +1,112 @@
+
+
Extra
+
Extra bits of information about me
+
+
Rail Photography
+
+ I take photos of trains and train stations fairly often.
+ If you would like to see these pictures, they are available
+ here
+
+
+
Bowling
+
+ I go bowling with some friends regularly. We track our scores
+ down to the throw in a csv. You can check out a website where
+ that data is compiled into a readable format
+ here
+
+
+
Personal Records
+
+
+ Activity |
+ Effort |
+ Date |
+ Location |
+
+
+ 1600m (1 mile) |
+ 4:34 |
+ November 14th, 2020 |
+ Williamson County Park |
+
+
+ Milk Mile |
+ 5:41 |
+ May 20th, 2021 |
+ Lake Travis High School |
+
+
+ 3200m (2 mile) |
+ 10:11 |
+ March 20th, 2021 |
+ Carroll High School |
+
+
+ 5000m XC |
+ 16:43 |
+ September 26th, 2020 |
+ Old Settler's Park |
+
+
+ Bench Press |
+ 280.5 Lbs |
+ December 31st, 2024 |
+ Anytime Fitness - Pottsville, PA |
+
+
+ Squat |
+ 415 Lbs |
+ August 10th, 2023 |
+ FUTO HQ |
+
+
+ Deadlift |
+ 415 Lbs |
+ Augist 10th, 2023 |
+ FUTO HQ |
+
+
+ Bowling |
+ 170 |
+ April 19th, 2024 |
+ Texas Union Underground |
+
+
+
+
+
+
+
PGP Key
+
+
+ -----BEGIN PGP PUBLIC KEY BLOCK-----
+
+ mDMEZ8J/bhYJKwYBBAHaRw8BAQdAGaG9EehhWlKQQXP42W3Uvv6qkyo1NPzYASkR
+ vx4m0Y20K05pY2hvbGFzIE9ybG93c2t5IDxuaWNrb3Jsb3dAbmlja29ybG93LmNv
+ bT6IkwQTFgoAOxYhBPFsfG56tNFpdTscKKnzukwKp6cLBQJnwn9uAhsDBQsJCAcC
+ AiICBhUKCQgLAgQWAgMBAh4HAheAAAoJEKnzukwKp6cLrHYBAOFT953mpAY3yVE9
+ tvcA4sdpkmWw/OIrsd24vW74ykWyAQCvtqwLfsVvZxXRzvWOau3P+IrnYP5UGXJj
+ snieP3vXDLg4BGfCf24SCisGAQQBl1UBBQEBB0BOiEhnLnikOTCENkGfgmIRdswh
+ 0qzryW9PMq5BN24BaAMBCAeIeAQYFgoAIBYhBPFsfG56tNFpdTscKKnzukwKp6cL
+ BQJnwn9uAhsMAAoJEKnzukwKp6cLyF8A/i46c9EPhzwlvkgLRJzsuHAoWX9DcCLR
+ JH39kfjZ5ecTAP4kQ+aw/oD3lhaDiIrEo1MobVDzoCM5wV39ci6klBsVCw==
+ =p51G
+
+ -----END PGP PUBLIC KEY BLOCK-----
+
+
+
+
diff --git a/src/index.filler.html b/src/index.filler.html
new file mode 100644
index 0000000..da06959
--- /dev/null
+++ b/src/index.filler.html
@@ -0,0 +1,28 @@
+
diff --git a/src/projects.filler.html b/src/projects.filler.html
new file mode 100644
index 0000000..2b0cd76
--- /dev/null
+++ b/src/projects.filler.html
@@ -0,0 +1,148 @@
+
+
Projects
+
+
+
Project Warminster: yayacemu, yacemu, yagbemu
+
C, C++, and SystemVerilog
+
+ [ Git Repo: yacemu ]
+ [ Git Repo: yayacemu ]
+
+
+ [ Tetris Demo: yayacemu ]
+ [ Bowling Demo: yayacemu ]
+
+
+ Project Warminster is a collection of 3 subprojects:
+
+ - yacemu (Yet Another Chip Eight Emulator): A CHIP-8 emulator written in C
+ - yayacemu (Yet Another Yet Another Chip Eight Emulator): A CHIP-8 hardware implementation in SystemVerilog (that works on real hardware)
+ - yagbemu (Yet Another Gameboy Emulator): A Gameboy hardware implementation in SystemVerilog (WIP, not public yet)
+
+ This project taught me a lot of practical hands-on things about Computer Architecture. Designing the hardware driver for the ST7920 LED display was
+ the most challenging part. Debugging hardware adds a lot of complications, you don't get breakpoints or a nice debugger like gdb. Additionally,
+ interference, faulty wires, timing, and debouncing all throw wrenches into the mix.
+
+
+
+
+
+
Nick Web Services (NWS)
+
C#, Kubernetes, Rancher, and HAProxy
+
[ Project Website ]
+
+ Nick Web Services is a cloud infrastructure provider service that I created and run.
+ It allows people to deploy containerized versions of their web apps across our multiple
+ points of presence. It provides geo-distributed high availability by default with no extra configuration
+ needed from users hosting their webapp with us.
+
+
+ Hardware-wise we use old Dell PowerEdge servers running Proxmox. We then have VMs running
+ in Proxmox that run Kubernetes clusters. At the peak I had 4 points of presence: Austin, Hill Country,
+ Schuylkill, and Philadelphia. The deployments are managed through GitOps with Rancher Fleet. Unfortunately,
+ we only have one point of presence at the moment due to a number of factors, however that should
+ change this fall.
+
+
+ NWS maintained 100% uptime for the period from 11/8/2023 to 11/28/2024 (over a year!).
+
+
+ The website you're reading this on right now is hosted on NWS!
+
+
+
+
+
Anthracite Web Server
+
C++, CMake, and Python
+
[ Git Repo ]
+
+ Anthracite is a web server written for Linux in C++. It currently supports both HTTP/1.0 and HTTP/1.1 and TLS.
+ It heavily uses a dependency injection design pattern to allow for a high degree of customization.
+ It currently uses an event-loop threading model and uses the epoll() system call to efficiently detect
+ events. Previously, it used a connection per thread model.
+
+
+ Anthracite's HTTP request parser is able to parse roughly 27 million requests per second on my laptop, compared
+ to Boost's HTTP parser which parsed roughly 1 million per second. I'd imagine a lot of this is due to missing
+ functionality in Anthracite's HTTP parser, but it's enough to get by! While I haven't run extensive end-to-end
+ tests on the newest version of Anthracite, in the limited tests I've done during development, it's been able to
+ handle ~300k RPS on my laptop, a comparable number to NGINX.
+
+
+ The website you're reading this on right now is hosted with Anthracite!
+
+
+
+
+
RAZZLE
+
C, ASM, and CMake
+
[ Git Repo ]
+
+ RAZZLE is a monolithic kernel. Currently, it's very limited and I haven't made a lot of progress on it.
+ It's currently single-core but supports preemptive timesharing. It has basic I/O interfaces for ps2,
+ serial, and vga. It currently has a very limited in-ram filesystem using a proprietary filesystem.
+ I'm currently working on adding an ATA driver so I can have programs run on RAZZLE without including
+ them at build-time.
+
+
+
+
+
+
+
+
SQUIRREL
+
Rust
+
[ Git Repo ]
+
+ SQUIRREL stands for SQL Query Util-Izing Rust's Reliable and Efficient Logic. It is a SQL database
+ that I am writing in Rust. Currently, it can create tables, insert data into tables, and select all
+ data from a given table. The biggest challenge so far has been writing the parser. My next steps are
+ to add WHERE clauses to SELECT statements, allow column filtering in SELECT statements, and add DELETE
+ statements.
+
+
+
+
+
CavCash
+
C#, Kubernetes, SQL Server, and MongoDB
+
+
+ CavCash was a company that I founded which built a debit-based payment system similar to
+ PayPal and Venmo. I assembled a 5 person team and took on a technical role in the company,
+ writing most of our backend codebase. Our backend used C#, ASP.NET, Microsoft SQL Server,
+ and MongoDB. Our infrastructure changed throughout the lifetime of the company, initially
+ it was on Microsoft Azure using Azure App Service. We then pivoted to AWS using Elastic
+ Beanstalk. We also ran on Google Cloud Platform using Compute Engine. Finally, we setup our
+ own servers in-house and managed our deployments with Kubernetes.
+
+
+ We launched in 2021, with the ability to send money between real banks using the ACH network.
+ We ended up processing a few hundred dollars in transaction volume before ultimately shutting
+ down due to a lack of funding.
+
+
+
+
+
diff --git a/src/structure.template.html b/src/structure.template.html
new file mode 100644
index 0000000..8928886
--- /dev/null
+++ b/src/structure.template.html
@@ -0,0 +1,23 @@
+
+ Nicholas Orlowsky
+
+
+
+
+
+
+
+ {{ body_area }}
+
+
+