From 28d047813f1bad2d5a6e483877da9d71a42789ed Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Tue, 15 Apr 2025 15:48:31 -0400 Subject: [PATCH] feat(software): document my competitive programming setup --- .../competitive-programming-setup.html | 95 --------------- posts/software/my-cp-setup.html | 111 ++++++++++++++++++ public/posts/my-cp-setup/cp-setup.webp | Bin 0 -> 37132 bytes scripts/index.js | 1 + styles/post.css | 4 + 5 files changed, 116 insertions(+), 95 deletions(-) delete mode 100644 posts/software/competitive-programming-setup.html create mode 100644 posts/software/my-cp-setup.html create mode 100644 public/posts/my-cp-setup/cp-setup.webp diff --git a/posts/software/competitive-programming-setup.html b/posts/software/competitive-programming-setup.html deleted file mode 100644 index 5e0744a..0000000 --- a/posts/software/competitive-programming-setup.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - - - - - - - competitive programming setup - - - -
-
-
-

competitive programming setup

- -
-
-

HTML, JavaScript, and CSS

-

That's all there is to it.

-

I thought about using the following frameworks:

-
    -
  1. React.js
  2. -
  3. Next.js
  4. -
  5. Hugo
  6. -
  7. Astro
  8. -
-

- But I did not actually need any of them to make this site - look decent. -

-

What I've Learned

-

- Of course, most people build simple websites like these to learn a - new technology or framework, not to use an optimal tool. That's - actually why I - hosted this website on AWS. -

-

- Building this website with truly bare-bones technologies has made me - appreciate why these web frameworks have emerged. -

-
    -
  • - Writing JavaScript to manipulate the DOM works just fine but lacks - the readability and composability that many JavaScript frameworks - bring to the table. -
  • -
  • - Re-using code is odd. For example, I created a - "common.js" with general utilities—there is zero - indication (both to me and my language servers) that these - functions are exposed to other scripts included by the same HTML - file. -
  • -
  • - JSX is great. Dynamically inserting HTML as raw strings or writing - them line by line with the DOM is a pain, and a verbose one at - that. -
  • -
  • - Similarly, CSS styling (inline/stylesheet) works at the small - scale. However, with styles being completely divorced from the - HTML itself, much is left to be desired. -
  • -
  • - Reusing HTML, styles, and JavaScript feels extremely fragile. - Innovative type-safe, optimized, and composable solutions - definitely have their place in the web. -
  • -
  • - You can be efficient with HTML, JS, and CSS. My iteration - speed on on this site versus other React.js/MDX blogs I have - worked on is the same if not faster. While this may be a testament - to my lack of JavaScript experience, I think people conclude too - early that their task is beyond the technologies that form the - foundation of the web today. -
  • -
-
-
-
- - - - - diff --git a/posts/software/my-cp-setup.html b/posts/software/my-cp-setup.html new file mode 100644 index 0000000..c7b1eb4 --- /dev/null +++ b/posts/software/my-cp-setup.html @@ -0,0 +1,111 @@ + + + + + + + + + + my cp setup + + + +
+
+
+

my cp setup

+ +
+
+

+ Source code + here. +

+

my goals

+

+ I wanted the following features in my competitive programming (cp) + setup: +

+
    +
  • + Flexibility: support various environments (codeforces, + USACO, cses, etc.) with ease +
  • +
  • + Speed: instantaneous, non-blocking running/debugging; + automatic environment configuration and easy code testing +
  • +
  • + Editor-Agnostic: while I do provide first-in-class NeoVim + integration for my setup, it should be easily portable to + any os/editor. +
  • +
+

the solution

+

+ Some (POSIX-compliant, of course) scripts and a + makefile are more than enough. I created the following + intuitive way to interact with my CP setup: +

+
    +
  1. + make setup: populate the environment with + configurations in ~/.config/cp-template for + clang-format and clangd +
  2. +
  3. make run file
  4. +
  5. make debug file
  6. +
  7. make clean
  8. +
+

+ That's it. The makefile relies on some scripts that + compile code and run the corresponding executables. +

+

neovim integration

+
+ screenshot of my neovim competitive programming setup +
+

+ Leveraging + LuaSnip, a custom CP user command, and some scripting for + window management and asynchronous jobs, I'm able to: +

+
    +
  • + Asynchronously format, run, and debug code (:h vim.system) +
  • +
  • Use a three-window (input, output, and code) view
  • +
  • Toggle between problems instantly (yes, the windows update)
  • +
  • + Automatically populate my coding buffers with competition-specific + templates (i.e. USACO, CSES, etc.) +
  • +
  • Run the code from the CLI in less than a second
  • +
  • + Easily tweak and change the setup—there's absolutely nothing + fancy. +
  • +
+
+
+
+ + + + + diff --git a/public/posts/my-cp-setup/cp-setup.webp b/public/posts/my-cp-setup/cp-setup.webp new file mode 100644 index 0000000000000000000000000000000000000000..aa2d2765921d08438554d4515065e23276f7d592 GIT binary patch literal 37132 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 N%!;S(csc7B7y#`>zF`0W literal 0 HcmV?d00001 diff --git a/scripts/index.js b/scripts/index.js index 5550b86..9469ed3 100644 --- a/scripts/index.js +++ b/scripts/index.js @@ -2,6 +2,7 @@ const postMapping = new Map([ [ "software", [ + "my cp setup", "from github pages to aws", "designing this website", // "working in the terminal", diff --git a/styles/post.css b/styles/post.css index 1d75ad9..bfc9353 100644 --- a/styles/post.css +++ b/styles/post.css @@ -4,6 +4,9 @@ body { margin: 0; padding: 0; height: 100%; + min-height: 100vh; + display: flex; + flex-direction: column; } header { @@ -25,6 +28,7 @@ li { .main { display: flex; justify-content: center; + flex: 1; } .post-header {