Compare commits
21 commits
Author | SHA1 | Date | |
---|---|---|---|
cc7c7d7b4a | |||
a7b2713c0a | |||
a143106ade | |||
535c38cd10 | |||
13b8fd6590 | |||
c219a1d60a | |||
9739575f50 | |||
b2accdd1a3 | |||
6953d4eafc | |||
950508cb54 | |||
2b4f7a2761 | |||
b226cde9b1 | |||
54a642df99 | |||
60bc37390b | |||
ee28bb4c44 | |||
ba86ac288d | |||
489e86e2a5 | |||
21877d4d68 | |||
c7373c378c | |||
65d96c5941 | |||
57c3a8d7a2 |
29
.devcontainer/devcontainer.json
Normal file
|
@ -0,0 +1,29 @@
|
|||
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
|
||||
// README at: https://github.com/devcontainers/templates/tree/main/src/docker-existing-dockerfile
|
||||
{
|
||||
"name": "Existing Dockerfile",
|
||||
"build": {
|
||||
// Sets the run context to one level up instead of the .devcontainer folder.
|
||||
"context": "..",
|
||||
// Update the 'dockerFile' property if you aren't using the standard 'Dockerfile' filename.
|
||||
"dockerfile": "../Dockerfile"
|
||||
},
|
||||
"features": {
|
||||
"ghcr.io/devcontainers/features/node:1": {},
|
||||
},
|
||||
|
||||
// Features to add to the dev container. More info: https://containers.dev/features.
|
||||
// "features": {},
|
||||
|
||||
// Use 'forwardPorts' to make a list of ports inside the container available locally.
|
||||
"forwardPorts": [4321]
|
||||
|
||||
// Uncomment the next line to run commands after the container is created.
|
||||
// "postCreateCommand": "cat /etc/os-release",
|
||||
|
||||
// Configure tool-specific properties.
|
||||
// "customizations": {},
|
||||
|
||||
// Uncomment to connect as an existing user other than the container default. More info: https://aka.ms/dev-containers-non-root.
|
||||
// "remoteUser": "devcontainer"
|
||||
}
|
|
@ -5,11 +5,13 @@ on:
|
|||
branches:
|
||||
- "main"
|
||||
|
||||
defaults:
|
||||
run:
|
||||
working-directory: /home/mom/git/eleboog-astro
|
||||
|
||||
jobs:
|
||||
builder:
|
||||
runs-on: docker
|
||||
container:
|
||||
image: node:23-alpine
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Check out code
|
||||
uses: actions/checkout@v4
|
||||
|
@ -18,7 +20,7 @@ jobs:
|
|||
uses: docker/setup-qemu-action@v2
|
||||
|
||||
- name: Set up context
|
||||
uses: docker context create builders
|
||||
run: docker context create builders
|
||||
|
||||
- name: Set up Docker Build
|
||||
uses: docker/setup-buildx-action@v2
|
||||
|
@ -37,5 +39,5 @@ jobs:
|
|||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
push: true
|
||||
platforms: linux/amd64,linux/arm64
|
||||
platforms: linux/amd64
|
||||
tags: ${{ vars.REGISTRY_URL }}/${{ env.GITHUB_REPOSITORY }}:latest
|
2
.gitignore
vendored
|
@ -17,6 +17,8 @@ pnpm-debug.log*
|
|||
.env
|
||||
.env.production
|
||||
|
||||
.pnpm-store
|
||||
|
||||
# macOS-specific files
|
||||
.DS_Store
|
||||
|
||||
|
|
101
Dockerfile
|
@ -1,79 +1,54 @@
|
|||
# syntax=docker/dockerfile:1
|
||||
# okay, let's figure this out
|
||||
|
||||
# Comments are provided throughout this file to help you get started.
|
||||
# If you need more help, visit the Dockerfile reference guide at
|
||||
# https://docs.docker.com/go/dockerfile-reference/
|
||||
|
||||
# Want to help us make this template better? Share your feedback here: https://forms.gle/ybq9Krt8jtBL3iCk7
|
||||
|
||||
ARG NODE_VERSION=23.3.0
|
||||
ARG PNPM_VERSION=9.10.0
|
||||
|
||||
################################################################################
|
||||
# Use node image for base image for all stages.
|
||||
FROM node:${NODE_VERSION}-alpine AS base
|
||||
|
||||
# Set working directory for all build stages.
|
||||
WORKDIR /usr/src/app
|
||||
|
||||
# Install pnpm.
|
||||
RUN --mount=type=cache,target=/root/.npm \
|
||||
npm install -g pnpm@${PNPM_VERSION}
|
||||
FROM node:23.11-slim AS base
|
||||
|
||||
ENV PNPM_HOME="/pnpm"
|
||||
ENV PATH="$PNPM_HOME:$PATH"
|
||||
RUN corepack enable
|
||||
|
||||
################################################################################
|
||||
# Create a stage for installing production dependecies.
|
||||
FROM base AS deps
|
||||
WORKDIR /app
|
||||
|
||||
# Download dependencies as a separate step to take advantage of Docker's caching.
|
||||
# Leverage a cache mount to /root/.local/share/pnpm/store to speed up subsequent builds.
|
||||
# Leverage bind mounts to package.json and pnpm-lock.yaml to avoid having to copy them
|
||||
# into this layer.
|
||||
RUN --mount=type=bind,source=package.json,target=package.json \
|
||||
--mount=type=bind,source=pnpm-lock.yaml,target=pnpm-lock.yaml \
|
||||
--mount=type=cache,target=/root/.local/share/pnpm/store \
|
||||
pnpm install --prod --frozen-lockfile
|
||||
# By copying only the package.json and package-lock.json here, we ensure that the following `-deps` steps are independent of the source code.
|
||||
# Therefore, the `-deps` steps will be skipped if only the source code changes.
|
||||
COPY package.json pnpm-lock.yaml ./
|
||||
|
||||
################################################################################
|
||||
# Create a stage for building the application.
|
||||
FROM deps AS build
|
||||
FROM base AS prod-deps
|
||||
RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --prod --frozen-lockfile
|
||||
|
||||
# Download additional development dependencies before building, as some projects require
|
||||
# "devDependencies" to be installed to build. If you don't need this, remove this step.
|
||||
RUN --mount=type=bind,source=package.json,target=package.json \
|
||||
--mount=type=bind,source=pnpm-lock.yaml,target=pnpm-lock.yaml \
|
||||
--mount=type=cache,target=/root/.local/share/pnpm/store \
|
||||
pnpm install --frozen-lockfile
|
||||
FROM base AS build-deps
|
||||
RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --frozen-lockfile
|
||||
|
||||
# Copy the rest of the source files into the image.
|
||||
FROM build-deps AS build
|
||||
COPY . .
|
||||
# Run the build script.
|
||||
RUN pnpm run build
|
||||
|
||||
################################################################################
|
||||
# Create a new stage to run the application with minimal runtime dependencies
|
||||
# where the necessary files are copied from the build stage.
|
||||
FROM base AS final
|
||||
FROM base AS runtime
|
||||
# Copy dependencies
|
||||
COPY --from=prod-deps /app/node_modules ./node_modules
|
||||
# Copy the built output
|
||||
COPY --from=build /app/dist ./dist
|
||||
|
||||
# Use production node environment by default.
|
||||
ENV NODE_ENV=production
|
||||
|
||||
# Run the application as a non-root user.
|
||||
USER node
|
||||
|
||||
# Copy package.json so that package manager commands can be used.
|
||||
COPY package.json .
|
||||
|
||||
# Copy the production dependencies from the deps stage and also
|
||||
# the built application from the build stage into the image.
|
||||
COPY --from=deps /usr/src/app/node_modules ./node_modules
|
||||
COPY --from=build /usr/src/app/dist ./dist
|
||||
|
||||
# Expose the port that the application listens on.
|
||||
# Bind to all interfaces
|
||||
ENV HOST=0.0.0.0
|
||||
# Port to listen on
|
||||
ENV PORT=4321
|
||||
# Just convention, not required
|
||||
EXPOSE 4321
|
||||
|
||||
# Run the application.
|
||||
CMD pnpm start
|
||||
# Start the app
|
||||
CMD ["node", "./dist/server/entry.mjs"]
|
||||
|
||||
# Install NGINX
|
||||
RUN apt-get update && apt-get install -y nginx && rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Copy NGINX config
|
||||
COPY nginx.conf /etc/nginx/nginx.conf
|
||||
|
||||
# Serve static files from /app/dist/client
|
||||
RUN mkdir -p /var/www/html && ln -s /app/dist/client /var/www/html
|
||||
|
||||
# Expose NGINX port
|
||||
EXPOSE 8080
|
||||
|
||||
# Start both NGINX and Node server
|
||||
CMD service nginx start && node ./dist/server/entry.mjs
|
|
@ -42,6 +42,8 @@ export default defineConfig({
|
|||
'/now': '/journal#now',
|
||||
'/links': '/sharefeed',
|
||||
'/ideas': '/me#ideas',
|
||||
'/chipotle': '/me#chipotle',
|
||||
'/ai': '/me#ai',
|
||||
'/feed.xml': '/feeds/feed.xml',
|
||||
'/feeds': '/feeds/feed.xml',
|
||||
},
|
||||
|
|
BIN
public/blog/pcgamesn_p890.jpg
Normal file
After Width: | Height: | Size: 27 KiB |
BIN
public/buttons/522@5snb.club.png
Normal file
After Width: | Height: | Size: 2.5 KiB |
BIN
public/buttons/bentley_88x31.png
Normal file
After Width: | Height: | Size: 9.9 KiB |
BIN
public/buttons/eleboog_button.jpg
Normal file
After Width: | Height: | Size: 3.4 KiB |
BIN
public/buttons/eleboog_button_light.jpg
Normal file
After Width: | Height: | Size: 3.2 KiB |
BIN
public/buttons/foxscot.ch.png
Normal file
After Width: | Height: | Size: 2 KiB |
BIN
public/buttons/green-team.gif
Normal file
After Width: | Height: | Size: 479 B |
BIN
public/buttons/sominemo.gif
Normal file
After Width: | Height: | Size: 808 B |
Before Width: | Height: | Size: 81 KiB After Width: | Height: | Size: 81 KiB |
11
src/components/AttentionBar.astro
Normal file
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
|
||||
const props = Astro.props
|
||||
|
||||
---
|
||||
{ false && <>
|
||||
<a class="flex justify-center text-xl p-1 hover:underline bg-crusta-500 hover:bg-crusta-700 text-white dark:bg-night-700 dark:hover:bg-night-900"
|
||||
href="https://ko-fi.com/kebokyo">
|
||||
Sorry to be annoying, but I need money.
|
||||
</a>
|
||||
</>}
|
|
@ -6,26 +6,36 @@ const {current} = Astro.props;
|
|||
|
||||
<div>
|
||||
<!-- Header -->
|
||||
<div class="flex items-baseline">
|
||||
<a href="/" class="text-2xl xs:text-3xl sm:text-4xl font-serif title-gradient pb-2">
|
||||
eleboog<span class='title-dot'>.</span>com
|
||||
</a>
|
||||
<div class="flex w-8 self-baseline h-1 border-t border-crusta-200 dark:border-night-800 mx-2"></div>
|
||||
<h2 class="font-mono text-xl sm:text-2xl">{current}</h2>
|
||||
<div class="md:flex items-baseline justify-between">
|
||||
<div class="flex items-baseline">
|
||||
<span class="hover:underline">
|
||||
<a href="/" class="text-2xl xs:text-3xl sm:text-4xl font-serif title-gradient pb-2">
|
||||
eleboog<span class='title-dot'>.</span>com
|
||||
</a>
|
||||
</span>
|
||||
<div class="flex w-8 self-baseline h-1 border-t border-crusta-200 dark:border-night-800 mx-2"></div>
|
||||
<h2 class="font-mono text-xl sm:text-2xl">{current}</h2>
|
||||
</div>
|
||||
<div>
|
||||
<h2 class="font-mono mb-4 text-lg">
|
||||
<a href='/newest' class="text-subtitle hover:underline">newest</a>
|
||||
/
|
||||
<a href='/blog/' class="text-subtitle hover:underline">archive</a>
|
||||
/
|
||||
<a href='/journal' class="text-subtitle hover:underline">journal</a>
|
||||
/
|
||||
{/* <span class="nav-extras">
|
||||
<a href='/sharefeed' class="text-subtitle hover:underline">sharefeed</a>
|
||||
/
|
||||
<a href="/me" class="text-subtitle hover:underline">me</a>
|
||||
/
|
||||
<a href="/cool" class="text-subtitle hover:underline">cool</a>
|
||||
/
|
||||
<a href='/feeds' class="text-subtitle hover:underline">rss</a>
|
||||
</span> */}
|
||||
<a href="/more" class="text-subtitle hover:underline">more</a>
|
||||
</h2>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Navbar -->
|
||||
<h2 class="font-mono mb-4 text-lg">
|
||||
<a href='/newest' class="text-subtitle hover:underline">newest</a>
|
||||
/
|
||||
<a href='/blog/' class="text-subtitle hover:underline">archive</a>
|
||||
/
|
||||
<a href='/journal' class="text-subtitle hover:underline">journal</a>
|
||||
/
|
||||
<a href='/sharefeed' class="text-subtitle hover:underline">sharefeed</a>
|
||||
/
|
||||
<a href="/me" class="text-subtitle hover:underline">me</a>
|
||||
/
|
||||
<a href='/feeds' class="text-subtitle hover:underline">rss</a>
|
||||
</h2>
|
||||
</div>
|
|
@ -18,5 +18,6 @@ const props = Astro.props
|
|||
'--props-center': props.center ? 'auto' : 'none',
|
||||
}}
|
||||
/>
|
||||
|
||||
<p class="text-sm italic text-subtitle mt-2">{props.alt}</p>
|
||||
</div>
|
72
src/content/posts/2025-03-04-jwl-01.mdx
Normal file
|
@ -0,0 +1,72 @@
|
|||
---
|
||||
date: 2025-03-04 13:00:00
|
||||
title: Walking Out Into the Rain (JustWriteLol part 1)
|
||||
summary: Being unprepared for a mundane event made me think a little too much. A start to what I hope to be a series of shorter posts.
|
||||
---
|
||||
|
||||
Tuesday, March 4, 2025\
|
||||
1:45 PM
|
||||
|
||||
I was standing in the entrance lobby of my university's computer science building. When I walked inside, I was immediately blindsided by the
|
||||
torrent of rain assaulting the pavement outside the front doors. I leaned against a wall off to the side and pulled out my phone: It's around 40
|
||||
degrees, feels-like 35, which hopefully meant that my thick black-and-white sweater would keep me warm enough outside.
|
||||
|
||||
The bigger problem is that I don't have a coat. Or an umbrella. Or anything at all that could keep me dry. Even my backpack, holding within
|
||||
its modest 13-liter capacity everything I needed (and a bunch of things I didn't) for my school day... is not really known to be waterproof.
|
||||
Holding it above my head like a sacrificial offering might keep my head dry, but I couldn't say the same about everything *else* in the bag.
|
||||
|
||||
I guess this is why most people check the forecast before they leave for their daily errands: so they don't feel incredibly stupid when
|
||||
Mother Nature desides to pull a prank on them.
|
||||
|
||||
My weather app says the rain won't cease until at least another hour, so unless I want to stay trapped in this building for the next hour waiting
|
||||
for the rain to die down... I need to just say screw it and walk out the front doors. So, after putting my phone back in my back pocket,
|
||||
I pushed a door open and stepped out into the outdoors.
|
||||
|
||||
Immediately I felt the slight chill in the air. Strangely, it felt less oppressive now than it did when I left this morning. Then, there was so much
|
||||
wind constantly battering me, making me stop in my tracks halfway to the bus stop outside my apartment as I turned the thought of going back and
|
||||
grabbing my coat over in my head. I decided I didn't want to risk being even later to class by missing the bus, so I huffed it regardless of the cold.
|
||||
|
||||
In hindsight, that unrelenting wind was probably the opening act to the torrent I'm stuck in the middle of now — something about the cold front
|
||||
moving in or whatever. Yet somehow, the main event is less distressing than I thought it would be. I barely feel the rain on my body, likely thanks
|
||||
to my sweater taking the brunt of the attack. Even when the raindrops hit the top of my head, they feel... pleasant? I joked with myself before
|
||||
opening the doors that "at least I'll get a little shower from this", but I didn't expect it to actually feel like that.
|
||||
|
||||
I took a path down some (slightly precarious) sidewalk steps and put myself on the main road of campus, thankfully closed off from most motor-traffic
|
||||
since this fall. I picked up the pace a little bit, jogging lightly across the street, but I didn't feel a big sense of urgency to get out of the rain.
|
||||
I expected to be walking into Poseidon's hell-pit, but I actually feel like I'm in a gentle waterfall. I think to myself "This is fine" but I'm
|
||||
not sarcastic about it. I genuinely feel fine. I feel great. A little refresher in a day full of underlying stress and worry.
|
||||
|
||||
I eventually walked down the road to the school library, which houses a cafe in the lowest floor. And it is here where I am writing this very post.
|
||||
|
||||
---
|
||||
|
||||
I'm tempted to slightly lampshade this next section, but I think for vibes' sake I'm not going to.
|
||||
|
||||
That brief little experience of fearing the
|
||||
consequences of my actions and then realizing that the outcome is a lot more pleasurable than I thought it would be... kinda sums up a lot of
|
||||
my experiences trying new things and becoming an adult. I have so much anxiety about messing things up: friendships, relationships, school,
|
||||
projects, even cooking and cleaning. I feel so much pressure to be a perfectly functioning person that when I don't live up to that expectation, I
|
||||
often shut down. Especially since I don't really know how to balance work and productivity vs rest and relaxation, it feels like my body and mind
|
||||
schedule maintenance randomly no matter what I need to be doing. Hell, you could consider *this* to be unscheduled maintenance since I originally
|
||||
intended to work on homework until my next scheduled event for today.
|
||||
|
||||
But oftentimes, all of this anxiety is solely based on worst-case predictions that aren't likely to come true. If I actually step out of my comfort
|
||||
zone and actually *do the thing*, I often find that the results fare far better than I feared. I walk out into the rain without a coat, and I
|
||||
actually end up feeling comforted by the "little shower". I tell my friend something I fear will make them upset, and instead they react understandingly
|
||||
and positively. I try a new concoction in the kitchen in a desparate attempt to feed myself, and it actually tastes pretty good and gives me enough
|
||||
energy to stay productive for the rest of the day.
|
||||
|
||||
I'm so scared to do anything that could be bad that I oftentimes miss out on the good things that come from stepping out and being an adult.
|
||||
I think that's the big reason I feel so mentally "stuck" right now: I'm too afraid to actually step outside my known comfort junk-routines and
|
||||
actually make decisions for myself.
|
||||
|
||||
I think I'm finally at a place mentally where I can start rectifying that.
|
||||
|
||||
---
|
||||
|
||||
This post should hopefully be the start of a new series of shorter posts about random things. They'll come out every week, starting today.
|
||||
|
||||
One of them may be about the Gunsmith system in recent Call of Duty games. Another one may be about my misadventures with Docker. I don't really
|
||||
know what I'll write, but I'll write *something*. I just need to write. Lol.
|
||||
|
||||
Goodnight everypony
|
59
src/content/posts/2025-06-14-1yranni.mdx
Normal file
|
@ -0,0 +1,59 @@
|
|||
---
|
||||
date: 2025-06-16 13:00:00
|
||||
title: It's the one year anniversary!
|
||||
summary: ...pretty much. Talking about my current plans for the site and what I'm going to do with it now that I am free from school.
|
||||
draft: true
|
||||
---
|
||||
|
||||
Blow the party horns. My first ever post on this version of the blog happened on June 18, 2024 ~~even though it says the 17th,
|
||||
i still need to fix that~~. It is now June *16*, 2025. Close enough. HAPPY ONE YEAR!!!!!
|
||||
|
||||
To be fair, I *did* change the backend from Next.js to Astro around eight months ago, so I haven't been on this specific *core* of the blog
|
||||
for a year, but as far as the design goes, it's been almost a full year. Wowzers.
|
||||
|
||||
I figured now would be a good time to do a little reflection of this site to honor the occassion, so let's do that. This may end up looking
|
||||
like a collection of random notes, but since I'm doing this for myself as much as I am doing it for The Gram®, I figured just
|
||||
getting these thoughts *out there*, no matter how neatly they're organized, would be the best approach.
|
||||
|
||||
# what worked
|
||||
|
||||
The design Just Works™ for the most part. It has a light and dark mode theme that syncs with your browser, that functionality works
|
||||
very well thanks to Tailwind, and currently I have no plans for iterating on that (adding a toggle to keep it on light or dark & saving
|
||||
it with a cookie, for example). I like how things are mostly text focused with minimal added fluff.
|
||||
|
||||
Astro as a framework mostly works. I like how I can create standalone MDX pages that Just Work™, albeit with some extra addons and
|
||||
configuring needed. It has a solid foundation for me to work off of but also allows me to go beyond it if needed. I really like how it uses
|
||||
server-side rendering instead of client-side rendering like a lot of other "modern" frameworks — navigating it feels like how
|
||||
web pages *should* work.
|
||||
|
||||
# what didn't
|
||||
|
||||
The current dark theme needs a bit more contrast. I know it's bad to put blue text on a black background, but I did it anyway, and there are
|
||||
some darker hues that just do not work.
|
||||
|
||||
I love the monospace font, Monofur... but I'm not sure if it's working well for what I want to use it for. I might need to try out different
|
||||
fonts in the future and see if there's a similarly quirky once that's more legible I could use instead (e. comic mono / shanns).
|
||||
|
||||
Next.js... was okay at first, but not the right fit for me. It's designed for 🍊-worthy SPA's, not personal blogs. Astro is *starting*
|
||||
to hit similar notes for me now, but that's mostly in how it's a more niche framework not a lot of people have built stuff around. Also,
|
||||
the "content" system is inferior to Contentlayer in my very humble opinion. I would rather just use Contentlayer than have to work around
|
||||
Astro's built-in content management system like I have to do now.
|
||||
|
||||
# what to do next
|
||||
|
||||
First, update a bunch of stuff on the site that is no longer relevant to my current situation. I no longer have a "school bag", for example,
|
||||
and my trusty M1 MacBook Air currently has the macOS 26 beta on it... because *I'm not really using it much anymore.*
|
||||
|
||||
I've already done a *couple* of minor visual tweaks, like (finally) making the maximum content width a bit higher to better fill out large
|
||||
desktop screens... but that's lead to some slight consequences, like with the banner image on blog posts being way too big and pushing
|
||||
the rest of the content down. Now that I am no longer trying to follow my No JavaScript Ever™ policy, I think building in some slight
|
||||
responsive design would be cool. I'll need to work on the design, though.
|
||||
|
||||
For bigger things, I need to do a full accessibility sweep. Make sure any sticking points are addressed. Possibly get plaintext versions of posts up and running to later
|
||||
utilize when I (again, possibly) make a geminispace fork of the site.
|
||||
|
||||
If I decide it's time to do a backend rewrite (because i love doing those for some reason), try going for a framework that has *less* batteries
|
||||
included. My mentor is really into Hono because of *how* light it is, but I really hate how it does routing. Something like that or HTMX
|
||||
would be worth looking into if I want to go that route, though.
|
||||
|
||||
And finally... I need to make it easier for me to update this blog.
|
8
src/content/posts/2025-06-21-sharefeed-chrome.mdx
Normal file
|
@ -0,0 +1,8 @@
|
|||
---
|
||||
date: 2025-06-21 13:00:00
|
||||
title: I made a silly thing (sharefeed-chrome)
|
||||
summary: I made a silly little Chrome extension I created to more easily create Sharefeed entries while I am on the web. A brief overview of its functionality and the process I went through to make it.
|
||||
draft: true
|
||||
---
|
||||
|
||||
For the longest time, I've wanted to be more dilligent in updating my [sharefeed](/sharefeed)
|
79
src/content/posts/2025-06-25-jwl-02.mdx
Normal file
|
@ -0,0 +1,79 @@
|
|||
---
|
||||
date: 2025-06-25 20:04:00
|
||||
title: A random thought about clicking a mouse (JWL 02)
|
||||
summary: I had a realization about how I used my mouse while playing Call of Duty that may speak to how quirky our minds can be. The long-awaited second entry to my "please god let me make shorter blog posts" series.
|
||||
---
|
||||
|
||||
A little bit ago, I finally reinstalled Call of Duty: Modern Warfare III (the reboot released in 2023).
|
||||
I was watching YouTube videos on the game again that encouraged me to pick the game back up.
|
||||
I had originally bought Modern Warfare III (which I will abbreviate as MWIII from now on)
|
||||
*after* Black Ops 6 had already been out for a month or two. I heard that the game's
|
||||
core multiplayer mode was surprisingly decent, so I wanted to see what I missed...
|
||||
and yeah! It's one of the coolest AAA multiplayer experiences I've had so far, up there with
|
||||
the extraction shooter spinoff DMZ released in 2022 and even Battlefield 4, still to this day
|
||||
the G.O.A.T. of casual multiplayer gaming in my opinion.
|
||||
|
||||
Still, I had to be a little more self-conscious about how and when I played this game now
|
||||
due to the fact that I no longer live alone — I live with multiple roommates who
|
||||
might get annoyed at the click-clacking of my Razer Huntsman Mini (the one thing I don't like
|
||||
about it lol). However, when I was talking with my roomates trying to confirm if they even had said issues,
|
||||
the feedback was different than I expected. One of my roommates noticed me clicking my mouse multiple times
|
||||
in quick succession when playing certain games, and that annoyed them *more* than my keyboard.
|
||||
|
||||
It took me a while to figure out what it was, but after some self-reflection,
|
||||
I realized what was happening: it was my backup pistol that made me click
|
||||
that way.
|
||||
|
||||
---
|
||||
|
||||
Most guns in Call of Duty have automatic fire, meaning that bullets fire
|
||||
out of the gun over and over as long as you are holding down the "trigger"
|
||||
(in this case, my left mouse button). In COD, you usually can only carry two
|
||||
weapons: your main "primary" weapon and your backup "secondary" weapon.
|
||||
Secondary weapons mostly consist of pistols that have *semi*-automatic fire.
|
||||
These pistols only shoot *one* bullet when you pull the trigger, so to fire
|
||||
multiple shots, you have to pull the trigger (click the mouse) multiple times, one for each shot.
|
||||
|
||||
That explains the pattern that my roommate was observing: since you usually have to fire
|
||||
multiple shots on-target in order to down an opponent in COD, if I had my pistol out, I had
|
||||
to click my mouse multiple times in rapid succession to win the fight.
|
||||
But that might not be the whole story.
|
||||
|
||||
This is purely anecdotal experience, but with semi-auto weapons, every shot you fire feels
|
||||
like it has more "weight" to it since you have to deliberately trigger each one.
|
||||
This is actually something the developers at Valve noticed when developing Team Fortress 2:
|
||||
they made most of the weapons in that game semi-automatic *on purpose* so that
|
||||
players felt like they contributed more to the outcome of each gunfight
|
||||
(I'm too tired tonight to find a good source, but if you really want me to, [bug me about it](https://plush.city/@kebokyo)).
|
||||
I have a feeling that because I was putting more mental effort into each shot,
|
||||
I also put more *physical* effort into each shot — increasing the amount of noise
|
||||
each click produced and thus exacerbating the problem for my roommate.
|
||||
|
||||
There might have even been a chance that the specific pistol I used contributed to
|
||||
the problem as well. I have been working to unlock cosmetics for the pistols carried forward
|
||||
from the previous game, Modern Warfare II, so I have the P890 pistol on most of
|
||||
my loadouts right now. The P890, like most guns in both games, is based on a real-life
|
||||
weapon but given a fake name to avoid legal trouble. In this case, the P890 is based off of
|
||||
the Sig Sauer P226, a heavy-duty pistol that emphasises the *heavy* part, both in caliber (.45 ACP)
|
||||
and in weight (its frame is still made out of steel!). In-game, the pistol has
|
||||
a high damage output but a slow rate-of-fire to compensate, which means I have to be
|
||||
even *more* deliberate with my shots — further emphasizing the mental (and,
|
||||
indrectly, physical) effort I put into my mouse clicks.
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
In the end, I made a personal rule that I will not play COD or other input-intensive games
|
||||
like FPS games in the evening, where my hardcore gamering might disturb my roommates' other evening
|
||||
activities. Of course, with how hot the weather has been getting lately, that effectively means that
|
||||
I am *never* allowed to play these games (as a gaming PC running on full blast generates a ton of heat already)... but that may be more of a blessing than a curse if I am being honest with myself.
|
||||
|
||||
Oh, before I go, here's my very general opinion on MWIII: multiplayer is a blast, Modern Warfare Zombies
|
||||
is an insult to both DMZ fans and COD Zombies fans, and I haven't touched the campaign yet because
|
||||
I'm still trying to finish the prior game's campaign first. I have a *lot* more to say
|
||||
(including how I feel about the Gunsmith weapon customization systems in both this game and
|
||||
Black Ops 6)... but that is for another time.
|
||||
|
||||
Hope y'all enjoyed this post, as ranty as it is. Since this is more of a "long journal entry" than
|
||||
"short blog post", here is the [obligatory song link](https://www.youtube.com/watch?v=HbwzOHjZUkg). Cya!
|
|
@ -1,185 +1,241 @@
|
|||
{
|
||||
"sharefeed" : [
|
||||
{
|
||||
"url": "https://update.botghost.com/",
|
||||
"title": "Discord is Threatening to Shutdown BotGhost: The Enshittification of Discord.",
|
||||
"author": "",
|
||||
"publishedDate": "2025-06-23 13:00:00",
|
||||
"accessedDate": "2025-06-23 16:16:29",
|
||||
"note": "This is the most hilarious \"we are being shut down by the company we rely on for our SaaS\" notice I have seen in a while. Discord's TOS clearly forbids BotGhost's entire business strategy. Absolute cinema. Just in case, here's an archive link too: https://archive.ph/oBdS9"
|
||||
},
|
||||
{
|
||||
"url": "https://www.youtube.com/watch?v=oTOu7VfXnl8",
|
||||
"title": "the dream music player, finally.",
|
||||
"author": "Bread on Penguins",
|
||||
"publishedDate": "2025-05-21 12:30:21",
|
||||
"accessedDate": "2025-06-23 11:15:30",
|
||||
"note": "also this video, this video is so great. i need that globe"
|
||||
},
|
||||
{
|
||||
"url": "https://www.youtube.com/watch?v=nXaMfy5GYCo",
|
||||
"title": "My Dad Switched To Linux",
|
||||
"author": "Oscar",
|
||||
"publishedDate": "2025-06-07 07:28:21",
|
||||
"accessedDate": "2025-06-23 11:05:06",
|
||||
"note": "If all Linux videos would be like this, the year of the Linux desktop would actually be feasible."
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/izabera/bitwise-challenge-2048",
|
||||
"title": "bitwise-challenge-2048 - 2048 with only 64 bits of state",
|
||||
"author": "Isabella Bosia",
|
||||
"publishedDate": "",
|
||||
"accessedDate": "2025-06-22 21:22:24",
|
||||
"note": "Cute retro implementation of that one game everyone loves to recreate. I also like the idea of sharing your board with someone else with the `$STATE` variable."
|
||||
},
|
||||
{
|
||||
"url": "https://danco.substack.com/p/have-you-ever-seen-a-goth-downtown",
|
||||
"author": "Alex Danco",
|
||||
"title": "Have you ever seen a goth downtown? - Creativity after AI",
|
||||
"publishedDate": "2025-08-14",
|
||||
"accessedDate": "2025-02-18 15:00",
|
||||
"note": "Even though there's some AI glazing in this article, and the goth analogy is a little back-asswards, I think the main point of this is important: In the persuit of reducing hallucinations, generative AI has become more and more sanatized, corporate, and \"safe\". As we transition into a post-GPT society, creative work will inneviatably become more and more cookie-cutter as AI is incorporated more and more into workflows, either by choice or by corporate demand. In my opinion, the best thing to do in response is to be unabashedly freaky with it in spite of this."
|
||||
},
|
||||
{
|
||||
"url": "https://www.scattered-thoughts.net/writing/small-tech/",
|
||||
"author": "Jamie Brandon",
|
||||
"title": "Small Tech",
|
||||
"publishedDate": "2020-09-07",
|
||||
"accessedDate": "2025-02-18 14:00",
|
||||
"note": "An honor roll of smaller tech companies and/or projects that maintain their quality and authenticity in a world full of venture capital and startup sellouts. I wanna highlight the Sublime shoutout: I love Sublime, all my homies love Sublime, and if you don't you aren't a real one /j"
|
||||
},
|
||||
{
|
||||
"url": "https://joyarbitrage.substack.com/p/find-your-2ers",
|
||||
"author": "Tadzio Dlugoleki",
|
||||
"title": "find your 2%ers - then do life with them.",
|
||||
"publishedDate": "2023-12-12",
|
||||
"accessedDate": "2025-02-18 13:00",
|
||||
"note": "A (slightly millennially pretentious) thinkpiece about the importance of finding people you vibe with well and keeping those relationships healthy."
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/dplanitzer/Serena",
|
||||
"author": "Dietmar Planitzer",
|
||||
"title": "Serena - An experimental operating system for 32bit Amiga computers.",
|
||||
"date": "2024-08-14 13:00",
|
||||
"accessedDate": "2024-08-14 13:00",
|
||||
"note": "If I had an Amiga, I would be geeking out so much about this. You would not see me for days."
|
||||
},
|
||||
{
|
||||
"url": "https://chuck.is/news/",
|
||||
"author": "Chuck Carrol",
|
||||
"title": "The News is Information Junk Food",
|
||||
"pubDate": "2022-09-16",
|
||||
"date": "2024-08-09 16:00",
|
||||
"publishedDate": "2022-09-16",
|
||||
"accessedDate": "2024-08-09 16:00",
|
||||
"note": "A discussion about the negative affects the 24 hour news cycle has on us. I want to dissect this further cause I have a feeling there's some nuggets of bad takes in here, but the overall takeway I agree with. If I had a nickel for every time my social media feed ended up getting overrun by political nonsense, I would have... uh... five nickels? What can you buy for a quarter nowadays? ...hmm"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/vpand/icpp",
|
||||
"author": "VPAND Team",
|
||||
"title": "icpp - Running C++ in anywhere like a script.",
|
||||
"date": "2024-08-09 15:00",
|
||||
"accessedDate": "2024-08-09 15:00",
|
||||
"note": "I just think it's funny okay"
|
||||
},
|
||||
{
|
||||
"url": "https://jon.bo/posts/digital-tools/",
|
||||
"author": "Jonathan Borichevskiy",
|
||||
"title": "Digital Tools I Wish Existed",
|
||||
"pubDate": "2019-11-28",
|
||||
"date": "2024-08-09 14:00",
|
||||
"publishedDate": "2019-11-28",
|
||||
"accessedDate": "2024-08-09 14:00",
|
||||
"note": "Interesting exploration of digital information gathering, consumption, and archive tools that the author wish existed. I want to make a response to this one day with my own ideas and critiques of the particular features he wants (whether they make sense to me or not and if not what alternatives I think would be good instead)."
|
||||
},
|
||||
{
|
||||
"url": "https://stack-auth.com",
|
||||
"author": "Stackframe Inc.",
|
||||
"title": "Stack Auth - Open-source Clerk/Auth0 alternative",
|
||||
"date": "2024-08-09 13:00",
|
||||
"accessedDate": "2024-08-09 13:00",
|
||||
"note": "A really promising open source alternative to WYSIWIG auth solutions like Clerk and Auth0. I would need to confirm its security and its flexibility, but the fact that they specifically say \"hey, you can totally just use your own frontend and use our SDK in the background\" makes me very excited. All of the user-facing elements can be styled my own way, while the internal admin elements can just be the defaults so I don't have to code it all. I might end up using this instead of Auth.js for phase 2 of my site if this lives up to my expectations."
|
||||
},
|
||||
{
|
||||
"url": "https://tonsky.me/blog/diagrams/",
|
||||
"author": "Niki Tonsky",
|
||||
"title": "Where Should Visual Programming Go?",
|
||||
"pubDate": "2024-07-18",
|
||||
"date": "2024-07-27 14:00",
|
||||
"publishedDate": "2024-07-18",
|
||||
"accessedDate": "2024-07-27 14:00",
|
||||
"note": "A discussion about what incorporating diagrams and other visualizations into your codebase could and should look like. I think the idea of embedding diagrams into your comments is a very good idea (in fact, we should be using markdown in our docs already), but I'm not sure how useful creating parsable visual state machines and etc. would be. Fun fact: there seems to be a pseudo-collab-tool built into the site where you can see where other readers' cursors are. I kept trying to hold digital hands with the other cursor but it kept running away from me. Why are you so mean ;w;"
|
||||
},
|
||||
{
|
||||
"url": "https://blog.singleton.io/posts/2022-10-17-otp-on-wrist/",
|
||||
"author": "David Singleton",
|
||||
"title": "TOTP tokens on my wrist with the smartest dumb watch.",
|
||||
"pubDate": "2022-10-17",
|
||||
"date": "2024-07-27 13:00",
|
||||
"publishedDate": "2022-10-17",
|
||||
"accessedDate": "2024-07-27 13:00",
|
||||
"note": "A demonstration of the Sensor Watch, a replacement motherboard for the famous Casio F-91W digital watch that turns it into a programmable ARM Cortex M0+ powered smartwatch. It is absolutely wild, and I want one now even though the motherboard costs more than the watch itself. The idea of a wearable version of those Square Enix TOTP devices is so fascinating to me."
|
||||
},
|
||||
{
|
||||
"url": "https://semanticdiff.com/blog/language-aware-diff-how-far/",
|
||||
"author": "Michael Müller",
|
||||
"title": "How far should a programming language aware diff go?",
|
||||
"pubDate": "2024-07-17",
|
||||
"date": "2024-07-25",
|
||||
"publishedDate": "2024-07-17",
|
||||
"accessedDate": "2024-07-25",
|
||||
"note": "A fun look on what differences in code could be considered \"irrelevant changes\" and the consequences of ignoring such changes. Note: This is a corporate blog post made for a VSCode and GitHub extension for \"language aware diff\" that includes premium software support."
|
||||
},
|
||||
{
|
||||
"url": "https://scrapscript.org",
|
||||
"author": "Max Bernstein",
|
||||
"title": "scrapscript - A functional, content-addressable programming language",
|
||||
"date": "2024-07-24",
|
||||
"accessedDate": "2024-07-24",
|
||||
"note": "An interesting new scripting language that's basically Haskell but if it was even weirder. I want to make a blog post about this one day discussing how it compares to other programming languages and how it could be used."
|
||||
},
|
||||
{
|
||||
"url": "https://thetinypod.com",
|
||||
"title": "tinypod - an iPod-style case for the Apple Watch",
|
||||
"date": "2024-07-20",
|
||||
"accessedDate": "2024-07-20",
|
||||
"note": "A really cute concept for taking a computer on your wrist and adapting it into a digital detox device. The regular model is a little too expensive for my liking, but the \"lite\" model is cheap enough that I could justify trying it out with my own Apple Watch (once I find it again lol)."
|
||||
},
|
||||
{
|
||||
"url": "https://simonwillison.net/2024/Jul/13/give-people-something-to-link-to/",
|
||||
"author": "Simon Willson",
|
||||
"title": "Give people something to link to so they can talk about your features and ideas",
|
||||
"pubDate": "2024-07-13",
|
||||
"date": "2024-07-14",
|
||||
"publishedDate": "2024-07-13",
|
||||
"accessedDate": "2024-07-14",
|
||||
"note": "If you want people to be able to talk about an idea, concept, or feature that you develop, you should have a resource about it for people to easily reference. ChatGPT being used as an example is slightly cringe, but it works to show what not to do."
|
||||
},
|
||||
{
|
||||
"url": "https://openpipe.ai/blog/hn-ai-crypto",
|
||||
"author": "Kyle Corbitt",
|
||||
"title": "Is AI the Next Crypto? Insights from 2M HN comments",
|
||||
"pubDate": "2023-11-08",
|
||||
"date": "2023-11-08",
|
||||
"publishedDate": "2023-11-08",
|
||||
"accessedDate": "2023-11-08",
|
||||
"note": "An analysis of Hacker News' sentiment towards AI compared to NFT's... using AI. Big note: this is a very cleverly disguised ad for OpenPipe, the service which is hosting this article, but I actually appreciated how it broke down the details of how the author computed his data. I wish there was a bit more analysis of the results, though."
|
||||
},
|
||||
{
|
||||
"url": "https://mariusbancila.ro/blog/2023/09/12/formatting-text-in-c-the-old-and-the-new-ways/",
|
||||
"author": "Marius Brancila",
|
||||
"title": "Formatting Text in C++: The Old and The New Ways",
|
||||
"pubDate": "2023-09-12",
|
||||
"date": "2023-11-07 14:00:00",
|
||||
"publishedDate": "2023-09-12",
|
||||
"accessedDate": "2023-11-07 14:00:00",
|
||||
"note": "C++20 introduced some new std functions to format strings: std::format and std::format_to. In practice, they work much like a streamlined version of C's printf. However, their implementation (based on the library {fmt}) results in much higher efficiency! Apparently the guys at C++ really like it because the new std::print function in C++23 has the functionality of std::format built in. I'm curious to see how this will change C++ devs' workflows, including newbies coming to C++ from other languages like Java or Python."
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/jesseduffield/horcrux",
|
||||
"author": "Jesse Duffield",
|
||||
"title": "horcrux - Split your file into encrypted fragments so that you don't need to remember a passcode",
|
||||
"date": "2023-11-07 13:00:00",
|
||||
"accessedDate": "2023-11-07 13:00:00",
|
||||
"note": "A simple terminal program that allows you to split files into encrypted chunks that can later be re-combined into the original file. Think of it like a RAID setup but for individual files or archives, inspired by an everything-phobic fantasy media franchise. I actually find the concept really facinating: it could be a good way to split up large media files and share them over the internet. Even if one horcrux gets corrupted, the others can still make up the original file, and since it is encrypted, it's tougher to discern what the original file is without enough pieces to put it together."
|
||||
},
|
||||
{
|
||||
"url": "https://stytch.com/blog/open-sourcing-sqx-a-way-to-build-flexible-database-models-in-go/",
|
||||
"author": "Logan Gore",
|
||||
"title": "Open-sourcing SQX, a way to build flexible database models in Go",
|
||||
"pubDate": "2023-08-31",
|
||||
"date": "2023-09-09 14:00:00",
|
||||
"publishedDate": "2023-08-31",
|
||||
"accessedDate": "2023-09-09 14:00:00",
|
||||
"note": "A really cool SQL interface for Go that both simplifies a lot of the boilerplate and allows for quickly building complex models through OOP. I don't have any experience in Go, but I'm honestly tempted to start learning Go just to try this library out and see if a port of it to other languages like C++ or Rust is possible."
|
||||
},
|
||||
{
|
||||
"url": "https://muldoon.cloud/2023/09/06/software-keeps-failing.html",
|
||||
"author": "Mickey Muldoon",
|
||||
"title": "Every Software Project is a Startup That Will Probably Fail",
|
||||
"pubDate": "2023-09-06",
|
||||
"date": "2023-09-09 13:00:00",
|
||||
"publishedDate": "2023-09-06",
|
||||
"accessedDate": "2023-09-09 13:00:00",
|
||||
"note": "A short retrospective on the reality of software projects: the value you get out of most of them is the lessons you learn when they crumble. I feel like this lesson could be told in a way less intrinsic to our dumb economic system, but I don't have enough brain capacity to write that up right now."
|
||||
},
|
||||
{
|
||||
"url": "https://ploum.net/2023-07-06-stop-trying-to-make-social-networks-succeed.html",
|
||||
"author": "Lionel Dricot",
|
||||
"title": "Stop Trying to Make Social Networks Succeed",
|
||||
"pubDate": "2023-07-06",
|
||||
"date": "2023-07-06",
|
||||
"publishedDate": "2023-07-06",
|
||||
"accessedDate": "2023-07-06",
|
||||
"note": "Social networks will never become universal or ubiquitous in the way companies and VC's want them to. Every social network will appeal to certain people more than others, so the best social network is the one that works best for you and your contacts. If one doesn't exist... make one! (or have someone else make it for you)."
|
||||
},
|
||||
{
|
||||
"url": "https://www.reproof.app/blog/notes-apps-help-us-forget",
|
||||
"author": "Matthew Guay",
|
||||
"title": "Notes apps are where ideas go to die. And that’s good.",
|
||||
"pubDate": "2022-02-15",
|
||||
"date": "2023-06-03 14:00:00",
|
||||
"publishedDate": "2022-02-15",
|
||||
"accessedDate": "2023-06-03 14:00:00",
|
||||
"note": "Notes apps always market themselves as tools to remember important things before they leave your mind. But maybe we should think of it the other way instead: notes afford us the ability to let thoughts leave our mind since we have already saved the information elsewhere."
|
||||
},
|
||||
{
|
||||
"url": "https://kapeli.com/dash",
|
||||
"title": "Dash for macOS - an API Documentation Browser and Code Snippet Manager",
|
||||
"date": "2023-06-03 13:00:00",
|
||||
"accessedDate": "2023-06-03 13:00:00",
|
||||
"note": "Really cool offline documentation viewer for macOS... that's also $30 for some reason. DESPITE THERE BEING AN OFFICAL OPEN SOURCE PORT TO WINDOWS AND LINUX. I AM GOING TO COMBUST"
|
||||
},
|
||||
{
|
||||
"url": "https://blog.jim-nielsen.com/2023/deadlines-as-technology/",
|
||||
"author": "Jim Nielsen",
|
||||
"title": "Deadlines as Technology",
|
||||
"pubDate": "2023-03-09",
|
||||
"date": "2023-05-20",
|
||||
"publishedDate": "2023-03-09",
|
||||
"accessedDate": "2023-05-20",
|
||||
"note": "My ADHD means I always procrastinate things until the last minute. Well, if there is no 'last minute' -- i.e. there is no deadline -- shit won't get done. If you try to pace yourself to hit certain self-set deadlines, you may find that work becomes easier."
|
||||
},
|
||||
{
|
||||
"url": "https://tech.news.am/eng/news/510/worlds-first-portable-quantum-computers-on-sale-in-japan-prices-start-at-$8700.html",
|
||||
"author": "News.am",
|
||||
"title": "World's first portable quantum computers on sale in Japan: Prices start at $8,700",
|
||||
"pubDate": "2022-12-21",
|
||||
"date": "2023-05-20 15:00:00",
|
||||
"publishedDate": "2022-12-21",
|
||||
"accessedDate": "2023-05-20 15:00:00",
|
||||
"note": "they put an android tablet on a fucking quantum computer, i'm shitting and cumming rn"
|
||||
},
|
||||
{
|
||||
"url": "https://userinyerface.com/",
|
||||
"author": "Verhaert",
|
||||
"title": "User Inyerface",
|
||||
"date": "2023-05-20 14:00:00",
|
||||
"accessedDate": "2023-05-20 14:00:00",
|
||||
"note": "Want to hate technology and how all of its innovations can be used for great evil? Try to work your way through this."
|
||||
},
|
||||
{
|
||||
"url": "https://walkingtheworld.substack.com/p/why-the-us-cant-have-nice-things",
|
||||
"author": "Chris Arnade",
|
||||
"title": "Why the US can't have nice things - A rant on bus stops",
|
||||
"pubDate": "2023-05-20",
|
||||
"date": "2023-05-20 13:00:00",
|
||||
"publishedDate": "2023-05-20",
|
||||
"accessedDate": "2023-05-20 13:00:00",
|
||||
"note": "A blog post on why US public works suck so much: the government doesn't trust its citizens to utilize public works properly nor make their own organic solutions for public issues. Really good read!"
|
||||
},
|
||||
{
|
||||
"url": "https://fortelabs.com/blog/the-secret-power-of-read-it-later-apps/",
|
||||
"author": "Tiago Forte",
|
||||
"title": "The Secret Power of 'Read-It-Later' Apps",
|
||||
"pubDate": "2022-12-06",
|
||||
"date": "2023-05-19",
|
||||
"publishedDate": "2022-12-06",
|
||||
"accessedDate": "2023-05-19",
|
||||
"note": "An article on the benefits of using 'read-it-later' apps. There are so many things wrong with this article that I'm definitely going to make a blog post responding to it at some point. Despite that, it is part of the inspiration for this feed... so thanks, I guess?"
|
||||
}
|
||||
]
|
||||
|
|
|
@ -6,8 +6,11 @@ import '../styles/globals.css'
|
|||
|
||||
import Header from '../components/Header.astro'
|
||||
import Footer from '../components/Footer.astro'
|
||||
import AttentionBar from '../components/AttentionBar.astro'
|
||||
|
||||
const { title } = Astro.props
|
||||
const { title, description, ogImage } = Astro.props
|
||||
|
||||
const ogImageUrl = ogImage ? "https://eleboog.com" + ogImage : "https://eleboog.com/blog/blogbanner.png"
|
||||
|
||||
---
|
||||
|
||||
|
@ -19,12 +22,28 @@ const { title } = Astro.props
|
|||
<meta name="viewport" content="width=device-width" />
|
||||
<meta name="generator" content={Astro.generator} />
|
||||
<title>{title ? title + ' - eleboog.com' : 'eleboog.com'}</title>
|
||||
|
||||
{/* open graph babeeeee */}
|
||||
<meta property="og:title" content={title ? title + ' - eleboog.com' : 'eleboog.com'} />
|
||||
<meta property="og:site_name" content="eleboog.com" />
|
||||
<meta property="og:description" content={description ?? "My personal website, containing blog posts, a mini journal, and other projects. The dark side of the sauce."} />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:image" content={ ogImageUrl } />
|
||||
<meta property="og:image:secure_url" content={ ogImageUrl } />
|
||||
<meta property="og:image:width" content="1280" />
|
||||
<meta property="og:image:height" content="720" />
|
||||
<meta property="twitter:title" content={title ? title + ' - eleboog.com' : 'eleboog.com'} />
|
||||
<meta property="twitter:card" content="summary_large_image" />
|
||||
<meta property="twitter:image" content={ ogImageUrl } />
|
||||
</head>
|
||||
<body class="flex-col mx-auto min-h-screen max-w-screen-md p-8 py-4">
|
||||
<Header current={title}/>
|
||||
<main>
|
||||
<slot/>
|
||||
</main>
|
||||
<Footer/>
|
||||
<body>
|
||||
<AttentionBar/>
|
||||
<div class="main-spacing">
|
||||
<Header current={title}/>
|
||||
<main>
|
||||
<slot/>
|
||||
</main>
|
||||
<Footer/>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
|
@ -19,6 +19,8 @@ const headings = await Astro.props.headings
|
|||
|
||||
const title = fm.title ?? 'blog post'
|
||||
|
||||
const ogImageUrl = "https://eleboog.com/blog/blogbanner.png"
|
||||
|
||||
const numberToWord = (num: number) => {
|
||||
switch(num) {
|
||||
case 1: return "one";
|
||||
|
@ -38,8 +40,23 @@ const numberToWord = (num: number) => {
|
|||
<meta name="viewport" content="width=device-width" />
|
||||
<meta name="generator" content={Astro.generator} />
|
||||
<title>{title ? title + ' - eleboog.com' : 'eleboog.com'}</title>
|
||||
|
||||
{/* open graph babeeeee */}
|
||||
<meta property="og:title" content={title ? title + ' - eleboog.com' : 'eleboog.com'} />
|
||||
<meta property="og:site_name" content="eleboog.com" />
|
||||
<meta property="og:description" content={fm.summary ?? "My personal website, containing blog posts, a mini journal, and other projects. The dark side of the sauce."} />
|
||||
<meta property="og:type" content="article" />
|
||||
<meta property="og:article:published_time" content={fm.date.replace(' ', 'T')} />
|
||||
<meta property="og:article:modified_time" content={fm.updated ? fm.updated.replace(' ', 'T') : fm.date.replace(' ', 'T')} />
|
||||
<meta property="og:image" content={ fm.cover ? 'https://eleboog.com' + fm.cover : ogImageUrl } />
|
||||
<meta property="og:image:secure_url" content={ fm.cover ? 'https://eleboog.com' + fm.cover : ogImageUrl } />
|
||||
<meta property="og:image:width" content="1280" />
|
||||
<meta property="og:image:height" content="720" />
|
||||
<meta property="twitter:title" content={title ? title + ' - eleboog.com' : 'eleboog.com'} />
|
||||
<meta property="twitter:card" content="summary_large_image" />
|
||||
<meta property="twitter:image" content={ fm.cover ? 'https://eleboog.com' + fm.cover : ogImageUrl } />
|
||||
</head>
|
||||
<body class="flex-col mx-auto min-h-screen max-w-screen-md p-8 py-4">
|
||||
<body class="main-spacing">
|
||||
<Header current='blog post'/>
|
||||
<main>
|
||||
{ ( fm.cover && fm.cover_alt ) ? (
|
||||
|
|
|
@ -8,10 +8,13 @@ import Header from '../components/Header.astro'
|
|||
import Footer from '../components/Footer.astro'
|
||||
|
||||
import HR from '../components/HR.astro'
|
||||
import { flatMap } from 'lodash'
|
||||
|
||||
const { frontmatter } = Astro.props
|
||||
|
||||
const title = frontmatter.slug ?? 'me'
|
||||
const title = frontmatter.slug ?? 'whoops'
|
||||
|
||||
const ogImageUrl = "https://eleboog.com/blog/blogbanner.png"
|
||||
|
||||
---
|
||||
|
||||
|
@ -23,8 +26,21 @@ const title = frontmatter.slug ?? 'me'
|
|||
<meta name="viewport" content="width=device-width" />
|
||||
<meta name="generator" content={Astro.generator} />
|
||||
<title>{title ? title + ' - eleboog.com' : 'eleboog.com'}</title>
|
||||
|
||||
{/* open graph babeeeee */}
|
||||
<meta property="og:title" content={title ? title + ' - eleboog.com' : 'eleboog.com'} />
|
||||
<meta property="og:site_name" content="eleboog.com" />
|
||||
<meta property="og:description" content={frontmatter.summary ?? "My personal website, containing blog posts, a mini journal, and other projects. The dark side of the sauce."} />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:image" content={ ogImageUrl } />
|
||||
<meta property="og:image:secure_url" content={ ogImageUrl } />
|
||||
<meta property="og:image:width" content="1280" />
|
||||
<meta property="og:image:height" content="720" />
|
||||
<meta property="twitter:title" content={title ? title + ' - eleboog.com' : 'eleboog.com'} />
|
||||
<meta property="twitter:card" content="summary_large_image" />
|
||||
<meta property="twitter:image" content={ ogImageUrl } />
|
||||
</head>
|
||||
<body class="flex-col mx-auto min-h-screen max-w-screen-md p-8 py-4">
|
||||
<body class="main-spacing">
|
||||
<Header current={title}/>
|
||||
<main>
|
||||
<h1 class="text-3xl font-serif my-2">{frontmatter.title}</h1>
|
||||
|
|
|
@ -39,7 +39,7 @@ export async function computeFeed() {
|
|||
|
||||
export function addSharefeedEntriesToFeed(feed: Feed, main?: boolean) {
|
||||
const entries = sfjson.sharefeed
|
||||
.sort((a:ShareFeedEntry, b:ShareFeedEntry) => compareDesc(new Date(a.date), new Date(b.date)))
|
||||
.sort((a:ShareFeedEntry, b:ShareFeedEntry) => compareDesc(new Date(a.accessedDate), new Date(b.accessedDate)))
|
||||
.filter((entry:ShareFeedEntry) => !(entry.draft))
|
||||
.slice(0,15);
|
||||
|
||||
|
@ -65,7 +65,7 @@ export function addSharefeedEntriesToFeed(feed: Feed, main?: boolean) {
|
|||
author: [{
|
||||
name: entry.author
|
||||
}],
|
||||
date: toZonedTime(entry.date, timeZone)
|
||||
date: toZonedTime(entry.accessedDate, timeZone)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
|
|
@ -3,8 +3,8 @@ export type ShareFeedEntry = {
|
|||
author?: string,
|
||||
email?: string,
|
||||
baseUrl?: string,
|
||||
date: string,
|
||||
pubDate?: string,
|
||||
accessedDate: string,
|
||||
publishedDate?: string,
|
||||
title: string,
|
||||
note: string,
|
||||
draft?: boolean
|
||||
|
|
|
@ -15,7 +15,7 @@ const archives = await getCollection('archives');
|
|||
|
||||
---
|
||||
|
||||
<BaseLayout title="archives">
|
||||
<BaseLayout title="archives" description="The main list of all of the blog posts and other articles I have written on this site, including some that were written in prior versions of the site.">
|
||||
<h1 class="font-serif text-3xl my-2">Blog Archive</h2>
|
||||
<p>This is a list of all blog posts that have ever been posted on this site.</p>
|
||||
|
||||
|
|
27
src/pages/cool.mdx
Normal file
|
@ -0,0 +1,27 @@
|
|||
---
|
||||
date: 1970-01-01
|
||||
layout: '../layouts/StandaloneMDXLayout.astro'
|
||||
title: Cool Stuff
|
||||
slug: cool
|
||||
---
|
||||
|
||||
This is my archival page for cool stuff I find on the internet. If the sharefeed is a "oh, this looks cool", this page is "okay, this is certified **epic**."
|
||||
|
||||
## Button Gallery
|
||||
|
||||
I thought about making a blogroll, but I decided instead to make a button gallery for all of my friends who run blogs and have 88x31 buttons to go with them.
|
||||
|
||||
<div class="button-gallery mb-2 space-x-2">
|
||||
<a href="https://www.5snb.club"><img width="88" height="31" src="/buttons/522@5snb.club.png" class="border-none shadow-none inline rounded-none" alt="A button for 522 at 5snb dot club."/></a>
|
||||
<a href="https://foxscot.ch"><img width="88" height="31" src="/buttons/foxscot.ch.png" class="border-none shadow-none inline rounded-none" alt="A button for Foxscotch."/></a>
|
||||
<a href="http://legacy.sominemo.com"><img width="88" height="31" src="/buttons/sominemo.gif" class="border-none shadow-none inline rounded-none" alt="A button for Sominemo."/></a>
|
||||
<a href="https://bentley.trashcan.lol"><img width="88" height="31" src="/buttons/bentley_88x31.png" class="border-none shadow-none inline rounded-none" alt="A button for Bentley."/></a>
|
||||
</div>
|
||||
|
||||
{ false && <>...and here's a list of friends I am publicly shaming into making buttons because I am a gremlin:
|
||||
<a href="https://cendyne.dev/">Cendyne</a> / <a href="https://soatok.blog">Soatok</a> / <a href="https://xeiaso.net">Xe Iaso (Cadey)</a></>}
|
||||
|
||||
If you want to link my website to your page like this, feel free to use these buttons I made!
|
||||
|
||||
<a href="https://eleboog.com" style=" max "><img width="88" height="31" src="/buttons/eleboog_button.jpg" class="border-none shadow-none inline rounded-none" alt="A button for eleboog dot com in a blue color pallete."/></a>
|
||||
<a href="https://eleboog.com" style=" max "><img width="88" height="31" src="/buttons/eleboog_button_light.jpg" class="border-none shadow-none inline rounded-none" alt="A button for eleboog dot com in an orange color pallete."/></a>
|
|
@ -4,5 +4,5 @@ import type { APIContext } from 'astro';
|
|||
export async function GET(context: APIContext): Promise<Response> {
|
||||
const feed = await computeFeed();
|
||||
|
||||
return new Response(feed.json1())
|
||||
return new Response(feed.json1(), { headers: { "Content-Type": "application/json" } })
|
||||
}
|
|
@ -3,5 +3,5 @@ import { computeFeed, injectXSL } from "../../lib/feed.ts";
|
|||
export async function GET(): Promise<Response> {
|
||||
const feed = await computeFeed();
|
||||
|
||||
return new Response(injectXSL(feed.atom1(), "/feed.xsl"))
|
||||
return new Response(injectXSL(feed.atom1(), "/feed.xsl"), { headers: { "Content-Type": "application/atom+xml" } })
|
||||
}
|
|
@ -14,13 +14,16 @@ import { getCollection } from 'astro:content';
|
|||
const posts = await getCollection('posts')
|
||||
|
||||
import { timeZone } from "../lib/utils";
|
||||
import HR from '../components/HR.astro';
|
||||
|
||||
let okay = 0;
|
||||
|
||||
---
|
||||
|
||||
<BaseLayout title="home">
|
||||
<h2 class="font-serif text-3xl my-2">Hey. Welcome to City 23.</h2>
|
||||
<Picture
|
||||
src={cri}
|
||||
<h2 class="font-serif text-3xl my-2 hover:underline">Hey. Welcome to City 23.</h2>
|
||||
<img
|
||||
src="/chills_going_waaaaah.png"
|
||||
alt="A scrunkly drawing of my sona crying"
|
||||
class="w-20 mr-4 inline-flex float-left"
|
||||
/>
|
||||
|
@ -31,20 +34,14 @@ import { timeZone } from "../lib/utils";
|
|||
<p class="mb-2">Expect posts once or twice a week, I guess.</p>
|
||||
|
||||
<p class="mb-2"><b>Last journal update:</b>
|
||||
<a href="/journal" class="font-serif text-subtitle text-sm hover:underline">November 14, 2024</a>
|
||||
<a href="/journal" class="font-serif text-subtitle text-sm hover:underline">June 23, 2025</a>
|
||||
</p>
|
||||
|
||||
<MDXCallout preset="info">
|
||||
whoops i forgor to pay my hosting provider so my website went poof. i fixed it. website back now. yey
|
||||
<br/><br/>
|
||||
Expect an editing pass to my last blog post (f i n a l l y) sometime soon-ish.
|
||||
</MDXCallout>
|
||||
|
||||
<h2 class="font-serif text-2xl mb-2">recent posts</h2>
|
||||
<ul class="space-y-2">
|
||||
<ul class="space-y-2 mb-2">
|
||||
{posts.sort((a, b) => compareDesc(new Date(a.data.date), new Date(b.data.date))).map((post, idx) => {
|
||||
if (idx >= 3 || post.data.draft) return;
|
||||
console.log(toZonedTime(post.data.date, timeZone));
|
||||
if (okay >= 3 || post.data.draft) return;
|
||||
okay++;
|
||||
return (
|
||||
<li >
|
||||
<a href={'/posts/' + post.slug} class="font-serif text-lg text-crusta-400 dark:text-night-300 hover:underline">{post.data.title}</a>
|
||||
|
@ -54,14 +51,17 @@ import { timeZone } from "../lib/utils";
|
|||
);
|
||||
})}
|
||||
</ul>
|
||||
<h2 class="font-serif text-2xl mb-2">webrings</h2>
|
||||
<div class="flex items-baseline">
|
||||
<p class="mb-2"><a href="/blog" class="text-subtitle italic hover:text-current">find more posts →</a></p>
|
||||
<HR/>
|
||||
<div class="flex items-center">
|
||||
<a class="text-subtitle hover:text-current" href="https://fediring.net/previous?host=eleboog.com">← </a>
|
||||
<a class="text-subtitle hover:text-current" href="https://fediring.net/">Fediring</a>
|
||||
<a class="text-subtitle hover:text-current" href="https://fediring.net/next?host=eleboog.com"> →</a>
|
||||
<div class="flex w-4 self-baseline h-1 border-t border-crusta-200 dark:border-night-800 mx-2"></div>
|
||||
  
|
||||
<a class="text-subtitle hover:text-current" href="https://webring.bucketfish.me/redirect.html?to=prev&name=kebokyo">← </a>
|
||||
<a class="text-subtitle hover:text-current" href="https://webring.bucketfish.me">bucket webring</a>
|
||||
<a class="text-subtitle hover:text-current" href="https://webring.bucketfish.me/redirect.html?to=next&name=kebokyo"> →</a>
|
||||
  
|
||||
<a href="https://512kb.club"><img width="88" height="31" src="/buttons/green-team.gif" alt="a proud member of the green team of 512KB club" /></a>
|
||||
</div>
|
||||
</BaseLayout>
|
||||
|
|
|
@ -13,18 +13,120 @@ import Icon from "../components/Icon.astro";
|
|||
|
||||
## now
|
||||
|
||||
it's 4am. i need to sleep. but i will not. because i do not control the eep
|
||||
when your girlfriend tells you to drink your goddamn tea, you better drink your goddamn tea
|
||||
|
||||
---
|
||||
|
||||
<MDXAccordion title="todo">
|
||||
- [ ] Make an editing pass on the last blog post (FINALLY) so I can stop worrying about it.
|
||||
- [ ] Just. Write. Goddammit.
|
||||
- [ ] Figure out how to make the API route serving the Atom feed ([feed.xml](../feeds/feed.xml)) actually send an xml file that can be recognized by the browser (i.e. allowing for a `.xsl` to work with it and/or opening it automatically in your RSS reader of choice).
|
||||
- [ ] Make another blog post this month.
|
||||
- [ ] Update the Sharefeed a little more maybe? As a treat?
|
||||
- [x] ~~Figure out how to make the API route serving the Atom feed ([feed.xml](../feeds/feed.xml)) actually send an xml file that can be recognized by the browser (i.e. allowing for a `.xsl` to work with it and/or opening it automatically in your RSS reader of choice).~~ I figured it out! I talk about it [here](../posts/2025-06-14-1yranni).
|
||||
</MDXAccordion>
|
||||
|
||||
---
|
||||
|
||||
# 2025-06-23
|
||||
|
||||
I made a cool little thing. It's called the [Sharefeed Entry Tool](https://git.eleboog.com/kebokyo/sharefeed-chrome) and it's my way of decreasing
|
||||
the friction between me seeing something cool and logging it in the [sharefeed](/sharefeed). It auto-generates a JSON object with
|
||||
the url of the webpage, the current date and time, and if it detects metadata it can grab on the current page, all the other data I would
|
||||
need to make the sharefeed entry. It currently supports all Substack websites, Medium, YouTube, GitHub, and more... and I only made it
|
||||
in a day or two. **Without AI.**
|
||||
|
||||
I *really* want to make a blog post about it soon, so I'm going to hold off on rambling about it too much for now. Instead, I'm going to
|
||||
share [this cool ambient piece with a real Rhodes](https://www.youtube.com/watch?v=HFbfpt6P1bk) and try to calm down after a slightly
|
||||
stressful day. Mwwwah, love you, bye.
|
||||
|
||||
# 2025-06-14
|
||||
|
||||
I did it. I graduated from college with a bachelor's in computer science. I have an... okay GPA — worse than I would like it to be, but considering everything, I think
|
||||
everything turned out okay in the end. I also got some silly certificate and a cool "emphasis" but none of those really matter.
|
||||
|
||||
Now I just need to get a job. And I don't think that will happen.
|
||||
|
||||
I moved to an area that is absolutely *not* condusive to my current line of work. I would need to relocate again or get a remote job to find something good, and even then,
|
||||
the market is absolutely horrible right now. Everyone wants to fire. No one wants to hire. It's going to take me a *minimum* of three months to find a decent job. I can't
|
||||
wait that long.
|
||||
|
||||
So, here's what I am going to do: I'm going to see if I can get *some* income. Work a minimum-wage service job for less than I made in college. From there, I can wait for
|
||||
the market to decide I matter. I'll network constantly, looking for new opportunities. I'll continue doing what I'm currently doing, working on this site and at [FurSquared](https://fursquared.com/),
|
||||
to continue to hone my skills and find more ways to network.
|
||||
|
||||
I'll also be looking at solidifying *one* additional side project that I can slap on a portfolio. For example, I recently discovered the right way (for me) to use Notion: use
|
||||
the database tool to quickly organize personal data in a fast and intuitive way. I currently have on a second monitor (!!!) a kanban board full of the job applications I'm managing
|
||||
that I can easily turn into a Gantt chart to visualize when I need to take next steps. It's lovely. But it has limitations. I can only look at one view at a time;
|
||||
I can't combine them. Automations are locked behind a paywall. Everything is in the cloud in servers I do not control, which means if some big brain hacker wanted to see
|
||||
all the anime I want to watch for some reason, they might be able to find a way.
|
||||
|
||||
Ideally, I would want the automations to be something I can easily "script" using
|
||||
a language like Lua or Python (so more advanced automations can be made without having to push through a silly visual workflow). I would also have the views
|
||||
themselves be more customizable, also possibly with a scripting language. Finally, I can start everything as a local-only app w/ a basic SQLite database and eventually
|
||||
work my way to self-hosted paradise (so eventually I can make my own mobile apps for it!!)
|
||||
This *may* be a bit too over my head, especially considering a big reason why Notion works
|
||||
so well for me right now is because it's *right there* and Just Works™... but there's a little shit in the bottom-right corner that periodically animates itself
|
||||
to goad me to look at it, click on it, and remember it's their stupid AI thing they desperately want me to use and I want that twink **obliterated**. So, the perfect
|
||||
reason to reinvent the wheel :3
|
||||
|
||||
Since it has been *again* a hot minute since I wrote a blog post, I'm going to make a new one real quick about my misadventures moving to a new setup and
|
||||
what I plan to do now that I am out of school.
|
||||
|
||||
So... yeah! I was looking for one track [but accidentally came across a totally different one so here's that one](https://www.youtube.com/watch?v=WL2SyirMpGI).
|
||||
I also have literally no income so [any donations to keep this site up and running would be amazing](https://ko-fi.com/kebokyo). Hopefully this
|
||||
all goes well and I can finally break my YGS curse. Please.
|
||||
|
||||
# 2025-03-04
|
||||
|
||||
Welp, that didn't work.
|
||||
|
||||
I tried creating a CI/CD system with Docker containers and Forgejo Actions... and it worked once. Now it doesn't work.
|
||||
|
||||
I'm going to revert back to my old method, which involves a local node server managed with PM2, and figure out why Docker refused to cooperate later.
|
||||
I made this system so I didn't have to think about pushing changes, but since I clearly have to think about this a lot more with this system, it just
|
||||
isn't worth it.
|
||||
|
||||
In other news I just had to spend $600 to make my car usuable so if anyone wants to [send me a few bucks on Ko-fi](https://ko-fi.com/kebokyo) I would
|
||||
appreciate that so much \<3
|
||||
|
||||
This entry and the entry below it are both new now since the update that contained it never went live. Feel free to read that one too!
|
||||
|
||||
Finally, [here's a deep cut from a legendary rock band's lesser-known albums.](https://www.youtube.com/watch?v=DBzuYNK95sM&pp=ygUOdGVuIHllYXJzIGdvbmU%3D) ktnxbye
|
||||
|
||||
# 2025-02-18
|
||||
|
||||
Today I learned that [NetNewsWire](https://netnewswire.com) added an extension to Safari that puts a little RSS button to the left of the address bar.
|
||||
When you click it, it auto-magically finds the RSS feed for the website you're currently on and opens the "New Feed" dialog on NetNewsWire w/ the
|
||||
feed's URL already copy-pasted into the dialog box. Found a new blog that you think is neat? Two clicks ([philip](https://www.youtube.com/watch?v=KHmVgS5lDZM&pp=ygUJY2Fib29zaW5n))
|
||||
and that blog can be added to your RSS reader, ready to view on both your laptop and your phone whenever you want (remember, this app has iCloud sync! :3).
|
||||
|
||||
I immediately went through my [sharefeed](/sharefeed) and added as many blogs as I could to NetNewsWire. I **doubled** the amount of blogs in my "Blogs" folder.
|
||||
I feel like a god.
|
||||
|
||||
...But I also realized how neglected my sharefeed has become lately. The last entry to it before today was in *August*. Of *last year*. Ouch.
|
||||
|
||||
Have I just run out of content to regurgitate? Nope. I'm still glued to my [Hacker News Telegram bot](http://t.me/hackernewslive), saving articles that look cool.
|
||||
I just haven't read many of them to the point where I feel comfortable doing my blog equivalent of a re~~tw~~skeet yet. I save, but I do not engage.
|
||||
I hoard instead of currate.
|
||||
|
||||
I'm not sure how to fix this other than... doing the freakin' thing more often. I've thought about automating the process of adding new entries
|
||||
a little more, maybe with a tiny wizard script that asks for each field and then adds that object to the JSON array... but I feel like making
|
||||
that whole thing work would be overengineering, as opening up the JSON array itself and adding the object myself is just as easy.
|
||||
|
||||
Hopefully, this little button in Safari will help me keep tabs on sites I like better. I've really enjoyed the *thought* of using RSS readers, but
|
||||
I keep running into little issues with them. NetNewsWire has solved most of them, but even then I get more outside problems like "oh god why did
|
||||
I add this news website, now I get like 100 new articles a day about things I don't care about and half of them are ads and I can't keep track of
|
||||
all of these posts aaaaaaaaaaa". The more I replace these big news sites with a bunch of smaller blogs, the better my RSS experience will be, I think.
|
||||
|
||||
<MDXCallout>
|
||||
This is my call-to-action: If **YOU** use RSS readers to subscribe to blogs and other websites you enjoy, please email me with what sites you
|
||||
subscribe to! I would love to hear about more cool places on the internet from other like-minded people.
|
||||
</MDXCallout>
|
||||
|
||||
Oh, and I've decided it would be a cool idea to make a blogroll to more explicitly recommend sites and people I find cool.
|
||||
I'm still wanting to flesh it out a little more before I publish it for real, but I hope it will be a good resource when it is released.
|
||||
|
||||
Finally, [here's a song that feels very thematically appropriate regarding current events](https://www.youtube.com/watch?v=lLa0rlhOTvw&pp=ygUgdGhlIGxvbmdlc3QgbmlnaHQgbGl2ZSBhdCBoZWFyc3Q%3D). ok bye
|
||||
|
||||
# 2025-01-22
|
||||
|
||||
Oh my god!!! It's another year!!!!
|
||||
|
|
|
@ -3,6 +3,7 @@ layout: '../layouts/StandaloneMDXLayout.astro'
|
|||
title: Me!
|
||||
date: 1970-01-01
|
||||
summary: "A page for stuff about me and what I'm doing."
|
||||
slug: me
|
||||
draft: true
|
||||
---
|
||||
|
||||
|
@ -40,6 +41,11 @@ There used to be a link to my Cohost (`@kebokyo`), but Cohost is unfortunately s
|
|||
|
||||
If you like what I do and want to help me make more of it, currently the only way I have for you to give me money is through [Ko-fi](https://ko-fi.com/kebokyo). I am a very very broke college student and any little bit of help means a lot to me!
|
||||
|
||||
<MDXCallout>
|
||||
Most of the information below is out of date since I have just graduated college and thus had a massive shift in my day-to-day operations.
|
||||
Expect updates soon(ish).
|
||||
</MDXCallout>
|
||||
|
||||
# why
|
||||
|
||||
Why do I even have this website? Well, it's for mulitple reasons:
|
||||
|
@ -70,7 +76,7 @@ I also carry my [Nintendo 3DS](https://en.wikipedia.org/wiki/Nintendo_3DS) almos
|
|||
|
||||
# colophon
|
||||
|
||||
This website runs on a [Hetzner VPS](https://www.hetzner.com), Nginx web server, and [~~Next.js metaframework~~](https://nextjs.org) [Astro web framework](https://astro.build).
|
||||
This website runs on a [~~Hetzner VPS~~](https://www.hetzner.com) [~~Vultr VPS~~](https://www.vultr.com/) actually I'm going back to Hetzner now lmao, Nginx web server, and [~~Next.js metaframework~~](https://nextjs.org) [Astro web framework](https://astro.build).
|
||||
|
||||
The reason this site looks so fancy in both light & dark mode is because of [Tailwind CSS](https://tailwindcss.com) and its built-in light & dark mode features. I may build a special toggle so you can choose which version of the site you like more one day, but for now, it's just based on whether your browser / OS is in light or dark mode.
|
||||
|
||||
|
@ -87,7 +93,13 @@ When I insert code into my blog, I use [React Code Block](https://react-code-blo
|
|||
I use the <a href="https://www.npmjs.com/package/feed" class="text-subtitle text-base hover:underline px-1 bg-neutral-300 bg-opacity-50 dark:bg-slate-600 dark:bg-opacity-100 rounded-md font-mono">feed</a> library to generate my Atom & JSON feeds ~~for everything except narrated articles. For that, I use <a href="https://www.npmjs.com/package/feed" class="text-subtitle text-base hover:underline px-1 bg-neutral-300 bg-opacity-50 dark:bg-slate-600 dark:bg-opacity-100 rounded-md font-mono">podcast-rss</a> since it has more features specifically to comply with platforms' weird-ass rules
|
||||
regarding podcast feeds.~~ Right now, narrated articles have been scrapped, but when I do start making audio content, I'll use `podcast-rss` to generate a feed specifically for that audio content.
|
||||
|
||||
Finally, for the software I use to actually write the code... I used to use [Visual Studio Code](https://code.visualstudio.com), but since it's an Electron app (basically Google Chrome in a fancy native-app-shaped box), its performance and resource use is very high. Thus, I switched *back* to [Sublime Text](https://www.sublimetext.com). If anyone has a FOSS alternative to Sublime that works just as well, let me know cause that would be awesome.
|
||||
Finally, for the software I use to actually write the code...
|
||||
I ~~used to~~ *currently* use [Visual Studio Code](https://code.visualstudio.com)~~, but since it's an Electron app
|
||||
(basically Google Chrome in a fancy native-app-shaped box), its performance and resource use is very high.
|
||||
Thus, I switched *back* to [Sublime Text](https://www.sublimetext.com).
|
||||
If anyone has a FOSS alternative to Sublime that works just as well, let me know cause that would be awesome.~~
|
||||
as eventually I just realized the bomb is too powerful and the good it does on my workflow outweighs the bad it does on my computer.
|
||||
Weeeeeeeeeeeeeeeeeee!!!
|
||||
|
||||
# ideas
|
||||
|
||||
|
@ -99,12 +111,25 @@ It's hard for me to put all of my ideas into one place at the moment, so expect
|
|||
|
||||
# chipotle
|
||||
|
||||
Qdoba is better. Fight me.
|
||||
Qdoba is better. Fight me. (plus I'm poor so I don't get either of them very often lmao)
|
||||
|
||||
(plus I'm poor so I don't get either of them very often lmao)
|
||||
...but I just placed an order today (4/15/25) so here you go I guess
|
||||
|
||||
- Chipoltle Honey Chicken
|
||||
- brown rice, black beans
|
||||
- corn salsa, tomato salsa, fajita veggies
|
||||
- shredded cheese, lettuce
|
||||
- salsa de verde, sour cream
|
||||
|
||||
and for today since I got free double protien I double-wrapped it just in case.
|
||||
|
||||
If you take me to chipotle and get this exact order (minus the protien because i think it's seasonal lol), I will make out with you.
|
||||
|
||||
# ai
|
||||
|
||||
I do not use generative AI on this website. Period.
|
||||
|
||||
The only time I used generative AI for any real purpose was during a massive crunch session in college, and even then I was disappointed in it.
|
||||
I need to write a post about it one day.
|
||||
|
||||
One day, I need to add a `robots.txt` and other such protections to prevent this website from being scraped... but no-one is going to listen to me anyway because my rights don't matter to them in that regard.
|
||||
|
|
23
src/pages/more.mdx
Normal file
|
@ -0,0 +1,23 @@
|
|||
---
|
||||
date: 1970-01-01
|
||||
layout: '../layouts/StandaloneMDXLayout.astro'
|
||||
title: More Pages
|
||||
slug: more
|
||||
summary: Other miscleaneous pages on my website.
|
||||
---
|
||||
|
||||
Want to see even more stupid stuff that I've been up to? Here you go!
|
||||
|
||||
- [sharefeed - A collection of links to things that are interesting](/sharefeed)
|
||||
|
||||
- [me - An "about me" page and a whole lot more](/me)\
|
||||
If you are a fan of slash pages, try throwing some into the URL and see what happens!
|
||||
For example, [/colophon](/colophon) or [/chipotle](/chipotle) :3
|
||||
|
||||
- [cool - A miscellaneous resource of cool stuff I want to draw more attention to](/cool)
|
||||
|
||||
- [rss - Want to keep tabs on what I make? This is the best way to do it](/rss)\
|
||||
If you need an RSS client and are on iOS and/or macOS, check out [NetNewsWire](https://netnewswire.com/) (not sponsored, it's just what
|
||||
I use lol)
|
||||
|
||||
If you have suggestions for what else to put on my website, please let me know ^w^
|
|
@ -6,10 +6,16 @@ import type { APIRoute } from 'astro';
|
|||
|
||||
const posts = await getCollection('posts')
|
||||
|
||||
const newestPost = posts.sort((a, b) => compareDesc(new Date(a.data.date), new Date(b.data.date)))[0];
|
||||
const newestPost = posts.sort(
|
||||
(a, b) => compareDesc(new Date(a.data.date), new Date(b.data.date))
|
||||
).filter((e) => {
|
||||
if (e.data.draft) {
|
||||
return false;
|
||||
} else return true;
|
||||
})[0];
|
||||
|
||||
console.log(newestPost.slug)
|
||||
|
||||
export const GET: APIRoute = ({ redirect }) => {
|
||||
return redirect('https://eleboog.com/posts/' + newestPost.slug, 307);
|
||||
return redirect('/posts/' + newestPost.slug, 307);
|
||||
}
|
|
@ -12,7 +12,7 @@ import sfjson from "../data/sharefeed.json";
|
|||
import type { ShareFeedEntry } from "../lib/utils";
|
||||
|
||||
const entries = sfjson.sharefeed
|
||||
.sort((a:ShareFeedEntry,b:ShareFeedEntry) => compareDesc(new Date(a.date), new Date(b.date)))
|
||||
.sort((a:ShareFeedEntry,b:ShareFeedEntry) => compareDesc(new Date(a.accessedDate), new Date(b.accessedDate)))
|
||||
.filter((entry: ShareFeedEntry) => !(entry.draft))
|
||||
|
||||
---
|
||||
|
@ -35,8 +35,8 @@ const entries = sfjson.sharefeed
|
|||
</a>
|
||||
<p class="text-sm text-subtitle">
|
||||
<span class="italic">< {entry.url} ></span><br/>
|
||||
{entry.pubDate ? `originally published on ${format(entry.pubDate, "LLLL d, yyyy")} - ` : ''}
|
||||
retrieved {format(entry.date, "LLLL d, yyyy")}
|
||||
{entry.publishedDate ? `originally published on ${format(entry.publishedDate, "LLLL d, yyyy")} - ` : ''}
|
||||
retrieved {format(entry.accessedDate, "LLLL d, yyyy")}
|
||||
</p>
|
||||
<p>{entry.note}</p>
|
||||
</li>
|
||||
|
|
|
@ -101,11 +101,27 @@
|
|||
}
|
||||
|
||||
@layer components {
|
||||
.title-gradient {
|
||||
@media (prefers-color-scheme: dark) {
|
||||
background-color: #cbd0fa;
|
||||
background-image: linear-gradient(to right, #cbd0fa, #8989f0);
|
||||
.main-spacing {
|
||||
@apply flex-col mx-auto min-h-screen max-w-screen-lg p-8 py-4;
|
||||
}
|
||||
|
||||
.nav-extras {
|
||||
@apply inline;
|
||||
}
|
||||
.nav-more {
|
||||
@apply hidden;
|
||||
}
|
||||
|
||||
@media (max-width: 932px) {
|
||||
.nav-extras {
|
||||
@apply hidden;
|
||||
}
|
||||
.nav-more {
|
||||
@apply inline;
|
||||
}
|
||||
}
|
||||
|
||||
.title-gradient {
|
||||
background-color: #ff7f3e;
|
||||
background-image: linear-gradient(to right, #ff7f3e, #af4261);
|
||||
background-size: 100%;
|
||||
|
@ -116,9 +132,6 @@
|
|||
}
|
||||
|
||||
.title-dot {
|
||||
@media (prefers-color-scheme: dark) {
|
||||
background-color: #fba63c;
|
||||
}
|
||||
background-color: #1c78ad;
|
||||
background-size: 100%;
|
||||
-webkit-background-clip: text;
|
||||
|
@ -141,6 +154,24 @@
|
|||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
.title-gradient {
|
||||
background-color: #cbd0fa;
|
||||
background-image: linear-gradient(to right, #cbd0fa, #8989f0);
|
||||
background-size: 100%;
|
||||
-webkit-background-clip: text;
|
||||
-moz-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
-moz-text-fill-color: transparent;
|
||||
}
|
||||
|
||||
.title-dot {
|
||||
background-color: #fba63c;
|
||||
background-size: 100%;
|
||||
-webkit-background-clip: text;
|
||||
-moz-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
-moz-text-fill-color: transparent;
|
||||
}
|
||||
.text-title {
|
||||
@apply text-night-300
|
||||
}
|
||||
|
|