
<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="http://willnj.com/feed.xml" rel="self" type="application/atom+xml" /><link href="http://willnj.com/" rel="alternate" type="text/html" /><updated>2026-06-23T04:11:56+00:00</updated><id>http://willnj.com/feed.xml</id><title type="html">William N. Johnson</title><subtitle>Computer Scientist | Programmer</subtitle><entry><title type="html">Microslop - Downfall of Windows and Future of AI</title><link href="http://willnj.com/blog/Microslop-Downfall-of-Windows-and-Future-of-AI/" rel="alternate" type="text/html" title="Microslop - Downfall of Windows and Future of AI" /><published>2026-02-16T00:00:00+00:00</published><updated>2026-02-16T00:00:00+00:00</updated><id>http://willnj.com/blog/Microslop-Downfall-of-Windows-and-Future-of-AI</id><content type="html" xml:base="http://willnj.com/blog/Microslop-Downfall-of-Windows-and-Future-of-AI/"><![CDATA[<p>When Microsoft announced the end-of-life date for Windows 10, it didn’t seem like an upgrade announcement in the slightest bit. October 2025: move to Windows 11 or receive no more updates or patches.</p>

<p>You upgrade anyway, and it’s instant regret. Your system uses up more RAM, the Explorer menu cannot find the folder or file you’re looking for, and everything seems just out of place. The design feels macOS-like, but the operating system itself feels unpolished.</p>

<p>The bigger problem? Microsoft Copilot pinned on my taskbar. Why would I want an AI tool pre-installed on my operating system? Even worse, applications have Copilot built in. Open Notepad. There’s Copilot. Open Paint. Copilot again.</p>

<p>If I wanted a more capable text editor, I would install Notepad++. If I wanted AI to write me something, I’d probably choose something else. Seriously!? Why does a lightweight text editor need generative AI baked in?</p>

<p>This isn’t a rant about AI outright, since AI has been around for decades from search ranking to spam detection and so on. Even Google’s been building their AI infrastructure long before the AI hype, and Google’s Gemini is just a continuation of that.</p>

<p>The problem is generative AI being used to create text, images, and video. Hop onto social media and your feed is filled with “wholesome” clips, but it turns out to be AI-generated simply for clicks and engagement. That’s psychological warfare right there!</p>

<p>And then there’s agentic AI… systems that take action over you. They can browse the web, manage your emails, execute commands, etc. Seems powerful, but in practice, it’s a security nightmare. A malicious actor could poison your prompts and nudge these agents to perform unintended actions. So, why is agentic AI being pushed down our throat when the guardrails aren’t present enough?</p>

<p>There’s a reason for this AI push, and it’s competition (and revenue). Since OpenAI made its debut in late 2022, companies like Google and Microsoft wanted to take their own piece of the pie. And with competition being a factor, everyone is rushing in to gain the spotlight and not fall behind. Remember Windows phones? They weren’t as successful because they were late in the competition when iOS and Android were already popular.</p>

<p>But even with significant backlash against Microsoft, they unfortunately live in their own tech echo chamber where they care more about investors than end-users. So, the community eventually branded them <strong>Microslop</strong>.</p>

<figure class="post-image">
  
    <img src="https://i.imgur.com/b57FY5Z.png" data-zoom-src="https://i.imgur.com/b57FY5Z.png" alt="The tech echo chamber" width="500px" loading="lazy" />
  

  
    <figcaption>The tech echo chamber</figcaption>
  
</figure>

<p>And now, the biggest concern is an AI bubble. Is it truly there? Maybe. Hype cycles do tend to fluctuate, but bubbles don’t stop technology, just expectations. Even if AI (generative and agentic) isn’t ready now, it’ll continue to thrive and evolve.</p>

<p>But one thing is clear: AI should be optional. Let the users install Copilot (if they want it) instead of forcing them to uninstall it. An operating system should be clear, simple, and stable, not a Pandora’s box of bloated and experimental software. Make it opt-in, not opt-out!</p>

<p>Still, I am interested in seeing how far this technology can go. In fact, I think Google Aluminium (Google’s upcoming agentic operating system) may outperform whatever Microsoft is doing with their operating system. Let’s be real, Google’s been doing AI research for years (with Google DeepMind being their major research). Besides, Google retains much of the world’s digital footprint, so I think they’ll be the ultimate winner in the AI race.</p>]]></content><author><name>William</name></author><category term="tech" /><summary type="html"><![CDATA[When Microsoft announced the end-of-life date for Windows 10, it didn’t seem like an upgrade announcement in the slightest bit. October 2025: move to Windows 11 or receive no more updates or patches. You upgrade anyway, and it’s instant regret. Your system uses up more RAM, the Explorer menu cannot find the folder or file you’re looking for, and everything seems just out of place. The design feels macOS-like, but the operating system itself feels unpolished. The bigger problem? Microsoft Copilot pinned on my taskbar. Why would I want an AI tool pre-installed on my operating system? Even worse, applications have Copilot built in. Open Notepad. There’s Copilot. Open Paint. Copilot again. If I wanted a more capable text editor, I would install Notepad++. If I wanted AI to write me something, I’d probably choose something else. Seriously!? Why does a lightweight text editor need generative AI baked in? This isn’t a rant about AI outright, since AI has been around for decades from search ranking to spam detection and so on. Even Google’s been building their AI infrastructure long before the AI hype, and Google’s Gemini is just a continuation of that. The problem is generative AI being used to create text, images, and video. Hop onto social media and your feed is filled with “wholesome” clips, but it turns out to be AI-generated simply for clicks and engagement. That’s psychological warfare right there! And then there’s agentic AI… systems that take action over you. They can browse the web, manage your emails, execute commands, etc. Seems powerful, but in practice, it’s a security nightmare. A malicious actor could poison your prompts and nudge these agents to perform unintended actions. So, why is agentic AI being pushed down our throat when the guardrails aren’t present enough? There’s a reason for this AI push, and it’s competition (and revenue). Since OpenAI made its debut in late 2022, companies like Google and Microsoft wanted to take their own piece of the pie. And with competition being a factor, everyone is rushing in to gain the spotlight and not fall behind. Remember Windows phones? They weren’t as successful because they were late in the competition when iOS and Android were already popular. But even with significant backlash against Microsoft, they unfortunately live in their own tech echo chamber where they care more about investors than end-users. So, the community eventually branded them Microslop. The tech echo chamber And now, the biggest concern is an AI bubble. Is it truly there? Maybe. Hype cycles do tend to fluctuate, but bubbles don’t stop technology, just expectations. Even if AI (generative and agentic) isn’t ready now, it’ll continue to thrive and evolve. But one thing is clear: AI should be optional. Let the users install Copilot (if they want it) instead of forcing them to uninstall it. An operating system should be clear, simple, and stable, not a Pandora’s box of bloated and experimental software. Make it opt-in, not opt-out! Still, I am interested in seeing how far this technology can go. In fact, I think Google Aluminium (Google’s upcoming agentic operating system) may outperform whatever Microsoft is doing with their operating system. Let’s be real, Google’s been doing AI research for years (with Google DeepMind being their major research). Besides, Google retains much of the world’s digital footprint, so I think they’ll be the ultimate winner in the AI race.]]></summary></entry><entry><title type="html">Bluetooth - Why I Despise Wireless Earphones</title><link href="http://willnj.com/blog/Bluetooth-Why-I-Despise-Wireless-Earphones/" rel="alternate" type="text/html" title="Bluetooth - Why I Despise Wireless Earphones" /><published>2025-09-27T00:00:00+00:00</published><updated>2025-09-27T00:00:00+00:00</updated><id>http://willnj.com/blog/Bluetooth-Why-I-Despise-Wireless-Earphones</id><content type="html" xml:base="http://willnj.com/blog/Bluetooth-Why-I-Despise-Wireless-Earphones/"><![CDATA[<p>Some nights you just want to relax, put on your favorite artist, and zone out. Then suddenly one side of your Bluetooth earphones shuts off. You know you charged them a couple of hours ago, so why is this happening? Now you are stuck listening to music from only one side and it is frustrating.</p>

<p>I still remember when Apple killed the headphone jack back in 2016. People were mad. It was one of those moments in tech history where everyone had an opinion. Somehow Apple made it stick, though, and now almost every phone maker has ditched the jack. Sure, there are wired earphones you can still use with the charging port, but then you cannot charge your phone and listen to music at the same time unless you buy extra accessories. Why does the world have to be this complicated? But honestly, that is not even the worst part. Phones last all day now anyway.</p>

<p>What really drives me crazy is how easy it is to lose these little earbuds. Fall asleep with them in, wake up, and suddenly one has completely disappeared. Then you are crawling around your room, tearing apart your bed, checking the floor, even retracing every step you took last night. Eventually you find it, but it is always in the most random place. At least wired earphones stayed together. You might get knots in the cord but at least you rarely lost them.</p>

<p>Another annoying thing is syncing. Try opening GarageBand or a piano app and playing around with music. Forget it. Bluetooth has too much lag and it just does not work.</p>

<p>And speaking of things that <em>should</em> just work, have you ever stopped to think about how Bluetooth even became a thing? It’s so ubiquitous now, you just expect it to be there, but it has this surprisingly cool and almost ancient origin story. It all started way back in the 90s, at Ericsson, when engineers were trying to find a way to standardize short-range radio technology to connect different devices wirelessly. And get this – the name “Bluetooth” itself actually comes from Harald Bluetooth, a 10th-century Danish king who was famous for uniting the Scandinavian tribes! The idea was that this new tech would, in a similar spirit, unite different communication protocols. Pretty clever, right? Eventually, a bunch of tech giants like Ericsson, Intel, Nokia, and Toshiba formed the Bluetooth Special Interest Group (SIG) to develop and standardize the technology we all rely on today. It’s funny how something so deeply ingrained in our modern lives has such a geeky, historical backstory, especially when it gives us so much grief sometimes!</p>

<figure class="post-image">
  
    <img src="https://i.imgur.com/FKmCLWv.jpeg" data-zoom-src="https://i.imgur.com/FKmCLWv.jpeg" alt="A pair of wireless earbuds in a charging case" width="500px" loading="lazy" />
  

  
    <figcaption>A pair of wireless earbuds in a charging case</figcaption>
  
</figure>

<p>But the most frustrating thing of all is charging. Half the time the earbuds do not even make contact in the case. I have had to clean them with isopropyl alcohol more times than I can count. Sometimes it works, sometimes it does not. Most of the time I end up taking the rubber cap off just so it will actually charge. And losing those little rubber caps is its own special kind of nightmare.</p>

<p>In the end none of this really changes anything. I still use Bluetooth earphones every day. I wouldn’t necessarily say they’re more convenient, but I do remember the constant struggle with wired headphones where the cords would always fray or something, causing them to not properly get a good signal. No wires in my pocket, no cord getting caught on something when I walk past. But I do miss the headphone jack and how simple things used to be.</p>]]></content><author><name>William</name></author><category term="life" /><summary type="html"><![CDATA[Some nights you just want to relax, put on your favorite artist, and zone out. Then suddenly one side of your Bluetooth earphones shuts off. You know you charged them a couple of hours ago, so why is this happening? Now you are stuck listening to music from only one side and it is frustrating. I still remember when Apple killed the headphone jack back in 2016. People were mad. It was one of those moments in tech history where everyone had an opinion. Somehow Apple made it stick, though, and now almost every phone maker has ditched the jack. Sure, there are wired earphones you can still use with the charging port, but then you cannot charge your phone and listen to music at the same time unless you buy extra accessories. Why does the world have to be this complicated? But honestly, that is not even the worst part. Phones last all day now anyway. What really drives me crazy is how easy it is to lose these little earbuds. Fall asleep with them in, wake up, and suddenly one has completely disappeared. Then you are crawling around your room, tearing apart your bed, checking the floor, even retracing every step you took last night. Eventually you find it, but it is always in the most random place. At least wired earphones stayed together. You might get knots in the cord but at least you rarely lost them. Another annoying thing is syncing. Try opening GarageBand or a piano app and playing around with music. Forget it. Bluetooth has too much lag and it just does not work. And speaking of things that should just work, have you ever stopped to think about how Bluetooth even became a thing? It’s so ubiquitous now, you just expect it to be there, but it has this surprisingly cool and almost ancient origin story. It all started way back in the 90s, at Ericsson, when engineers were trying to find a way to standardize short-range radio technology to connect different devices wirelessly. And get this – the name “Bluetooth” itself actually comes from Harald Bluetooth, a 10th-century Danish king who was famous for uniting the Scandinavian tribes! The idea was that this new tech would, in a similar spirit, unite different communication protocols. Pretty clever, right? Eventually, a bunch of tech giants like Ericsson, Intel, Nokia, and Toshiba formed the Bluetooth Special Interest Group (SIG) to develop and standardize the technology we all rely on today. It’s funny how something so deeply ingrained in our modern lives has such a geeky, historical backstory, especially when it gives us so much grief sometimes! A pair of wireless earbuds in a charging case But the most frustrating thing of all is charging. Half the time the earbuds do not even make contact in the case. I have had to clean them with isopropyl alcohol more times than I can count. Sometimes it works, sometimes it does not. Most of the time I end up taking the rubber cap off just so it will actually charge. And losing those little rubber caps is its own special kind of nightmare. In the end none of this really changes anything. I still use Bluetooth earphones every day. I wouldn’t necessarily say they’re more convenient, but I do remember the constant struggle with wired headphones where the cords would always fray or something, causing them to not properly get a good signal. No wires in my pocket, no cord getting caught on something when I walk past. But I do miss the headphone jack and how simple things used to be.]]></summary></entry><entry><title type="html">Clean Your Room, Sleep Better</title><link href="http://willnj.com/blog/It's-Time-to-Start-Cleaning/" rel="alternate" type="text/html" title="Clean Your Room, Sleep Better" /><published>2025-09-20T00:00:00+00:00</published><updated>2025-09-20T00:00:00+00:00</updated><id>http://willnj.com/blog/It&apos;s-Time-to-Start-Cleaning</id><content type="html" xml:base="http://willnj.com/blog/It&apos;s-Time-to-Start-Cleaning/"><![CDATA[<p>The most important thing you can do for yourself is sleep. And if you can’t sleep, if your mind is buzzing when it should be winding down, then it might just be time to clean your room.</p>

<p>Seriously. Just look around. The air might feel heavier not because of running thoughts, but because of a subtle, insidious layer of dust sitting on everything. You don’t always notice it building up—the dust, the clutter, the stale air. It’s not glaringly obvious, especially in the dim light at night. But something feels off. The room feels heavier. It’s almost like your body knows before your mind catches up. That low-level chaos, that visual and atmospheric static, adds up, even if you’re not looking right at it. It whispers a constant hum of unfinished business.</p>

<p>But cleaning your room doesn’t have to be a stressful chore, another item on an already overflowing to-do list. In fact, it’s actually kind of relaxing. You’re not doomscrolling through endless feeds, nor are you wrestling with a million abstract problems. Instead, you’re engaged in simple, physical actions: wiping down baseboards, folding laundry, moving things around. It’s a quiet, tactile process, an oddly therapeutic meditation in motion.</p>

<p>I remember in 2023, I went through a summer trying to figure out how to manage stress, especially after my doctor’s visit in May. A lot was going on, both externally and internally. I spent countless hours cooking and baking, teaching myself how to make elaborate things from scratch, blogging, and so much more. I’d take long, indulgent evening baths and lift dumbbells in the living room while watching TV, almost as a visceral response to the mental turbulence. It was a stark period of self-soothing, but eventually, my attention turned to my physical space—my bedroom. And honestly, it just felt good to have fewer things running through my mind at that time, a tangible way to quiet the inner noise.</p>

<p>I’d had the same bedroom layout for years. It felt stagnant, boring. Like the room itself was clinging to an old version of me, a past self begging to be renewed. So one day, I decided to clean it. Really clean it. I moved almost every piece of furniture, and rearranged them. Wiped down every single surface. Cleaned the bedposts until they gleamed. Got all the dust off the baseboards and meticulously around the door frame. Oh, and I didn’t forget the ceiling fan. It was more than overdue; it was a necessity.</p>

<p>That small, yet profound, shift did more than just make my room feel fresh and new. It helped me feel like I was actively making space for something new in my life. Although it didn’t help me through the latter parts of 2023, at the moment it felt like I was finally catching up to myself, aligning my external environment with the internal state. It was progress.</p>

<figure class="post-image">
  
    <img src="https://i.imgur.com/J4gOT35.jpeg" data-zoom-src="https://i.imgur.com/J4gOT35.jpeg" alt="Cleaning bottle spray" width="500px" loading="lazy" />
  

  
    <figcaption>Cleaning bottle spray</figcaption>
  
</figure>

<p>It’s easy to put off stuff like this. You tell yourself you’ll clean when you “have time” or “have energy.” But the truth is, most of the time, doing it <em>gives</em> you the energy. It’s a virtuous cycle. Even if you just start with one small corner. Your desk, especially if you eat there. Your sheets—the scent of freshly cleaned linen. The baseboard behind your nightstand. A single drawer, emptied and organized. Each small act of tidying is a gentle push back against the tide of chaos.</p>

<figure class="post-image">
  
    <img src="https://i.imgur.com/hfrngDX.jpeg" data-zoom-src="https://i.imgur.com/hfrngDX.jpeg" alt="Cleaning towel" width="500px" loading="lazy" />
  

  
    <figcaption>Cleaning towel</figcaption>
  
</figure>

<p>And best of all, when your space feels lighter, cleaner, and more ordered, your mind often follows suit. So I tell myself this every once in a while—take a moment to clean your room, and you’ll sleep better.</p>]]></content><author><name>William</name></author><category term="life" /><summary type="html"><![CDATA[The most important thing you can do for yourself is sleep. And if you can’t sleep, if your mind is buzzing when it should be winding down, then it might just be time to clean your room. Seriously. Just look around. The air might feel heavier not because of running thoughts, but because of a subtle, insidious layer of dust sitting on everything. You don’t always notice it building up—the dust, the clutter, the stale air. It’s not glaringly obvious, especially in the dim light at night. But something feels off. The room feels heavier. It’s almost like your body knows before your mind catches up. That low-level chaos, that visual and atmospheric static, adds up, even if you’re not looking right at it. It whispers a constant hum of unfinished business. But cleaning your room doesn’t have to be a stressful chore, another item on an already overflowing to-do list. In fact, it’s actually kind of relaxing. You’re not doomscrolling through endless feeds, nor are you wrestling with a million abstract problems. Instead, you’re engaged in simple, physical actions: wiping down baseboards, folding laundry, moving things around. It’s a quiet, tactile process, an oddly therapeutic meditation in motion. I remember in 2023, I went through a summer trying to figure out how to manage stress, especially after my doctor’s visit in May. A lot was going on, both externally and internally. I spent countless hours cooking and baking, teaching myself how to make elaborate things from scratch, blogging, and so much more. I’d take long, indulgent evening baths and lift dumbbells in the living room while watching TV, almost as a visceral response to the mental turbulence. It was a stark period of self-soothing, but eventually, my attention turned to my physical space—my bedroom. And honestly, it just felt good to have fewer things running through my mind at that time, a tangible way to quiet the inner noise. I’d had the same bedroom layout for years. It felt stagnant, boring. Like the room itself was clinging to an old version of me, a past self begging to be renewed. So one day, I decided to clean it. Really clean it. I moved almost every piece of furniture, and rearranged them. Wiped down every single surface. Cleaned the bedposts until they gleamed. Got all the dust off the baseboards and meticulously around the door frame. Oh, and I didn’t forget the ceiling fan. It was more than overdue; it was a necessity. That small, yet profound, shift did more than just make my room feel fresh and new. It helped me feel like I was actively making space for something new in my life. Although it didn’t help me through the latter parts of 2023, at the moment it felt like I was finally catching up to myself, aligning my external environment with the internal state. It was progress. Cleaning bottle spray It’s easy to put off stuff like this. You tell yourself you’ll clean when you “have time” or “have energy.” But the truth is, most of the time, doing it gives you the energy. It’s a virtuous cycle. Even if you just start with one small corner. Your desk, especially if you eat there. Your sheets—the scent of freshly cleaned linen. The baseboard behind your nightstand. A single drawer, emptied and organized. Each small act of tidying is a gentle push back against the tide of chaos. Cleaning towel And best of all, when your space feels lighter, cleaner, and more ordered, your mind often follows suit. So I tell myself this every once in a while—take a moment to clean your room, and you’ll sleep better.]]></summary></entry><entry><title type="html">The Price of Online Privacy</title><link href="http://willnj.com/blog/The-Price-of-Online-Privacy/" rel="alternate" type="text/html" title="The Price of Online Privacy" /><published>2025-09-19T00:00:00+00:00</published><updated>2025-09-19T00:00:00+00:00</updated><id>http://willnj.com/blog/The-Price-of-Online-Privacy</id><content type="html" xml:base="http://willnj.com/blog/The-Price-of-Online-Privacy/"><![CDATA[<p>These days it feels like many websites are asking for my email and phone number before I can even blink. I treat both like valuables, not giveaways. My inbox and phone line are private spaces, and I protect them with the same care I give to my bank account.</p>

<p>It all started when I realized just how messy the online world really is. The first wake-up call was the scam job market. Online job hunting is a minefield. Fake job listings, shady startups promising they’ll pay you when they get traction, and outright scams designed to harvest personal data are everywhere. Even platforms I trusted, like LinkedIn and Indeed, can’t catch all of them. Every time I considered sharing my personal email or phone number, I realized I could be feeding a scammer’s pipeline. Once they have your info, it’s not just spam. Some postings try to phish sensitive details or trick you into paying upfront for training or equipment. And I’m tired of it all!</p>

<p>And then there are the “work-for-free” exit scams. This is a special kind of awful. The company might ask you to complete a “small project” as a final step in the hiring process. This isn’t your average 30-minute coding challenge. They want you to build an entire feature, or sometimes, a whole section of their product. You work for hours, sometimes days, pouring your time and skill into what you think is a legitimate test. But that “project” is the product itself. Once you submit the work, they take your code, implement it, and then vanish. The website disappears, the “recruiter” ghosts you, and the company’s social media accounts go dark. They got free labor, and you’re left with nothing but wasted time and the sinking feeling you were just a cog in a broader exit scam. It’s a frustrating and exhausting wild goose chase, leaving you with a lingering sense of vulnerability and a mountain of cleanup.</p>

<figure class="post-image">
  
    <img src="https://i.imgur.com/Ed21zlV.png" data-zoom-src="https://i.imgur.com/Ed21zlV.png" alt="Dealing with Scam Emails" width="500px" loading="lazy" />
  

  
    <figcaption>Dealing with Scam Emails</figcaption>
  
</figure>

<h3 id="the-unseen-dangers-of-data">The Unseen Dangers of Data</h3>

<p>Then there’s the misuse of personal data, something I experienced firsthand. At one point, I strongly suspect my online activity led to my address being leaked. Not long after, someone physically destroyed my mailbox, not once but twice (the first time in May 2023, and the second time a year later). I can’t prove the connection, but the timing was too coincidental to ignore. I actually feared for my life. If someone is willing to destroy my mailbox, who knows what they might do next? That’s completely messed up. And it’s not even about oversharing. These scammers are relentless. They’ll go to extreme lengths if they think you have something valuable to them. I don’t even know what they wanted from me, but dealing with it was awful and exhausting. This experience made it crystal clear that personal information online is more dangerous than most people realize.</p>

<p>Much of your personal information is already floating around on the internet, often without your consent. Sites like Spokeo, Whitepages, and countless other data-aggregation platforms collect phone numbers, addresses, and more. I spend a lot of time trying to remove my information wherever I can, but some sites are nearly impossible to deal with. They are often paywalled, forcing you to pay just to see if your own details are listed. It feels absurd. Here I am trying to protect my privacy, and the system basically asks me to pay to check on myself. I’ve even thought about legal action, but lawsuits cost money and unless you’re a celebrity with deep pockets, there’s no realistic way to make these sites remove your information. Honestly, it’s incredibly frustrating that data brokers can legally get away with this kind of exploitation.</p>

<h3 id="the-ai-plague-and-constant-marketing">The AI Plague and Constant Marketing</h3>

<p>If that wasn’t enough, the rise of <strong>AI-generated content</strong> has made spotting fraud an adversarial battleground. Fake job sites now churn out realistic-sounding listings, convincing recruiter profiles, and entire company websites in minutes. I’ve seen offers for AI startups that are clearly just data-harvesting schemes designed to look legitimate to anyone not paying close attention. At this point, I almost expect these bots to start sending me thank you notes for my personal information.</p>

<p>Even when a company is legitimate, sharing your email or phone number often opens the floodgates to marketing you never asked for. Give a site your contact info once, and suddenly you’re subscribed to a lifetime of spam, partner offers, robocalls, and surveys. Unsubscribing works occasionally, but it often feels like plugging holes in a leaky dam with chewing gum. It is simply easier to keep my real contact info out of reach from the start.</p>

<h3 id="my-digital-defense">My Digital Defense</h3>

<p>So what do I do instead? I <strong>compartmentalize my digital identity</strong>. I use <strong>Google Voice</strong> for calls and texts, keeping my real number private. I maintain a separate <strong>burner email</strong> for signups and online forms, while my private email never touches job boards or sketchy websites. None of this is tied to my social accounts or banking. And unfortunately, there are moments where I have to use a real phone number, because some websites don’t accept Google Voice or temporary numbers.</p>

<p>I also use a <strong>VPN</strong> or <strong>VPS</strong> when visiting untrusted sites, sometimes relying on Proton’s free VPN or a Slate router, depending on what’s convenient at the moment. On top of that, I follow strong security habits: <strong>unique passwords</strong>, a <strong>password manager</strong>, <strong>two-factor authentication (2FA)</strong> everywhere possible, and I even keep a physical security key. <em>I swear I’m not paranoid.</em> I’m just taking these precautions seriously because of how bad things have gotten. That way, even if one email or number ends up on a spam list, my real life stays quiet.</p>

<p>The takeaway is simple. Be deliberate about what you share. Every time you hand out your email or phone number, think about who is really getting it, how they might use it, and whether it’s worth exposing yourself to scams, AI-generated junk, relentless marketing, or data aggregation sites. For me, the answer is almost always no. That’s why my personal email and phone number stay private, and why my inbox, voicemail, and sanity stay intact.</p>]]></content><author><name>William</name></author><category term="tech" /><summary type="html"><![CDATA[These days it feels like many websites are asking for my email and phone number before I can even blink. I treat both like valuables, not giveaways. My inbox and phone line are private spaces, and I protect them with the same care I give to my bank account. It all started when I realized just how messy the online world really is. The first wake-up call was the scam job market. Online job hunting is a minefield. Fake job listings, shady startups promising they’ll pay you when they get traction, and outright scams designed to harvest personal data are everywhere. Even platforms I trusted, like LinkedIn and Indeed, can’t catch all of them. Every time I considered sharing my personal email or phone number, I realized I could be feeding a scammer’s pipeline. Once they have your info, it’s not just spam. Some postings try to phish sensitive details or trick you into paying upfront for training or equipment. And I’m tired of it all! And then there are the “work-for-free” exit scams. This is a special kind of awful. The company might ask you to complete a “small project” as a final step in the hiring process. This isn’t your average 30-minute coding challenge. They want you to build an entire feature, or sometimes, a whole section of their product. You work for hours, sometimes days, pouring your time and skill into what you think is a legitimate test. But that “project” is the product itself. Once you submit the work, they take your code, implement it, and then vanish. The website disappears, the “recruiter” ghosts you, and the company’s social media accounts go dark. They got free labor, and you’re left with nothing but wasted time and the sinking feeling you were just a cog in a broader exit scam. It’s a frustrating and exhausting wild goose chase, leaving you with a lingering sense of vulnerability and a mountain of cleanup. Dealing with Scam Emails The Unseen Dangers of Data Then there’s the misuse of personal data, something I experienced firsthand. At one point, I strongly suspect my online activity led to my address being leaked. Not long after, someone physically destroyed my mailbox, not once but twice (the first time in May 2023, and the second time a year later). I can’t prove the connection, but the timing was too coincidental to ignore. I actually feared for my life. If someone is willing to destroy my mailbox, who knows what they might do next? That’s completely messed up. And it’s not even about oversharing. These scammers are relentless. They’ll go to extreme lengths if they think you have something valuable to them. I don’t even know what they wanted from me, but dealing with it was awful and exhausting. This experience made it crystal clear that personal information online is more dangerous than most people realize. Much of your personal information is already floating around on the internet, often without your consent. Sites like Spokeo, Whitepages, and countless other data-aggregation platforms collect phone numbers, addresses, and more. I spend a lot of time trying to remove my information wherever I can, but some sites are nearly impossible to deal with. They are often paywalled, forcing you to pay just to see if your own details are listed. It feels absurd. Here I am trying to protect my privacy, and the system basically asks me to pay to check on myself. I’ve even thought about legal action, but lawsuits cost money and unless you’re a celebrity with deep pockets, there’s no realistic way to make these sites remove your information. Honestly, it’s incredibly frustrating that data brokers can legally get away with this kind of exploitation. The AI Plague and Constant Marketing If that wasn’t enough, the rise of AI-generated content has made spotting fraud an adversarial battleground. Fake job sites now churn out realistic-sounding listings, convincing recruiter profiles, and entire company websites in minutes. I’ve seen offers for AI startups that are clearly just data-harvesting schemes designed to look legitimate to anyone not paying close attention. At this point, I almost expect these bots to start sending me thank you notes for my personal information. Even when a company is legitimate, sharing your email or phone number often opens the floodgates to marketing you never asked for. Give a site your contact info once, and suddenly you’re subscribed to a lifetime of spam, partner offers, robocalls, and surveys. Unsubscribing works occasionally, but it often feels like plugging holes in a leaky dam with chewing gum. It is simply easier to keep my real contact info out of reach from the start. My Digital Defense So what do I do instead? I compartmentalize my digital identity. I use Google Voice for calls and texts, keeping my real number private. I maintain a separate burner email for signups and online forms, while my private email never touches job boards or sketchy websites. None of this is tied to my social accounts or banking. And unfortunately, there are moments where I have to use a real phone number, because some websites don’t accept Google Voice or temporary numbers. I also use a VPN or VPS when visiting untrusted sites, sometimes relying on Proton’s free VPN or a Slate router, depending on what’s convenient at the moment. On top of that, I follow strong security habits: unique passwords, a password manager, two-factor authentication (2FA) everywhere possible, and I even keep a physical security key. I swear I’m not paranoid. I’m just taking these precautions seriously because of how bad things have gotten. That way, even if one email or number ends up on a spam list, my real life stays quiet. The takeaway is simple. Be deliberate about what you share. Every time you hand out your email or phone number, think about who is really getting it, how they might use it, and whether it’s worth exposing yourself to scams, AI-generated junk, relentless marketing, or data aggregation sites. For me, the answer is almost always no. That’s why my personal email and phone number stay private, and why my inbox, voicemail, and sanity stay intact.]]></summary></entry><entry><title type="html">Stress Management</title><link href="http://willnj.com/blog/Stress-Management/" rel="alternate" type="text/html" title="Stress Management" /><published>2025-09-13T00:00:00+00:00</published><updated>2025-09-13T00:00:00+00:00</updated><id>http://willnj.com/blog/Stress-Management</id><content type="html" xml:base="http://willnj.com/blog/Stress-Management/"><![CDATA[<p>Well, you can’t spell <strong>stressed</strong> without <strong>desserts</strong>… but really, just look at the word “desserts” backwards.</p>

<p>That kind of sums up how stress has looked in my life—sometimes backwards, sometimes semi-manageable, sometimes completely out of control.</p>

<figure class="post-image">
  
    <img src="https://i.imgur.com/BW4VRzn.png" data-zoom-src="https://i.imgur.com/BW4VRzn.png" alt="Stress-Free Candle" width="500px" loading="lazy" />
  

  
</figure>

<h2 id="a-drive-through-university-campus">A Drive Through University Campus</h2>

<p>I remember sometime in fall of 2019, my sister drove me around the University of Tennessee campus. I can’t remember the exact reason, but I think it was to assist my brother-in-law—then just her boyfriend—and his friends at a Rube Goldberg competition for the Tennessee Society of Professional Engineers. He was finishing his PhD at the time, and we were judging high school students’ contraptions.</p>

<p>That drive was more than just a detour through Knoxville. It was a wake-up call. A reminder that I needed to go back to school.</p>

<p>Honestly, I never really cared for a Computer Science degree. It always felt more like an applied maths degree than anything else. And I had spent a lot of time in 2016 and 2017 watching Udemy and Lynda.com tutorials, building software, and genuinely enjoying programming—but none of it ever turned into a professional career. That drive around campus felt like a signal to try again.</p>

<p>Little did I know I’d be returning to school right as a pandemic was about to flip everything upside down.</p>

<h2 id="2020-vision-a-look-into-the-pandemic">2020 Vision: A Look into the Pandemic</h2>

<p>In early 2020, I got back into college. Then Spring Break happened—and it never really ended. Schools shut down. Everything went online.</p>

<p>Stress started to creep in. Being at home every day, working through assignments alone, and just hoping to stay on track for graduation… it was a weird kind of isolation. But at the same time, it wasn’t entirely bad. I didn’t have to drive anywhere, and I started sitting outside on a trampoline just to clear my head. No bouncing. Just sitting. It helped.</p>

<p>The “temporary” situation dragged on… what was supposed to initially be a 2 week lockdown turned into an eternity. Online classes stuck around for the next two semesters. I was supposed to transfer to UT in Fall 2020 so I could take more courses and be on track to graduate by the end of 2022 or maybe even earlier, but with everything still remote, getting academic assistance was a nightmare. I had to stay in community college and didn’t truly transfer until January 2021.</p>

<p>That delay triggered a serious breakdown. I don’t think any student should have to go through that much struggle just to transfer, especially when the pandemic made everything harder. Even after I got into UT, classes were still online. But thankfully, the CS students had set up a Discord server. That honestly saved me. Being able to ask questions, give help, and just connect—even if it was just to a faceless profile avatar—made everything feel more manageable.</p>

<p>Still, it was surreal. Some of these classmates I didn’t meet in person until way later. Imagine spending an entire semester talking to someone on Discord and then finally seeing their face months later in a lecture hall.</p>

<h2 id="2021-and-2022-back-in-the-real-world">2021 and 2022: Back in the Real World</h2>

<p>Things shifted again when classes returned in-person in Fall 2021. On paper, that should’ve helped with stress. But even that came with its own issues.</p>

<p>I had to deal with parking (a constant battle), and I somehow picked the most inefficient walking route to get to the Min Kao building. The transition back to face-to-face learning felt strange. Seeing students’ actual faces after months of profile pictures made campus feel like an alternate reality.</p>

<p>Still, it was good to be back—even if it wasn’t easy.</p>

<h2 id="2023-the-tipping-point">2023: The Tipping Point</h2>

<p>2023 is when everything boiled over. Stress became constant—grad school, farewells to friends, general burnout. I wrote more about it here: <a href="/blog/Looking-Back-2-Years-Ago/">Looking Back – 2 Years Ago</a></p>

<p>By the end of 2023, things weren’t just overwhelming—they were unmanageable.</p>

<p>I was having panic attacks. Moments where I couldn’t breathe, where I had to literally run outside for fresh air. I was dealing with acid reflux and skipping meals. Some days, I’d go without eating and just live on coffee. I kept telling myself I could handle it, but I couldn’t.</p>

<p>That month became my wake-up call to finally deal with the one thing I had ignored for the past three years: <strong>stress management</strong>.</p>

<h2 id="2024-soup-and-tea">2024: Soup and Tea</h2>

<p>I didn’t expect the solution to begin with changing what I ate, especially tomato soup.</p>

<p>I never liked tomatoes, but for some reason, soup became something I could actually enjoy, especially during that winter month. Then, in the summer of 2024, my sister brought home a tin of Earl Grey tea. I started drinking it every night, just boiling water and making tea as a way to slow things down. I never had tea before, so it was new.</p>

<p>I also stopped eating fast food. Sure, I’ll have occasional pizza, but I wouldn’t eat fried food everyday. I started cooking more. It wasn’t a major lifestyle overhaul, but it was enough to feel like I had control again. And yeah, cooking takes time—but at least I knew what I was putting into my body. Oh, and I started taking vitamins.</p>

<h2 id="2025-resting-easy">2025: Resting Easy</h2>

<p>Now it’s 2025. I haven’t had a panic attack in two years.</p>

<p>That doesn’t mean life is <em>entirely</em> stress-free. But it’s different now. I’m calmer. I’ve built routines that help. I eat better. I sleep better. I breathe easier.</p>

<p>And I’ve recognized, sometimes managing stress is about changing the things you can control, especially when it comes to choices in lifestyle.</p>]]></content><author><name>William</name></author><category term="life" /><summary type="html"><![CDATA[Well, you can’t spell stressed without desserts… but really, just look at the word “desserts” backwards. That kind of sums up how stress has looked in my life—sometimes backwards, sometimes semi-manageable, sometimes completely out of control. A Drive Through University Campus I remember sometime in fall of 2019, my sister drove me around the University of Tennessee campus. I can’t remember the exact reason, but I think it was to assist my brother-in-law—then just her boyfriend—and his friends at a Rube Goldberg competition for the Tennessee Society of Professional Engineers. He was finishing his PhD at the time, and we were judging high school students’ contraptions. That drive was more than just a detour through Knoxville. It was a wake-up call. A reminder that I needed to go back to school. Honestly, I never really cared for a Computer Science degree. It always felt more like an applied maths degree than anything else. And I had spent a lot of time in 2016 and 2017 watching Udemy and Lynda.com tutorials, building software, and genuinely enjoying programming—but none of it ever turned into a professional career. That drive around campus felt like a signal to try again. Little did I know I’d be returning to school right as a pandemic was about to flip everything upside down. 2020 Vision: A Look into the Pandemic In early 2020, I got back into college. Then Spring Break happened—and it never really ended. Schools shut down. Everything went online. Stress started to creep in. Being at home every day, working through assignments alone, and just hoping to stay on track for graduation… it was a weird kind of isolation. But at the same time, it wasn’t entirely bad. I didn’t have to drive anywhere, and I started sitting outside on a trampoline just to clear my head. No bouncing. Just sitting. It helped. The “temporary” situation dragged on… what was supposed to initially be a 2 week lockdown turned into an eternity. Online classes stuck around for the next two semesters. I was supposed to transfer to UT in Fall 2020 so I could take more courses and be on track to graduate by the end of 2022 or maybe even earlier, but with everything still remote, getting academic assistance was a nightmare. I had to stay in community college and didn’t truly transfer until January 2021. That delay triggered a serious breakdown. I don’t think any student should have to go through that much struggle just to transfer, especially when the pandemic made everything harder. Even after I got into UT, classes were still online. But thankfully, the CS students had set up a Discord server. That honestly saved me. Being able to ask questions, give help, and just connect—even if it was just to a faceless profile avatar—made everything feel more manageable. Still, it was surreal. Some of these classmates I didn’t meet in person until way later. Imagine spending an entire semester talking to someone on Discord and then finally seeing their face months later in a lecture hall. 2021 and 2022: Back in the Real World Things shifted again when classes returned in-person in Fall 2021. On paper, that should’ve helped with stress. But even that came with its own issues. I had to deal with parking (a constant battle), and I somehow picked the most inefficient walking route to get to the Min Kao building. The transition back to face-to-face learning felt strange. Seeing students’ actual faces after months of profile pictures made campus feel like an alternate reality. Still, it was good to be back—even if it wasn’t easy. 2023: The Tipping Point 2023 is when everything boiled over. Stress became constant—grad school, farewells to friends, general burnout. I wrote more about it here: Looking Back – 2 Years Ago By the end of 2023, things weren’t just overwhelming—they were unmanageable. I was having panic attacks. Moments where I couldn’t breathe, where I had to literally run outside for fresh air. I was dealing with acid reflux and skipping meals. Some days, I’d go without eating and just live on coffee. I kept telling myself I could handle it, but I couldn’t. That month became my wake-up call to finally deal with the one thing I had ignored for the past three years: stress management. 2024: Soup and Tea I didn’t expect the solution to begin with changing what I ate, especially tomato soup. I never liked tomatoes, but for some reason, soup became something I could actually enjoy, especially during that winter month. Then, in the summer of 2024, my sister brought home a tin of Earl Grey tea. I started drinking it every night, just boiling water and making tea as a way to slow things down. I never had tea before, so it was new. I also stopped eating fast food. Sure, I’ll have occasional pizza, but I wouldn’t eat fried food everyday. I started cooking more. It wasn’t a major lifestyle overhaul, but it was enough to feel like I had control again. And yeah, cooking takes time—but at least I knew what I was putting into my body. Oh, and I started taking vitamins. 2025: Resting Easy Now it’s 2025. I haven’t had a panic attack in two years. That doesn’t mean life is entirely stress-free. But it’s different now. I’m calmer. I’ve built routines that help. I eat better. I sleep better. I breathe easier. And I’ve recognized, sometimes managing stress is about changing the things you can control, especially when it comes to choices in lifestyle.]]></summary></entry><entry><title type="html">Being a GTA</title><link href="http://willnj.com/blog/Being-a-GTA/" rel="alternate" type="text/html" title="Being a GTA" /><published>2025-09-08T00:00:00+00:00</published><updated>2025-09-08T00:00:00+00:00</updated><id>http://willnj.com/blog/Being-a-GTA</id><content type="html" xml:base="http://willnj.com/blog/Being-a-GTA/"><![CDATA[<p>Being a Graduate Teaching Assistant is both chill and chaotic. Some days, you’re sipping coffee in a half-empty lab waiting for students who never show up. Other days, you’re knee-deep in final exams wondering why some students don’t seem to know how a semaphore works. It’s a mixed bag, but honestly, one of the more meaningful things I’ve done in grad school.</p>

<h3 id="office-hours">Office Hours</h3>

<p>Most students don’t show up to office hours. That’s just the reality. I usually spend that time grading or catching up on other work. But I still hope someone walks in.</p>

<p>When they do, it’s often the best part of my day. Some students want to dive deeper into a concept. I’ll happily jump to the whiteboard to explain how MAC Attack works, or go over bit shifting with an example. Others just want to know why they lost points. I’ll pull up their submission, go over my comments, and if I misread something or made a mistake, I’ll own up to it and fix it. Not a big deal.</p>

<p>Honestly, I like that part of being a GTA. It’s like mini tutoring sessions, but more conversational.</p>

<h3 id="grading">Grading</h3>

<p>Grading can be fun or frustrating, depending on the course.</p>

<p>Human-Computer Interaction (HCI) was one of the fun ones. Students submitted design projects, often with videos. You could tell who really cared about the work. Those were a blast to review.</p>

<p>Then there was Applied Cryptography. I requested that class because I’m into cybersecurity, and it was a great fit. Students asked questions I was genuinely interested in, and I could answer a lot without even pulling up FIPS or some other technical document until I needed it. It felt natural. And the professor for that class introduced me to Docker containers (Portainer) to help manage students’ online submissions, so it was nice to learn about that piece of technology along the way.</p>

<p>Operating Systems, on the other hand… not so fun. I had to grade typed midterm and final responses based on OSTEP, or <em>Operating Systems: Three Easy Pieces</em>. The professor gave me a list of keywords to look for in each answer. Sounds simple, but it gets tricky. Some students clearly understood the concept but didn’t use any of the keywords. I had to decide whether to reward the logic or stick to the rubric. Those kinds of judgment calls are exhausting.</p>

<h3 id="the-ai-problem">The AI Problem</h3>

<p>Now for the part that’s been getting worse: AI in student work.</p>

<p>Sometimes I’ll read an answer and it just feels off. Too formal, too clean, or worded in a way that doesn’t match the student’s usual style. Feels like ChatGPT. But unless I’m absolutely certain, I can’t do much. 99% confidence still isn’t 100%.</p>

<p>And the irony? AI doesn’t always help students. Especially in Operating Systems. Some AI-generated answers were flat-out wrong. They sounded convincing but totally missed what the professor was asking. The students who did their own work, cited the textbook, and wrote in their own words? They usually crushed it.</p>

<figure class="post-image">
  
    <img src="https://i.imgur.com/ZtcY8Lb.png" data-zoom-src="https://i.imgur.com/ZtcY8Lb.png" alt="Decision" width="500px" loading="lazy" />
  

  
</figure>

<p>I also saw some possible AI use in a Blockchain assignment called “Quotechain.” Students had to build a chain of quotes and hash them block by block. Language choice was up to them. It was a straightforward assignment. But I noticed two students submitted code that had a very similar structure — same class usage, variable names, flow. And their previous assignments didn’t follow the pattern of this assignment. I was suspicious. So I fed the assignment description into ChatGPT, and sure enough, it produced something eerily close to their code.</p>

<p>Could I prove they used it? Not completely. So I didn’t flag it. It was also their last assignment of the semester, and the project was relatively simple anyway. If they used AI, they probably spent more time debugging than they would’ve writing it from scratch (in my own experience, it took maybe 30 lines of code, so having fancy classes and variable names was completely unnecessary). At the end of the day, they hurt themselves more than anything.</p>

<h3 id="my-take-on-ai">My Take on AI</h3>

<p>I didn’t get access to tools like ChatGPT during undergrad. It wasn’t really a thing until late 2022, and by then I was nearly done with my Bachelor’s. Man, I still remember the crazy moments trying to wrap my head around implementing Dekel-Nassimi-Sahni’s parallel matrix multiplication in MPI, and all of the other programming ventures along the way. But since starting grad school, I’ve tried using AI for a few things — mostly just to test it. Mixed results.</p>

<p>Ask ChatGPT for something like “prove that the union of countably many countable sets is countable,” and it fumbles. It creates a convincing, but incorrect response. I usually have to check Math StackExchange anyway. Man, can you imagine reading the word <em>count</em> three times in one sentence!?</p>

<p>I think CS professors are already adapting. A lot of them are designing problems that AI just doesn’t handle well. They’ll write exam questions in ways that force reasoning or creative thinking, or citation. Plus, I think those professors have a network of professors they collaborate with to create unique questions, so students don’t look up on Chegg or other publicly available resources.</p>

<h3 id="final-thoughts">Final Thoughts</h3>

<p>If you’re in college, you’re paying for it. In time, money, and effort. So why take shortcuts?</p>

<p>I get it — school can be overwhelming. But when you outsource your learning to an AI tool, you’re not gaming the system. You’re short-circuiting your own development. That comes back to bite later.</p>

<p>Being a GTA reminded me how valuable genuine effort is. The students who ask questions, show up to office hours, and put thought into their work? It shows. And those are the ones who really get something out of their education.</p>

<p>If you’re considering being a GTA, I say go for it. You’ll teach, but you’ll also learn a lot more than you expect. And if you’re a student, then take the opportunity to visit office hours. We enjoy your company!</p>]]></content><author><name>William</name></author><category term="life" /><summary type="html"><![CDATA[Being a Graduate Teaching Assistant is both chill and chaotic. Some days, you’re sipping coffee in a half-empty lab waiting for students who never show up. Other days, you’re knee-deep in final exams wondering why some students don’t seem to know how a semaphore works. It’s a mixed bag, but honestly, one of the more meaningful things I’ve done in grad school. Office Hours Most students don’t show up to office hours. That’s just the reality. I usually spend that time grading or catching up on other work. But I still hope someone walks in. When they do, it’s often the best part of my day. Some students want to dive deeper into a concept. I’ll happily jump to the whiteboard to explain how MAC Attack works, or go over bit shifting with an example. Others just want to know why they lost points. I’ll pull up their submission, go over my comments, and if I misread something or made a mistake, I’ll own up to it and fix it. Not a big deal. Honestly, I like that part of being a GTA. It’s like mini tutoring sessions, but more conversational. Grading Grading can be fun or frustrating, depending on the course. Human-Computer Interaction (HCI) was one of the fun ones. Students submitted design projects, often with videos. You could tell who really cared about the work. Those were a blast to review. Then there was Applied Cryptography. I requested that class because I’m into cybersecurity, and it was a great fit. Students asked questions I was genuinely interested in, and I could answer a lot without even pulling up FIPS or some other technical document until I needed it. It felt natural. And the professor for that class introduced me to Docker containers (Portainer) to help manage students’ online submissions, so it was nice to learn about that piece of technology along the way. Operating Systems, on the other hand… not so fun. I had to grade typed midterm and final responses based on OSTEP, or Operating Systems: Three Easy Pieces. The professor gave me a list of keywords to look for in each answer. Sounds simple, but it gets tricky. Some students clearly understood the concept but didn’t use any of the keywords. I had to decide whether to reward the logic or stick to the rubric. Those kinds of judgment calls are exhausting. The AI Problem Now for the part that’s been getting worse: AI in student work. Sometimes I’ll read an answer and it just feels off. Too formal, too clean, or worded in a way that doesn’t match the student’s usual style. Feels like ChatGPT. But unless I’m absolutely certain, I can’t do much. 99% confidence still isn’t 100%. And the irony? AI doesn’t always help students. Especially in Operating Systems. Some AI-generated answers were flat-out wrong. They sounded convincing but totally missed what the professor was asking. The students who did their own work, cited the textbook, and wrote in their own words? They usually crushed it. I also saw some possible AI use in a Blockchain assignment called “Quotechain.” Students had to build a chain of quotes and hash them block by block. Language choice was up to them. It was a straightforward assignment. But I noticed two students submitted code that had a very similar structure — same class usage, variable names, flow. And their previous assignments didn’t follow the pattern of this assignment. I was suspicious. So I fed the assignment description into ChatGPT, and sure enough, it produced something eerily close to their code. Could I prove they used it? Not completely. So I didn’t flag it. It was also their last assignment of the semester, and the project was relatively simple anyway. If they used AI, they probably spent more time debugging than they would’ve writing it from scratch (in my own experience, it took maybe 30 lines of code, so having fancy classes and variable names was completely unnecessary). At the end of the day, they hurt themselves more than anything. My Take on AI I didn’t get access to tools like ChatGPT during undergrad. It wasn’t really a thing until late 2022, and by then I was nearly done with my Bachelor’s. Man, I still remember the crazy moments trying to wrap my head around implementing Dekel-Nassimi-Sahni’s parallel matrix multiplication in MPI, and all of the other programming ventures along the way. But since starting grad school, I’ve tried using AI for a few things — mostly just to test it. Mixed results. Ask ChatGPT for something like “prove that the union of countably many countable sets is countable,” and it fumbles. It creates a convincing, but incorrect response. I usually have to check Math StackExchange anyway. Man, can you imagine reading the word count three times in one sentence!? I think CS professors are already adapting. A lot of them are designing problems that AI just doesn’t handle well. They’ll write exam questions in ways that force reasoning or creative thinking, or citation. Plus, I think those professors have a network of professors they collaborate with to create unique questions, so students don’t look up on Chegg or other publicly available resources. Final Thoughts If you’re in college, you’re paying for it. In time, money, and effort. So why take shortcuts? I get it — school can be overwhelming. But when you outsource your learning to an AI tool, you’re not gaming the system. You’re short-circuiting your own development. That comes back to bite later. Being a GTA reminded me how valuable genuine effort is. The students who ask questions, show up to office hours, and put thought into their work? It shows. And those are the ones who really get something out of their education. If you’re considering being a GTA, I say go for it. You’ll teach, but you’ll also learn a lot more than you expect. And if you’re a student, then take the opportunity to visit office hours. We enjoy your company!]]></summary></entry><entry><title type="html">Interviews Are Broken… Let’s Talk About It</title><link href="http://willnj.com/blog/Interviews-Are-Broken-Let's-Talk-About-It/" rel="alternate" type="text/html" title="Interviews Are Broken… Let’s Talk About It" /><published>2025-09-04T00:00:00+00:00</published><updated>2025-09-04T00:00:00+00:00</updated><id>http://willnj.com/blog/Interviews-Are-Broken-Let&apos;s-Talk-About-It</id><content type="html" xml:base="http://willnj.com/blog/Interviews-Are-Broken-Let&apos;s-Talk-About-It/"><![CDATA[<p>“What motivates you?” That’s often the first question you hear in a behavioral interview. But is it really the right one? Motivation lights the candle. It’s bright, it’s warm—but it’s fleeting. Put a jar over that candle, deprive it of oxygen, and it burns out quickly. Discipline is what keeps the flame alive. Discipline is leaving space for air to enter, letting the light endure.</p>

<p>So why do we keep asking about motivation, as if it’s the secret to lasting work? It’s not. Motivation gets you started; discipline sustains you.</p>

<h2 id="behavioral-questions-an-inquisition-without-context">Behavioral Questions: An Inquisition Without Context</h2>

<p>Behavioral interviews lean on their trusty script:</p>

<ul>
  <li>“Tell me about a time you led a team.”</li>
  <li>“Tell me about a time you faced conflict.”</li>
</ul>

<p>The problem isn’t the questions themselves; it’s the way they’re asked—with no context, no setup. They’re dropped into conversation like pop quizzes. Instead of a dialogue, it’s an inquisition. You end up reaching for canned stories you’ve polished to death using the STAR method, or you scramble to invent a narrative on the spot. Neither feels authentic.</p>

<h2 id="the-technical-gauntlet">The Technical Gauntlet</h2>

<p>Not one, but <em>two</em>. Sometimes even <em>four</em> rounds of interviews.</p>

<ul>
  <li>You talk with the Hiring Manager.</li>
  <li>You talk with the Development Team.</li>
  <li>You talk with the Lead Senior Engineer.</li>
  <li>You talk with the CEO.</li>
</ul>

<figure class="post-image">
  
    <img src="https://i.imgur.com/yKVchaI.png" data-zoom-src="https://i.imgur.com/yKVchaI.png" alt="The Interviewing Process" width="500px" loading="lazy" />
  

  
</figure>

<p>Contrast that with years ago. You’d drive to the office, shake hands, slide your résumé (and maybe a business card) across the desk, and actually talk. Maybe you’d walk to a whiteboard—an actual whiteboard, not a digital one—and sketch out a design pattern for a specific task, debug a snippet of code, normalize a database schema, or walk through some pointer arithmetic. The conversation was grounded in practice, in collaboration.</p>

<p>Today, the questions are different: <strong>“Invert this binary tree.”</strong> Something you probably did once in university and never again. You stare at the online editor, trying to recall the exact sequence, or if the base case in your recursion implementation is correct, while the interviewer—who has never inverted a binary tree in production—waits silently.</p>

<p><em>Psst. In real life? We use StackOverflow. We use manpages. We ask our colleagues. We use frameworks and libraries with the tools already provided for us. We use AI. That’s the job.</em></p>

<p>Back then, the test was: <em>can you think through design?</em> Now, the test is: <em>can you memorize problems from a book you bought off Amazon? And sometimes, the books become heavily outdated or irrelevant!</em></p>

<figure class="post-image">
  
    <img src="https://i.imgur.com/Iy0Wqil.jpeg" data-zoom-src="https://i.imgur.com/Iy0Wqil.jpeg" alt="Stack of Books" width="500px" loading="lazy" />
  

  
    <figcaption>Stack of Books</figcaption>
  
</figure>

<h2 id="the-fortune-300-paradox">The Fortune 300 Paradox</h2>

<p>Wait, why is everyone calling them “FAANG companies”? And is Netflix still relevant, or does the ‘N’ stand for NVIDIA now?</p>

<p>There’s some logic here. Big companies want scalable filters. Running candidates through algorithm drills looks rigorous. But once people know the game, they just study and memorize LeetCode problems until the solutions are drilled in.</p>

<p>It’s like testing a chef by asking them to recite recipes from memory, word for word. They might know the list of ingredients—but can they actually cook?</p>

<h2 id="the-illusion-of-automation">The Illusion of Automation</h2>

<p>This is where it gets really murky. In an attempt to “streamline” hiring, more and more companies are leaning on AI or automated systems to filter candidates. Résumé screeners, initial coding challenges with strict time limits, even sentiment analysis on video interviews. The idea is to weed out the “bad” fits efficiently.</p>

<p>The problem? You don’t truly know a candidate unless you talk with them, or, better yet, have worked with them for a good length of time. Automating this crucial human interaction is fraught with peril. If you build a system designed for automated input, don’t be surprised when candidates start providing automated, impersonal responses—or worse, adding exaggerated numbers and details to fluff up their résumé or using AI to cheat on a technical interview. We’ve now incentivized candidates to beat the machine, not to excel at the job.</p>

<h2 id="conundrums-in-hiring">Conundrums in Hiring</h2>

<p>We face a few recurring issues that make no sense:</p>

<ul>
  <li>
    <p><strong>Expecting one individual to have every piece of expertise.</strong> Well, Rome wasn’t built in a day—and it wasn’t built by one individual either. Sure, it’s <em>possible</em>, but it’s unrealistic. Ultimately, the organization builds the organism; we thrive by mutualism, like worker ants and bees.</p>
  </li>
  <li>
    <p><strong>Expecting hyper-specific skills in hyper-specific languages.</strong> Believe it or not, computer scientists are adaptable. There’s a reason <em>K&amp;R’s C Programming Language</em> book is so highly regarded and why professors don’t tell students to buy a book on every programming language out there: it teaches the foundations. You learn one system deeply, and suddenly the next language comes easier. The real skill isn’t memorization—it’s knowing how to look things up, how to adapt, and how to collaborate.</p>
  </li>
  <li>
    <p><strong>Ignoring the ecosystem.</strong> If I’m fumbling with something, I don’t reinvent the wheel in isolation. I talk with my team. I ask the senior engineer. We hash it out in a standup, or on Slack. We plan the roadmap together. Again, the ecosystem builds the individual.</p>
  </li>
</ul>

<p>Hmm… How do you think a C++ programmer would adapt to writing Java code?</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="rouge-code"><pre>// TODO: Fix this. Java requires this block of code for some reason when I'm compiling with g++.
// vvvvvv IGNORE THIS BLOCK OF CODE vvvvvv
        %:include &lt;iostream&gt;
        %:define System S s;s
        %:define public
        %:define static
        %:define void int
        %:define main(x) main()
        struct F &lt;% int println(const char* s) &lt;% std::cout &lt;&lt; s &lt;&lt; std::endl; return 0; %&gt;%&gt;;
        struct S &lt;% F out; %&gt;;
// ^^^^^^ IGNORE THIS BLOCK OF CODE ^^^^^^

// My first Java program
public static void main(String[] args) {
  System.out.println("I love Java!");
}
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="why-behavioral-questions-get-so-much-hate">Why Behavioral Questions Get So Much Hate</h2>

<p>Behavioral interviews often get painted as the villain. And honestly, they deserve some of it—they focus more on how well you can <em>perform a story</em> than how you’ll actually <em>perform on the job.</em></p>

<p>But here’s the irony: behavioral could be the most useful. Instead of <em>“tell me about a time you disagreed with a coworker,”</em> what if it was:</p>

<blockquote>
  <p>“Imagine you’re working on a specific feature. Mid-sprint, a teammate strongly disagrees with your approach. What happens next?”</p>
</blockquote>

<p>That’s a conversation. That’s context. That’s useful.</p>

<h2 id="so-whats-the-fix">So What’s the Fix?</h2>

<p>It’s not rocket science; it’s about reorienting towards reality:</p>

<ul>
  <li><strong>Contextual Behavioral Questions</strong> → Stop the vague prompts. Give scenarios.</li>
  <li><strong>Practical Technical Questions</strong> → Test debugging, critical thinking, and technical breadth, not just algorithms.</li>
  <li><strong>Collaborative Interviews</strong> → Pair programming, design and code reviews, roadmap discussions. See how candidates think with others.</li>
  <li><strong>Respect Time and Energy</strong> → Two rounds, not four. Your candidates likely have many interviews for different companies, so let’s cut to the chase.</li>
  <li><strong>Balance Between Theory and Practice</strong> → Yes, ask about fundamentals—but tie them to real-world use.</li>
</ul>

<p>Ultimately, interviewing should follow a core principle: <strong>“You are not the user.”</strong> Just as software engineers gather user stories and perform A/B testing to understand the product’s audience, shouldn’t we apply the same empathy and data-driven approach to understanding our candidates? We need to think like the user (the job candidate) to get real insights.</p>

<h2 id="keep-it-simple-stupid">Keep It Simple, Stupid</h2>

<p>At the end of the day, interviewing should answer one question: <em>can this person do the work, and do it with us?</em> That doesn’t require four Zoom calls, a binary tree pop quiz, and a behavioral inquisition.</p>

<p>Sometimes, all it takes is a whiteboard, a good question, and an actual conversation. See you on the next TED talk! <i class="fa-solid fa-face-smile-wink"></i></p>]]></content><author><name>William</name></author><category term="tech" /><summary type="html"><![CDATA[“What motivates you?” That’s often the first question you hear in a behavioral interview. But is it really the right one? Motivation lights the candle. It’s bright, it’s warm—but it’s fleeting. Put a jar over that candle, deprive it of oxygen, and it burns out quickly. Discipline is what keeps the flame alive. Discipline is leaving space for air to enter, letting the light endure. So why do we keep asking about motivation, as if it’s the secret to lasting work? It’s not. Motivation gets you started; discipline sustains you. Behavioral Questions: An Inquisition Without Context Behavioral interviews lean on their trusty script: “Tell me about a time you led a team.” “Tell me about a time you faced conflict.” The problem isn’t the questions themselves; it’s the way they’re asked—with no context, no setup. They’re dropped into conversation like pop quizzes. Instead of a dialogue, it’s an inquisition. You end up reaching for canned stories you’ve polished to death using the STAR method, or you scramble to invent a narrative on the spot. Neither feels authentic. The Technical Gauntlet Not one, but two. Sometimes even four rounds of interviews. You talk with the Hiring Manager. You talk with the Development Team. You talk with the Lead Senior Engineer. You talk with the CEO. Contrast that with years ago. You’d drive to the office, shake hands, slide your résumé (and maybe a business card) across the desk, and actually talk. Maybe you’d walk to a whiteboard—an actual whiteboard, not a digital one—and sketch out a design pattern for a specific task, debug a snippet of code, normalize a database schema, or walk through some pointer arithmetic. The conversation was grounded in practice, in collaboration. Today, the questions are different: “Invert this binary tree.” Something you probably did once in university and never again. You stare at the online editor, trying to recall the exact sequence, or if the base case in your recursion implementation is correct, while the interviewer—who has never inverted a binary tree in production—waits silently. Psst. In real life? We use StackOverflow. We use manpages. We ask our colleagues. We use frameworks and libraries with the tools already provided for us. We use AI. That’s the job. Back then, the test was: can you think through design? Now, the test is: can you memorize problems from a book you bought off Amazon? And sometimes, the books become heavily outdated or irrelevant! Stack of Books The Fortune 300 Paradox Wait, why is everyone calling them “FAANG companies”? And is Netflix still relevant, or does the ‘N’ stand for NVIDIA now? There’s some logic here. Big companies want scalable filters. Running candidates through algorithm drills looks rigorous. But once people know the game, they just study and memorize LeetCode problems until the solutions are drilled in. It’s like testing a chef by asking them to recite recipes from memory, word for word. They might know the list of ingredients—but can they actually cook? The Illusion of Automation This is where it gets really murky. In an attempt to “streamline” hiring, more and more companies are leaning on AI or automated systems to filter candidates. Résumé screeners, initial coding challenges with strict time limits, even sentiment analysis on video interviews. The idea is to weed out the “bad” fits efficiently. The problem? You don’t truly know a candidate unless you talk with them, or, better yet, have worked with them for a good length of time. Automating this crucial human interaction is fraught with peril. If you build a system designed for automated input, don’t be surprised when candidates start providing automated, impersonal responses—or worse, adding exaggerated numbers and details to fluff up their résumé or using AI to cheat on a technical interview. We’ve now incentivized candidates to beat the machine, not to excel at the job. Conundrums in Hiring We face a few recurring issues that make no sense: Expecting one individual to have every piece of expertise. Well, Rome wasn’t built in a day—and it wasn’t built by one individual either. Sure, it’s possible, but it’s unrealistic. Ultimately, the organization builds the organism; we thrive by mutualism, like worker ants and bees. Expecting hyper-specific skills in hyper-specific languages. Believe it or not, computer scientists are adaptable. There’s a reason K&amp;R’s C Programming Language book is so highly regarded and why professors don’t tell students to buy a book on every programming language out there: it teaches the foundations. You learn one system deeply, and suddenly the next language comes easier. The real skill isn’t memorization—it’s knowing how to look things up, how to adapt, and how to collaborate. Ignoring the ecosystem. If I’m fumbling with something, I don’t reinvent the wheel in isolation. I talk with my team. I ask the senior engineer. We hash it out in a standup, or on Slack. We plan the roadmap together. Again, the ecosystem builds the individual. Hmm… How do you think a C++ programmer would adapt to writing Java code? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 // TODO: Fix this. Java requires this block of code for some reason when I'm compiling with g++. // vvvvvv IGNORE THIS BLOCK OF CODE vvvvvv %:include &lt;iostream&gt; %:define System S s;s %:define public %:define static %:define void int %:define main(x) main() struct F &lt;% int println(const char* s) &lt;% std::cout &lt;&lt; s &lt;&lt; std::endl; return 0; %&gt;%&gt;; struct S &lt;% F out; %&gt;; // ^^^^^^ IGNORE THIS BLOCK OF CODE ^^^^^^ // My first Java program public static void main(String[] args) { System.out.println("I love Java!"); } Why Behavioral Questions Get So Much Hate Behavioral interviews often get painted as the villain. And honestly, they deserve some of it—they focus more on how well you can perform a story than how you’ll actually perform on the job. But here’s the irony: behavioral could be the most useful. Instead of “tell me about a time you disagreed with a coworker,” what if it was: “Imagine you’re working on a specific feature. Mid-sprint, a teammate strongly disagrees with your approach. What happens next?” That’s a conversation. That’s context. That’s useful. So What’s the Fix? It’s not rocket science; it’s about reorienting towards reality: Contextual Behavioral Questions → Stop the vague prompts. Give scenarios. Practical Technical Questions → Test debugging, critical thinking, and technical breadth, not just algorithms. Collaborative Interviews → Pair programming, design and code reviews, roadmap discussions. See how candidates think with others. Respect Time and Energy → Two rounds, not four. Your candidates likely have many interviews for different companies, so let’s cut to the chase. Balance Between Theory and Practice → Yes, ask about fundamentals—but tie them to real-world use. Ultimately, interviewing should follow a core principle: “You are not the user.” Just as software engineers gather user stories and perform A/B testing to understand the product’s audience, shouldn’t we apply the same empathy and data-driven approach to understanding our candidates? We need to think like the user (the job candidate) to get real insights. Keep It Simple, Stupid At the end of the day, interviewing should answer one question: can this person do the work, and do it with us? That doesn’t require four Zoom calls, a binary tree pop quiz, and a behavioral inquisition. Sometimes, all it takes is a whiteboard, a good question, and an actual conversation. See you on the next TED talk!]]></summary></entry><entry><title type="html">Looking Back 2 Years Ago</title><link href="http://willnj.com/blog/Looking-Back-2-Years-Ago/" rel="alternate" type="text/html" title="Looking Back 2 Years Ago" /><published>2025-09-03T00:00:00+00:00</published><updated>2025-09-03T00:00:00+00:00</updated><id>http://willnj.com/blog/Looking-Back-2-Years-Ago</id><content type="html" xml:base="http://willnj.com/blog/Looking-Back-2-Years-Ago/"><![CDATA[<p>Like Janus, the Roman god with two faces, I find myself looking both backward and forward. 2023 was a year of endings and beginnings, a pivot point where excitement tangled with stress, farewells blurred with new starts, and reflection slowly gave way to resilience.</p>

<h3 id="senior-year">Senior Year</h3>

<p>Being a senior was all three at once: exciting, stressful, and bittersweet. On the bright side, I finally completed my Bachelor’s and got to dive deep into a senior design project I still brag about: <em>Neuromorphic Autonomous Racing</em>. What made it truly special wasn’t just the tech, but the team—friends I’d known since community college back in 2020. That kind of synergy? It’s rare, and it created fun academic moments.</p>

<p>But, man, it wasn’t smooth sailing. My stubborn drive to keep a perfect 4.0 GPA meant I overloaded myself with pressure, even tackling graduate-level courses like Software Security and Network Security. The stress was <em>relentless</em>. Still, crossing that finish line and graduating felt like my proudest achievement, even if my brain felt like scrambled eggs.</p>

<p>And the ceremony? Yeah, I skipped it. I’d earned my Volunteer of Distinction pin, which probably would’ve looked pretty cool on a graduation gown, but pomp and circumstance has just never been my thing. Plus, let’s be real, a university graduation just hits different than high school, right? Much less fuss.</p>

<h6 id="demo-of-our-neuromorphic-autonomous-car">Demo of our Neuromorphic Autonomous Car</h6>

<div style="width: 100%; max-width: 720px; margin-bottom: 1rem;">
  <div style="position: relative; width: 100%; height: 0; padding-bottom: 56.25%;">
    <iframe src="https://www.youtube.com/embed/TVREhZGX4KY" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: 0;">
    </iframe>
  </div>
</div>

<figure class="post-image">
  
    <img src="https://i.imgur.com/BR9V7ZN.gif" data-zoom-src="https://i.imgur.com/BR9V7ZN.gif" alt="Neuromorphic Autonomous Car Simulation" width="500px" loading="lazy" />
  

  
    <figcaption>Running the Car in Simulation</figcaption>
  
</figure>

<h3 id="friendships--farewells">Friendships &amp; Farewells</h3>

<p>The more difficult goodbyes weren’t marked by speeches or after-graduation parties. They were silent farewells to colleagues and friends, especially the ones I’d spent countless hours with for my Software Engineering course and our Senior Design Capstone. These were friendships built on shared passions, debugging sessions on Discord, and the mutual understanding of impending deadlines. When the time came to part ways, we didn’t need flowery speeches—just an unspoken <em>good luck on your next adventure</em>. It felt more profound, in a way.</p>

<h3 id="the-masters-degree">The Master’s Degree</h3>

<p>Pursuing a Master’s wasn’t exactly on my meticulously planned roadmap. The post-pandemic job market was brutal, and grad school offered a kind of stability I just couldn’t ignore. With a solid nudge from family members and professors, and a strong academic record, I took the leap—and thankfully landed a Graduate Teaching Assistantship to help chip away at tuition.</p>

<p>But honestly, the transition wasn’t fueled by excitement. It was anxiety. I was itching for hands-on work, for <em>building</em> things, not more math and theory. By the time I finished my Bachelor’s, I was already pretty burnt out, and the Master’s felt less like ambition and more like… well, obligation. A necessary evil, maybe.</p>

<h3 id="stress--balance">Stress &amp; Balance</h3>

<p>Stress pretty much shadowed me through 2023—keeping grades sky-high, navigating the GTA role application, and prepping for grad school. To cope, weirdly enough, I drifted back onto social media. It was a fragmented online landscape then, wasn’t it? I dabbled in Substack, Threads, Bluesky, Mastodon… trying to find a niche that felt right.</p>

<figure class="post-image">
  
    <img src="https://i.imgur.com/9KxgASg.png" data-zoom-src="https://i.imgur.com/9KxgASg.png" alt="Substack Blogging" width="250px" loading="lazy" />
  

  
</figure>

<p>Substack, unexpectedly, became my personal outlet during that summer. Even if nobody was reading, I loved what I started calling “vibe blogging”—basically, prompting ChatGPT for topic ideas and then spinning my own thoughts and outlines into these fun, low-pressure (and sometimes whimsical) posts. I’d pour out thoughts on programming, linguistics, or just whatever random idea popped into my head. Writing helped untangle the knots in my brain and gave me a rhythm outside the constant push for academic perfection.</p>

<p>By fall, though, the weight finally caught up. I felt sluggish, mentally overloaded, just completely stretched thin. The turning point? Finally letting go of that crippling perfectionism. It wasn’t a dramatic epiphany, more like a slow, quiet surrender. And honestly, 2024 greeted me with a significantly lighter, more positive outlook because of it.</p>

<h3 id="blogging--social-media">Blogging &amp; Social Media</h3>

<p>Blogging was never about building a brand or becoming an “influencer.” It was genuinely just a way to escape.</p>

<p>The social media landscape then still felt so… fractured, though. Tech circles were clinging to X (formerly Twitter), science conversations were migrating to Bluesky, writers were nesting on Substack. Different corners, different voices. It definitely wasn’t cohesive, but in a weird way, it felt more <em>real</em> than ever before.</p>

<figure class="post-image">
  
    <img src="https://i.imgur.com/SLzKR1K.png" data-zoom-src="https://i.imgur.com/SLzKR1K.png" alt="Threads Registration" width="500px" loading="lazy" />
  

  
</figure>

<p><strong>Fun fact:</strong> I was #62008 on Threads. Managed to snag the APK before launch, even though registration was locked.</p>

<h3 id="reflection">Reflection</h3>

<p>Looking back now, two years later, I definitely see 2023 as a character-building year. A year that tested me, stretched me to my limits, and ultimately reminded me that strength comes from facing those hurdles head-on and sometimes taking a small step back, even when you’d rather just curl up in a ball.</p>

<p>The biggest lessons I’m carrying forward:</p>
<ul>
  <li><strong>Plan ahead, but don’t panic.</strong> Wait, isn’t that an advice from <em>The Hitchhiker’s Guide to the Galaxy</em>? Even if grad school isn’t in your immediate sights, dabbling in a graduate course or two <em>before</em> you need to can make a huge difference in how prepared you feel.</li>
  <li><strong>Roll with the flow.</strong> Seriously, don’t obsess over the <em>what ifs</em>. Opportunities rarely come neatly packaged or exactly when you expect them—sometimes you just have to grab them and figure out the rest on the fly. It’s often where the best stuff happens.</li>
</ul>]]></content><author><name>William</name></author><category term="life" /><summary type="html"><![CDATA[Like Janus, the Roman god with two faces, I find myself looking both backward and forward. 2023 was a year of endings and beginnings, a pivot point where excitement tangled with stress, farewells blurred with new starts, and reflection slowly gave way to resilience. Senior Year Being a senior was all three at once: exciting, stressful, and bittersweet. On the bright side, I finally completed my Bachelor’s and got to dive deep into a senior design project I still brag about: Neuromorphic Autonomous Racing. What made it truly special wasn’t just the tech, but the team—friends I’d known since community college back in 2020. That kind of synergy? It’s rare, and it created fun academic moments. But, man, it wasn’t smooth sailing. My stubborn drive to keep a perfect 4.0 GPA meant I overloaded myself with pressure, even tackling graduate-level courses like Software Security and Network Security. The stress was relentless. Still, crossing that finish line and graduating felt like my proudest achievement, even if my brain felt like scrambled eggs. And the ceremony? Yeah, I skipped it. I’d earned my Volunteer of Distinction pin, which probably would’ve looked pretty cool on a graduation gown, but pomp and circumstance has just never been my thing. Plus, let’s be real, a university graduation just hits different than high school, right? Much less fuss. Demo of our Neuromorphic Autonomous Car Running the Car in Simulation Friendships &amp; Farewells The more difficult goodbyes weren’t marked by speeches or after-graduation parties. They were silent farewells to colleagues and friends, especially the ones I’d spent countless hours with for my Software Engineering course and our Senior Design Capstone. These were friendships built on shared passions, debugging sessions on Discord, and the mutual understanding of impending deadlines. When the time came to part ways, we didn’t need flowery speeches—just an unspoken good luck on your next adventure. It felt more profound, in a way. The Master’s Degree Pursuing a Master’s wasn’t exactly on my meticulously planned roadmap. The post-pandemic job market was brutal, and grad school offered a kind of stability I just couldn’t ignore. With a solid nudge from family members and professors, and a strong academic record, I took the leap—and thankfully landed a Graduate Teaching Assistantship to help chip away at tuition. But honestly, the transition wasn’t fueled by excitement. It was anxiety. I was itching for hands-on work, for building things, not more math and theory. By the time I finished my Bachelor’s, I was already pretty burnt out, and the Master’s felt less like ambition and more like… well, obligation. A necessary evil, maybe. Stress &amp; Balance Stress pretty much shadowed me through 2023—keeping grades sky-high, navigating the GTA role application, and prepping for grad school. To cope, weirdly enough, I drifted back onto social media. It was a fragmented online landscape then, wasn’t it? I dabbled in Substack, Threads, Bluesky, Mastodon… trying to find a niche that felt right. Substack, unexpectedly, became my personal outlet during that summer. Even if nobody was reading, I loved what I started calling “vibe blogging”—basically, prompting ChatGPT for topic ideas and then spinning my own thoughts and outlines into these fun, low-pressure (and sometimes whimsical) posts. I’d pour out thoughts on programming, linguistics, or just whatever random idea popped into my head. Writing helped untangle the knots in my brain and gave me a rhythm outside the constant push for academic perfection. By fall, though, the weight finally caught up. I felt sluggish, mentally overloaded, just completely stretched thin. The turning point? Finally letting go of that crippling perfectionism. It wasn’t a dramatic epiphany, more like a slow, quiet surrender. And honestly, 2024 greeted me with a significantly lighter, more positive outlook because of it. Blogging &amp; Social Media Blogging was never about building a brand or becoming an “influencer.” It was genuinely just a way to escape. The social media landscape then still felt so… fractured, though. Tech circles were clinging to X (formerly Twitter), science conversations were migrating to Bluesky, writers were nesting on Substack. Different corners, different voices. It definitely wasn’t cohesive, but in a weird way, it felt more real than ever before. Fun fact: I was #62008 on Threads. Managed to snag the APK before launch, even though registration was locked. Reflection Looking back now, two years later, I definitely see 2023 as a character-building year. A year that tested me, stretched me to my limits, and ultimately reminded me that strength comes from facing those hurdles head-on and sometimes taking a small step back, even when you’d rather just curl up in a ball. The biggest lessons I’m carrying forward: Plan ahead, but don’t panic. Wait, isn’t that an advice from The Hitchhiker’s Guide to the Galaxy? Even if grad school isn’t in your immediate sights, dabbling in a graduate course or two before you need to can make a huge difference in how prepared you feel. Roll with the flow. Seriously, don’t obsess over the what ifs. Opportunities rarely come neatly packaged or exactly when you expect them—sometimes you just have to grab them and figure out the rest on the fly. It’s often where the best stuff happens.]]></summary></entry><entry><title type="html">The Fabric of Computing</title><link href="http://willnj.com/blog/The-Fabric-of-Computing/" rel="alternate" type="text/html" title="The Fabric of Computing" /><published>2025-08-30T00:00:00+00:00</published><updated>2025-08-30T00:00:00+00:00</updated><id>http://willnj.com/blog/The-Fabric-of-Computing</id><content type="html" xml:base="http://willnj.com/blog/The-Fabric-of-Computing/"><![CDATA[<p>The Jacquard loom may not be the first thing that comes to mind when you think about modern computing, but it’s more than just a relic of textile history. In fact, the Jacquard loom set the stage for a number of key computing concepts that we still use today, from punch cards to parallel processing. In this post, let’s explore how this weaving machine, invented in 1801, has shaped the way we think about programming and computers.</p>

<h2 id="the-loom-that-programmed-itself">The Loom That Programmed Itself</h2>

<p>When Joseph Marie Jacquard invented the <a href="https://en.wikipedia.org/wiki/Jacquard_machine">Jacquard loom</a>, it wasn’t just a new way to weave fabric. It was a breakthrough in automating complex tasks using a series of punched cards. These cards contained patterns of holes that told the loom exactly what to do next. Each punch card represented an instruction that the machine would follow, making it one of the first programmable machines in history. Sound familiar?</p>

<figure class="post-image">
  
    <img src="https://upload.wikimedia.org/wikipedia/commons/0/09/Jacquard.loom.cards.jpg" data-zoom-src="https://upload.wikimedia.org/wikipedia/commons/0/09/Jacquard.loom.cards.jpg" alt="Punch cards of a Jacquard loom (2004)" width="500px" loading="lazy" />
  

  
    <figcaption>Close-up of punch cards from a Jacquard loom, by George H. Williams (public domain)</figcaption>
  
</figure>

<p>Well, if you’ve ever worked with early computers, you might recognize this concept: <strong>punch cards</strong>. They were the primary method of input for early computer systems and are directly inspired by Jacquard’s loom.</p>

<h2 id="punch-cards-the-dna-of-early-computers">Punch Cards: The DNA of Early Computers</h2>

<p>Before the digital age took off, <a href="https://en.wikipedia.org/wiki/Punched_card">punch cards</a> were used to input instructions into computing machines, from Charles Babbage’s Analytical Engine to IBM’s first computers. Just like the Jacquard loom used punch cards to control the weaving process, early computers used them to store data and commands. This was essentially the beginning of programming.</p>

<p>If you ever sat in school filling in little bubbles on a Scantron test, you’ve already experienced the same principle. Those sheets worked just like punch cards—your answers weren’t read as words or ideas, but as patterns of holes and marks that a machine could process. In both cases, the medium was dumb, but the pattern carried meaning.</p>

<p>Even today, when we use digital languages to program computers, the underlying idea is still the same: we give the machine instructions in a structured way, whether it’s a hole in a card, a filled bubble on a Scantron, or a line of code in a script.</p>

<h3 id="fun-fact-why-do-we-use-words-like-threads">Fun Fact: Why Do We Use Words Like “Threads”?</h3>

<p>If you’ve ever worked with <a href="https://en.wikipedia.org/wiki/Thread_(computing)">multi-threaded programming or parallel computing</a>, you’ve probably encountered the term <strong>“threads.”</strong> In fact, you might have heard it so many times that you didn’t even stop to think about where the term came from. Well, it all goes back to weaving.</p>

<p>In the textile industry, a <strong>thread</strong> is a single strand that weaves through a loom to create a fabric. Similarly, in computing, a <strong>thread</strong> is the smallest unit of execution, working in parallel with other threads to build a program. So when you’re programming a multi-threaded app, you’re essentially “weaving” your program, much like the threads of fabric on a loom.</p>

<p>In modern computing, <strong>multi-threading</strong> allows different parts of a program to run simultaneously, much like how the Jacquard loom could execute multiple threads at once to produce more complex patterns.</p>

<h2 id="warps-and-wefts-the-parallel-processing-connection">Warps and Wefts: The Parallel Processing Connection</h2>

<p>Now, let’s dive a bit deeper into parallel processing. If you’ve ever used a <strong>GPU</strong> (Graphics Processing Unit), you’ve probably heard of <strong>warps</strong>—especially if you’re familiar with <strong>CUDA programming</strong>. A <a href="https://en.wikipedia.org/wiki/Thread_block_(CUDA_programming)">warp</a> is a group of 32 threads that are processed simultaneously by a GPU core. But why is this called a “warp”?</p>

<p>Here’s where it gets interesting: The term <strong>warp</strong> is inspired by the parallel threads used in traditional weaving, specifically the <strong>warp threads</strong>. These are the longitudinal threads that run the length of the fabric, providing the foundation for the weaving process. In the context of computing, <strong>warps</strong> are like these foundational threads—they work together in lockstep to execute tasks simultaneously, weaving a “fabric” of computational results.</p>

<p>So, in essence, just as the Jacquard loom used multiple threads working together in a synchronized pattern, modern processors use <strong>warps</strong> to execute multiple threads in parallel, speeding up computation.</p>

<h2 id="the-jacquard-looms-lasting-impact-on-computing">The Jacquard Loom’s Lasting Impact on Computing</h2>

<p>The Jacquard loom’s punch card system wasn’t just a revolutionary concept in weaving—it laid the groundwork for <strong>modern computing</strong>. Its idea of <strong>programming via a series of instructions</strong> (punch cards) gave birth to the digital punch cards used by Babbage and eventually, the broader computing community. It also influenced how we think about tasks being broken down into small, parallel units—whether those are threads in a program or warps on a GPU.</p>

<p>Even the concepts we use today, such as multi-threading and parallel processing, have their roots in the old textile world. So next time you run a program with multiple threads, remember that you’re not just executing code—you’re weaving a digital fabric, and Jacquard’s loom was one of the first to lay the threads.</p>]]></content><author><name>William</name></author><category term="tech" /><summary type="html"><![CDATA[The Jacquard loom may not be the first thing that comes to mind when you think about modern computing, but it’s more than just a relic of textile history. In fact, the Jacquard loom set the stage for a number of key computing concepts that we still use today, from punch cards to parallel processing. In this post, let’s explore how this weaving machine, invented in 1801, has shaped the way we think about programming and computers. The Loom That Programmed Itself When Joseph Marie Jacquard invented the Jacquard loom, it wasn’t just a new way to weave fabric. It was a breakthrough in automating complex tasks using a series of punched cards. These cards contained patterns of holes that told the loom exactly what to do next. Each punch card represented an instruction that the machine would follow, making it one of the first programmable machines in history. Sound familiar? Close-up of punch cards from a Jacquard loom, by George H. Williams (public domain) Well, if you’ve ever worked with early computers, you might recognize this concept: punch cards. They were the primary method of input for early computer systems and are directly inspired by Jacquard’s loom. Punch Cards: The DNA of Early Computers Before the digital age took off, punch cards were used to input instructions into computing machines, from Charles Babbage’s Analytical Engine to IBM’s first computers. Just like the Jacquard loom used punch cards to control the weaving process, early computers used them to store data and commands. This was essentially the beginning of programming. If you ever sat in school filling in little bubbles on a Scantron test, you’ve already experienced the same principle. Those sheets worked just like punch cards—your answers weren’t read as words or ideas, but as patterns of holes and marks that a machine could process. In both cases, the medium was dumb, but the pattern carried meaning. Even today, when we use digital languages to program computers, the underlying idea is still the same: we give the machine instructions in a structured way, whether it’s a hole in a card, a filled bubble on a Scantron, or a line of code in a script. Fun Fact: Why Do We Use Words Like “Threads”? If you’ve ever worked with multi-threaded programming or parallel computing, you’ve probably encountered the term “threads.” In fact, you might have heard it so many times that you didn’t even stop to think about where the term came from. Well, it all goes back to weaving. In the textile industry, a thread is a single strand that weaves through a loom to create a fabric. Similarly, in computing, a thread is the smallest unit of execution, working in parallel with other threads to build a program. So when you’re programming a multi-threaded app, you’re essentially “weaving” your program, much like the threads of fabric on a loom. In modern computing, multi-threading allows different parts of a program to run simultaneously, much like how the Jacquard loom could execute multiple threads at once to produce more complex patterns. Warps and Wefts: The Parallel Processing Connection Now, let’s dive a bit deeper into parallel processing. If you’ve ever used a GPU (Graphics Processing Unit), you’ve probably heard of warps—especially if you’re familiar with CUDA programming. A warp is a group of 32 threads that are processed simultaneously by a GPU core. But why is this called a “warp”? Here’s where it gets interesting: The term warp is inspired by the parallel threads used in traditional weaving, specifically the warp threads. These are the longitudinal threads that run the length of the fabric, providing the foundation for the weaving process. In the context of computing, warps are like these foundational threads—they work together in lockstep to execute tasks simultaneously, weaving a “fabric” of computational results. So, in essence, just as the Jacquard loom used multiple threads working together in a synchronized pattern, modern processors use warps to execute multiple threads in parallel, speeding up computation. The Jacquard Loom’s Lasting Impact on Computing The Jacquard loom’s punch card system wasn’t just a revolutionary concept in weaving—it laid the groundwork for modern computing. Its idea of programming via a series of instructions (punch cards) gave birth to the digital punch cards used by Babbage and eventually, the broader computing community. It also influenced how we think about tasks being broken down into small, parallel units—whether those are threads in a program or warps on a GPU. Even the concepts we use today, such as multi-threading and parallel processing, have their roots in the old textile world. So next time you run a program with multiple threads, remember that you’re not just executing code—you’re weaving a digital fabric, and Jacquard’s loom was one of the first to lay the threads.]]></summary></entry><entry><title type="html">Do You Really Need a Personal Website?</title><link href="http://willnj.com/blog/Do-You-Really-Need-a-Personal-Website/" rel="alternate" type="text/html" title="Do You Really Need a Personal Website?" /><published>2025-08-29T00:00:00+00:00</published><updated>2025-08-29T00:00:00+00:00</updated><id>http://willnj.com/blog/Do-You-Really-Need-a-Personal-Website</id><content type="html" xml:base="http://willnj.com/blog/Do-You-Really-Need-a-Personal-Website/"><![CDATA[<p>There’s this little field that shows up everywhere: networking events, conference badges, job applications, LinkedIn profiles. “Personal Website.” Most people leave it blank. But maybe they shouldn’t.</p>

<p>In my academic years, I’ve hosted a personal web page through my university’s web server, through Github Pages, and through other third-party vendors, all for free, to showcase academic achievements, but never really considered using my own domain. In this blog, I discuss why you should select your own domain and the benefits.</p>

<h2 id="people-actually-look">People Actually Look</h2>

<p>Here’s what I didn’t expect: people genuinely visit personal websites. I get asked about things I do that there’s simply no room for on a one-page resume. During phone calls, I’ll mention a project or research I’ve written about, and I can hear them clicking around in the background, and they’ll be intrigued to the point that they’ll want to explore more about you. What better place to explore than a personal website?</p>

<p>A website lets you showcase so much more than what fits on a resume. I can write blogs about tech, document projects in detail, add a Projects button that links directly to my Github repos. When someone asks about a specific project, instead of trying to explain it over the phone, I can just say “check out my blog on my site about my current project.”</p>

<p>It’s become this natural extension of my professional presence—a place where there’s actually room to showcase more than meets the surface.</p>

<h2 id="you-dont-need-to-break-the-bank">You Don’t Need to Break the Bank</h2>

<p>The beauty of having a personal website in 2025 is that it doesn’t require server admin skills or a monthly budget.</p>

<p>Sure, you <em>could</em> go the full route—rent a VPS, set up NGINX, configure SSL certificates, and pay monthly fees. You’d get your own IP address, full control, and the satisfaction of running your own server. But for most of us, that’s overkill, and probably outside most recent graduates’ budget.</p>

<p>The simple approach? Buy a domain from GoDaddy (or your registrar of choice) for maybe $15-25 a year, and host it on GitHub Pages for free. You can even use GitHub Pages <strong>without your own domain</strong>, but it’s a bit ugly using a <em>github.io</em> domain name. I used <a href="https://github.com/barryclark/jekyll-now/">Jekyll Now</a> to get this site up and running in about an hour, then heavily customized the code. No monthly fees, no server management, no headaches.</p>

<h2 id="beyond-just-a-website">Beyond Just a Website</h2>

<p>Once you have your own domain, a whole world of possibilities opens up. Your registrar may recommend an Outlook subscription, but you could instead use other providers such as Zoho Mail for free to send and receive email from <strong>your own domain</strong>.</p>

<p>You can use your domain as your Bluesky username, making your social media presence more professional and memorable. Some services even let you connect your domain to other platforms, creating a cohesive online identity that’s entirely under your control.</p>

<p>It’s like having your own little corner of the Internet that grows with you.</p>

<h2 id="its-your-digital-business-card">It’s Your Digital Business Card</h2>

<p>Think of it as professional presence in the modern world. When you meet someone at a conference or get introduced through a mutual connection, having a website gives them somewhere to go to learn more about you. You’re not just a candidate like every other candidate, but a thumb that truly sticks out.</p>

<p>And your website doesn’t need to be fancy. A clean layout with some information about you (even fun things like your hobbies), and maybe a blog where you write about things you’re learning or problems you’ve solved, can really make you stand out. The key is that it exists and represents YOU.</p>

<h2 id="the-creative-outlet">The Creative Outlet</h2>

<p>Having a personal website is genuinely fun.</p>

<p>I’m not going to build the next Facebook or create some mega-million dollar web application with a complex backend. But I can experiment with this site. I can write blog posts (like this one), tweak the design, add new features, and just… play around.</p>

<p>If I want to spend an evening just improving something small—maybe the way links look when you hover over them, or adding a new section to showcase a project, then I can do just that. It’s rewarding in its own way. Below are some fun examples to improve this blog.</p>

<h3 id="code-block">Code Block</h3>

<p>I can create a fancy-looking code block.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
</pre></td><td class="rouge-code"><pre><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">R"(
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⡀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⠙⠻⢶⣄⡀⠀⠀⠀⢀⣤⠶⠛⠛⡇⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⣇⠀⠀⣙⣿⣦⣤⣴⣿⣁⠀⠀⣸⠇⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⣡⣾⣿⣿⣿⣿⣿⣿⣿⣷⣌⠋⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣴⣿⣷⣄⡈⢻⣿⡟⢁⣠⣾⣿⣦⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⣿⣿⣿⣿⠘⣿⠃⣿⣿⣿⣿⡏⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⠀⠈⠛⣰⠿⣆⠛⠁⠀⡀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣼⣿⣦⠀⠘⠛⠋⠀⣴⣿⠁⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⣶⣾⣿⣿⣿⣿⡇⠀⠀⠀⢸⣿⣏⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⣠⣶⣿⣿⣿⣿⣿⣿⣿⣿⠿⠿⠀⠀⠀⠾⢿⣿⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⣠⣿⣿⣿⣿⣿⣿⡿⠟⠋⣁⣠⣤⣤⡶⠶⠶⣤⣄⠈⠀⠀⠀⠀⠀⠀
⠀⠀⠀⢰⣿⣿⣮⣉⣉⣉⣤⣴⣶⣿⣿⣋⡥⠄⠀⠀⠀⠀⠉⢻⣄⠀⠀⠀⠀⠀
⠀⠀⠀⠸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣟⣋⣁⣤⣀⣀⣤⣤⣤⣤⣄⣿⡄⠀⠀⠀⠀
⠀⠀⠀⠀⠙⠿⣿⣿⣿⣿⣿⣿⣿⡿⠿⠛⠋⠉⠁⠀⠀⠀⠀⠈⠛⠃⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠉⠉⠉⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
    )"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Here’s some C code that calculates two numbers:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre></td><td class="rouge-code"><pre><span class="c1">// math.c</span>
<span class="c1">// Obfuscated C code that does maths</span>
<span class="o">%:</span><span class="n">include</span> <span class="o">&lt;</span><span class="n">stdio</span><span class="p">.</span><span class="n">h</span><span class="o">&gt;</span>
<span class="o">%:</span><span class="n">include</span> <span class="o">&lt;</span><span class="n">stdlib</span><span class="p">.</span><span class="n">h</span><span class="o">&gt;</span>
<span class="o">%:</span><span class="n">define</span> <span class="n">V</span> <span class="kt">void</span>
<span class="o">%:</span><span class="n">define</span> <span class="n">I</span> <span class="kt">int</span>
<span class="o">%:</span><span class="n">define</span> <span class="n">U</span> <span class="kt">unsigned</span> <span class="n">I</span>
<span class="o">%:</span><span class="n">define</span> <span class="n">S</span> <span class="kt">char</span><span class="o">*</span>
<span class="o">%:</span><span class="n">define</span> <span class="n">Z</span> <span class="mh">0XF</span>
<span class="o">%:</span><span class="n">define</span> <span class="n">M</span> <span class="o">~</span><span class="p">(</span><span class="mh">0X1</span><span class="o">&lt;&lt;</span><span class="mh">0X1F</span><span class="p">)</span>
<span class="o">%:</span><span class="n">define</span> <span class="n">N</span> <span class="n">__FUNCTION__</span>
<span class="o">%:</span><span class="n">define</span> <span class="n">F</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span> <span class="p">(</span><span class="n">printf</span><span class="p">(</span><span class="s">"%-5s(%d, %d): "</span><span class="p">,</span> <span class="n">N</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">))</span>
<span class="o">%:</span><span class="n">define</span> <span class="n">G</span><span class="p">(</span><span class="n">p</span><span class="p">)</span> <span class="p">(</span><span class="k">sizeof</span><span class="p">(</span><span class="n">p</span><span class="p">)</span><span class="o">/</span><span class="k">sizeof</span><span class="p">(</span><span class="o">*</span><span class="n">p</span><span class="p">))</span>
<span class="o">%:</span><span class="n">define</span> <span class="n">A</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="n">atoi</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
<span class="o">%:</span><span class="n">define</span> <span class="n">ERR</span> <span class="n">stderr</span>
<span class="o">%:</span><span class="n">define</span> <span class="n">E</span><span class="p">(</span><span class="n">m</span><span class="p">)</span> <span class="p">(</span><span class="n">fprintf</span><span class="p">(</span><span class="n">ERR</span><span class="p">,</span> <span class="s">"%s: %s"</span><span class="p">,</span> <span class="n">N</span><span class="p">,</span> <span class="n">m</span><span class="p">))</span>
<span class="o">%:</span><span class="n">define</span> <span class="n">R</span> <span class="k">return</span>
<span class="o">%:</span><span class="n">define</span> <span class="n">W</span> <span class="k">while</span>
<span class="o">%:</span><span class="n">define</span> <span class="n">C</span> <span class="k">if</span>

<span class="n">S</span> <span class="n">B</span> <span class="o">=</span> <span class="s">"</span><span class="se">\x45\x78\x70\x65\x63\x74\x65\x64\x20\x74\x77\x6F\x20\x61\x72\x67\x75\x6D\x65\x6E\x74\x73\x2E\x0A</span><span class="s">"</span><span class="p">;</span> <span class="n">I</span> <span class="nf">ADD</span><span class="p">(</span><span class="n">I</span> <span class="n">x</span><span class="p">,</span> <span class="n">I</span> <span class="n">y</span><span class="p">)</span> <span class="o">&lt;%</span> <span class="n">F</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">);</span> <span class="n">U</span> <span class="n">t</span><span class="p">;</span> <span class="n">W</span><span class="p">(</span><span class="n">y</span><span class="p">)</span> <span class="o">&lt;%</span> <span class="n">t</span><span class="o">=</span><span class="n">x</span><span class="o">&amp;</span><span class="n">y</span><span class="p">;</span> <span class="n">x</span><span class="o">^=</span><span class="n">y</span><span class="p">;</span> <span class="n">y</span><span class="o">=</span><span class="n">t</span><span class="o">&lt;&lt;</span><span class="mi">1</span><span class="p">;</span> <span class="o">%&gt;</span> <span class="n">R</span><span class="p">(</span><span class="n">I</span><span class="p">)</span><span class="n">x</span><span class="p">;</span> <span class="o">%&gt;</span> <span class="n">I</span> <span class="nf">SUB</span><span class="p">(</span><span class="n">I</span> <span class="n">x</span><span class="p">,</span> <span class="n">I</span> <span class="n">y</span><span class="p">)</span> <span class="o">&lt;%</span> <span class="n">F</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">);</span> <span class="n">I</span> <span class="n">t</span><span class="p">;</span> <span class="n">W</span><span class="p">(</span><span class="n">y</span><span class="p">)</span> <span class="o">&lt;%</span> <span class="n">t</span><span class="o">=</span><span class="p">(</span><span class="o">~</span><span class="n">x</span><span class="p">)</span><span class="o">&amp;</span><span class="n">y</span><span class="p">;</span> <span class="n">x</span><span class="o">^=</span><span class="n">y</span><span class="p">;</span> <span class="n">y</span><span class="o">=</span><span class="n">t</span><span class="o">&lt;&lt;</span><span class="mi">1</span><span class="p">;</span> <span class="o">%&gt;</span> <span class="n">R</span><span class="p">(</span><span class="n">I</span><span class="p">)</span><span class="n">x</span><span class="p">;</span> <span class="o">%&gt;</span> <span class="n">I</span> <span class="nf">MULT</span><span class="p">(</span><span class="n">I</span> <span class="n">x</span><span class="p">,</span> <span class="n">I</span> <span class="n">y</span><span class="p">)</span> <span class="o">&lt;%</span> <span class="n">F</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">);</span> <span class="n">I</span> <span class="n">t</span> <span class="o">=</span> <span class="n">y</span><span class="o">^</span><span class="n">y</span><span class="p">;</span> <span class="n">W</span><span class="p">(</span><span class="n">y</span><span class="o">--</span><span class="p">)</span> <span class="o">&lt;%</span> <span class="n">t</span><span class="o">+=</span><span class="n">x</span><span class="p">;</span> <span class="o">%&gt;</span> <span class="n">R</span><span class="p">(</span><span class="n">I</span><span class="p">)</span><span class="n">t</span><span class="p">;</span> <span class="o">%&gt;</span> <span class="n">I</span> <span class="nf">IDIV</span><span class="p">(</span><span class="n">I</span> <span class="n">x</span><span class="p">,</span> <span class="n">I</span> <span class="n">y</span><span class="p">)</span> <span class="o">&lt;%</span> <span class="n">F</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">);</span> <span class="n">C</span><span class="p">(</span><span class="o">!</span><span class="n">y</span><span class="p">)</span> <span class="n">R</span><span class="p">(</span><span class="n">I</span><span class="p">)</span><span class="n">M</span><span class="p">;</span> <span class="n">I</span> <span class="n">t</span> <span class="o">=</span> <span class="n">y</span><span class="o">^</span><span class="n">y</span><span class="p">;</span> <span class="n">W</span><span class="p">(</span><span class="o">++</span><span class="n">t</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">x</span><span class="o">-=</span><span class="n">y</span><span class="p">)</span><span class="o">&gt;=</span><span class="n">y</span><span class="p">);</span> <span class="n">R</span><span class="p">(</span><span class="n">I</span><span class="p">)</span><span class="n">t</span><span class="p">;</span> <span class="o">%&gt;</span> <span class="n">I</span> <span class="nf">Q</span><span class="p">(</span><span class="n">I</span> <span class="n">i</span><span class="p">,</span> <span class="n">I</span> <span class="n">j</span><span class="p">)</span> <span class="o">&lt;%</span> <span class="n">W</span><span class="p">(</span><span class="n">i</span><span class="o">--</span> <span class="o">&amp;&amp;</span> <span class="o">--</span><span class="n">j</span><span class="p">);</span> <span class="n">R</span><span class="o">!</span><span class="p">(</span><span class="n">i</span> <span class="o">||</span> <span class="n">j</span><span class="o">--</span><span class="p">);</span> <span class="o">%&gt;</span> <span class="n">V</span> <span class="n">v</span><span class="p">(</span><span class="n">I</span> <span class="n">x</span><span class="p">,</span> <span class="n">I</span> <span class="n">y</span><span class="p">,</span> <span class="n">I</span> <span class="p">(</span><span class="o">*</span><span class="n">p</span><span class="o">&lt;::&gt;</span><span class="p">)(),</span> <span class="n">U</span> <span class="n">fs</span><span class="p">)</span> <span class="o">&lt;%</span> <span class="n">I</span> <span class="n">i</span> <span class="o">=</span> <span class="n">Z</span><span class="o">^</span><span class="n">Z</span><span class="p">;</span> <span class="n">W</span><span class="p">(</span><span class="n">i</span> <span class="o">&lt;</span> <span class="n">fs</span><span class="p">)</span> <span class="n">printf</span><span class="p">(</span><span class="s">"%i</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">p</span><span class="o">&lt;:</span><span class="n">i</span><span class="o">++:&gt;</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">));</span> <span class="o">%&gt;</span> <span class="n">V</span> <span class="n">main</span><span class="p">(</span><span class="n">I</span> <span class="n">i</span><span class="p">,</span> <span class="n">S</span> <span class="n">s</span><span class="o">&lt;::&gt;</span><span class="p">)</span> <span class="o">&lt;%</span> <span class="n">I</span> <span class="p">(</span><span class="o">*</span><span class="n">p</span><span class="o">&lt;::&gt;</span><span class="p">)()</span> <span class="o">=</span> <span class="o">&lt;%</span> <span class="n">ADD</span><span class="p">,</span> <span class="n">SUB</span><span class="p">,</span> <span class="n">MULT</span><span class="p">,</span> <span class="n">IDIV</span> <span class="o">%&gt;</span><span class="p">;</span> <span class="n">U</span> <span class="n">fs</span> <span class="o">=</span> <span class="n">G</span><span class="p">(</span><span class="n">p</span><span class="p">);</span> <span class="n">Q</span><span class="p">(</span><span class="n">i</span><span class="p">,(</span><span class="n">Z</span><span class="o">^</span><span class="mh">0XC</span><span class="p">))</span> <span class="o">?</span> <span class="n">v</span><span class="p">(</span><span class="n">A</span><span class="p">(</span><span class="n">s</span><span class="o">&lt;:</span><span class="n">Z</span><span class="o">^</span><span class="mh">0XE</span><span class="o">:&gt;</span><span class="p">),</span> <span class="n">A</span><span class="p">(</span><span class="n">s</span><span class="o">&lt;:</span><span class="n">Z</span><span class="o">^</span><span class="mh">0XD</span><span class="o">:&gt;</span><span class="p">),</span> <span class="n">p</span><span class="p">,</span> <span class="n">fs</span><span class="p">)</span> <span class="o">:</span> <span class="n">E</span><span class="p">(</span><span class="n">B</span><span class="p">);</span> <span class="o">%&gt;</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>I can make it look like I’m executing the program from a terminal window:</p>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre><span class="o">&gt;</span> ./math 6 3
ADD  <span class="o">(</span>6, 3<span class="o">)</span>: 9
SUB  <span class="o">(</span>6, 3<span class="o">)</span>: 3
MULT <span class="o">(</span>6, 3<span class="o">)</span>: 18
IDIV <span class="o">(</span>6, 3<span class="o">)</span>: 2
</pre></td></tr></tbody></table></code></pre></div></div>

<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
</pre></td><td class="rouge-code"><pre><span class="n">PS</span><span class="w"> </span><span class="nx">C:\Users\William\Playground</span><span class="err">&gt;</span><span class="w"> </span><span class="o">.</span><span class="nx">/math</span><span class="w"> </span><span class="nx">6</span><span class="w"> </span><span class="nx">3</span><span class="w">
</span><span class="n">ADD</span><span class="w">  </span><span class="p">(</span><span class="mi">6</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">):</span><span class="w"> </span><span class="mi">9</span><span class="w">
</span><span class="n">SUB</span><span class="w">  </span><span class="p">(</span><span class="mi">6</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">):</span><span class="w"> </span><span class="mi">3</span><span class="w">
</span><span class="n">MULT</span><span class="w"> </span><span class="p">(</span><span class="mi">6</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">):</span><span class="w"> </span><span class="mi">18</span><span class="w">
</span><span class="n">IDIV</span><span class="w"> </span><span class="p">(</span><span class="mi">6</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">):</span><span class="w"> </span><span class="mi">2</span><span class="w">
</span><span class="n">PS</span><span class="w"> </span><span class="nx">C:\Users\William\Playground</span><span class="err">&gt;</span><span class="w"> 
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>Or just display the shell output like this:</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
</pre></td><td class="rouge-code"><pre><span class="gp">root@willnj:~$</span><span class="w"> </span>./math 6 3
<span class="go">ADD  (6, 3): 9
SUB  (6, 3): 3
MULT (6, 3): 18
IDIV (6, 3): 2
</span><span class="gp">root@willnj:~$</span><span class="w"> 
</span></pre></td></tr></tbody></table></code></pre></div></div>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre><span class="o">&gt;</span> ./math 6 3
ADD  <span class="o">(</span>6, 3<span class="o">)</span>: 9
SUB  <span class="o">(</span>6, 3<span class="o">)</span>: 3
MULT <span class="o">(</span>6, 3<span class="o">)</span>: 18
IDIV <span class="o">(</span>6, 3<span class="o">)</span>: 2
</pre></td></tr></tbody></table></code></pre></div></div>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre><span class="o">&gt;</span> ./math 6 3
ADD  <span class="o">(</span>6, 3<span class="o">)</span>: 9
SUB  <span class="o">(</span>6, 3<span class="o">)</span>: 3
MULT <span class="o">(</span>6, 3<span class="o">)</span>: 18
IDIV <span class="o">(</span>6, 3<span class="o">)</span>: 2
</pre></td></tr></tbody></table></code></pre></div></div>

<div class="language-zsh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre><span class="o">&gt;</span> ./math 6 3
ADD  <span class="o">(</span>6, 3<span class="o">)</span>: 9
SUB  <span class="o">(</span>6, 3<span class="o">)</span>: 3
MULT <span class="o">(</span>6, 3<span class="o">)</span>: 18
IDIV <span class="o">(</span>6, 3<span class="o">)</span>: 2
</pre></td></tr></tbody></table></code></pre></div></div>

<p>I can also display a directory structure without having to handtype the pipe symbols.</p>

<pre><code class="language-tree">/(root)
 bin
  etc
   shadow
  dev
  lib
  home
   john
   jacob
   jingleheimer
   schmidt
</code></pre>

<h3 id="call-to-action-buttons">Call to Action Buttons</h3>

<p>I can even have buttons which can say things like “Donate” or “Subscribe” or whatever I want.</p>

<div class="cta-container">
  <a href="https://example.com/action" class="cta-button primary">
    Call to Action Example 1
  </a>
</div>

<div class="cta-container">
  <a href="https://example.com/action" class="cta-button secondary">
    Call to Action Example 2
  </a>
</div>

<h3 id="tables">Tables</h3>

<p>And here’s a table for different data types in C.</p>

<table class="pretty">
  <thead>
    <tr>
      <th style="text-align: left">Type</th>
      <th style="text-align: center">Size</th>
      <th style="text-align: right">Example</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">int</td>
      <td style="text-align: center">4</td>
      <td style="text-align: right">42</td>
    </tr>
    <tr>
      <td style="text-align: left">float</td>
      <td style="text-align: center">4</td>
      <td style="text-align: right">3.14</td>
    </tr>
    <tr>
      <td style="text-align: left">double</td>
      <td style="text-align: center">8</td>
      <td style="text-align: right">3.14159</td>
    </tr>
  </tbody>
</table>

<h3 id="prompts">Prompts</h3>

<p>If I’m writing a tutorial, I can add these prompts to visually alert the reader.</p>

<div class="prompt prompt-tip">
  <div class="prompt-icon">
    
        <i class="fa-solid fa-lightbulb"></i>
      
  </div>
  <div class="prompt-text">
    <p><strong>Tip:</strong> When using this feature, remember to always save your work frequently. This will prevent any data loss in case of unexpected errors. You can also use keyboard shortcuts like <strong>Ctrl+S</strong> or <strong>Cmd+S</strong> to quickly save. For more detailed instructions, check out <a href="https://example.com/docs">our documentation</a>.</p>

  </div>
</div>

<div class="prompt prompt-info">
  <div class="prompt-icon">
    
        <i class="fa-solid fa-info-circle"></i>
      
  </div>
  <div class="prompt-text">
    <p><strong>Info:</strong> The system has been updated to include new functionality for managing your tasks. You can now filter by due date, priority, and project, and even save custom views for future use. Remember to refresh the page after making changes to see the latest updates. If you’re unfamiliar with the new layout, hover over the info icons for helpful tooltips.</p>

  </div>
</div>

<div class="prompt prompt-danger">
  <div class="prompt-icon">
    
        <i class="fa-solid fa-triangle-exclamation"></i>
      
  </div>
  <div class="prompt-text">
    <p><strong>Warning:</strong> Deleting this item is permanent and cannot be undone. Make sure you have backed up any important data before proceeding. Double-check the item name and details before confirming the deletion. Misclicks can cause serious issues, so proceed with caution. If you’re unsure, consult the <a href="https://example.com/support">support guide</a> or contact the admin.</p>

  </div>
</div>

<h2 id="famous-people">Famous People</h2>

<p>Here are some famous people in tech.</p>

<div class="card-marquee" id="card-marquee-default">
  <div class="card-marquee-track" data-card-width="335">
    
    <a href="https://github.com/torvalds/linux" class="card-marquee-item" target="_blank" rel="noopener noreferrer">
      
      <div class="card-marquee-thumb">
        <img src="https://upload.wikimedia.org/wikipedia/commons/e/e8/Lc3_2018_%28263682303%29_%28cropped%29.jpeg" alt="Linus Torvalds" />
      </div>
      
      <div class="card-marquee-content">
        
        <h4 class="card-marquee-name">Linus Torvalds</h4>
        
        
        <p class="card-marquee-label">Developer</p>
        
        
        <p class="card-marquee-description">Creator of Linux and Git</p>
        
      </div>
    </a>
    
    <a href="https://openai.com" class="card-marquee-item" target="_blank" rel="noopener noreferrer">
      
      <div class="card-marquee-thumb">
        <img src="https://upload.wikimedia.org/wikipedia/commons/a/a2/Sam_Altman_TechCrunch_SF_2019_Day_2_Oct_3_%28cropped%29.jpg" alt="Sam Altman" />
      </div>
      
      <div class="card-marquee-content">
        
        <h4 class="card-marquee-name">Sam Altman</h4>
        
        
        <p class="card-marquee-label">Entrepreneur</p>
        
        
        <p class="card-marquee-description">CEO of OpenAI</p>
        
      </div>
    </a>
    
    <a href="https://karpathy.ai" class="card-marquee-item" target="_blank" rel="noopener noreferrer">
      
      <div class="card-marquee-thumb">
        <img src="https://upload.wikimedia.org/wikipedia/commons/c/c0/Andrej_Karpathy%2C_OpenAI.png" alt="Andrej Karpathy" />
      </div>
      
      <div class="card-marquee-content">
        
        <h4 class="card-marquee-name">Andrej Karpathy</h4>
        
        
        <p class="card-marquee-label">AI Researcher</p>
        
        
        <p class="card-marquee-description">Former Tesla AI Director</p>
        
      </div>
    </a>
    
    <a href="https://www.python.org" class="card-marquee-item" target="_blank" rel="noopener noreferrer">
      
      <div class="card-marquee-thumb">
        <img src="https://upload.wikimedia.org/wikipedia/commons/6/6b/Guido_van_Rossum_in_PyConUS24_%28cropped%29.jpg" alt="Guido van Rossum" />
      </div>
      
      <div class="card-marquee-content">
        
        <h4 class="card-marquee-name">Guido van Rossum</h4>
        
        
        <p class="card-marquee-label">Developer</p>
        
        
        <p class="card-marquee-description">Creator of Python</p>
        
      </div>
    </a>
    
    <a href="https://www.apple.com" class="card-marquee-item" target="_blank" rel="noopener noreferrer">
      
      <div class="card-marquee-thumb">
        <img src="https://upload.wikimedia.org/wikipedia/commons/d/dc/Steve_Jobs_Headshot_2010-CROP_%28cropped_2%29.jpg" alt="Steve Jobs" />
      </div>
      
      <div class="card-marquee-content">
        
        <h4 class="card-marquee-name">Steve Jobs</h4>
        
        
        <p class="card-marquee-label">Entrepreneur</p>
        
        
        <p class="card-marquee-description">Co-founder of Apple</p>
        
      </div>
    </a>
    
    <a href="https://en.wikipedia.org/wiki/Ada_Lovelace" class="card-marquee-item" target="_blank" rel="noopener noreferrer">
      
      <div class="card-marquee-thumb">
        <img src="https://upload.wikimedia.org/wikipedia/commons/4/4c/Ada_Lovelace_daguerreotype_by_Antoine_Claudet_1843_-_cropped.png" alt="Ada Lovelace" />
      </div>
      
      <div class="card-marquee-content">
        
        <h4 class="card-marquee-name">Ada Lovelace</h4>
        
        
        <p class="card-marquee-label">Mathematician</p>
        
        
        <p class="card-marquee-description">First computer programmer</p>
        
      </div>
    </a>
    
  </div>
</div>

<script>
(function() {
  const marquees = document.querySelectorAll('.card-marquee');
  
  marquees.forEach(function(marquee) {
    const track = marquee.querySelector('.card-marquee-track');
    
    // Get original cards BEFORE cloning
    const originalCards = Array.from(track.querySelectorAll('.card-marquee-item'));
    const originalCount = originalCards.length;
    
    if (originalCount === 0) return;
    
    // Clone the original set exactly ONCE
    originalCards.forEach(function(card) {
      const clone = card.cloneNode(true);
      track.appendChild(clone);
    });
    
    // Force reflow to ensure everything is rendered
    void track.offsetWidth;
    
    // MEASURE the actual rendered width of the first set
    const firstCard = originalCards[0];
    const lastCard = originalCards[originalCount - 1];
    
    const firstCardLeft = firstCard.offsetLeft;
    const lastCardRight = lastCard.offsetLeft + lastCard.offsetWidth;
    
    const computedStyle = window.getComputedStyle(track);
    const gap = parseFloat(computedStyle.gap) || 24;
    const singleSetWidth = (lastCardRight - firstCardLeft) + gap;
    
    track.style.setProperty('--scroll-width', '-' + singleSetWidth + 'px');
    
    const animationDuration = (singleSetWidth / 200).toFixed(1);
    
    track.style.animation = 'scroll-left ' + animationDuration + 's linear infinite';
  });
})();
</script>

<h2 id="talk-about-your-project">Talk About Your Project</h2>

<p>You can highlight all of the features of the project you’re shipping.</p>

<div class="features-list">
  
  <div class="feature-card feature-card-blue">
    <div class="feature-card-i">
      <i class="fa-solid fa-gauge-high"></i>
    </div>
    <div class="feature-card-content">
      <h3 class="feature-card-title">Powerful Core Dashboard</h3>
      <p class="feature-card-description">A unified control center to manage projects, users, analytics, and settings.</p>
    </div>
  </div>
  
  <div class="feature-card feature-card-green">
    <div class="feature-card-i">
      <i class="fa-solid fa-users"></i>
    </div>
    <div class="feature-card-content">
      <h3 class="feature-card-title">Seamless Team Collaboration</h3>
      <p class="feature-card-description">Share projects, leave comments, and track changes in real time so your entire team stays aligned and productive.</p>
    </div>
  </div>
  
  <div class="feature-card feature-card-yellow">
    <div class="feature-card-i">
      <i class="fa-solid fa-bolt"></i>
    </div>
    <div class="feature-card-content">
      <h3 class="feature-card-title">Lightning-Fast Performance</h3>
      <p class="feature-card-description">Optimized rendering and smart caching ensure your data loads instantly, even with thousands of records.</p>
    </div>
  </div>
  
  <div class="feature-card feature-card-red">
    <div class="feature-card-i">
      <i class="fa-solid fa-heart"></i>
    </div>
    <div class="feature-card-content">
      <h3 class="feature-card-title">Support Us</h3>
      <p class="feature-card-description">Donations can be received anytime at <a href="https://example.com" target="_blank">example.com</a>.</p>
    </div>
  </div>
  
</div>

<h3 id="add-badges">Add Badges</h3>

<p>Include a list of badges.</p>

<p><span class="badge"><i class="fa-brands fa-windows"></i>Windows
      </span><span class="badge"><i class="fa-brands fa-apple"></i>MacOS
      </span><span class="badge"><i class="fa-brands fa-linux"></i>Linux
      </span></p>

<h2 id="getting-started">Getting Started</h2>

<p>Maybe you’re a student who’s stumbled across my blog, or someone who’s genuinely interested in having a personal website. Well, here’s my simple path explained:</p>

<ol>
  <li><strong>Buy a domain</strong> - GoDaddy, Namecheap, wherever. Pick something simple and professional.</li>
  <li><strong>Fork Jekyll Now</strong> - It’s a GitHub repository that sets up a blog in minutes.</li>
  <li><strong>Enable GitHub Pages</strong> - Free hosting, automatic deployments.</li>
  <li><strong>Set up extras</strong> - Custom email with Zoho Mail, use your domain for Bluesky, etc.</li>
  <li><strong>Customize gradually</strong> - Start simple, improve over time.</li>
</ol>

<p>That’s it. You’ll have a website that costs you maybe $15-25 a year and takes an evening to set up. Not bad for having a professional presence that’s entirely your own.</p>

<p>Trust me, your future self will thank you for taking that small step.</p>]]></content><author><name>William</name></author><category term="tech" /><category term="life" /><summary type="html"><![CDATA[There’s this little field that shows up everywhere: networking events, conference badges, job applications, LinkedIn profiles. “Personal Website.” Most people leave it blank. But maybe they shouldn’t. In my academic years, I’ve hosted a personal web page through my university’s web server, through Github Pages, and through other third-party vendors, all for free, to showcase academic achievements, but never really considered using my own domain. In this blog, I discuss why you should select your own domain and the benefits. People Actually Look Here’s what I didn’t expect: people genuinely visit personal websites. I get asked about things I do that there’s simply no room for on a one-page resume. During phone calls, I’ll mention a project or research I’ve written about, and I can hear them clicking around in the background, and they’ll be intrigued to the point that they’ll want to explore more about you. What better place to explore than a personal website? A website lets you showcase so much more than what fits on a resume. I can write blogs about tech, document projects in detail, add a Projects button that links directly to my Github repos. When someone asks about a specific project, instead of trying to explain it over the phone, I can just say “check out my blog on my site about my current project.” It’s become this natural extension of my professional presence—a place where there’s actually room to showcase more than meets the surface. You Don’t Need to Break the Bank The beauty of having a personal website in 2025 is that it doesn’t require server admin skills or a monthly budget. Sure, you could go the full route—rent a VPS, set up NGINX, configure SSL certificates, and pay monthly fees. You’d get your own IP address, full control, and the satisfaction of running your own server. But for most of us, that’s overkill, and probably outside most recent graduates’ budget. The simple approach? Buy a domain from GoDaddy (or your registrar of choice) for maybe $15-25 a year, and host it on GitHub Pages for free. You can even use GitHub Pages without your own domain, but it’s a bit ugly using a github.io domain name. I used Jekyll Now to get this site up and running in about an hour, then heavily customized the code. No monthly fees, no server management, no headaches. Beyond Just a Website Once you have your own domain, a whole world of possibilities opens up. Your registrar may recommend an Outlook subscription, but you could instead use other providers such as Zoho Mail for free to send and receive email from your own domain. You can use your domain as your Bluesky username, making your social media presence more professional and memorable. Some services even let you connect your domain to other platforms, creating a cohesive online identity that’s entirely under your control. It’s like having your own little corner of the Internet that grows with you. It’s Your Digital Business Card Think of it as professional presence in the modern world. When you meet someone at a conference or get introduced through a mutual connection, having a website gives them somewhere to go to learn more about you. You’re not just a candidate like every other candidate, but a thumb that truly sticks out. And your website doesn’t need to be fancy. A clean layout with some information about you (even fun things like your hobbies), and maybe a blog where you write about things you’re learning or problems you’ve solved, can really make you stand out. The key is that it exists and represents YOU. The Creative Outlet Having a personal website is genuinely fun. I’m not going to build the next Facebook or create some mega-million dollar web application with a complex backend. But I can experiment with this site. I can write blog posts (like this one), tweak the design, add new features, and just… play around. If I want to spend an evening just improving something small—maybe the way links look when you hover over them, or adding a new section to showcase a project, then I can do just that. It’s rewarding in its own way. Below are some fun examples to improve this blog. Code Block I can create a fancy-looking code block. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #include &lt;iostream&gt; int main() { std::cout &lt;&lt; R"( ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⡀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⠙⠻⢶⣄⡀⠀⠀⠀⢀⣤⠶⠛⠛⡇⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⣇⠀⠀⣙⣿⣦⣤⣴⣿⣁⠀⠀⣸⠇⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⣡⣾⣿⣿⣿⣿⣿⣿⣿⣷⣌⠋⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣴⣿⣷⣄⡈⢻⣿⡟⢁⣠⣾⣿⣦⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⣿⣿⣿⣿⠘⣿⠃⣿⣿⣿⣿⡏⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⠀⠈⠛⣰⠿⣆⠛⠁⠀⡀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣼⣿⣦⠀⠘⠛⠋⠀⣴⣿⠁⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⣶⣾⣿⣿⣿⣿⡇⠀⠀⠀⢸⣿⣏⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⣠⣶⣿⣿⣿⣿⣿⣿⣿⣿⠿⠿⠀⠀⠀⠾⢿⣿⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⣠⣿⣿⣿⣿⣿⣿⡿⠟⠋⣁⣠⣤⣤⡶⠶⠶⣤⣄⠈⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⢰⣿⣿⣮⣉⣉⣉⣤⣴⣶⣿⣿⣋⡥⠄⠀⠀⠀⠀⠉⢻⣄⠀⠀⠀⠀⠀ ⠀⠀⠀⠸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣟⣋⣁⣤⣀⣀⣤⣤⣤⣤⣄⣿⡄⠀⠀⠀⠀ ⠀⠀⠀⠀⠙⠿⣿⣿⣿⣿⣿⣿⣿⡿⠿⠛⠋⠉⠁⠀⠀⠀⠀⠈⠛⠃⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠉⠉⠉⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ )" &lt;&lt; std::endl; return 0; } Here’s some C code that calculates two numbers: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 // math.c // Obfuscated C code that does maths %:include &lt;stdio.h&gt; %:include &lt;stdlib.h&gt; %:define V void %:define I int %:define U unsigned I %:define S char* %:define Z 0XF %:define M ~(0X1&lt;&lt;0X1F) %:define N __FUNCTION__ %:define F(x, y) (printf("%-5s(%d, %d): ", N, x, y)) %:define G(p) (sizeof(p)/sizeof(*p)) %:define A(s) atoi(s) %:define ERR stderr %:define E(m) (fprintf(ERR, "%s: %s", N, m)) %:define R return %:define W while %:define C if S B = "\x45\x78\x70\x65\x63\x74\x65\x64\x20\x74\x77\x6F\x20\x61\x72\x67\x75\x6D\x65\x6E\x74\x73\x2E\x0A"; I ADD(I x, I y) &lt;% F(x, y); U t; W(y) &lt;% t=x&amp;y; x^=y; y=t&lt;&lt;1; %&gt; R(I)x; %&gt; I SUB(I x, I y) &lt;% F(x, y); I t; W(y) &lt;% t=(~x)&amp;y; x^=y; y=t&lt;&lt;1; %&gt; R(I)x; %&gt; I MULT(I x, I y) &lt;% F(x, y); I t = y^y; W(y--) &lt;% t+=x; %&gt; R(I)t; %&gt; I IDIV(I x, I y) &lt;% F(x, y); C(!y) R(I)M; I t = y^y; W(++t &amp;&amp; (x-=y)&gt;=y); R(I)t; %&gt; I Q(I i, I j) &lt;% W(i-- &amp;&amp; --j); R!(i || j--); %&gt; V v(I x, I y, I (*p&lt;::&gt;)(), U fs) &lt;% I i = Z^Z; W(i &lt; fs) printf("%i\n", p&lt;:i++:&gt;(x, y)); %&gt; V main(I i, S s&lt;::&gt;) &lt;% I (*p&lt;::&gt;)() = &lt;% ADD, SUB, MULT, IDIV %&gt;; U fs = G(p); Q(i,(Z^0XC)) ? v(A(s&lt;:Z^0XE:&gt;), A(s&lt;:Z^0XD:&gt;), p, fs) : E(B); %&gt; I can make it look like I’m executing the program from a terminal window: 1 2 3 4 5 &gt; ./math 6 3 ADD (6, 3): 9 SUB (6, 3): 3 MULT (6, 3): 18 IDIV (6, 3): 2 1 2 3 4 5 6 PS C:\Users\William\Playground&gt; ./math 6 3 ADD (6, 3): 9 SUB (6, 3): 3 MULT (6, 3): 18 IDIV (6, 3): 2 PS C:\Users\William\Playground&gt; Or just display the shell output like this: 1 2 3 4 5 6 root@willnj:~$ ./math 6 3 ADD (6, 3): 9 SUB (6, 3): 3 MULT (6, 3): 18 IDIV (6, 3): 2 root@willnj:~$ 1 2 3 4 5 &gt; ./math 6 3 ADD (6, 3): 9 SUB (6, 3): 3 MULT (6, 3): 18 IDIV (6, 3): 2 1 2 3 4 5 &gt; ./math 6 3 ADD (6, 3): 9 SUB (6, 3): 3 MULT (6, 3): 18 IDIV (6, 3): 2 1 2 3 4 5 &gt; ./math 6 3 ADD (6, 3): 9 SUB (6, 3): 3 MULT (6, 3): 18 IDIV (6, 3): 2 I can also display a directory structure without having to handtype the pipe symbols. /(root) bin etc shadow dev lib home john jacob jingleheimer schmidt Call to Action Buttons I can even have buttons which can say things like “Donate” or “Subscribe” or whatever I want. Call to Action Example 1 Call to Action Example 2 Tables And here’s a table for different data types in C. Type Size Example int 4 42 float 4 3.14 double 8 3.14159 Prompts If I’m writing a tutorial, I can add these prompts to visually alert the reader. Tip: When using this feature, remember to always save your work frequently. This will prevent any data loss in case of unexpected errors. You can also use keyboard shortcuts like Ctrl+S or Cmd+S to quickly save. For more detailed instructions, check out our documentation. Info: The system has been updated to include new functionality for managing your tasks. You can now filter by due date, priority, and project, and even save custom views for future use. Remember to refresh the page after making changes to see the latest updates. If you’re unfamiliar with the new layout, hover over the info icons for helpful tooltips. Warning: Deleting this item is permanent and cannot be undone. Make sure you have backed up any important data before proceeding. Double-check the item name and details before confirming the deletion. Misclicks can cause serious issues, so proceed with caution. If you’re unsure, consult the support guide or contact the admin. Famous People Here are some famous people in tech. Linus Torvalds Developer Creator of Linux and Git Sam Altman Entrepreneur CEO of OpenAI Andrej Karpathy AI Researcher Former Tesla AI Director Guido van Rossum Developer Creator of Python Steve Jobs Entrepreneur Co-founder of Apple Ada Lovelace Mathematician First computer programmer Talk About Your Project You can highlight all of the features of the project you’re shipping. Powerful Core Dashboard A unified control center to manage projects, users, analytics, and settings. Seamless Team Collaboration Share projects, leave comments, and track changes in real time so your entire team stays aligned and productive. Lightning-Fast Performance Optimized rendering and smart caching ensure your data loads instantly, even with thousands of records. Support Us Donations can be received anytime at example.com. Add Badges Include a list of badges. Windows MacOS Linux Getting Started Maybe you’re a student who’s stumbled across my blog, or someone who’s genuinely interested in having a personal website. Well, here’s my simple path explained: Buy a domain - GoDaddy, Namecheap, wherever. Pick something simple and professional. Fork Jekyll Now - It’s a GitHub repository that sets up a blog in minutes. Enable GitHub Pages - Free hosting, automatic deployments. Set up extras - Custom email with Zoho Mail, use your domain for Bluesky, etc. Customize gradually - Start simple, improve over time. That’s it. You’ll have a website that costs you maybe $15-25 a year and takes an evening to set up. Not bad for having a professional presence that’s entirely your own. Trust me, your future self will thank you for taking that small step.]]></summary></entry></feed>