diff --git a/.github/workflows/hugo.yaml b/.github/workflows/hugo.yaml index 41bd0cc..eb7dff7 100644 --- a/.github/workflows/hugo.yaml +++ b/.github/workflows/hugo.yaml @@ -45,7 +45,7 @@ jobs: --minify \ --baseURL "${{ steps.pages.outputs.base_url }}/" - name: Upload artifact - uses: actions/upload-pages-artifact@v1 + uses: actions/upload-pages-artifact@v3 with: path: ./public @@ -53,9 +53,13 @@ jobs: environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} + permissions: + actions: read + pages: write + id-token: write runs-on: ubuntu-latest needs: build steps: - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v2 + uses: actions/deploy-pages@v4 diff --git a/README.md b/README.md new file mode 100644 index 0000000..e8b537a --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +# marcus8448.github.io + +My personal website/portfolio. +Built with Hugo and hosted on GitHub Pages. diff --git a/assets/main.scss b/assets/main.scss index 895ea4a..5c67137 100644 --- a/assets/main.scss +++ b/assets/main.scss @@ -1,26 +1,51 @@ @charset "utf-8"; -$navbar-breakpoint: 480px; -$footer-padding: 2rem 1.5rem 4rem; -//$info: darken(hsl(207, 61%, 53%), 10%); - -@import 'bulma/sass/base/_all'; -@import "bulma/sass/utilities/_all"; - -@import 'bulma/sass/elements/box'; -@import 'bulma/sass/elements/container'; -@import 'bulma/sass/elements/content'; -@import 'bulma/sass/elements/icon'; -@import 'bulma/sass/elements/image'; -@import 'bulma/sass/elements/title'; -@import 'bulma/sass/components/media'; -@import 'bulma/sass/components/navbar'; -@import 'bulma/sass/grid/columns'; -@import 'bulma/sass/helpers/_all'; -@import 'bulma/sass/layout/footer'; -@import 'bulma/sass/layout/hero'; - -@media (max-width: $tablet) { +@use "bulma/sass/base"; +@use "bulma/sass/utilities/initial-variables" as iv; +@use "bulma/sass/utilities/derived-variables" with ( + $custom-colors: ( + "light-yellow": ( + hsl(42, 100%, 90%), + iv.$black, + ), + "light-blue": ( + hsl(219, 61%, 90%), + iv.$black, + ), + "nav-blue": ( + hsl(219, 61%, 53%), + iv.$white, + ), + ) +); + +@use "bulma/sass/themes"; + +@use "bulma/sass/helpers"; +@use "bulma/sass/utilities"; + +@use "bulma/sass/components/dropdown"; +@use "bulma/sass/components/panel"; +@use "bulma/sass/components/navbar" with ( + $navbar-breakpoint: 480px, + //$navbar-background-color: hsl(180,100%,97%) +); + +@use "bulma/sass/elements/box"; +@use "bulma/sass/elements/content"; +@use "bulma/sass/elements/title"; +@use "bulma/sass/elements/image"; + +@use "bulma/sass/layout/container"; +@use "bulma/sass/layout/hero"; +@use "bulma/sass/layout/media"; +@use "bulma/sass/layout/footer" with ( + $footer-padding: 2rem 1.5rem 4rem +); + +@use "bulma/sass/grid/columns"; + +@media (max-width: iv.$tablet) { .only-mobile { display: inherit; } @@ -28,7 +53,8 @@ $footer-padding: 2rem 1.5rem 4rem; display: none !important; } } -@media (min-width: $tablet) { + +@media (min-width: iv.$tablet) { .only-mobile { display: none !important; } @@ -36,3 +62,28 @@ $footer-padding: 2rem 1.5rem 4rem; display: inherit; } } + +@media (prefers-color-scheme: dark) { + .invert-dark { + filter: invert(1) + } +} + +// based on: https://stackoverflow.com/a/52375669 +@function str-split($string) { + @return str-slice($string, 1, str-index($string, " ") - 1); +}; + +$hero-med-height: str-split("#{hero.$hero-body-padding-medium}"); + +@media (max-width: iv.$tablet) { + .content-med-hero-size { + min-height: calc(100vh - #{navbar.$navbar-height} - #{$hero-med-height} - 10rem); + } +} + +@media (min-width: iv.$tablet) { + .content-med-hero-size { + min-height: calc(100vh - #{navbar.$navbar-height} - #{$hero-med-height} - 23rem); + } +} diff --git a/content/_index.md b/content/_index.md index 925ed8b..82ea034 100644 --- a/content/_index.md +++ b/content/_index.md @@ -1,18 +1,8 @@ --- title: "Home" +heroTitle: "Hi, my name is Marcus." +heroSubtitle: "I'm a programmer from Canada with experience in Java, C/C++, and Rust." --- -### Hi, my name is Marcus. - -I'm a programmer from Canada with experience in Java, C++, and Rust. - -[//]: # (I'm particularly interested in build tooling (buildscripts) and compilers.) - -You probably know me from [Galacticraft](/projects/galacticraft) (or, maybe you know me IRL). +You probably know me from [Galacticraft](/projects/galacticraft). ---- - -I've been programming for many years now, -mainly in Java where I have written multiple JavaFX applications and modifications for Minecraft. - -I have also written command line applications and a web service backend using Rust, -and have worked with embedded C++. diff --git a/content/blog/_index.md b/content/blog/_index.md index 61ae3b9..451b13c 100644 --- a/content/blog/_index.md +++ b/content/blog/_index.md @@ -1,10 +1,6 @@ --- title: "Blog" description: Coming soon™ -heroType: is-link +heroType: is-background-light-blue-soft date: 2023-09-22T13:51:23-07:00 --- - -I'll write something here, someday. - -# Posts diff --git a/content/blog/test-post-2.md b/content/blog/test-post-2.md new file mode 100644 index 0000000..12843c3 --- /dev/null +++ b/content/blog/test-post-2.md @@ -0,0 +1,7 @@ +--- +title: "Test Post 2" +description: "Hello world!" +date: 2024-06-01T00:00:00-07:00 +--- + +Hello world diff --git a/content/blog/test-post.md b/content/blog/test-post.md index 87768be..7e80b84 100644 --- a/content/blog/test-post.md +++ b/content/blog/test-post.md @@ -1,6 +1,6 @@ --- title: "Test Post" -description: "Some sort of blog entry" +description: "Hello world!" date: 2023-09-22T13:51:23-07:00 --- diff --git a/content/projects/_index.md b/content/projects/_index.md index 5a33d86..ae36c51 100644 --- a/content/projects/_index.md +++ b/content/projects/_index.md @@ -1,5 +1,5 @@ --- title: "Projects" description: Things that I've created over the years -heroType: is-link +heroType: is-background-light-blue-soft --- diff --git a/content/projects/chat.md b/content/projects/chat.md index cd29129..19895fa 100644 --- a/content/projects/chat.md +++ b/content/projects/chat.md @@ -5,7 +5,7 @@ icon: /image/chat.png Description: | An encrypted, ephemeral instant messaging app. repository: https://github.com/marcus8448/Chat -heroType: is-light +heroType: has-background-light-soft languages: - java - gradle @@ -13,30 +13,52 @@ languages: # About -This was a fun project that I made in approximately 2 weeks to gain more experience using JavaFX. +This was a project that I made in approximately 2 weeks to gain more experience using JavaFX. This time I avoided FXML and defined the GUI in pure Java. It uses a multi-project Gradle build to enable code sharing between the client and server applications, while keeping them as separate binaries. I found it interesting to compare the strengths and weaknesses of different cryptographic ciphers for this project. Originally, everything was based on RSA keys, -until I realized the max block size was too small (and thereby moved to use AES session keys). +until I realized the max block size could not support large messages (and thereby moved to use AES session keys). # Features * Channel support -* Notification support -* Support for both text and image messages -* Messages are encrypted over the network - * After an initial handshake with RSA keys, a session AES key is generated and sent by the server +* System tray notification support +* Support for sending both text and images +* Messages are encrypted over the network (however, they are not end-to-end encrypted) * The server saves no user information * User accounts are based on RSA keys * Server just acts as a router * Messages are not stored * Only those watching a channel will see messages that are sent * Upon closing the client, all history is forgotten -* User account data stored on the client is encrypted with a password - * Uses PBKDF2 +* User account data stored on the client is encrypted with a password using PBKDF2 + +# Security + +### Initial Handshake + +Upon connecting to a server, the client and server exchange public RSA keys. +If the server's RSA key has changed, +or the client has never connected to the server before, +the client will ask the user if they trust the server's key. + +The server then sends a session AES key, encrypted with the client's public key. +This key is used to encrypt all future messages sent between the client and server. + +### Message Signatures + +All messages are signed with the sender's RSA private key. +Keys can be marked as 'trusted' in the client, and given nicknames. +If a message is signed by a key that is not trusted, the client will display a warning. + +### Client-side Security + +The client stores user account data in a file encrypted with a PBKDF2 key derived from the user's password. +This prevents the user's account data from being used if the file is stolen. +However, this also means that if the user forgets their password, they will lose all their account data. ### Disclaimer diff --git a/content/projects/galacticraft.md b/content/projects/galacticraft.md index 661a4b8..860c189 100644 --- a/content/projects/galacticraft.md +++ b/content/projects/galacticraft.md @@ -18,13 +18,13 @@ languages: # About I started to contribute to Galacticraft (4) through issue/bug reports in 2017 and pull requests in 2018. -In 2019 I was invited to work on Galacticraft 5 (called Galacticraft: Rewoven at the time) and have worked on it since then. +In 2019, I was invited to work on Galacticraft 5 (called Galacticraft: Rewoven at the time) and have worked on it since then. As a member of the international team creating Galacticraft 5, I have: -* Implemented a graph based wire network (power distribution) system +* Implemented a graph-based wire network (power distribution) system * Created an extensible framework for making machines (see [MachineLib](/projects/MachineLib)) -* Ported numerous pieces of content +* Ported many pieces of content * Noise and world generation code * Blocks, items, tools * Entities diff --git a/content/projects/gamemodeoverhaul.md b/content/projects/gamemodeoverhaul.md index 3614ab3..b3bd096 100644 --- a/content/projects/gamemodeoverhaul.md +++ b/content/projects/gamemodeoverhaul.md @@ -8,7 +8,7 @@ Description: | repository: https://github.com/marcus8448/MinecraftMods modrinth: gamemodeoverhaul curseforge: gamemodeoverhaul -heroType: is-light +heroType: has-background-light-soft languages: - java - gradle @@ -16,7 +16,7 @@ languages: # About -This was my first real mod for Minecraft, made in February 2019. +This was my first proper Minecraft modification, originally released in February 2019. Created in about two weeks, the original goal of this mod was just restore the removed integer `/gamemode` arguments, but its scope steadily expanded to other commands and aliases. diff --git a/content/projects/machinelib.md b/content/projects/machinelib.md index 294804a..a71ba49 100644 --- a/content/projects/machinelib.md +++ b/content/projects/machinelib.md @@ -5,7 +5,7 @@ icon: /image/machinelib.png Description: | A library for Minecraft mods that simplifies the implementation of complex blocks that process resources. repository: https://github.com/TeamGalacticraft/MachineLib -heroType: is-light +heroType: has-background-light-soft languages: - java - gradle @@ -26,7 +26,7 @@ I decided to try and make my own implementation using the newly standardized * Builder-style resource storage (inventory) creation * Slot resource filtering * Define slot locations in one place - * Simply define acceptable external block interactions and player interactions by setting a slot's type + * Define acceptable external block interactions and player interactions by setting a slot's type * Comes with a base `BlockEntity` implementation * Supports player-configurable resource I/O interactions with adjacent blocks * Minecraft redstone (de)activation diff --git a/content/projects/robotics/v5_cli.md b/content/projects/robotics/v5_cli.md index 97d9ebc..1bff9a5 100644 --- a/content/projects/robotics/v5_cli.md +++ b/content/projects/robotics/v5_cli.md @@ -2,9 +2,8 @@ title: "v5_cli" date: 2022-12-12T22:17:00-08:00 icon: /image/v5_cli.png -heroType: is-light -Description: | - A re-implementation of [pros-cli](https://github.com/purduesigbots/pros-cli) in Rust, adding true wireless (bluetooth) upload support. +heroType: has-background-light-soft +Description: A re-implementation of [pros-cli](https://github.com/purduesigbots/pros-cli) in Rust, adding bluetooth upload support. repository: https://github.com/marcus8448/v5_cli languages: - rust @@ -18,11 +17,10 @@ I chose to (re)write it in Rust mainly to gain experience with the language, but also because I was already familiar with one of its CLI frameworks, [clap](https://clap.rs/). Once I had made an app with about the same features as the original, -I left the project alone for a while... -Until I discovered that [direct bluetooth connection](https://gist.github.com/wireboy5/e41444a135d7643c92fc3b83aa69058b) +I left the project alone until I discovered that [direct bluetooth connection](https://gist.github.com/wireboy5/e41444a135d7643c92fc3b83aa69058b) to the VEX V5 brain was possible. This led me to try and enable wireless code upload over bluetooth LE. -Utilizing bluetooth was more difficult than I originally anticipated as bluetooth APIs tend to be asynchronous +Using bluetooth was more difficult than I originally anticipated as bluetooth APIs tend to be asynchronous and bluetooth connections are significantly less reliable than wired ones. This required me to rearchitect the project to use asynchronous Rust, and account for packet loss and/or corruption in-transit. @@ -31,9 +29,14 @@ and account for packet loss and/or corruption in-transit. # Features * Connect to V5 robot via usb or wirelessly via bluetooth + * Significantly better throughput compared to VEXnet controller connections. * Upload binaries * Supports PROS style hot/cold linking * Manage robot filesystem * Installed programs, metadata * Update robot name, team number * Connect to running program's standard input/output for debugging +* List connected V5 devices +* Keep robot connection alive with a daemon + * Automatically reconnects if connection is lost + * Allows for interaction with standard i/o and the system i/o simultaneously diff --git a/content/projects/robotics/vex-v5.md b/content/projects/robotics/vex-v5.md index 98122e7..63123a6 100644 --- a/content/projects/robotics/vex-v5.md +++ b/content/projects/robotics/vex-v5.md @@ -3,10 +3,10 @@ title: "VEX V5" date: 2021-11-16T18:07:43-07:00 icon: /image/vex-v5.png Description: | - I have participated in the [Vex Robotics Competition](https://www.vexrobotics.com/v5/competition/) - since the 2021-2022 season (VRC Tipping Point). + I participated in the [Vex Robotics Competition](https://www.vexrobotics.com/v5/competition/) + from 2021-2024. repository: https://github.com/marcus8448/VexV5 -heroType: is-warning +heroType: has-background-light-soft languages: - c - cplusplus @@ -15,24 +15,24 @@ languages: # About -In 2021 I started competing in the VEX robotics competition. +In 2021, I started competing in the VEX robotics competition. This was my first real application using C++ (ignoring Arduino). On the tooling side, I learned about makefiles and managing dependencies in the C/C++ ecosystem. To improve IDE integration and remove platform-specific build code, I rewrote the program's makefile as a CMake project in my second year of robotics. -Compared to Makefiles, I found CMake to be quite fun to use. +Compared to Makefiles, I found CMake to be much simpler to use and quickly iterate on. It handled cross-compilation surprisingly well and made building with different compilers significantly easier. -Currently, I am focused on adopting modern C++ practices in my code and improving my debugging and testing tools. - # Features -* Use of LVGL to draw information on the screen +* Runtime sensor diagnostic information and debug tools on the screen (LVGL) * Runtime PID tuning * Real-time graphing of sensor information * Select autonomous run via the screen * Uses a CMake project instead of Makefiles (compared to a typical [PROS](https://pros.cs.purdue.edu/) project) * Improved IDE support (can generate a Visual Studio project) * Run `clang-tidy` or `clang-format` over the project's sources - * Develop on windows without a full cygwin environment + * Simplified dependency management + * Better support across operating systems + * Simplified build process diff --git a/content/projects/website.md b/content/projects/website.md index 27e8079..689f1fb 100644 --- a/content/projects/website.md +++ b/content/projects/website.md @@ -6,7 +6,7 @@ Description: | My portfolio/website. Built with Hugo and Bulma and hosted on GitHub Pages. repository: https://github.com/marcus8448/marcus8448.github.io link: https://marcus8448.github.io/ -heroType: is-warning +heroType: has-background-light-soft languages: - html5 diff --git a/layouts/_default/baseof.html b/layouts/_default/baseof.html index 238fc39..1e4927f 100644 --- a/layouts/_default/baseof.html +++ b/layouts/_default/baseof.html @@ -44,7 +44,7 @@ -