Compare commits
40 Commits
aafa982faf
...
v2.0.0-alp
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
68263b1bad | ||
|
|
b8f65f2ce4 | ||
|
|
820a1f357a | ||
|
|
5fde9a2754 | ||
|
|
fba35705e9 | ||
|
|
2f09ca4a61 | ||
|
|
1c00979274 | ||
|
|
2af6bd1ed7 | ||
|
|
63c3b16bda | ||
|
|
a0d89676a8 | ||
|
|
3c7a687cab | ||
|
|
bd67b51325 | ||
|
|
e0d8a71e99 | ||
|
|
415182edae | ||
|
|
fb7cb1b73c | ||
|
|
60cd0f9850 | ||
|
|
81b854d32a | ||
|
|
a2c7d72ecf | ||
|
|
bc66ede0e1 | ||
|
|
7d1dfd0a5f | ||
|
|
dd199d7d5f | ||
|
|
9e59f22448 | ||
|
|
4662c8261c | ||
|
|
a97ec550fa | ||
|
|
8d2f472935 | ||
|
|
d9c47c0403 | ||
|
|
d6b689e0f6 | ||
|
|
7ba55567e8 | ||
|
|
4f1873b775 | ||
|
|
561048c93b | ||
|
|
ffb1bfdc30 | ||
|
|
643b2adb38 | ||
|
|
bf19ff876e | ||
|
|
ec1947376f | ||
|
|
d02026bd55 | ||
|
|
30938fe9d1 | ||
|
|
863355cd1c | ||
|
|
5bc1d2ecd9 | ||
|
|
5bde31a42f | ||
|
|
5f4049c10c |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1 +1,2 @@
|
||||
**/target
|
||||
**/__pycache__
|
||||
|
||||
12
build.sh
12
build.sh
@@ -83,17 +83,13 @@ do
|
||||
|
||||
elif [ "$x" == 'copy' ]
|
||||
then
|
||||
cmd='cp -R'
|
||||
|
||||
files=(
|
||||
'src/.well-known/security.txt'
|
||||
'src/feed/rss.xml'
|
||||
'src/robots.txt'
|
||||
)
|
||||
|
||||
mkdir -p target/.well-known
|
||||
mkdir -p target/feed
|
||||
|
||||
cp 'src/feed/rss.xml' 'target/feed/rss.xml'
|
||||
cp 'src/robots.txt' 'target/robots.txt'
|
||||
cp 'src/.well-known/security.txt' 'target/.well-known/security.txt'
|
||||
|
||||
action=Copying...
|
||||
|
||||
elif [ "$x" == 'conv-img' ]
|
||||
|
||||
13
src/.well-known/public.asc
Normal file
13
src/.well-known/public.asc
Normal file
@@ -0,0 +1,13 @@
|
||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||
|
||||
xjMEaNawyhYJKwYBBAHaRw8BAQdARXZA94pLJ9NqMFGi2g4mgC+JhsDccsjC5YZL
|
||||
FFrXyVfNK09saXZpYSBCcm9va3MgPG9saXZpYS5hLmJyb29rczc3QGdtYWlsLmNv
|
||||
bT7CiQQTFggAMRYhBNHb+MmfTznTILS7fUanaquYTswnBQJo1rDKAhsDBAsJCAcF
|
||||
FQgJCgsFFgIDAQAACgkQRqdqq5hOzCdoOQEAwF3dlYsoaiAKuD1xv2R45QAWobHG
|
||||
hI41JuUnAGPHWh4BAPilFDXQv3PbYOIS/fVqrNVZI9ZPbNpT0ZlQeLCFm48AzjgE
|
||||
aNawyxIKKwYBBAGXVQEFAQEHQPMiRn06nv5gWZNYHjtKmshLWKlcnwOcOH1WRWE7
|
||||
VREvAwEIB8J4BBgWCAAgFiEE0dv4yZ9POdMgtLt9Rqdqq5hOzCcFAmjWsMsCGwwA
|
||||
CgkQRqdqq5hOzCfc9wD5AV4m9zFPoipKQNfZpll62bdI9zdtAT3QYS5XzwGCz1EA
|
||||
/1Km4cYgieqk10A7X1Zpz2tP5miNyaAW48D5QiWd7GUD
|
||||
=jPqw
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
||||
@@ -1,4 +1,5 @@
|
||||
Contact: mailto:olivia.a.brooks77@gmail.com
|
||||
Expires: 2026-06-01T04:00:00.000Z
|
||||
Encryption: https://www.cutieguwu.ca/.well-known/public.asc
|
||||
Acknowledgments: https://www.cutieguwu.ca/acknowledgements.html
|
||||
Preferred-Languages: en, fr
|
||||
Expires: 2027-01-01T04:00:00.000Z
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
teachers certainly made sure of that, and ultimately helped lead me down a
|
||||
path of being the teacher's pet. Maybe I'll talk about my experiences and
|
||||
struggles related to that another time, but the short of it is that I am a
|
||||
high-acheiving workaholic as a result. My ex-boyfriend on the other hand,
|
||||
high-achieving workaholic as a result. My ex-boyfriend on the other hand,
|
||||
didn't have that kind of an experience, and ultimately was led down the
|
||||
college-level course stream in high school.
|
||||
</p>
|
||||
|
||||
162
src/blog/posts/2_buyers_anxiety.html
Normal file
162
src/blog/posts/2_buyers_anxiety.html
Normal file
@@ -0,0 +1,162 @@
|
||||
<!doctype html>
|
||||
|
||||
<html lang="en-ca">
|
||||
<head>
|
||||
<title>Buyer's Anxiety | Cutieguwu</title>
|
||||
<include src="includes/meta.html" />
|
||||
</head>
|
||||
<body>
|
||||
<nav class="pane">
|
||||
<include src="includes/nav_header.html" />
|
||||
<include src="includes/nav_menu.html" />
|
||||
<div class="location">
|
||||
<header><h4>You are here:</h4></header>
|
||||
<h5 class="page">Blog - Buyer's Anxiety</h5>
|
||||
</div>
|
||||
<include src="includes/nav_quick_links.html" />
|
||||
</nav>
|
||||
<main class="pane blog">
|
||||
<div class="body">
|
||||
<header>
|
||||
<h1 class="title">Buyer's Anxiety</h1>
|
||||
<p class="date">Posted: 11 September, 2025</p>
|
||||
<p class="date">Last Edited: 14 September, 2025</p>
|
||||
</header>
|
||||
<div class="body">
|
||||
<img
|
||||
alt="Katie's old laptop, seated upon her clean desk, struggling on. Although, you can't tell how broken the hinge is or the parts that her kitten chewed. I swear, it's in worse condition than it looks."
|
||||
src="/img/blog/posts/2_buyers_anxiety.webp"
|
||||
/>
|
||||
<p>
|
||||
I can't say that I'm thrilled that my blog posts have only been when I'm
|
||||
down or struggling with something. But, here we are: the third one.
|
||||
</p>
|
||||
<p>
|
||||
I'm stuck with an internal conflict. It feels like remorse, but before the
|
||||
poor choice has happened, as opposed to fear? But it is fear.
|
||||
</p>
|
||||
<p>
|
||||
It's no secret that I love my Framework 16, the company's values, and Linux.
|
||||
</p>
|
||||
<p>I also want to support my friends whenever and however I can.</p>
|
||||
<p>But what if those two things clash?... Spoiler: they have.</p>
|
||||
<p>
|
||||
To preface this whole thing, my friend is looking for a new laptop. She
|
||||
bought her old one because it was in her price range. Four years later,
|
||||
it's... struggling. The enshittification of the tech industry took hold, one
|
||||
hinge died a couple years ago, the whole body is weak, the system is
|
||||
relatively underpowered for her needs, and it's not going to survive
|
||||
university in any good condition, if even that. As a two-time published
|
||||
author, she needs to be able to type and open this system a lot. That means
|
||||
a good keyboard and good hinges. She also wants to play Minecraft, Roblox,
|
||||
and probably Uno on it too. Thus, GPU demands aren't high and she'll want at
|
||||
least a 15" display. She treats her devices well and cares for their
|
||||
longevity.
|
||||
</p>
|
||||
<p>
|
||||
To me, this sounds like a great place for a Framework laptop. Expensive
|
||||
upfront, sure. But the 16" model has an iGPU that runs Minecraft and Roblox
|
||||
just fine, has a super easy to replace input module system to replace the
|
||||
keyboard, good hinges, a CPU that's total overkill (even for the stuff I do;
|
||||
I wanted a six-core), and it wears like a tank. A guy at our high school
|
||||
proved that unintentionally. I have the dent in the lid and the pristene
|
||||
display to prove it. It also has some added benefits, like the hardware
|
||||
switches for the camera and mic, overall modular design, repairability, and
|
||||
the upgrade paths, which save her from spending more money to buy a full
|
||||
tower or another laptop. Framework recently announced the new generation
|
||||
boards for the FW 16, and knocked down the price of the 7040 series boards
|
||||
slightly, but that's a nice-to-have. Even if you're a non-techie, you won't
|
||||
need to get into the hardware unless you're building it or repairing
|
||||
something, and Framework's guides have only gotten better. Even when trying
|
||||
to replace the liquid metal, or solve an issue that I thought was a loose
|
||||
display cable (it was a linux software issue of some kind), the guides got
|
||||
me through the wholly unknown to me.
|
||||
</p>
|
||||
<p>This makes it sound perfect.</p>
|
||||
<p>
|
||||
The downside? Well, I feel like I'm just succumbing to brand loyalty. A
|
||||
total shill. The whole above paragraph sounds like a sales pitch without the
|
||||
company's values explicitly spouted. The one thing I envy of Apple fans, is
|
||||
their ability to convince others that Apple is great and feel no conflict.
|
||||
</p>
|
||||
<p>
|
||||
Is this what a parent feels like when buying for a child? Probably not?
|
||||
After all, the child likely isn't knowledgeable upon the context, or doesn't
|
||||
care enough to question the rationale leading to the purchase. But here, I'm
|
||||
buying for a friend. Someone smart (Before someone starts, I'm not saying
|
||||
that a child can't be smart or that the rest of my friends are dumb). Sure,
|
||||
she's not a techie the way I am, but she is more than capable of questioning
|
||||
things for herself. What's the price? What's the rationale? Are you just
|
||||
pushing me into an ecosystem that you love? Are you buying my friendship?
|
||||
...and so on down the rabbit hole my train of thought hops.
|
||||
</p>
|
||||
<p>
|
||||
I've already convinced two friends to try Linux, but their hardware and
|
||||
personal needs caused too many problems. I also convinced a family member of
|
||||
mine, who was an Apple fan, to shift to a Framework 13 running Linux.
|
||||
</p>
|
||||
<p>
|
||||
I feel like a manipulator. I left my proud, cheerful "switch to Linux"
|
||||
chanting phase a while ago. But did I really? Am I so moral-driven that I'm
|
||||
blind? Is this really a selfless gift to a friend? Is this because I'm
|
||||
afraid of losing my friends? Or do I subconciously hold an agenda to migrate
|
||||
everyone to Framework and Linux? As stupid as it sounds, I mean this
|
||||
literally.
|
||||
</p>
|
||||
<p>
|
||||
Even if you consider the idea that "only a good person would think like
|
||||
that, because a bad person would know it," it doesn't help.
|
||||
</p>
|
||||
<p>
|
||||
To make things worse again, I've long spouted buying something with the
|
||||
intent to run it long term, instead of buying a bunch of cheap somethings
|
||||
that die super fast. My previous laptop, which I got from my father, ran for
|
||||
nearly 12 years before the display started dying; now it's a server. So
|
||||
imagine a teenager with that kind of a background in keeping a computer
|
||||
running for so long, sees a 3-year old laptop already in a far worse
|
||||
condition than their 10/11-year old one (with comparable specs). I was that
|
||||
teenager, and I started a "joke" once I got my new laptop, about it's easily
|
||||
replaceable hinges... and so on. Of course, I was prideful in a sense, and I
|
||||
kept that "joke" going too long... So how will it look when the laptop who's
|
||||
death I foretold gets replaced by the exact laptop that it was compared to?
|
||||
(Assuming that I didn't start the "joke" about the purchase decisions, age,
|
||||
and condition of my previous one.)
|
||||
</p>
|
||||
<p>
|
||||
The only consolation I get for now, is that I have a few days to see how
|
||||
Katie likes the FW 13, which is loaned off the aforementioned family member
|
||||
of mine. The trouble, because of course there's more, is that I need to
|
||||
discern between her impressions of the computer, and the OS, since it's
|
||||
Manjaro Linux. Because of that, my plan is to dual boot the gifted system.
|
||||
That way she can finish her computer science stuff in the same environment,
|
||||
and then decide whether or not to scrap the Linux partition.
|
||||
</p>
|
||||
<p>
|
||||
Of course, as always, my troubles start just after having had a counselling
|
||||
session. So, I'm left to deal with this myself for a few weeks.
|
||||
</p>
|
||||
<p>Sometimes I wonder why things can't just be simple for me in life...</p>
|
||||
<hr />
|
||||
<p>
|
||||
Now, as a note, I'm not saying that Framework is perfect. They've had, and
|
||||
continue to have, their issues. The difference is that they actually listen
|
||||
and work on them. The guides, the incorrect QR codes, the support system,
|
||||
FW16 keyboard deflection, late UEFI updates, the FW16 keyboard wake-up issue
|
||||
with the screen closed, the first-gen display expansion cards power draw
|
||||
issue, and so on. And sure, they can be slow. But they're small, and they
|
||||
try to do it right the first time. They release the software and hardware
|
||||
patches to affected systems, and listen on to further critique in the
|
||||
interest of improving.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<include src="includes/tailer.html" />
|
||||
</main>
|
||||
<div class="pane spacer">
|
||||
<include src="./includes/blog_recent_posts.html" />
|
||||
<div class="spacer_container"><p>#AD</p></div>
|
||||
</div>
|
||||
<include src="includes/footer.html" />
|
||||
<include src="includes/scripts.html" />
|
||||
</body>
|
||||
</html>
|
||||
142
src/blog/posts/3_closing_chapters.html
Normal file
142
src/blog/posts/3_closing_chapters.html
Normal file
@@ -0,0 +1,142 @@
|
||||
<!doctype html>
|
||||
|
||||
<html lang="en-ca">
|
||||
<head>
|
||||
<title>Closing Chapters | Cutieguwu</title>
|
||||
<include src="includes/meta.html" />
|
||||
</head>
|
||||
<body>
|
||||
<nav class="pane">
|
||||
<include src="includes/nav_header.html" />
|
||||
<include src="includes/nav_menu.html" />
|
||||
<div class="location">
|
||||
<header><h4>You are here:</h4></header>
|
||||
<h5 class="page">Blog - Closing Chapters</h5>
|
||||
</div>
|
||||
<include src="includes/nav_quick_links.html" />
|
||||
</nav>
|
||||
<main class="pane blog">
|
||||
<div class="body">
|
||||
<header>
|
||||
<h1 class="title">Closing Chapters</h1>
|
||||
<p class="date">Posted: 18 December, 2025</p>
|
||||
<p class="date">Last Edited: 18 December, 2025</p>
|
||||
</header>
|
||||
<div class="body">
|
||||
<p>
|
||||
I'm not sure why I'm suddenly writing another blog post. Particularly when I
|
||||
still have an exam to do, for which I need to read two chapters of the
|
||||
textbook.
|
||||
</p>
|
||||
<p>
|
||||
Perhaps it's because I've just come out of a counselling session, and once
|
||||
again, find something I need to talk about <em>after</em> it's finished.
|
||||
</p>
|
||||
<p>
|
||||
Perhaps it's because I feel a need to prove to myself that I'm still a good
|
||||
writer, even if I barely pass my Creative Writing course...
|
||||
</p>
|
||||
<p>
|
||||
Maybe it's because I'm just generally tired but I've been awake long enough
|
||||
that I've progressed into my first period of creative brain waves. Yes,
|
||||
apparently that's a thing.
|
||||
</p>
|
||||
<p>
|
||||
Anyway, this post's idea stems from the sentiments I've been experiencing
|
||||
since graduating high school.
|
||||
</p>
|
||||
<p>
|
||||
I feel like I keep wanting to run back to my childhood, as awful as it was
|
||||
in many respects. It's not just my overwhelming fear of death, and general
|
||||
existential dread, it's my nostalgia.
|
||||
</p>
|
||||
<p>
|
||||
Yesterday, I went to see my old high school band and jazz band perform their
|
||||
annual Holiday Concert. It was great getting to see my old buddies, have a
|
||||
couple laughs while berating the Audio-Visual equipment team for their awful
|
||||
cable management in the few months that I've been gone now.
|
||||
</p>
|
||||
<p>
|
||||
But, as I listened to them play the biggest set list the band has done since
|
||||
the pandemic, I found myself melancholy. I wanted to be back with them,
|
||||
playing in the pink lighting, learning solos that I couldn't as a result of
|
||||
COVID, setting up equipment, taping cables down to comply with safety
|
||||
policies, digging into the hows and whys of DMX-512, managing my old tech
|
||||
team, shooting the shit.
|
||||
</p>
|
||||
<p>I can't really do that now.</p>
|
||||
<p>
|
||||
Picking up the hobbies again, joining a music group on Campus, finding an
|
||||
A/V equipment team to join... it just wouldn't be the same.
|
||||
</p>
|
||||
<p>
|
||||
I have more demanding courses to come, and I just don't have the time
|
||||
anymore. I, like many others, already treat the Carleton Cybersecurity Club
|
||||
as an extra course.
|
||||
</p>
|
||||
<p>The workshops; our lectures.</p>
|
||||
<p>The weekly challenges; our quizzes and textbook readings.</p>
|
||||
<p>The competitions; our midterms.</p>
|
||||
<p>
|
||||
After my showing in the past semester alone, it's likely that I'll take on
|
||||
running a couple workshops in the future.
|
||||
</p>
|
||||
<p>
|
||||
I can keep going back to the band's events, and catch up with old profs
|
||||
during reading week, but for how long?
|
||||
</p>
|
||||
<p>
|
||||
How long until everyone has moved on? How long until all the staff rotate,
|
||||
and nothing but the U-shape of the building remains?
|
||||
</p>
|
||||
<p>
|
||||
Even if I step back and question why, why am I so attached to these
|
||||
memories, I don't know.
|
||||
</p>
|
||||
<p>
|
||||
I know a lot of people who, like myself, left this school having experienced
|
||||
the absolute worst periods of their life.
|
||||
</p>
|
||||
<p>They never went back. Not for anything.</p>
|
||||
<p>
|
||||
But I'm practically desperate to return, to jump back in time to grade 9 and
|
||||
fuck everything up again, run through depression, experience the worst days
|
||||
of my dysphoria, and tolerate every bitch and asshole who decided to spend
|
||||
their time splinkling on a bit more shit all the while.
|
||||
</p>
|
||||
<p>
|
||||
I've run out of things to say at this point. I wish this was better
|
||||
structured than just a brain dump, but I'm too tired and emotional to work
|
||||
on it further.
|
||||
</p>
|
||||
<p>
|
||||
So, with the loss of my non-existent PG-13 rating, I shall conclude this
|
||||
post, and begin [hopefully] immediately on another post that will outline
|
||||
what I hope to do over the winter break, and what posts I hope to have lined
|
||||
up.
|
||||
</p>
|
||||
<p>
|
||||
So, to my only reader, stay tuned! I want to get out of the doom and gloom
|
||||
real soon.
|
||||
</p>
|
||||
<hr />
|
||||
<p>
|
||||
OKAY, so, as per usual, I know a guy, FOR EVERYTHING. He's directed me
|
||||
towards contacting another guy on campus who works with A/V stuff. So, maybe
|
||||
I can find a way to keep that chapter open, despite everything else I have
|
||||
going on these days. It also seems that there might be a way to take an
|
||||
elective course that looks into A/V equipment. I will have to hunt around
|
||||
and see if I can fit that into my program
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<include src="includes/tailer.html" />
|
||||
</main>
|
||||
<div class="pane spacer">
|
||||
<include src="./includes/blog_recent_posts.html" />
|
||||
<div class="spacer_container"><p>#AD</p></div>
|
||||
</div>
|
||||
<include src="includes/footer.html" />
|
||||
<include src="includes/scripts.html" />
|
||||
</body>
|
||||
</html>
|
||||
149
src/blog/posts/4_pointless_plans.html
Normal file
149
src/blog/posts/4_pointless_plans.html
Normal file
@@ -0,0 +1,149 @@
|
||||
<!doctype html>
|
||||
|
||||
<html lang="en-ca">
|
||||
<head>
|
||||
<title>Pointless Plans | Cutieguwu</title>
|
||||
<include src="includes/meta.html" />
|
||||
</head>
|
||||
<body>
|
||||
<nav class="pane">
|
||||
<include src="includes/nav_header.html" />
|
||||
<include src="includes/nav_menu.html" />
|
||||
<div class="location">
|
||||
<header><h4>You are here:</h4></header>
|
||||
<h5 class="page">Blog - Pointless Plans</h5>
|
||||
</div>
|
||||
<include src="includes/nav_quick_links.html" />
|
||||
</nav>
|
||||
<main class="pane blog">
|
||||
<div class="body">
|
||||
<header>
|
||||
<h1 class="title">Pointless Plans</h1>
|
||||
<p class="date">Posted: 18 December, 2025</p>
|
||||
<p class="date">Last Edited: 18 December, 2025</p>
|
||||
</header>
|
||||
<div class="body">
|
||||
<p>
|
||||
So... remember my first post where I said that "a meaningless 'Welcome to my
|
||||
Blog' filled with my hopes and aspirations that inevitably would never come
|
||||
to light was something I knew I didn't want." Well...
|
||||
</p>
|
||||
<p>
|
||||
I've been stuck in a doom and gloom phase here, and with me hopefully
|
||||
concluding my counselling soon, I definitely don't want to dwell in it.
|
||||
</p>
|
||||
<p>
|
||||
As a result, I'm making a little list of things that I'd love to write
|
||||
about, and that you can hopefully expect to read about sometime soon!
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>CyberSci</p>
|
||||
<ul>
|
||||
<li>
|
||||
I had the fortune to participate at the Regional level,
|
||||
representing Carleton University. (Spoiler: We won, barely)
|
||||
</li>
|
||||
<li>
|
||||
This will probably have a follow up once Nationals happens in
|
||||
the summer.
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
<p>Creative Writing Work</p>
|
||||
<ul>
|
||||
<li>
|
||||
I've written some good things and some really bad things for the
|
||||
Creative Writing course this term. Obviously, I'll only publish
|
||||
works that I believe are well polished.
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
<p>Poetry</p>
|
||||
<ul>
|
||||
<li>
|
||||
I want to get back to writing poetry, but for now I have some
|
||||
things that are still unpublished.
|
||||
</li>
|
||||
<li>
|
||||
They're nothing like Building Up, so if you can't read [bad]
|
||||
Rust, don't worry. They're also far less whacky than Falling
|
||||
Down.
|
||||
</li>
|
||||
<li>
|
||||
<a
|
||||
href="https://gitea.cutieguwu.ca/cutieguwu/falling_down_building_up"
|
||||
>Falling Down & Building Up</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<p>
|
||||
Also, I've come to realise that I have a thing for memoirs. I never actually
|
||||
realised it because I usually read book series, but I now have four memoirs
|
||||
in my library.
|
||||
</p>
|
||||
<ol>
|
||||
<li>
|
||||
<em>Fatty Legs</em> by Christy Jordan-Fenton and Margaret Pokiak-Fenton
|
||||
</li>
|
||||
<li>its sequel, <em>A Stranger At Home</em></li>
|
||||
<li><em>The Glass Castle</em> by Jeannette Walls</li>
|
||||
<li><em>Tomboy Survival Guide</em> by Ivan Coyote</li>
|
||||
</ol>
|
||||
<p>
|
||||
So, after a creative non-fiction flash writing assignment just didn't work
|
||||
out well, even after reworking it heavily for the exam, I decided that I
|
||||
should actually take it in the direction of a full memoir, rather than the
|
||||
poetic form that it currently has.
|
||||
</p>
|
||||
<p>
|
||||
The problem is that I mean, a <em>full</em> memoir. And the problem with
|
||||
that is that memory is a complex thing. Many important and relevant things
|
||||
for a memoir are episodic, iconic, flashbulb memories, which can be
|
||||
difficult to just retrieve on the spot. (Yes, I referenced my textbook, no I
|
||||
am not a credible source for interpreting this information.)
|
||||
</p>
|
||||
<p>
|
||||
A lot of the time, my writing, particularly my poetry, comes from what can
|
||||
best be described as state-dependent memory. If I'm lucky, some random
|
||||
stimulus or set of stimuli will trigger a recollection of these memories,
|
||||
and give me an image from which to write. The problem is that this also
|
||||
means I cannot write sequentially.
|
||||
</p>
|
||||
<p>
|
||||
And just to make things even more difficult, memory is unreliable and easily
|
||||
influenced. So I need to review and consider how much I trust my own
|
||||
recollection of events, and work to mitigate my biases whenever possible by
|
||||
asking someone else to recount the event and compare details.
|
||||
</p>
|
||||
<p>
|
||||
So, in the background, I'm going to start working on that. Almost like
|
||||
forgetting to write in a diary for a week, then trying to catch up while you
|
||||
still remember.
|
||||
</p>
|
||||
<p>
|
||||
Hopefully this will have the added benefit of holding back some of the
|
||||
future doom and gloom from the blog.
|
||||
</p>
|
||||
<p>
|
||||
And finally, I'm going to try to finish up my blog generator,
|
||||
<a href="https://gitea.cutieguwu.ca/cutieguwu/cutinews">cutinews</a>. It's
|
||||
about time I got back and actually finished a programming project. Chances
|
||||
are that I'll be live on Twitch (yes, eww, ik) working on the code.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<include src="includes/tailer.html" />
|
||||
</main>
|
||||
<div class="pane spacer">
|
||||
<include src="./includes/blog_recent_posts.html" />
|
||||
<div class="spacer_container"><p>#AD</p></div>
|
||||
</div>
|
||||
<include src="includes/footer.html" />
|
||||
<include src="includes/scripts.html" />
|
||||
</body>
|
||||
</html>
|
||||
144
src/blog/posts/5_optical_recovery.html
Normal file
144
src/blog/posts/5_optical_recovery.html
Normal file
@@ -0,0 +1,144 @@
|
||||
<!doctype html>
|
||||
|
||||
<html lang="en-ca">
|
||||
<head>
|
||||
<title>Optical Recovery | Cutieguwu</title>
|
||||
<include src="includes/meta.html" />
|
||||
</head>
|
||||
<body>
|
||||
<nav class="pane">
|
||||
<include src="includes/nav_header.html" />
|
||||
<include src="includes/nav_menu.html" />
|
||||
<div class="location">
|
||||
<header><h4>You are here:</h4></header>
|
||||
<h5 class="page">Blog - Optical Recovery</h5>
|
||||
</div>
|
||||
<include src="includes/nav_quick_links.html" />
|
||||
</nav>
|
||||
<main class="pane blog">
|
||||
<div class="body">
|
||||
<header>
|
||||
<h1 class="title">Optical Recovery</h1>
|
||||
<p class="date">Posted: 10 January, 2026</p>
|
||||
<p class="date">Last Edited: 10 January, 2026</p>
|
||||
</header>
|
||||
<div class="body">
|
||||
<p>
|
||||
Data preservation is increasingly threatened in the digital age. That almost
|
||||
sounds backwards, until you dig into modern architecture.
|
||||
</p>
|
||||
<p>
|
||||
Once upon a time, the greatest threat to information preservation was nature
|
||||
and memory retrieval errors. The digital age introduced denser,
|
||||
longer-lasting forms of data storage. As we progressed from punch card, to
|
||||
tape, to 8 inch floppies, to flash and optical, and ever denser forms of
|
||||
all, we got better at preventing data loss. Quality control, error
|
||||
correction techniques bundled with file systems, and redundancy (parity) in
|
||||
storage virtualizations, like RAID.
|
||||
</p>
|
||||
<p>
|
||||
But in the modern age, the Enshittocene<sup>1</sup>, some would call it,
|
||||
consumers are ever strongarmed into corporate-controlled cloud storage. With
|
||||
that, comes a lack of ownership.
|
||||
</p>
|
||||
<p>
|
||||
Now, normally that's the lead-up to advocating for homelabbing, FOSS, and
|
||||
de-Googling. However, in this instance, it's the lead up to optical media
|
||||
preservation. Why? Because optical media remains a great storage medium
|
||||
today. Even if you don't believe that, many old games in their original
|
||||
form, or other preserved media, are still only available on discs.
|
||||
</p>
|
||||
<p>
|
||||
However, discs are subject to natural degradation through scratches,
|
||||
delamination, and disc rot. Especially as the quality control on these discs
|
||||
dwindles. Thus, there must be additional work put into caring for this
|
||||
medium.
|
||||
</p>
|
||||
<p>
|
||||
RAID arrays are great as alternatives too, as they already have parity,
|
||||
ddrescue, and error-correcting filesystems available. The problem is that
|
||||
the arrays themselves are not. At least not right now. Once again, partly
|
||||
thanks to AI datacentres demanding obscene amounts of resources, the cost of
|
||||
hard drives has gone up significantly since the pandemic.
|
||||
</p>
|
||||
<p>
|
||||
With that, we segue into my latest project, temporarily named
|
||||
<em>Kramer</em>. I know I did some research to come up with that name, but I
|
||||
genuinely don't recall who it was in reference to. In fact, having tried
|
||||
tracking down who it's in reference to, I may have messed up when I picked
|
||||
the name. My best guess is that it's in reference to Kane Kramer, but he
|
||||
helped design the Digital Audio Player, not optical media.
|
||||
</p>
|
||||
<p>
|
||||
Regardless, it's always been a working name while I figure out if I can
|
||||
finish the project.
|
||||
</p>
|
||||
<p>So, what is Kramer?</p>
|
||||
<p>
|
||||
Kramer is a recovery utility. Conceptually, it's meant to be akin to
|
||||
ddrescue<sup>2</sup>, but optimized for recovering data from optical media.
|
||||
</p>
|
||||
<p>
|
||||
There are two main problems I've experienced while trying to use ddrescue
|
||||
with optical drives, and both stem from the drive's firmware. Now, I don't
|
||||
know if me using the <code>--reset-slow</code> flag is contributing to these
|
||||
issues or not, but I experience more problems without it.
|
||||
</p>
|
||||
<p>
|
||||
If you've ever tried working with optical media in Linux, you may be
|
||||
familiar with <em>The Sleep Bug</em>. Normally, this is when a drive's
|
||||
firmware decides to sleep after two minutes, and never wakes. In the case of
|
||||
ddrescue, I've noticed that the drive often sleeps after read errors. When
|
||||
this happens, I can't kill ddrescue, and it just hangs. Even if I forcefully
|
||||
disconnect the drive, it just hangs, awaiting a response from the block
|
||||
device.
|
||||
</p>
|
||||
<p>
|
||||
For the record, Kramer still has this issue. I've only recently gotten
|
||||
mapping working alongside directIO to get around the Linux kernel's read
|
||||
poisoning.
|
||||
</p>
|
||||
<p>
|
||||
Keep in mind that I know very little C, and I don't play this low in the
|
||||
system much yet. So, I don't know why, but without the
|
||||
<code>O_DIRECT</code> flag to bypass the kernel's buffer (and whatever else
|
||||
directIO technically bypasses), after a single IO error, the kernel will
|
||||
refuse to return anything but that same IO error until the parent process is
|
||||
restarted. I tried doing the C calls directly through FFI, since poisoning
|
||||
is something that Rust employs in some places for safety. That didn't work,
|
||||
so I tried spawning a child process to execute the read, but that also
|
||||
didn't work. Thankfully, I know a guy, and with his help I was able to track
|
||||
down not only how to implement directIO, but also without using FFI to call
|
||||
<code>posix_memalign</code>.
|
||||
</p>
|
||||
<p>
|
||||
Back on track, the other issue is the spin-down. As ddrescue reads smaller
|
||||
clusters and/or starts hitting a particularly poor section of the disc, some
|
||||
drives' firmware is too quick to spin down, causing the spindle to
|
||||
constantly speed up and slow down, increasing wear.
|
||||
</p>
|
||||
<hr />
|
||||
<ol>
|
||||
<li>
|
||||
I would recommend reading <em>Enshittification</em> by Cory Doctorow.
|
||||
</li>
|
||||
<li>
|
||||
As I'm writing Kramer in Rust, I also have to stress the point that this
|
||||
project is not intended as a ddrescue rewrite in rust, for the sake of a
|
||||
rewrite in rust. I'm not trying to clone or replace ddrescue. Kramer has
|
||||
a different target, and ddrescue is a resource for me to learn from and
|
||||
use as a guide while I dig deeper into the system than I ever have.
|
||||
</li>
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
<include src="includes/tailer.html" />
|
||||
</main>
|
||||
<div class="pane spacer">
|
||||
<include src="./includes/blog_recent_posts.html" />
|
||||
<div class="spacer_container"><p>#AD</p></div>
|
||||
</div>
|
||||
<include src="includes/footer.html" />
|
||||
<include src="includes/scripts.html" />
|
||||
</body>
|
||||
</html>
|
||||
@@ -4,12 +4,57 @@
|
||||
<channel>
|
||||
<title>Cutieguwu Yaps</title>
|
||||
<link>https://www.cutieguwu.ca/</link>
|
||||
<description
|
||||
>Cutieguwu's blog where she discusses various things.</description>
|
||||
<description>
|
||||
Cutieguwu's blog where she discusses various things.
|
||||
</description>
|
||||
<language>en-ca</language>
|
||||
<category>Technology/IT/Life/Mental Health/Health</category>
|
||||
<item>
|
||||
<title>Optical Recovery</title>
|
||||
<pubDate>10 January, 2026</pubDate>
|
||||
<link>https://www.cutieguwu.ca/blog/posts/5_optical_recovery.html</link>
|
||||
<description>
|
||||
Introducing my optical media recovery utility, and some challenges in development.
|
||||
</description>
|
||||
<category>Coding</category>
|
||||
<category>Programming</category>
|
||||
<category>Optical Media</category>
|
||||
<category>Rust</category>
|
||||
</item>
|
||||
<item>
|
||||
<title>Pointless Plans</title>
|
||||
<pubDate>18 December, 2025</pubDate>
|
||||
<link>https://www.cutieguwu.ca/blog/posts/4_pointless_plans.html</link>
|
||||
<description>Winter Break plans</description>
|
||||
<category>Life</category>
|
||||
<category>Mental Health</category>
|
||||
<category>Health</category>
|
||||
</item>
|
||||
<item>
|
||||
<title>Closing Chapters</title>
|
||||
<pubDate>18 December, 2025</pubDate>
|
||||
<link>https://www.cutieguwu.ca/blog/posts/3_closing_chapters.html</link>
|
||||
<description>
|
||||
Things go, and others come in. Sometimes, we don't want to move forward, but we must.
|
||||
</description>
|
||||
<category>Life</category>
|
||||
<category>Mental Health</category>
|
||||
<category>Health</category>
|
||||
</item>
|
||||
<item>
|
||||
<title>Buyer's Anxiety</title>
|
||||
<pubDate>11 September, 2025</pubDate>
|
||||
<link>https://www.cutieguwu.ca/blog/posts/2_buyers_anxiety.html</link>
|
||||
<description>
|
||||
Discussing my fears regarding a purchase for a friend.
|
||||
</description>
|
||||
<category>Life</category>
|
||||
<category>Mental Health</category>
|
||||
<category>Health</category>
|
||||
</item>
|
||||
<item>
|
||||
<title>Unsure U.</title>
|
||||
<pubDate>09 August, 2025</pubDate>
|
||||
<link>https://www.cutieguwu.ca/blog/posts/1_unsure_u.html</link>
|
||||
<description>Discussing my fears for University.</description>
|
||||
<category>Life</category>
|
||||
@@ -18,8 +63,10 @@
|
||||
</item>
|
||||
<item>
|
||||
<title>Splitting Pathways</title>
|
||||
<link
|
||||
>https://www.cutieguwu.ca/blog/posts/0_divergent_pathways.html</link>
|
||||
<pubDate>29 July, 2025</pubDate>
|
||||
<link>
|
||||
https://www.cutieguwu.ca/blog/posts/0_divergent_pathways.html
|
||||
</link>
|
||||
<description>Discussing my struggles in love.</description>
|
||||
<category>Life</category>
|
||||
<category>Mental Health</category>
|
||||
|
||||
BIN
src/img/blog/posts/2_buyers_anxiety.jpg
Normal file
BIN
src/img/blog/posts/2_buyers_anxiety.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 10 MiB |
@@ -23,3 +23,6 @@
|
||||
<a class="title" href="https://pronoms.fr/@Cutieguwu">French</a>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<!-- Public Facing Webcheck -->
|
||||
<li><a class="title" href="https://webcheck.cutieguwu.ca">Web Check</a></li>
|
||||
|
||||
@@ -1,13 +1,49 @@
|
||||
<div class="spacer_container blog_recent_posts">
|
||||
<h2>Recent Posts</h2>
|
||||
<div class="section_list">
|
||||
<section>
|
||||
<header>
|
||||
<div>
|
||||
<h3 class="name">Optical Recovery</h3>
|
||||
<span class="subtitle">10 January, 2026</span>
|
||||
</div>
|
||||
<a href="/blog/posts/5_optical_recovery.html" class="status">View</a>
|
||||
</header>
|
||||
</section>
|
||||
<section>
|
||||
<header>
|
||||
<div>
|
||||
<h3 class="name">Pointless Plans</h3>
|
||||
<span class="subtitle">18 December, 2025</span>
|
||||
</div>
|
||||
<a href="/blog/posts/4_pointless_plans.html" class="status">View</a>
|
||||
</header>
|
||||
</section>
|
||||
<section>
|
||||
<header>
|
||||
<div>
|
||||
<h3 class="name">Closing Chapters</h3>
|
||||
<span class="subtitle">18 December, 2025</span>
|
||||
</div>
|
||||
<a href="/blog/posts/3_closing_chapters.html" class="status">View</a>
|
||||
</header>
|
||||
</section>
|
||||
<section>
|
||||
<header>
|
||||
<div>
|
||||
<h3 class="name">Buyer's Anxiety</h3>
|
||||
<span class="subtitle">11 September, 2025</span>
|
||||
</div>
|
||||
<a href="/blog/posts/2_buyers_anxiety.html" class="status">View</a>
|
||||
</header>
|
||||
</section>
|
||||
<section>
|
||||
<header>
|
||||
<div>
|
||||
<h3 class="name">Unsure U.</h3>
|
||||
<span class="subtitle">09 August, 2025</span>
|
||||
</div>
|
||||
<a href="/blog/posts/1_unsure_u.html" class="status"> View </a>
|
||||
<a href="/blog/posts/1_unsure_u.html" class="status">View</a>
|
||||
</header>
|
||||
</section>
|
||||
<section>
|
||||
@@ -16,7 +52,7 @@
|
||||
<h3 class="name">Divergent Pathways</h3>
|
||||
<span class="subtitle">29 July, 2025</span>
|
||||
</div>
|
||||
<a href="/blog/posts/0_divergent_pathways.html" class="status"> View </a>
|
||||
<a href="/blog/posts/0_divergent_pathways.html" class="status">View</a>
|
||||
</header>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
@@ -8,6 +8,9 @@
|
||||
<!-- See: https://github.com/ai-robots-txt/ai.robots.txt/issues/111 -->
|
||||
<meta name="bingbot" content="noarchive" />
|
||||
|
||||
<!-- Mastodon Author Attribution -->
|
||||
<meta name="fediverse:creator" content="@OliveTheFemboy@mastodon.online" />
|
||||
|
||||
<link rel="icon" type="image/x-icon" href="img/test-favicon.jpg" />
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="style.css" />
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<input type="checkbox" id="toggle" />
|
||||
<label for="toggle" class="nav_header">
|
||||
<input id="toggle_nav" type="checkbox" />
|
||||
<label for="toggle_nav" class="nav_header">
|
||||
<h2 class="logo">Cutieguwu</h2>
|
||||
<ion-icon name="menu-outline"></ion-icon>
|
||||
</label>
|
||||
|
||||
@@ -18,12 +18,14 @@
|
||||
|
||||
<!-- External Links -->
|
||||
<li class="dropdown">
|
||||
<header class="item">
|
||||
<input type="checkbox" id="toggle_ext_links" />
|
||||
<label for="toggle_ext_links" class="item">
|
||||
<p class="title">External Links</p>
|
||||
<ion-icon name="chevron-forward-outline"></ion-icon>
|
||||
</header>
|
||||
</label>
|
||||
<ul>
|
||||
<li><a class="title" href="https://github.com/Cutieguwu">Github (Mirror)</a></li>
|
||||
<li><a class="title" href="https://play.picoctf.org/users/cutieguwu">picoCTF</a></li>
|
||||
<li><a class="title" href="https://www.twitch.tv/cutieguwu">Twitch</a></li>
|
||||
<li><a class="title" href="https://www.youtube.com/@Cutieguwu">YouTube</a></li>
|
||||
</ul>
|
||||
@@ -33,21 +35,23 @@
|
||||
|
||||
<!-- Public Services -->
|
||||
<li class="dropdown">
|
||||
<header class="item">
|
||||
<input type="checkbox" id="toggle_srv_pub" />
|
||||
<label for="toggle_srv_pub" class="item">
|
||||
<p class="title">Public Services</p>
|
||||
<ion-icon name="chevron-forward-outline"></ion-icon>
|
||||
</header>
|
||||
</label>
|
||||
<ul>
|
||||
<li><a class="title" href="https://webcheck.cutieguwu.ca">Web Check</a></li>
|
||||
<li><a class="title" href="https://cyberchef.cutieguwu.ca">CyberChef</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<!-- Services -->
|
||||
<li class="dropdown">
|
||||
<header class="item">
|
||||
<input type="checkbox" id="toggle_srv_priv" />
|
||||
<label for="toggle_srv_priv" class="item">
|
||||
<p class="title">Services</p>
|
||||
<ion-icon name="chevron-forward-outline"></ion-icon>
|
||||
</header>
|
||||
</label>
|
||||
<ul>
|
||||
<li><a class="title" href="https://gitea.cutieguwu.ca/Cutieguwu">Gitea</a></li>
|
||||
</ul>
|
||||
|
||||
@@ -14,5 +14,8 @@
|
||||
<a href="https://www.cutieguwu.ca/feed/rss.xml" title="RSS Feed" download>
|
||||
<ion-icon name="logo-rss" alt="RSS Feed" class="orange"></ion-icon>
|
||||
</a>
|
||||
<a class="phantom"></a>
|
||||
|
||||
<!-- Mastodon Verification -->
|
||||
<!-- Doubles as the spacer -->
|
||||
<a rel="me" href="https://mastodon.online/@OliveTheFemboy" class="phantom"></a>
|
||||
</div>
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
<script type="module" src="https://unpkg.com/ionicons@7.1.0/dist/ionicons/ionicons.esm.js"></script>
|
||||
<script nomodule src="https://unpkg.com/ionicons@7.1.0/dist/ionicons/ionicons.js"></script>
|
||||
<script src="https://keepandroidopen.org/banner.js"></script>
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
<p class="date">Last Edited: 03 August, 2025</p>
|
||||
</header>
|
||||
<div class="body">
|
||||
<p>People, this is under development. Live with the lorem ipsum.</p>
|
||||
<p>lorem ipsum idk what else there is in this latin phrase</p>
|
||||
<p>
|
||||
Lorem ipsum dolor sit amet consectetur adipiscing elit. Quisque faucibus ex
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
// it should be visually, meaning more nested in the cascade.
|
||||
//
|
||||
// Odd numbers should be used as intermediate colours between the
|
||||
// fore and back elements. Excepting white--white's special.
|
||||
// fore and back elements.
|
||||
//
|
||||
// Eg. Current dropdown menu.
|
||||
|
||||
@@ -67,17 +67,18 @@
|
||||
|
||||
font-size: var(--font-size-generic);
|
||||
color: var(--white-1);
|
||||
}
|
||||
|
||||
body {
|
||||
background-color: var(--background-0);
|
||||
body {
|
||||
display: grid;
|
||||
background-color: var(--background-0);
|
||||
grid-template-rows: min-content auto;
|
||||
|
||||
// Adds a margin otherwise for some reason.
|
||||
margin: 0;
|
||||
// Adds a margin otherwise for some reason.
|
||||
margin: 0;
|
||||
|
||||
display: grid;
|
||||
grid-auto-flow: column dense;
|
||||
grid-template-columns: min-content 1fr min-content;
|
||||
grid-template-areas: "nav main spacer";
|
||||
.kao-banner {
|
||||
grid-area: banner;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -107,15 +108,15 @@ a {
|
||||
font-family: var(--font-family-generic);
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 500px) {
|
||||
// Mobile
|
||||
@media (max-width: 600px) {
|
||||
:root {
|
||||
--spacing-large: var(--spacing-small);
|
||||
}
|
||||
|
||||
body {
|
||||
grid-auto-flow: row;
|
||||
grid-template-columns: none;
|
||||
grid-template-areas: "nav" "main" "spacer";
|
||||
grid-template-areas: "banner" "nav" "main" "spacer";
|
||||
|
||||
// Compress spacings to maximize useable area.
|
||||
// padding: var(--spacing-small);
|
||||
@@ -130,3 +131,19 @@ a {
|
||||
right: auto;
|
||||
}
|
||||
}
|
||||
|
||||
// Tablets and Intermediary
|
||||
@media (min-width: 601px) and (max-width: 1023px) {
|
||||
body {
|
||||
grid-template-columns: min-content 1fr;
|
||||
grid-template-areas: "banner banner" "nav main" "spacer main";
|
||||
}
|
||||
}
|
||||
|
||||
// Desktops and Laptops
|
||||
@media (min-width: 1024px) {
|
||||
body {
|
||||
grid-template-columns: min-content 1fr min-content;
|
||||
grid-template-areas: "banner banner banner" "nav main spacer";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
margin-top: var(--spacing-small);
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 500px) {
|
||||
@media (max-width: 600px) {
|
||||
.layout_row {
|
||||
grid-auto-flow: row;
|
||||
}
|
||||
|
||||
@@ -6,18 +6,18 @@
|
||||
margin: var(--spacing-large);
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 500px) {
|
||||
@media (max-width: 600px) {
|
||||
.pane {
|
||||
width: 100%;
|
||||
width: calc((50% - var(--spacing-small)) * 2);
|
||||
}
|
||||
}
|
||||
|
||||
nav.pane,
|
||||
.pane.spacer {
|
||||
width: min-content;
|
||||
gap: var(--spacing-medium);
|
||||
@media (min-width: 601px) {
|
||||
nav.pane,
|
||||
.pane.spacer {
|
||||
gap: var(--spacing-medium);
|
||||
|
||||
position: sticky;
|
||||
top: var(--spacing-large);
|
||||
right: var(--spacing-large);
|
||||
position: sticky;
|
||||
top: var(--spacing-large);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -75,14 +75,14 @@
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 500px) {
|
||||
@media (max-width: 600px) {
|
||||
.section_list section {
|
||||
> header {
|
||||
column-gap: var(--spacing-small);
|
||||
}
|
||||
|
||||
> .body {
|
||||
/* Collapse the L/R padding to maximize usable space */
|
||||
// Collapse the L/R padding to maximize usable space
|
||||
padding: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
.dropdown {
|
||||
> header {
|
||||
> label.item {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr min-content;
|
||||
align-items: center;
|
||||
@@ -22,23 +22,41 @@
|
||||
}
|
||||
}
|
||||
|
||||
.dropdown:hover {
|
||||
> header {
|
||||
transform: var(--transform-scale-x);
|
||||
|
||||
> ion-icon {
|
||||
rotate: 90deg;
|
||||
transition-duration: 0.25s;
|
||||
@media (max-width: 600px) {
|
||||
.dropdown {
|
||||
> label.item > ion-icon {
|
||||
margin-right: var(--padding-mobile);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
> ul {
|
||||
display: grid;
|
||||
// Use a toggle for menu entries on mobile and intermediary devices.
|
||||
@media (max-width: 1023px) {
|
||||
.dropdown {
|
||||
> input:checked + label {
|
||||
color: var(--highlight-hover);
|
||||
|
||||
+ ul {
|
||||
display: grid;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 500px) {
|
||||
.dropdown > header > ion-icon {
|
||||
margin-right: var(--padding-mobile);
|
||||
// Use a hover state for menu entries on large screens.
|
||||
@media (min-width: 1024px) {
|
||||
.dropdown:hover {
|
||||
> label.item {
|
||||
transform: var(--transform-scale-x);
|
||||
|
||||
> ion-icon {
|
||||
rotate: 90deg;
|
||||
transition-duration: 0.25s;
|
||||
}
|
||||
}
|
||||
|
||||
> ul {
|
||||
display: grid;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@ nav.pane > .nav_header {
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 500px) {
|
||||
@media (max-width: 600px) {
|
||||
nav.pane > .nav_header {
|
||||
grid-template-columns: min-content 1fr min-content;
|
||||
grid-template-areas: "logo blank hamburger";
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
.location {
|
||||
grid-area: location;
|
||||
|
||||
margin: 0;
|
||||
padding: var(--spacing-small);
|
||||
background-color: var(--background-2);
|
||||
|
||||
@@ -2,8 +2,6 @@
|
||||
@use "nav_title";
|
||||
|
||||
nav .menu {
|
||||
grid-area: menu;
|
||||
|
||||
// Remove default padding and style applied to ul for bullets.
|
||||
padding: 0;
|
||||
list-style: none;
|
||||
@@ -47,7 +45,7 @@ nav .menu {
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 500px) {
|
||||
@media (max-width: 600px) {
|
||||
.menu {
|
||||
.item {
|
||||
padding: var(--padding-mobile);
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
nav.pane .quick_links {
|
||||
grid-area: quick_links;
|
||||
|
||||
--item-padding: 0.25rem;
|
||||
|
||||
justify-content: space-between;
|
||||
@@ -37,7 +35,7 @@ nav.pane .quick_links {
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 500px) {
|
||||
@media (max-width: 600px) {
|
||||
nav.pane .quick_links {
|
||||
margin-bottom: var(--spacing-small);
|
||||
|
||||
|
||||
@@ -13,15 +13,15 @@
|
||||
display: block;
|
||||
}
|
||||
|
||||
.menu .title:hover {
|
||||
color: var(--highlight-hover);
|
||||
transition: var(--transition-cut);
|
||||
}
|
||||
|
||||
/*
|
||||
@media only screen and (max-width: 500px) {
|
||||
@media (max-width: 600px) {
|
||||
.nav_title {
|
||||
padding: var(--padding-mobile);
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
@media (min-width: 1024px) {
|
||||
.menu .title:hover {
|
||||
color: var(--highlight-hover);
|
||||
transition: var(--transition-cut);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
grid-template-columns: 60% auto;
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 500px) {
|
||||
@media (max-width: 600px) {
|
||||
.awards,
|
||||
.certifications,
|
||||
.education,
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 500px) {
|
||||
@media (max-width: 600px) {
|
||||
.pane.blog .body > .body {
|
||||
padding: var(--spacing-small);
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 500px) {
|
||||
@media (max-width: 600px) {
|
||||
.pane.error {
|
||||
margin-top: var(--spacing-large);
|
||||
margin-bottom: var(--spacing-large);
|
||||
|
||||
@@ -24,16 +24,13 @@ nav.pane {
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 500px) {
|
||||
@media (max-width: 600px) {
|
||||
nav.pane {
|
||||
width: calc(
|
||||
calc(50% - var(--spacing-large) + var(--spacing-small)) * 2
|
||||
);
|
||||
|
||||
background-color: var(--background-2);
|
||||
border-radius: var(--border-radius-leaf);
|
||||
padding: 0 var(--spacing-small);
|
||||
|
||||
.nav_menu,
|
||||
.menu,
|
||||
.quick_links,
|
||||
.location {
|
||||
display: none;
|
||||
@@ -44,16 +41,14 @@ nav.pane {
|
||||
}
|
||||
}
|
||||
|
||||
nav.pane > #toggle:checked {
|
||||
+ .nav_header {
|
||||
color: var(--highlight-hover);
|
||||
nav.pane > input:checked + label {
|
||||
color: var(--highlight-hover);
|
||||
|
||||
+ .menu {
|
||||
display: grid;
|
||||
+ .menu {
|
||||
display: grid;
|
||||
|
||||
+ .location + .quick_links {
|
||||
display: flex;
|
||||
}
|
||||
+ .location + .quick_links {
|
||||
display: flex;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
.pane.spacer {
|
||||
grid-area: spacer;
|
||||
|
||||
width: min-content;
|
||||
height: calc(100vh - calc(var(--spacing-large) * 2));
|
||||
|
||||
display: grid;
|
||||
|
||||
2
src/quotes.txt
Normal file
2
src/quotes.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
A flower may only bloom once every three years, but that does not mean it is undeserving of watering. - Cutieguwu Sept. 11, 2025 14:39
|
||||
Don't wait for your future to happen. The time will never be just right. - Unknown
|
||||
@@ -20,14 +20,14 @@
|
||||
<div class="body">
|
||||
<header>
|
||||
<h1 class="title">Olivia Brooks</h1>
|
||||
<p class="date">Last Edited: 08 August, 2025</p>
|
||||
<p class="date">Last Edited: 21 February, 2026</p>
|
||||
</header>
|
||||
<div class="body">
|
||||
<div class="about_me">
|
||||
<p>
|
||||
Hello, I'm Olivia Brooks. I am a passionate, hard-working, and
|
||||
dependable individual with an inate interest in sharing and expanding my
|
||||
knowledge and expertise.
|
||||
dependable individual with an innate interest in sharing and expanding
|
||||
my knowledge and expertise.
|
||||
</p>
|
||||
<p>
|
||||
For the better part of a decade, I've specced, built, identified and
|
||||
@@ -87,7 +87,7 @@
|
||||
weather patterns.
|
||||
</li>
|
||||
<li>Additionally handled equipment maintenance.</li>
|
||||
<li>Acted as administrative liason.</li>
|
||||
<li>Acted as administrative liaison.</li>
|
||||
</ul>
|
||||
</div>
|
||||
</section>
|
||||
@@ -151,7 +151,7 @@
|
||||
<p>Bachelor of Arts (Honours)</p>
|
||||
<ul>
|
||||
<li>Major in Psychology</li>
|
||||
<li>[Intended] Minor in Women's and Gender Studies</li>
|
||||
<li>[Intended] Minor in Computer Science</li>
|
||||
<li>Concentration in Social/Personality Psychology</li>
|
||||
</ul>
|
||||
</div>
|
||||
@@ -227,6 +227,16 @@
|
||||
<h3 class="status">x2</h3>
|
||||
</header>
|
||||
</section>
|
||||
<section>
|
||||
<header>
|
||||
<div>
|
||||
<h3 class="name">CyberSci Regional Winner</h3>
|
||||
<span class="subtitle"
|
||||
>The Off-By-Ones - Ottawa, 2025</span
|
||||
>
|
||||
</div>
|
||||
</header>
|
||||
</section>
|
||||
<h3 class="early_history">
|
||||
Queries about other awards available by request.
|
||||
</h3>
|
||||
@@ -460,7 +470,7 @@
|
||||
<header>
|
||||
<div>
|
||||
<h3 class="name">
|
||||
<a href="mailto:olivia.a.brooks77@gmail.com"> Email </a>
|
||||
<a href="mailto:olivia.a.brooks77@gmail.com">Email</a>
|
||||
</h3>
|
||||
<span class="subtitle">olivia.a.brooks77@gmail.com</span>
|
||||
</div>
|
||||
|
||||
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
11
templates/device_queries.css
Normal file
11
templates/device_queries.css
Normal file
@@ -0,0 +1,11 @@
|
||||
/* Mobile Phone */
|
||||
@media (max-width: 600px) {
|
||||
}
|
||||
|
||||
/* Tablets and other weird intermediary stuff. */
|
||||
@media (min-width: 601px) and (max-width: 1023) {
|
||||
}
|
||||
|
||||
/* Desktops and Laptops */
|
||||
@media (min-width: 1024) {
|
||||
}
|
||||
Reference in New Issue
Block a user