<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Clayton Hickey's Blog</title><link>https://claytonhickey.me/blog</link><description>The latest blog posts by Clayton Hickey</description><image><title>Clayton Hickey's Blog</title><url>https://claytonhickey.me/images/headshot.jpg</url><link>https://claytonhickey.me/blog</link></image><language>en-us</language><copyright>Unless otherwise specified, all rights reserved to Clayton Hickey</copyright><managingEditor>clayton@claytondoesthings.xyz (Clayton Hickey)</managingEditor><webMaster>clayton@claytondoesthings.xyz (Clayton Hickey)</webMaster><itunes:owner><itunes:name>Clayton Hickey</itunes:name><itunes:email>clayton@claytondoesthings.xyz</itunes:email></itunes:owner><docs>https://www.rssboard.org/rss-specification</docs><generator>Custom OCaml</generator><atom:link href="https://claytonhickey.me/rss.xml" rel="self" type="application/rss+xml"/><item><title>Custom Notebook Binders</title><description>Boosting my productivity with custom notebook binders</description><media:description type="plain">Boosting my productivity with custom notebook binders</media:description><link>https://claytonhickey.me/blog/custom-notebook-binders/</link><guid>https://claytonhickey.me/blog/custom-notebook-binders/</guid><pubDate>Mon, 20 Jan 2025 00:21:00 EST</pubDate><itunes:image href="https://claytonhickey.me/blog/custom-notebook-binders/staining-or-sealing.jpg"/><content:encoded><![CDATA[<p><span lang="en">Read directly: </span><a href="https://claytonhickey.me/blog/custom-notebook-binders/">https://claytonhickey.me/blog/custom-notebook-binders/</a></p><h1>Inspiration</h1>
<p>I need to lock in. I thought about <a href="https://www.cis.upenn.edu/~cis1210/current/">CIS 1210</a> nearly every waking hour last semester before I surrendered. This semester must be different. I will pay attention in class. I will not "split" my attention between the professor and "productive work".</p>
<p>I admire my previous note-taking setup for its simplicity. It can't get much simpler than one <a href="https://upenn.bncollege.com/Categories/Gifts--Accessories/Office-Accessories/Desk-Accessories/Traditional/Roaring-Premium-5-Subject-Notebook-8-5x11-College-Ruled-20lb-Paper-Pressboard-Foil-Cover/p/510225015">big ass notebook</a>. One big ass notebook has everything: notes, homework, random thoughts, and fun little drawings. I became lost in its beauty every time I opened it. I organized it in perfect chronological order by when it was written. How could I possibly write notes if I haven't finished this homework problem? How inconvenient to read then.</p>
<p>I know. I will just write my notes on the computer. Oh? There's my computer science homework. Maybe I should work on that a bit before class starts? Oh? Class has started? Well... I'm in computer science class right now. It's on topic. I can't stop now.</p>
<p>I should now be clear that neither big ass notebook nor computer notes are working for me. If only I could move pages around in my big ass notebook. Maybe then I could alleviate the stress of writing pages in convenient order. I remember. I remember the big ass binders from elementary school.</p>
<figure>
    <a href="https://www.amazon.com/dp/B007SQZHKW"><img src="/blog/custom-notebook-binders/big-ass-binder.jpg" alt="A big ass binder"></a>
    <figcaption>A big ass binder.<br><i>Source: Amazon</i></figcaption>
</figure>
<p>I hated using those things though. They broke constantly, it was a struggle to unzip, and sometimes all the pages would fall out due to all three rings opening at once because of the weight of every single subject in one big ass binder.</p>
<p>Maybe the "one big ass" part of "one big ass binder" is the problem. Perhaps I should get a few normal ass binders.</p>
<figure>
    <a href="https://www.amazon.com/Samsill-Certified-Biobased-Eco-Friendly-Assortment/dp/B094BGW9B6"><img src="/blog/custom-notebook-binders/a-few-normal-ass-binders.jpg" alt="A few normal ass binders"></a>
    <figcaption>A few normal ass binders.<br><i>Source: Amazon</i></figcaption>
</figure>
<p>This could work. How many normal ass binders should I get? 4 binders for 4 classes + 1 binder for my own stuff = 5 binders should work. I'd have to carry all the binders at once since all my classes are back to back on 2 days of the week and I don't want to have to go back to the other side of the campus for my fun work binder before I perform my other new strat: working only anywhere-else-but-my-dorm-room and going home by 9 PM. The binders mustn't take up too much space for this to work. The smallest size they have is 1 inch. 1 inch × ( 5 binders ÷ 2 ) rounded up to account for the wedge shape of the binders = at least 3 inches of binders in my backpack at all times. That much thickness would be a lot to handle considering I also need to carry water, food, my laptop, and textbooks. If only I could have the convenience of a binder with the form factor of a notebook.</p>
<h1>Time to get Inventive</h1>
<p>There seems to be this weird obsession in the binder community with bulky yet fragile rings. Even these <a href="https://www.levenger.com/collections/circa-letter-notebooks/products/circa-ex-libris-foldover-notebook">goofy disc-bound notebooks</a> designed to "lay flat" use them. Why not just use string? String and spare cardboard boxes solved my problem.</p>
<figure>
    <img src="/blog/custom-notebook-binders/cardboard-string-notebook-binders.jpg">
    <figcaption>A picture of something else cropped to only show the cardboard notebook binders in the background on top of a pile of to-be-put-in-a-future-binder papers.</figcaption>
</figure>
<p>This solution fit all of my criteria: nearly perfectly flat, easy to reorder pages, kept pages safe and secure, light, and thin. I was ready to go to head to UPenn with these accompanying me in all my classes.</p>
<p>I was very dissapointed to find out that some were very much not impressed. They expressed extreme concern that the rich kids of the prestiguous <i><a href="https://en.wikipedia.org/wiki/Ivy_League#Members">University of Pennsylvania</a></i> would bully me for looking so deprived. I protested that I was 20 years old and no one would care to no avail.</p>
<h1>Becoming Fancy</h1>
<p>My first attempt to become fancy was to purchase a fancy Japanese mechanical pencil recommended by <a href="https://www.reddit.com/r/mechanicalpencils/">r/mechanicalpencils</a>: the <a href="https://www.amazon.com/Pentel-Mechanical-Pencil-ORENZ-PP3003/dp/B06VWPKXQH">Pentel Orenznero</a>.</p>
<figure>
    <a href="https://www.amazon.com/Pentel-Mechanical-Pencil-ORENZ-PP3003/dp/B06VWPKXQH"><img src="/blog/custom-notebook-binders/fancy-mechanical-pencil.jpg"></a>
    <figcaption>The Orenznero mechanical pencil Japanese glam shot.<br><i>Source: Amazon</i></figcaption>
</figure>
<p>No one was impressed.</p>
<p>My second attempt to become fancy was to replace the rope with necklace chain. This also got around my lack of knot tying skills by allowing opening and closing with "lobster clasps".</p>
<figure>
    <a href="https://www.amazon.com/Stainless-Jewelry-Lobster-Necklace-Accessories/dp/B097SZMMPY"><img src="/blog/custom-notebook-binders/necklace-chain.jpg"></a>
    <figcaption>A picture of a roll of necklace chain.<br><i>Source: Amazon</i></figcaption>
</figure>
<p>No one was impressed.</p>
<p>My third attempt to become fancy was to make a negative wooden notebook cover, make a mold of it using silicone, and then use the silicone mold to make resin casts. This strategy came with new complaints: it was way too expensive. I protested that it made sense because I could reuse the silicone mold for practically infinite notebooks. They were unconvinced.</p>
<p>I then learned wood and resin were actually pretty similar in strength and that wood had superior vibes. My third attempt to become fancy was cancelled and replaced by the fourth: just make the notebook covers out of wood.</p>
<h1>Woodworking</h1>
<p>I saw that I could get 2mm thick wood on Amazon. I imagined I could also find the same at Home Depot and not have to wait for shipping. I could not. I did find this 1/8" (3.175mm) ugly tempered hardwood though. I decided to stain it since it was so ugly</p>
<figure>
    <img src="/blog/custom-notebook-binders/ugly-tempered-hardwood.jpg">
    <figcaption>Ugly tempered hardwood, unfinished cutting lines, a hacksaw, acryclic sealer, dark walnut wood stain, a ruler, a pencil, a pencil sharpener, and an empty blastoise box.</figcaption>
</figure>
<p>It would've been nice if I had proper tools to make straight lines and stuff. This lack lead to it taking about 10 hours to cut the boards out. I accounted for my lack of tools and skill by adding a 2mm tolerance to my desired dimensions of the union of A4 and US Letter I call "US Metric": the greater 216 mm width of US letter and the greater 297 mm height of A4. To my surprise, I met the tolerances I set for myself.</p>
<figure>
    <img src="/blog/custom-notebook-binders/some-cut-out.png">
    <figcaption>Some of the covers cut out</figcaption>
</figure>
<p>I decided to drill the holes as small as possible so that maybe most of the stress would be on the wood instead of the paper. I don't know if that makes any sense. It was a bad idea anyway because the clasps didn't fit through. Even the little jump rings barely fit through. This oversight decreased the flatness slightly.</p>
<p>Staining and sealing also took forever: like 8 hours or something.</p>
<figure>
    <img src="/blog/custom-notebook-binders/staining-or-sealing.jpg">
    <figcaption>The covers at some stage of staining or sealing. Not sure.</figcaption>
</figure>
<p>It was harder than I thought it would be at first to put the pages in. I have since become a pro.</p>
<figure>
    <img src="/blog/custom-notebook-binders/stack-of-finished-notebook-binders.jpg">
    <figcaption>The stack of finished notebook binders.</figcaption>
</figure>
<p>What were once easy to make cardboard notebook binders are now fancy notebook binders. All it took was the last 3 days of winter break spent away from my family that my clamp hand still feels.</p>
<p>The notebooks have been very convenient. They fit A4 and US Letter, allow reordering of pages, are basically completely flat, offer a better backing surface than cardboard, use the <a href="https://en.m.wikipedia.org/wiki/Hole_punch#US_letter_3-hole_system">US Letter 3 Hole System</a>, seem sturdy so far, and are not that ugly. They are heavier than I specced since the wood was thicker and denser than expected. No one has called me poor yet.</p>
<p>This project also helped me feel like an engineer.</p>
<figure>
    <img src="/blog/custom-notebook-binders/3-different-paper-sizes.jpg">
    <figcaption>3 different paper sizes in one binder! I did forget my hole puncher at home btw.</figcaption>
</figure>
]]></content:encoded></item><item><title>Transferring from Bioengineering to Computer Engineering</title><description></description><media:description type="plain"></media:description><link>https://claytonhickey.me/blog/transferring-from-bioengineering-to-computer-engineering/</link><guid>https://claytonhickey.me/blog/transferring-from-bioengineering-to-computer-engineering/</guid><pubDate>Mon, 06 Jan 2025 22:47:00 EST</pubDate><itunes:image href="https://claytonhickey.me/blog/transferring-from-bioengineering-to-computer-engineering/CompE vs BE and Masters_ Interest and Workload.svg"/><content:encoded><![CDATA[<p><span lang="en">Read directly: </span><a href="https://claytonhickey.me/blog/transferring-from-bioengineering-to-computer-engineering/">https://claytonhickey.me/blog/transferring-from-bioengineering-to-computer-engineering/</a></p><h1>Transferring from Bioengineering to Computer Engineering</h1>
<p>Sophomore winter break January 4th I sent in the form transfer from Bioengineering to Computer Engineering.</p>
<p>I wanted to move from bioengineering because the classes, they way people talk about it, and where students go afterwards (like 90&amp; don't do engineering) gave me terrible vibes.</p>
<p>I made the following graph to demonstrate my reasoning for choosing computer engineering over bioengineering.:</p>
<figure>
    <img src="/blog/transferring-from-bioengineering-to-computer-engineering/CompE vs BE and Masters_ Interest and Workload.svg">
    <figcaption>Interest is slightly higher or the same each term for computer engineering. Workload is slightly better or the same for each term except Spring 2025.<br><a href="/blog/transferring-from-bioengineering-to-computer-engineering/UPenn Course Plan - Computer Engineering-3.pdf">Computer Engineering Calculations</a> <a href="/blog/transferring-from-bioengineering-to-computer-engineering/UPenn Course Plan - BE Calculations.pdf">Bioengineering Calculations</a></figcaption>
</figure>
<p>I chose Computer Engineering over Computer Science because I like engineering more than science.</p>
<p>I chose Computer Engineering over Electrical Engineering because they're nearly the same if choosing the computer engineering concentration and I don't know any better.</p> 
<p>I chose Computer Engineering over dropping out because I want money?</p>
<p>I am excited to learn the vibes of computer engineers.</p>
<h2>Next semester classes</h2>
<table>
    <tbody><tr><th>Class ID</th><th>Normal Description</th><th>Expected Interest (10 is best)</th><th>Expected Workload (10 is least)</th></tr>
    <tr><td><a href="https://penncoursereview.com/course/CIS-1210/2025A">CIS 1210</a></td><td>Simple Performance Analysis, Data Structures, &amp; Algorithms</td><td>2</td><td>0</td></tr>
    <tr><td><a href="https://penncoursereview.com/course/CIS-2400">CIS 2400</a></td><td>Binary, Logic Gates, Assembly, &amp; C programming</td><td>6</td><td>3</td></tr>
    <tr><td><a href="https://penncoursereview.com/course/JPAN-0400/2025A">JPAN 0400</a></td><td>4th Semester Japanese: End of Genki 2 &amp; start of Tobira</td><td>10</td><td>10</td></tr>
    <tr><td><a href="https://penncoursereview.com/course/STAT-4300/2025A">STAT 4300</a></td><td>Decently Simple Probability</td><td>3</td><td>8</td></tr>
</tbody></table>
]]></content:encoded></item><item><title>Language Learning (Dev)Log Week #20</title><description>Week 20 progress roundup</description><media:description type="plain">Week 20 progress roundup</media:description><link>https://claytonhickey.me/blog/language-learning-log-week-20/</link><guid>https://claytonhickey.me/blog/language-learning-log-week-20/</guid><pubDate>Sat, 07 Sep 2024 23:59:00 EDT</pubDate><itunes:image href="https://claytonhickey.me/blog/language-learning-log-week-20/thumb.png"/><content:encoded><![CDATA[<p><span lang="en">Read directly: </span><a href="https://claytonhickey.me/blog/language-learning-log-week-20/">https://claytonhickey.me/blog/language-learning-log-week-20/</a></p><h1 lang="en">Language Learning (Dev)Log Week #20</h1>
<p lang="en">My university japanese class has been going well</p>
]]></content:encoded></item><item><title>Language Learning (Dev)Log Week #19</title><description>Week 19 progress roundup</description><media:description type="plain">Week 19 progress roundup</media:description><link>https://claytonhickey.me/blog/language-learning-log-week-19/</link><guid>https://claytonhickey.me/blog/language-learning-log-week-19/</guid><pubDate>Sat, 31 Aug 2024 23:30:00 EDT</pubDate><itunes:image href="https://claytonhickey.me/blog/language-learning-log-week-19/thumb.png"/><content:encoded><![CDATA[<p><span lang="en">Read directly: </span><a href="https://claytonhickey.me/blog/language-learning-log-week-19/">https://claytonhickey.me/blog/language-learning-log-week-19/</a></p><h1 lang="en">Language Learning (Dev)Log Week #19</h1>
<p lang="en">I have still been doing Duolingo and Anki each day. My university japanese class has been going well</p>
<figure>
    <iframe src="/blog/language-learning-log-week-19/anki-stats-2024-08-31@23-26-19.pdf" width="100%" height="1000"></iframe>
    <figcaption lang="en">Anki Stats</figcaption>
</figure>
]]></content:encoded></item><item><title>Language Learning (Dev)Log Week #18</title><description>Week 18 progress roundup</description><media:description type="plain">Week 18 progress roundup</media:description><link>https://claytonhickey.me/blog/language-learning-log-week-18/</link><guid>https://claytonhickey.me/blog/language-learning-log-week-18/</guid><pubDate>Sat, 24 Aug 2024 21:30:00 EDT</pubDate><itunes:image href="https://claytonhickey.me/blog/language-learning-log-week-18/thumb.png"/><content:encoded><![CDATA[<p><span lang="en">Read directly: </span><a href="https://claytonhickey.me/blog/language-learning-log-week-18/">https://claytonhickey.me/blog/language-learning-log-week-18/</a></p><h1 lang="en">Language Learning (Dev)Log Week #18</h1>
<p lang="en">I have still been doing Duolingo and Anki each day</p>
<figure>
    <iframe src="/blog/language-learning-log-week-18/anki-stats-2024-08-24@21-26-55.pdf" width="100%" height="1000"></iframe>
    <figcaption lang="en">Anki Stats</figcaption>
</figure>
]]></content:encoded></item><item><title>Language Learning (Dev)Log Week #17</title><description>Week 17 progress roundup</description><media:description type="plain">Week 17 progress roundup</media:description><link>https://claytonhickey.me/blog/language-learning-log-week-17/</link><guid>https://claytonhickey.me/blog/language-learning-log-week-17/</guid><pubDate>Sat, 17 Aug 2024 14:25:00 EDT</pubDate><itunes:image href="https://claytonhickey.me/blog/language-learning-log-week-17/thumb.png"/><content:encoded><![CDATA[<p><span lang="en">Read directly: </span><a href="https://claytonhickey.me/blog/language-learning-log-week-17/">https://claytonhickey.me/blog/language-learning-log-week-17/</a></p><h1 lang="en">Language Learning (Dev)Log Week #17</h1>
<p lang="en">This week, I studied Japanese on Duolingo each day. I also finished (kind of) learning to understand the hiragana form of all the vocabulary in Genki 1 and 2 for my Japanese class next semester with Anki.</p>
<figure>
    <iframe src="/blog/language-learning-log-week-17/anki-stats-2024-08-17@13-52-54.pdf" width="100%" height="1000"></iframe>
    <figcaption lang="en">Anki Stats</figcaption>
</figure>
]]></content:encoded></item><item><title>Language Learning (Dev)Log Week #16</title><description>Week 16 progress roundup</description><media:description type="plain">Week 16 progress roundup</media:description><link>https://claytonhickey.me/blog/language-learning-log-week-16/</link><guid>https://claytonhickey.me/blog/language-learning-log-week-16/</guid><pubDate>Sat, 10 Aug 2024 21:05:38 EDT</pubDate><itunes:image href="https://claytonhickey.me/blog/language-learning-log-week-16/thumb.png"/><content:encoded><![CDATA[<p><span lang="en">Read directly: </span><a href="https://claytonhickey.me/blog/language-learning-log-week-16/">https://claytonhickey.me/blog/language-learning-log-week-16/</a></p><h1 lang="en">Language Learning (Dev)Log Week #16</h1>
<p lang="en">This week, I studied Japanese on Duolingo each day.</p>
]]></content:encoded></item><item><title>Language Learning (Dev)Log Week #15</title><description>Week 15 progress roundup</description><media:description type="plain">Week 15 progress roundup</media:description><link>https://claytonhickey.me/blog/language-learning-log-week-15/</link><guid>https://claytonhickey.me/blog/language-learning-log-week-15/</guid><pubDate>Sat, 03 Aug 2024 23:08:30 EDT</pubDate><itunes:image href="https://claytonhickey.me/blog/language-learning-log-week-15/thumb.png"/><content:encoded><![CDATA[<p><span lang="en">Read directly: </span><a href="https://claytonhickey.me/blog/language-learning-log-week-15/">https://claytonhickey.me/blog/language-learning-log-week-15/</a></p><h1 lang="en">Language Learning (Dev)Log Week #15</h1>
<p lang="en">This week, I studied Japanese on Duolingo each day and I learned how to handwrite all of hiragana, all of katakana, and some kanji with my language learning app.</p>
<figure>
    <img src="/blog/language-learning-log-week-15/thumb.png">
</figure>
]]></content:encoded></item><item><title>Language Learning (Dev)Log Week #14</title><description>Week 14 progress roundup</description><media:description type="plain">Week 14 progress roundup</media:description><link>https://claytonhickey.me/blog/language-learning-log-week-14/</link><guid>https://claytonhickey.me/blog/language-learning-log-week-14/</guid><pubDate>Sat, 27 Jul 2024 17:08:30 EDT</pubDate><itunes:image href="https://claytonhickey.me/blog/language-learning-log-week-14/thumb.png"/><content:encoded><![CDATA[<p><span lang="en">Read directly: </span><a href="https://claytonhickey.me/blog/language-learning-log-week-14/">https://claytonhickey.me/blog/language-learning-log-week-14/</a></p><h1 lang="en">Language Learning (Dev)Log Week #14</h1>
<p lang="en">This week, I studied Japanese on Duolingo each day.</p>
<p lang="en">I made no progress on my language learning app.</p>
]]></content:encoded></item><item><title>Language Learning (Dev)Log Week #13</title><description>Week 13 progress roundup</description><media:description type="plain">Week 13 progress roundup</media:description><link>https://claytonhickey.me/blog/language-learning-log-week-13/</link><guid>https://claytonhickey.me/blog/language-learning-log-week-13/</guid><pubDate>Sat, 20 Jul 2024 17:08:30 EDT</pubDate><itunes:image href="https://claytonhickey.me/blog/language-learning-log-week-13/thumb.png"/><content:encoded><![CDATA[<p><span lang="en">Read directly: </span><a href="https://claytonhickey.me/blog/language-learning-log-week-13/">https://claytonhickey.me/blog/language-learning-log-week-13/</a></p><h1 lang="en">Language Learning (Dev)Log Week #13</h1>
<p lang="en">This week, I studied Japanese on Duolingo each day and got the Genki 2 Textbook and workbook from my university library for my University Japanese Class in the fall.</p>
<p lang="en">Flashcards in my language learning app now work. The app is now usable.</p>
]]></content:encoded></item><item><title>Language Learning (Dev)Log Week #12</title><description>Week 12 progress roundup</description><media:description type="plain">Week 12 progress roundup</media:description><link>https://claytonhickey.me/blog/language-learning-log-week-12/</link><guid>https://claytonhickey.me/blog/language-learning-log-week-12/</guid><pubDate>Sat, 13 Jul 2024 13:17:30 EDT</pubDate><itunes:image href="https://claytonhickey.me/blog/language-learning-log-week-12/thumb.png"/><content:encoded><![CDATA[<p><span lang="en">Read directly: </span><a href="https://claytonhickey.me/blog/language-learning-log-week-12/">https://claytonhickey.me/blog/language-learning-log-week-12/</a></p><h1 lang="en">Language Learning (Dev)Log Week #12</h1>
<p lang="en">This week, I studied Japanese on Duolingo each day and posted <a href="/blog/how-I-added-multiple-languages-to-my-blog/" target="_BLANK">How I added multiple languages to my blog</a>.</p>
<p lang="en">I made no progress on my language learning app.</p>
]]></content:encoded></item><item><title>How I added multiple languages to my blog</title><description>Week 10 progress roundup: Duolingo and wack</description><media:description type="plain">Week 10 progress roundup: Duolingo and wack</media:description><link>https://claytonhickey.me/blog/how-I-added-multiple-languages-to-my-blog/</link><guid>https://claytonhickey.me/blog/how-I-added-multiple-languages-to-my-blog/</guid><pubDate>Sat, 13 Jul 2024 00:45:30 EDT</pubDate><itunes:image href="https://claytonhickey.me/blog/how-I-added-multiple-languages-to-my-blog/thumb.png"/><content:encoded><![CDATA[<p><span lang="en">Read directly: </span><a href="https://claytonhickey.me/blog/how-I-added-multiple-languages-to-my-blog/">https://claytonhickey.me/blog/how-I-added-multiple-languages-to-my-blog/</a></p><h1 lang="en">How I added multiple languages to my blog</h1>
<p lang="en">I like to study other languages, currently Japanese. So when I was talking to Hayden about improving our blogs, I decided I would just make it multilingual for fun. Now, at the bottom of the page, there are buttons to switch the language instantly:</p> 
<figure lang="en">
        <img src="/blog/how-I-added-multiple-languages-to-my-blog/language-switcher.png">
        <figcaption>"Switch Language: [English] [日本語]"</figcaption>
    </figure>
<p lang="en">I'm not fluent in Japanese yet, so there will probably be mistakes.</p>
<p lang="en">I saw a bunch of Stack Overflow posts that said that the only acceptable way to support multiple languages on a website is to send a different version of a page server-side depending on the user's preferred language. It is said that this reduces the amount of data the user has to download, and I agree. However, doing that would require me to increase the complexity of this site by something like 20 times. So, I don't want to.</p>
<p lang="en">I love web components because they basically just add features to HTML, which is like 99% of what I want web frameworks like React to do. So, I created a web component with the tag name "ml-s" in 77 lines of code. Each of its children have a "lang" attribute to indicate the language of its contents. Depending on the user's browser-defined preferred languages and the override buttons in the footer, it chooses which of its children is the best and replaces itself with the best child and backs up the children. If the language preferences change, it replaces again based on the backed-up children.</p>
<figure>
    <textarea readonly="" rows="5" style="width: 100%">&lt;ml-s&gt;
    &lt;h1 lang="en"&gt;How I added multiple languages to my blog&lt;/h1&gt;
    &lt;h1 lang="ja"&gt;私のブログに他の言語を付け加え方&lt;/h1&gt;
&lt;/ml-s&gt;</textarea>
    <figcaption lang="en">The HTML for this page's header</figcaption>
</figure>
<p lang="en">I love this solution because it's super simple and effective for normal viewing. For RSS, it's a little more complicated. Luckily, HTML is structured data, so for the different English/Japanese RSS feeds, I just parse the HTML page, title, and description using <a href="https://aantron.github.io/lambdasoup/" target="_BLANK">Lambda Soup</a>, extract the language from each ml-s element, convert it back into HTML text.</p>
<p lang="en">It's also a little complicated for the page title since HTML can only have text in the title, no HTML tags. So, I use a hidden element at the top of the body and everytime it changes, it updates the title with the text representation of itself. Still less complicated than <a href="https://dev.to/rohitnirban/adding-page-titles-to-react-app-23oe" target="_BLANK">React</a> 🤭.</p>
<p lang="en">Thank you for reading, I hope the simplicity inspires you as it does me.</p>
<a href="/blog/how-I-added-multiple-languages-to-my-blog/multilingual.js" target="_BLANK"><span lang="en">a copy of the current relevant code</span></a>

]]></content:encoded><enclosure url="https://claytonhickey.me/blog/how-I-added-multiple-languages-to-my-blog/voiceover.mp3" length="2112961" type="audio/mpeg"/></item><item><title>Language Learning (Dev)Log Week #11</title><description>Week 11 progress roundup</description><media:description type="plain">Week 11 progress roundup</media:description><link>https://claytonhickey.me/blog/language-learning-log-week-11/</link><guid>https://claytonhickey.me/blog/language-learning-log-week-11/</guid><pubDate>Sat, 06 Jul 2024 13:17:30 EDT</pubDate><itunes:image href="https://claytonhickey.me/blog/language-learning-log-week-11/thumb.png"/><content:encoded><![CDATA[<p><span lang="en">Read directly: </span><a href="https://claytonhickey.me/blog/language-learning-log-week-11/">https://claytonhickey.me/blog/language-learning-log-week-11/</a></p><h1 lang="en">Language Learning (Dev)Log Week #11</h1>
<p lang="en">This week, I studied Japanese on Duolingo each day and am almost done writing another blog post (excluding this one) in Japanese.</p>
<p lang="en">I made no progress on my language learning app, but I have been working on starting tutoring. I will teach a student next Monday.</p>
]]></content:encoded></item><item><title>Language Learning (Dev)Log Week #10</title><description>Week 10 progress roundup: Duolingo and wack</description><media:description type="plain">Week 10 progress roundup: Duolingo and wack</media:description><link>https://claytonhickey.me/blog/language-learning-log-week-10/</link><guid>https://claytonhickey.me/blog/language-learning-log-week-10/</guid><pubDate>Sat, 29 Jun 2024 23:44:00 EDT</pubDate><itunes:image href="https://claytonhickey.me/blog/language-learning-log-week-10/progress.png"/><content:encoded><![CDATA[<p><span lang="en">Read directly: </span><a href="https://claytonhickey.me/blog/language-learning-log-week-10/">https://claytonhickey.me/blog/language-learning-log-week-10/</a></p><h1><span lang="en">Language Learning (Dev)Log Week #10</span></h1>
<figure>
    <img src="/blog/language-learning-log-week-10/progress.png">
    <figcaption><span lang="en">A shocked person</span></figcaption>
</figure>
<p lang="en">This week, I added Japanese support to my blog and started looking for Japanese blogs to follow. I have also listed the blog on <a href="https://blogmura.com/profiles/11190482" target="_BLANK">BlogMura</a>, a Japanese blog ranking site.</p>
<p lang="en">I also made ok progress on my language learning app. I just need to add the skill introduction function and flashcards to get the app working.</p>
]]></content:encoded><enclosure url="https://claytonhickey.me/blog/language-learning-log-week-10/voiceover.mp3" length="298284" type="audio/mpeg"/></item><item><title>Language Learning (Dev)Log Week #9</title><description>Week 9 progress roundup: Duolingo and wack</description><media:description type="plain">Week 9 progress roundup: Duolingo and wack</media:description><link>https://claytonhickey.me/blog/language-learning-log-week-9/</link><guid>https://claytonhickey.me/blog/language-learning-log-week-9/</guid><pubDate>Sat, 22 Jun 2024 23:44:00 EDT</pubDate><itunes:image href="https://claytonhickey.me/blog/language-learning-log-week-9/progress.png"/><content:encoded><![CDATA[<p><span lang="en">Read directly: </span><a href="https://claytonhickey.me/blog/language-learning-log-week-9/">https://claytonhickey.me/blog/language-learning-log-week-9/</a></p><h1><span lang="en">Language Learning (Dev)Log Week #9</span></h1>
<figure>
    <img src="/blog/language-learning-log-week-9/progress.png">
    <figcaption><span lang="en">Duolingoだけ, programming ok: gears and arrows</span></figcaption>
</figure>
<p lang="en">This week, I learned basically no Japanese. I did Duolingo each day at least though.</p>
<p lang="en">Also this week, I made ok progress on Tutor Engine, my language learning app. I've got study plans generating slowly to almost get exercises working - the last part for textual functionality.</p>
]]></content:encoded><enclosure url="https://claytonhickey.me/blog/language-learning-log-week-9/voiceover.mp3" length="240984" type="audio/mpeg"/></item><item><title>Language Learning (Dev)Log Week #8</title><description>Week 8 progress roundup: Duolingo and programming skeletons</description><media:description type="plain">Week 8 progress roundup: Duolingo and programming skeletons</media:description><link>https://claytonhickey.me/blog/language-learning-log-week-8/</link><guid>https://claytonhickey.me/blog/language-learning-log-week-8/</guid><pubDate>Sat, 15 Jun 2024 23:00:00 EDT</pubDate><itunes:image href="https://claytonhickey.me/blog/language-learning-log-week-8/progress.png"/><content:encoded><![CDATA[<p><span lang="en">Read directly: </span><a href="https://claytonhickey.me/blog/language-learning-log-week-8/">https://claytonhickey.me/blog/language-learning-log-week-8/</a></p><h1><span lang="en">Language Learning (Dev)Log Week #8</span></h1>
<figure>
    <img src="/blog/language-learning-log-week-8/progress.png" alt="Duolingoだけ, programming ok: gears and skeletons">
    <figcaption><span lang="en">Duolingoだけ, programming ok: gears and skeletons</span></figcaption>
</figure>
<p lang="en">This week, I learned basically no Japanese. I did Duolingo each day at least though.</p>
<p lang="en">Also this week, I made pretty good progress on Tutor Engine, my language learning app. I've gotten annotations on text and images working, flashcards skeltonized, and goals skeltonized.</p>
]]></content:encoded><enclosure url="https://claytonhickey.me/blog/language-learning-log-week-8/voiceover.mp3" length="151616" type="audio/mpeg"/></item><item><title>Language Learning (Dev)Log Week #7</title><description>Week 7 progress roundup</description><media:description type="plain">Week 7 progress roundup</media:description><link>https://claytonhickey.me/blog/language-learning-log-week-7/</link><guid>https://claytonhickey.me/blog/language-learning-log-week-7/</guid><pubDate>Sat, 08 Jun 2024 13:36:00 EDT</pubDate><itunes:image href="https://claytonhickey.me/blog/language-learning-log-week-7/progress.png"/><content:encoded><![CDATA[<p><span lang="en">Read directly: </span><a href="https://claytonhickey.me/blog/language-learning-log-week-7/">https://claytonhickey.me/blog/language-learning-log-week-7/</a></p><h1><span lang="en">Language Learning (Dev)Log Week #7</span></h1>
<figure>
    <img src="/blog/language-learning-log-week-7/progress.png" alt="A poorly drawn 0">
    <figcaption><span lang="en">No progress</span></figcaption>
</figure>
<p lang="en">This week, I learned basically no Japanese.</p>
<p lang="en">This week, I made negligible progress on my language learning app.</p>
]]></content:encoded><enclosure url="https://claytonhickey.me/blog/language-learning-log-week-7/voiceover.mp3" length="129788" type="audio/mpeg"/></item><item><title>Language Learning (Dev)Log Week #6</title><description>Finished Busuu B1 course, anime still too hard, did not get Summer of Impact Award, and biked far w/ fun.</description><media:description type="plain">Finished Busuu B1 course, anime still too hard, did not get Summer of Impact Award, and biked far w/ fun.</media:description><link>https://claytonhickey.me/blog/language-learning-log-week-6/</link><guid>https://claytonhickey.me/blog/language-learning-log-week-6/</guid><pubDate>Sat, 01 Jun 2024 23:28:45 EDT</pubDate><itunes:image href="https://claytonhickey.me/blog/language-learning-log-week-6/week-6-progress.png"/><content:encoded><![CDATA[<p><span lang="en">Read directly: </span><a href="https://claytonhickey.me/blog/language-learning-log-week-6/">https://claytonhickey.me/blog/language-learning-log-week-6/</a></p><h1>Language Learning (Dev)Log Week #6</h1>
<figure>
    <img src="/blog/language-learning-log-week-6/week-6-progress.png" alt="Summarizing week: Finished Busuu B1 course, anime still too hard, did not get Summer of Impact Award, and biked far w/ fun">
    <figcaption>Summarizing week: Finished Busuu B1 course, anime still too hard, did not get Summer of Impact Award, and biked far w/ fun</figcaption>
</figure>
<p>This week, I finished the B1 course on Busuu and have gotten like halfway through the B2 course. The B2 course seems a lot lower quality than the B1 course and is unfinished, but I will probably finish it anyway. I tried watching Japanese subbed anime on Animelon after finishing the B1 course. The word-by-word translation on Animelon was kind of terrible, so I ended up understanding nothing, getting bored, and quitting. It would probably be better if I put it into LingQ somehow, but I'll have to figure out how to do that.</p>
<p>For Tutor Engine, my language learning app, I didn't put as many hours I wanted since I was busy and didn't wake up early enough at least 3 days of this week, but I made good progress onto implementing skill-annotated media with a slightly different and much simpler (it seems) approach than I've done before.</p>
<p>I did not receive the <a href="https://venturelab.smapply.io/prog/2024_summer_of_impact_venture_award/" target="_BLANK">Summer of Impact Award</a>.</p>
<p>For bicycling, notably, I did a 10 mile and a 20 mile ride. The 20 mile ride was particularly exciting because I found a way to reach the Schuylkill River Trail with barely any highway, so I don't die. By reaching the Schuylkill River Trail, I can pretty much reach anywhere in Pennsylvania, including Philadelphia, whereas previously I felt sort of trapped in my country zone. I could've done it without <a href="https://openstreetmaps.org" target="_BLANK">OpenStreetMap</a>, but it inspired me. I may write about OpenStreetMap later. Thank you <a href="https://haydenshuker.org">Hayden</a> for inspiring me to try OpenStreetMap.</p>
]]></content:encoded><enclosure url="https://claytonhickey.me/blog/language-learning-log-week-6/voiceover.mp3" length="1294836" type="audio/mpeg"/></item><item><title>Language Learning (Dev)Log Week #5</title><description>This week, I did studied on Busuu, met with a Japanese tutor, and submitted an application to the Summer of Impact Award.</description><media:description type="plain">This week, I did studied on Busuu, met with a Japanese tutor, and submitted an application to the Summer of Impact Award.</media:description><link>https://claytonhickey.me/blog/language-learning-log-week-5/</link><guid>https://claytonhickey.me/blog/language-learning-log-week-5/</guid><pubDate>Sat, 25 May 2024 21:55:00 EDT</pubDate><itunes:image href="https://claytonhickey.me/blog/language-learning-log-week-5/week-5-progress.png"/><content:encoded><![CDATA[<p><span lang="en">Read directly: </span><a href="https://claytonhickey.me/blog/language-learning-log-week-5/">https://claytonhickey.me/blog/language-learning-log-week-5/</a></p><h1>Language Learning (Dev)Log Week #5</h1>
<figure>
    <img src="/blog/language-learning-log-week-5/week-5-progress.png" alt="Summarizing week: 1039 stars on Busuu, &quot;83%&quot; fluent on Busuu, 30 minutes tutor session, submitted Summer of Impact Award">
    <figcaption>Summarizing week: 1039 stars on Busuu, "83%" fluent on Busuu, 30 minutes tutor session, submitted Summer of Impact Award</figcaption>
</figure>
<p>On average, I did an hour of study each day on Busuu. However, I did not study for the full hour 2 days. I only have 2 chapters left for the B1 course on  Busuu. I did another trial tutoring session from someone on iTalki. This time, I didn't feel as confident as the only previous trial tutoring session from someone else. I think it may that they were talking faster or overestimated my Japanese vocabulary. I also felt extra bad at Japanese that day for some reason. I was forgetting things like how to say "you're welcome" (and cultural equivalents) and "music".</p>
<p>My trial for Busuu has expired, so I will probably buy a month's subscription so I can do the B1 and B2 certificate tests for fun. I was about to unsubscribe from LingQ, but they offered 50% off for 3 months and I took it. It does make me kind of mad that apparently half of my subscription is "extra" then, but I feel like it's a resource I shouldn't abandon just yet. In less than 3 months, my language learning app will be usable, so I can unsubscribe then.</p>
<p>For the language learning app, this Sunday, I actually finished the <a href="https://venturelab.smapply.io/prog/2024_summer_of_impact_venture_award/" target="_BLANK">Summer of Impact Award</a> application. I feel like I made insignificant progress this week. So, next week, I will up the hours of language learning app development to 2 per day.</p>
]]></content:encoded><enclosure url="https://claytonhickey.me/blog/language-learning-log-week-5/voiceover.mp3" length="1328223" type="audio/mpeg"/></item><item><title>Language Learning (Dev)Log Week #4</title><description>This week, I started my daily routine for programming my language learning app, studying Japanese, and biking/exercising.</description><media:description type="plain">This week, I started my daily routine for programming my language learning app, studying Japanese, and biking/exercising.</media:description><link>https://claytonhickey.me/blog/language-learning-log-week-4/</link><guid>https://claytonhickey.me/blog/language-learning-log-week-4/</guid><pubDate>Sat, 18 May 2024 17:37:00 EDT</pubDate><itunes:image href="https://claytonhickey.me/blog/language-learning-log-week-4/week-4-progress.png"/><content:encoded><![CDATA[<p><span lang="en">Read directly: </span><a href="https://claytonhickey.me/blog/language-learning-log-week-4/">https://claytonhickey.me/blog/language-learning-log-week-4/</a></p><h1>Language Learning (Dev)Log Week #4</h1>
<figure>
    <img src="/blog/language-learning-log-week-4/week-4-progress.png" alt="Summarizing week: used Busuu, Tutor Engine is currently ugly website, and venture award is due midnight tomorrow">
    <figcaption>Summarizing week: used Busuu, Tutor Engine is currently ugly website, and venture award is due midnight tomorrow</figcaption>
</figure>
<p>I didn't read any Re:Zero, a Japanese light novel, unfortunately, but I did practice Japanese for at least an hour each day since I got back from college this Tuesday. I rediscovered a language learning app that I tried before, but didn't like last time: <a href="https://www.busuu.com" target="_BLANK">Busuu</a>. It is formatted like a textbook, which isn't ideal imo, but it's way better than Duolingo's near 0 structure. The tests likely aren't that accurate, but I was proud to <a href="https://api.busuu.com/anon/certificates/441f957b32cfc3c3d632fe0452481447?lid=nclh7ogu822f" target="_BLANK">pass the upper-beginner certificate test</a> on Busuu. Most of my Japanese study this week has been on Busuu.</p>
<p>I think the lesson structure is pretty good for introducing grammar. The correction system is mid since if there are way fewer users of your target language than there are users learning languages you know who already know your target language, you will never be corrected. This seems to be the case for me as an English speaker learning Japanese. This is why I plan to have staff/contractors do corrections in my language learning app. The grammar review works well, but only if you haven't memorized the answers to the relevant chapter's exercises. The vocabulary review is contextless and thus useless in my opinion.</p>
<p>I also tried watching anime without subs (since Crunchyroll does not have Japanese subtitles) and then watching the same episode again with subs. The anime that I watched kinda sucked, but the challenge was fun.</p>
<p>As for progress on the language learning app, I decided I would rewrite it to just be a web app that relies on only a static site generator and a separate API server. I am nearly finished email-based sign in, and I'm thinking that the main page will be more like a dashboard instead of a main menu like in the previous iterations of the app.</p>
<p>I intend to apply for the $10,000 Venture Lab <a href="https://venturelab.smapply.io/prog/2024_summer_of_impact_venture_award/" target="_BLANK">Summer of Impact Award</a>, but I must finish it by midnight tomorrow and the application is very long, so who knows.</p>
]]></content:encoded><enclosure url="https://claytonhickey.me/blog/language-learning-log-week-4/voiceover.mp3" length="1828824" type="audio/mpeg"/></item><item><title>Language Learning Log Week #3</title><description>This week, I started reading again, but not that much because of school. I also found out about Language Simp and little about how to talk to people.</description><media:description type="plain">This week, I started reading again, but not that much because of school. I also found out about Language Simp and little about how to talk to people.</media:description><link>https://claytonhickey.me/blog/language-learning-log-week-3/</link><guid>https://claytonhickey.me/blog/language-learning-log-week-3/</guid><pubDate>Sat, 11 May 2024 23:00:00 EDT</pubDate><itunes:image href="https://claytonhickey.me/blog/language-learning-log-week-3/anime-book-school-language-simp.png"/><content:encoded><![CDATA[<p><span lang="en">Read directly: </span><a href="https://claytonhickey.me/blog/language-learning-log-week-3/">https://claytonhickey.me/blog/language-learning-log-week-3/</a></p><h1>Language Learning Log Week #3</h1>
<p>This week, I had a 3 finals. Chemistry went great (I think), linear algebra went ok (I hope), discrete math went terrible (definitely). Regardless, I distracted myself by reading some Re:Zero this week. I read a total of 52 characters in about an hour and a half. I made a <a href="https://docs.google.com/spreadsheets/d/1x479E1OIDQWg4e_PLUq79xCDrOxV13z8gxkNY7COx-8/edit?usp=sharing" target="_BLANK">cool spreadsheet</a> to make the following mid graph to demonstrate it:</p>
<figure>
    <img src="/blog/language-learning-log-week-3/day-summaries.png">
    <figcaption>On Sunday and Monday, I read at ~34 characters/hour for ~46 minutes</figcaption>
</figure>
<p>26 characters an hour is pretty slow. Assuming 2 characters/word (based on nothing), that's 13 words per hour. Part of the trouble is that I'm entering it into Tutor Engine at the same time. However, entering it into Tutor Engine at the same time I think helps lot with remembering it and I help the app along at the same time.</p>
<p>Next week after school is over on Tuesday, I'll be starting my planned summer regiment: wake at sunrise (~6 am), bike (~30 minute sprint; now 6:30 am), eat (~30 minutes; now 7:00 am), shower (~30 minutes; now 7:30 am), work on Tutor Engine (1 hour - increase over time; now 8:30 am), study Japanese (1 hour; now 8:30 am), do whatever I want the rest of the day. For the Japanese study, I will start with reading as I have, and then try different strategies to increase speed, retention, and happiness. This should work assuming I don't get an opportunity to do something more rewarding, which seems likely at this point.</p> 
<p>I also did the minimum on Duolingo each day this week, but who cares? I also did not use LingQ.</p>
<p>The most interesting thing I actually did this week was find out about <a href="https://www.youtube.com/@LanguageSimp" target="_BLANK">@LanguageSimp</a> on YouTube. I found it very inspiring to be called a monolingual beta multiple times. I also love his linguistic vocabulary like calling "American English" "American". He explains his position on linguistics for language learning in his video <a href="https://www.youtube.com/watch?v=vQL3CJB72lM" target="_BLANK">"Why I HATE Linguistics"</a>. Further thinking about this led me to a simple rule of thumb: if the first time you've understood the "strict" meaning of a word was after it was explained in an advanced scientific setting, people not in a similar setting (of their own will) probably won't and don't want to understand it. For example, in the <a target="/blog/language-learning-log-week-1">first week's post</a>, I tried to use "script" to describe what most people would intuitively understand as an "alphabet" even though "alphabet", in a linguistics setting, would not be technically correct. I am sorry to have been so pedantic.</p>
<p>Anyway, I should study for my physics final.<br><br>Good luck doing whatever as long as it's not bad,<br>Clayton</p>
]]></content:encoded><enclosure url="https://claytonhickey.me/blog/language-learning-log-week-3/voiceover.mp3" length="2757529" type="audio/mpeg"/></item><item><title>Language Learning Log Week #2</title><description>This week, I talk about how I didn't do much, but I thought about my app ig.</description><media:description type="plain">This week, I talk about how I didn't do much, but I thought about my app ig.</media:description><link>https://claytonhickey.me/blog/language-learning-log-week-2/</link><guid>https://claytonhickey.me/blog/language-learning-log-week-2/</guid><pubDate>Sat, 04 May 2024 17:59:00 EDT</pubDate><itunes:image href="https://claytonhickey.me/blog/language-learning-log-week-2/thumb.png"/><content:encoded><![CDATA[<p><span lang="en">Read directly: </span><a href="https://claytonhickey.me/blog/language-learning-log-week-2/">https://claytonhickey.me/blog/language-learning-log-week-2/</a></p><h1>Language Learning Log Week #2</h1>
<p>The last day of university classes was this Wednesday. While I probably should be studying for my finals (gen chem 2 next Tuesday, linear algebra next Thursday, discrete math next Friday, and honors physics 2/electromagnetism next next Monday), I have been instead relaxing. Therefore, despite the purpose of these posts, my language learning activity remains low.</p>
<figure>
    <img src="/blog/language-learning-log-week-2/duolingo-activity.png">
    <figcaption>On Duolingo: 0 XP Sunday, ~120 XP Monday, ~15 XP Tuesday, ~15 XP Wednesday, ~15 XP Thursday, ~15 XP Friday, ~30 XP Saturday. My brother's XP is also pictured, but that is because Duolingo gives me no choice.</figcaption>
</figure>
<figure>
    <img src="/blog/language-learning-log-week-2/lingq-activity.png">
    <figcaption>On LingQ: low activity Monday and Wednesday. Opened the app on Tuesday</figcaption>
</figure>
<p>I feel I found it difficult to motivate myself to use LingQ this week because what I wanted to watch, <a href="https://www.youtube.com/watch?v=3X6yIlmJv-k" target="_BLANK">https://www.youtube.com/watch?v=3X6yIlmJv-k</a>, was too difficult and boring. So, even though I wouldn't have a pop-up dictionary, I'm considering going back to reading "Re:ゼロから始める異世界生活", the first light novel of Re:Zero. I think it would be more engaging and I could enter it into and annotate it with the prototype of <a href="https://tutorengine.org" target="_BLANK">Tutor Engine</a> while I do it. When I was reading it earlier in April, I found it really engaging, but I stopped because I was struggling to handle the constant bombardments of homework.</p>
<p>Now that I've decided I'm not going to have plugins for Tutor Engine to start (and because I've figured out a method to make plugins work on websites), I'm considering just making Tutor Engine a website instead of using Flutter. I also realized that the underlying principle of cross-device syncing is to have a server that handles every interaction internally. Having offline use and then attempting to reconcile changes with the server requires a server that can handle every interaction internally. Therefore, start out with just a server that handles every interaction internally. Therefore, an offline app is not required. Therefore, an online app is required. Therefore, Flutter would have to make a bunch of server requests. However, Flutter's async UI modules are annoying to use. Therefore, it would be much easier to use something centered around async UI modules. Web browsers are centered around async UI modules. Therefore, web browsers would be less annoying to use. A website that allows use of the app is also required. Flutter can create websites, but websites generated from Flutter are not good. Therefore, creating a website from scratch will result in a better website than using Flutter as well. However, potential investors seem to love Flutter and not like home-grown solutions (understandably). Therefore, I should consider whether this actually makes sense.</p>
<p>Also, I decided I'll just do these on Saturdays instead of Sunday because Sunday is study day.</p>
]]></content:encoded><enclosure url="https://claytonhickey.me/blog/language-learning-log-week-2/voiceover.mp3" length="2454509" type="audio/mpeg"/></item><item><title>Language Learning Log Week #1</title><description>I love language learning content, so I thought I would make some.</description><media:description type="plain">I love language learning content, so I thought I would make some.</media:description><link>https://claytonhickey.me/blog/language-learning-log-week-1/</link><guid>https://claytonhickey.me/blog/language-learning-log-week-1/</guid><pubDate>Sat, 27 Apr 2024 21:48:00 EDT</pubDate><itunes:image href="https://claytonhickey.me/blog/language-learning-log-week-1/week-1-thumb.webp"/><content:encoded><![CDATA[<p><span lang="en">Read directly: </span><a href="https://claytonhickey.me/blog/language-learning-log-week-1/">https://claytonhickey.me/blog/language-learning-log-week-1/</a></p><h1>Language Learning Log Week #1</h1>
<p>I love watching/reading language learning content. This is expected for me considering my reasoning for wanting to learn a language in the first place. I started playing music because I heard it made you smarter. I hated high school band because I was not allowed to play (even in rehearsal - priority for the limited drums we had were given to upperclassman even though throughout previous years we were expected to bring our own drum, so I had one), so I decided, to keep myself sharp, I should start learning a language. I considered that the best language for this goal would be Mandarin Chinese since it's considered one of the hardest languages for English speakers, is the most spoken language, and I wanted to learn more about China.</p>
<p>I switched after about a year of study to Japanese for a few reasons. Firstly, I studied from the perspective that each character had a unique pronunciation and meaning. Now obvious to me, each character's pronunciation and meaning is highly dependent on the word. I felt that I held this perspective for too long and I that I had somehow screwed myself. Secondly, Japanese also has Chinese characters (also called a script) and 2 alphabets (also called scripts). I thought Chinese characters (hanzi) were super cool, so Japanese kanji (one of the 3 Japanese scripts), which are loaned from hanzi, were a fine replacement. Thirdly, once I got tired of Duolingo, I started using language partners. My language partners were very nice, and I believe helped me learn Chinese much faster than before. However, they were too nice and wanted to get to know me too well, which made me very uncomfortable and still uncomfortable about language partners to this day. So, when WeChat updated their terms of service and locked my account, I didn't go through the effort to fix it. Fourthly, I found it difficult to find engaging Chinese immersion material, but I found it really easy to find engaging Japanese immersion material (anime).</p>
<p>Switching to Japanese was difficult, but my knowledge of Chinese characters did help a bit. I have been studying Japanese off-and-on for almost 4 years now, and I have enjoyed it for more than just the technical aspects of the language that was really my initial draw.</p>
<p>Oh, I should also note I studied Spanish each of my 4 years of high school, but I wouldn't say I know Spanish well except for my ability to read to some extent (speaking, writing, listening - definitely not well).</p>
<p>Coming from my perspective though, I'm probably more interested in the science of language learning, figuring out what makes a language learning method effective and why. Generally, this is why, despite how long I've been studying for, I still only know maybe elementary Japanese (on the transition from N4 to N3 (<a href="https://www.jlpt.jp/e/about/levelsummary.html" target="_BLANK">JLPT</a>)/A2 to B1 (<a href="https://www.coe.int/en/web/common-european-framework-reference-languages/level-descriptions" target="_BLANK">CEFR</a>)/upper beginner to lower intermediate - at least, that's what I'd like to believe). This interest is part of the reason why I've also been developing a language learning app, <a href="https://tutorengine.org" target="_BLANK">Tutor Engine</a>, for the past 5 years (heavily off-and-on with many rewrites to be clear).</p>
<p>This summer, I will finish it. Though, as you may think as well, I think, "how can someone who is basically monolingual possibly sell a language learning app?". I justify it to myself by considering that the experience of not knowing a second language could be lost to someone who already knows 2 or more languages and that I'm going to hire people to help create the actual explanations and exercises/teaching materal in general. However, I'm also aware that I'm just coping. So, this summer, I'm going to try to both get to at least B2 Japanese and finish the app. That may be unrealistic because that's like 2 full-time jobs, but university and trying to still have a life is also like having 2 full-time jobs, so I should be used to it.</p>
<p>I also read research papers (usually for school projects), but I don't really follow specific authors except for <a href="https://learninganalytics.upenn.edu/ryanbaker/" target="_BLANK">Professor Ryan Baker</a>. So, my favorite "pop" creators in the language learning space are <a href="https://www.youtube.com/channel/UCgHGPOxUMfWsiy1ZyR-tLVw" target="_BLANK">Livakivi</a> (my favorite, though I don't think I could handle his method), <a href="https://www.youtube.com/channel/UCMk_WSPy3EE16aK5HLzCJzw" target="_BLANK">NativLang</a> (not really learning focused, but really interesting), <a href="https://www.youtube.com/@Xidnaf/videos" target="_BLANK">Xidnaf</a> (also not really learning focused, but fun), <a href="https://www.youtube.com/@Artifexian/videos" target="_BLANK">Artifexian</a> (used to do a lot more cool conlang stuff), <a href="https://www.youtube.com/channel/UC5D4YLSFeB5igjYTd7x2PXQ" target="_BLANK">jo renee languages</a> (vlogs about her learning), <a href="https://www.youtube.com/@JerryRegistre/videos" target="_BLANK">Jerry Registre</a> (a little clickbaity with the AI stuff, but I respect his grind and I feel I got good value out of his videos), <a href="https://www.youtube.com/channel/UCez-2shYlHQY3LfILBuDYqQ" target="_BLANK">Steve Kaufmann</a> (a little clickbaity at times, but a good communicator and has good - through imo not perfect - theory/hypotheses), and <a href="https://www.youtube.com/channel/UC76KGdBNou9Gr1p3xV42ojQ" target="_BLANK">Ritchi</a>. I'm not really interested in Ritchi's other content, but his most recent two videos (<a href="https://www.youtube.com/watch?v=qUO3SexuzkA" target="_BLANK">wk 1</a>, <a href="https://www.youtube.com/watch?v=nvFtdjR7aR4" target="_BLANK">wk 2</a>), he started a challenge where he is going to study Japanese as much as possible for 100 days before taking a trip to Tokyo, Japan. Seeing him and other creators finally got me to start this language learning log of jealousy.</p>
<p>Almost a month ago, I found out that Steve Kaufmann was the one who founded <a href="https://www.lingq.com" target="_BLANK">LingQ</a>. I had sort of disregarded LingQ before, but seeing that he was the one who founded it and thinking, of the pop sources, he proposed the most in-depth and researched "learning technique ideals", I thought it would be good to look back on.</p>
<p>Previously, I saw LingQ's library thinking it was all they had (which it may have been at the time - I don't know) and that it was boring. When I tried to use it anyway, I got paywalled like 2 minutes in, got annoyed, and stopped. This time, I just got the subscription to try it out. Afterwards, using the system was pretty nice actually. The best feature, in my opinion, is the ability to import from popular sources like YouTube and Netflix (Netflix only if subtitles are available - which is unfortunately often not the case for Japanese).</p>
<p>For example, I was able to learn the lyrics to both <a href="https://www.youtube.com/watch?v=p2MRCdUDGWQ" target="_BLANK">"Papermoon"</a> by Tommy heavenly6 and <a href="https://www.youtube.com/watch?v=XrnKERoTKAE" target="_BLANK">"Parallel Line"</a> by SAYURI. Both songs also did not have any subtitles on YouTube, so LingQ used AI to automatically caption them - and pretty well from what I can tell.</p>
<figure>
    <img src="/blog/language-learning-log-week-1/papermoon-lingq.png">
    <figcaption>Screenshot of LingQ showing the Papermoon YouTube video playing in a box with a Japanese sentence, "夢を見失って迷うった時", in LingQ's "Sentence View" pulled up showing words I'm still learning highlighted with their definitions shown below (they also appear when hovered). It also includes a translation: "When you lost sight of your dream and feel lost" (the sentence is not complete - it continues to the next page).</figcaption>
</figure>
<figure>
    <img src="/blog/language-learning-log-week-1/parallel-line-lingq.png">
    <figcaption>This is a screenshot of me learning the lyrics to "Parallel Line" in LingQ with the same kind of information pulled up in the same view. The sentence this time is "君の唇から零れ出す言葉になりたい".</figcaption>
</figure>
<p>I think line goes so hard, so I'm going to try to explain what you need to know to be able to read it too even if you haven't studied Japanese before. Note this probably isn't perfect.</p>
<p>
    "君の唇から零れ出す言葉になりたい" required skills:
    </p><ol>
        <li>Recognize "君" (pronunciation: <a href="https://forvo.com/word/%E5%90%9B/#ja" target="_BLANK">fovoro.com</a>) means "you" with a sense some level of comradery</li>
        <li>Recognize "の" (pronunciation: <a href="https://forvo.com/word/%E3%81%AE/#ja" target="_BLANK">fovoro.com</a>) directly after a noun-like thing creates an adjective-like thing meaning like "owned/controlled by the preceding noun"</li>
        <li>Recognize that an adjective-like thing is directly before a noun-like thing modifies the noun-like thing (note: a good proportion of adjective-like things require a linking word like "な", but not all - does not matter for reading/listening/input though)</li>
        <li>Recognize "唇" (pronunciation: <a href="https://forvo.com/word/%E5%94%87/#ja" target="_BLANK">fovoro.com</a>) means "lips"</li>
        <li>Recognize "から" (pronunciation: <a href="https://forvo.com/word/%E3%81%8B%E3%82%89/#ja" target="_BLANK">fovoro.com</a>) indicates the preceding is where the subject of the verb phrase comes from</li>
        <li>Recognize that in situations where adding "る" (pronunciation: <a href="https://forvo.com/word/%E3%82%8B/#ja" target="_BLANK">fovoro.com</a>) to the end of something/linguistic stimulus (for reading, text) creates a recognizable present tense form of a verb that the original linguistic stimulus is likely the stem form the verb</li>
        <li>Recognize "零れる" (pronunciation: <a href="https://forvo.com/word/%E9%9B%B6%E3%82%8C%E3%82%8B/#ja" target="_BLANK">fovoro.com</a>) is the present tense form of a verb that means like "to spill"/for things with liquid-like movement (space filling), "to leave a container without control"</li>
        <li>Recognize that the stem form of a verb preceding another proceeding verb combines the meaning of the preceding and proceding verb into a verb of the same form as the proceeding (this pattern is often used only for specific verb combinations - does not matter for input though)</li>
        <li>"出す" (pronunciation: <a href="https://forvo.com/word/%E5%87%BA%E3%81%99/#ja" target="_BLANK">fovoro.com</a>) is the present tense form of a verb that means like "to take something out from something"</li>
        <li>Recognize that a verb, that is not in a polite form, before a noun can modify the noun to have properties of the whole preceding verb phrase</li>
        <li>"言葉" (pronunciation: <a href="https://forvo.com/word/%E8%A8%80%E8%91%89/#ja" target="_BLANK">fovoro.com</a>) means "a word"/"words"</li>
        <li>"に" (pronunciation: <a href="https://forvo.com/word/%E3%81%AB/#ja" target="_BLANK">fovoro.com</a>) can indicate the preceding is where the phrase's action/verb is going towards</li>
        <li>Recognize that in situations where replacing "りたい" (pronunciation: <a href="https://forvo.com/word/%E5%B1%A5%E5%B8%AF%EF%BC%88%E3%82%8A%E3%81%9F%E3%81%84%EF%BC%89/#ja" target="_BLANK">fovoro.com</a> - not a word so pronunciation might not be accurate to pitch) with "る" (pronunciation: <a href="https://forvo.com/word/%E3%82%8B/#ja" target="_BLANK">fovoro.com</a>) creates a recognizable present tense form of a verb that the original linguistic stimulus turns the verb phrase into an adjective-like phrase describing the desire for the phrase to occur</li>
        <li>"なる" (pronunciation: <a href="https://forvo.com/word/%E3%81%AA%E3%82%8B/#ja" target="_BLANK">fovoro.com</a>) is the present tense form of a verb meaning "to become"</li>
        <li>Recognize that, in Japanese, if one does not specify who they are talking about and it's not otherwise obvious, they are likely talking about themselves</li>
        <li>(not required for reading) If you want to reproduce or learn to recognize Japanese pronunciation, you should pay attention to the syllables/consonants &amp; vowels, spacing between syllables, and, at least a moderate extent, the intonation (called pitch accent - which syllables are higher or lower pitch in each word for Japanese)</li>
    </ol>
    Breaking it down then:
    <br>"君の" means "your" (skill #1 and #2)
    <br>"君の唇" means "your lips" (+ #3 and #4)
    <br>"君の唇から" means "from your lips" (+ #5)
    <br>"君の唇から零れ出す" means "spilling out from your lips" (+ #6, #7, #8, and #9)
    <br>"君の唇から零れ出す言葉" means "the words that spill out from your lips" (+ #10 and #11)
    <br>"君の唇から零れ出す言葉になりたい" means "the desire to become the words that spill out from your lips" (+ #12, #13, and #14)
    <br>"君の唇から零れ出す言葉になりたい" means "I am one who desires to become the words that spill out from your lips" (+ #15)
    <br>Less robotically, "I want to be the words that spill from your lips"
<p></p>
<p>Not sure why, but I thought it went hard. I didn't really pay attention too much to that line in the song before I knew what it meant, but now it's my favorite line in any Japanese song. I heard that the song is also an anime opening, so I might watch it later now.</p>
<p>However, looking back at LingQ, one may notice that LingQ only provides definitions of words and nothing about grammar and that 9/15 skills I outlined are more about grammar than words, something LingQ would then not be able to explain. LingQ can also only tell the difference between words by their textual representation. So, for different conjugations of the same verb (or adjective), LingQ and their users have to track basically the same thing multiple times. One may think, "Oh, well, there are only a certain number of conjugations for each word, so eventually every representation can be tracked and thus the approach is still sound.", but, in Japanese, words can be conjugated indefinitely and thus the limit to the number of textual representations for a given verb is actually infinite.</p>
<p>LingQ's philosophy is that through enough input, one will learn the grammar patterns naturally. Though, I think they're just coping because they haven't found a better solution. I understand the cope because I myself have found the problem to be really hard. I do think the problem is solveable, but only because I have possibly deluded myself into thinking I have a solution. While I would defend that my solution is not my delusion, I don't expect anyone (except investors) to care until I can prove it. I intend to prove it with my app.</p>
<p>I don't really want to criticize platforms until I have something to back it up (despite how much I enjoy it). I do personally agree that languages can be learned through only input (to be clear, I don't think it's the most efficient without leveraging one's first language through explanations), but I don't want to make it seem like I believe my current favorite language learning app, LingQ, is faultless.</p>
<p>To be honest, I haven't used LingQ every day since starting, but the reduction was necessary to not fail school, I think. I could be coping on that point since I've spent a few hours writing this blog post, but higher motivation is the point of this thing.</p>
<figure>
    <img src="/blog/language-learning-log-week-1/lingq-activity.png">
    <figcaption>High activity starting 4/5 to 4/11. Moderate activity on 4/15 and 4/18. Low activity 4/19, 4/20, 4/26, and 4/27. No activity other days.</figcaption>
</figure>
<p>I have been doing Duolingo pretty consistently due to the social aspect of trying to beat my brother's streak and despite my hatred for it.</p>
<figure>
    <img src="/blog/language-learning-log-week-1/duolingo-activity.png">
    <figcaption>Streak on Duolingo from 3/31 to 4/27 with a streak freeze on 4/14.</figcaption>
</figure>
<p>I did do an hour long tutoring session for the first time this month where we spoke in pretty much just Japanese the whole time. I found it challenging to create long phrases, but I felt decently comfortable and it was very fun. I am considering doing more tutoring sessions, but I don't know when since it's hard for me to schedule in advance.</p>
<p>Anyway, generally the plan to continue this series is to share things I find cool over the week and talk about how I feel about my progress in a way that that I hope can be useful to others. I plan to release a post every week on Sunday. I will release on Saturday this week because I want to though.</p>
<p>Have a good day,<br>Clayton</p>
<i>Duolingo owl model in thumbnail from <a href="https://sketchfab.com/3d-models/duolingo-6e98824568be4666b44577b7a41120ee">Toy War on Sketchfab</a></i>
]]></content:encoded><enclosure url="https://claytonhickey.me/blog/language-learning-log-week-1/voiceover.mp3" length="29531159" type="audio/mpeg"/></item><item><title>Handling Comments Attempt #2</title><description>Handling comments on a blog is difficult. My solution: don't (directly)</description><media:description type="plain">Handling comments on a blog is difficult. My solution: don't (directly)</media:description><link>https://claytonhickey.me/blog/handling-comments-attempt-2/</link><guid>https://claytonhickey.me/blog/handling-comments-attempt-2/</guid><pubDate>Fri, 26 Apr 2024 11:11:30 EDT</pubDate><itunes:image href="https://claytonhickey.me/blog/handling-comments-attempt-2/new-comments-16-9.png"/><content:encoded><![CDATA[<p><span lang="en">Read directly: </span><a href="https://claytonhickey.me/blog/handling-comments-attempt-2/">https://claytonhickey.me/blog/handling-comments-attempt-2/</a></p><h1>Handling Comments Attempt #2</h1>
<p>I noticed that despite having all the cool meta tags I put on my site, the SEO (search engine optimization/discoverability through Google-like searches) for my blog is still kind of terrible.</p>
<figure>
    <img src="/blog/handling-comments-attempt-2/google-search.webp">
    <figcaption>Tiny, at the bottom (13th position) of this screenshot of a Google search for "Clayton Hickey", you can see my blog with some weird description.</figcaption>
</figure>
<p>While I don't feel too bad about myself because I also occupy the 3rd, 6th, and 9th position, I obviously aspire to be 1st, and I definitely want <b>my</b> blog to be above "my" LinkedIn.</p>
<p>Unfortunately, I don't believe this is a technical issue - it's a popularity issue.</p>
<p>Popularity issues is completely understandable. Most people don't read blogs as far as I know and how would one even find my blog? I'm not popular on any other platform and no one is talking about the blog.</p>
<p>There is actually pretty good data to support the previous paragraph's statement:</p>
<figure>
    <img src="/blog/handling-comments-attempt-2/cloudflare-traffic.png">
    <figcaption>1.73k unique visitors per month according to Cloudflare. This number is likely very inflated because about half of the traffic is apparently coming from non-English speaking countries (China and Singapore) and because it probably includes a good number of bots since I don't use Cloudflare's on-site analytics (can't disable DNS level and I get ~22 attacks/month, so I need Cloudflare).</figcaption>
</figure>
<p>I failed to get a screenshot before wasting my "free lookups", but the only sites linking to this site are mine/sites I've posted on and <a href="https://haydenshuker.com/articles/l2.html" target="_BLANK">Hayden Shuker's blog</a>. External links from other (also highly &amp; reputably linked) sites are pretty much the most important thing for SEO.</p>
<p>So, when it comes to the question of how I should implement comments, I consider this and a few other things. Firstly, I should acknowledge the most intuitive implementation based on what other popular sites do would be to either add an account-like system to my site (note: this situation is nearly equivalent to my old solution of loading comments from my Mastodon server, <a href="https://cdt.social" target="_BLANK">https://cdt.social</a>) so users can create comments directly. This solution has many issues that make me not want to do it:</p>
<ul>
    <li>I would have to do a lot of work to get such a complex system working (including creating a whole new API server for the blog)</li>
    <li>I would have to curate comments to make sure they're not breaking any laws or something (too much work)</li>
    <li>I would be the source of trust of what comments are genuine (could be accused of over-curating or falsifying)</li>
    <li>It wouldn't help SEO since all comments are site-only</li>
    <li>Commenter's accounts would have little external significance (Is "Joe Biden" on Clayton Hickey's blog really the president?)</li>
</ul>
<p>The second most intuitive solution (to me) is to simply not have comments. "It's not <i>my</i> responsibility to serve your every desire." Though, I would be lying because it's actually my desire. On other platforms, like <a href="https://twitter.com/ClaytonsThings" target="_BLANK">𝕏</a>, one of my favorite things to do when reading something mildly interesting is to read what other people/bots are saying about it.</p>
<p>So, what I want from a comment system:</p>
<ul>
    <li>Promotes people talking about posts on other platforms (linking to them for juicy SEO)</li>
    <li>I would be able to easily find them</li>
    <li>I wouldn't have to do much work</li>
</ul>
<p>From this, I devised another plan without thinking too much: just show posts mentioning the specific blog post other platforms already aggregated (like 𝕏, Google, and Reddit). Unfortunately, those platforms have disabled embedding with iframes, so I can't display the posts directly on the blog. However, it probably suffices to link out instead because one cannot read a blog post and comments simultaneously anyway.</p>
<figure>
    <img src="/blog/handling-comments-attempt-2/old-comments.png">
    <figcaption>The old comments: just pulling from a thread on <a href="https://cdt.social" target="_BLANK">cdt.social</a> (no one has ever commented with the old system).</figcaption>
</figure>
<figure>
    <img src="/blog/handling-comments-attempt-2/new-comments.png">
    <figcaption>The new comments: "Like this post? Follow with RSS; What others are saying on: 𝕏, Google, Reddit; Comment on: 𝕏, Reddit, Facebook; Comment to me directly: clayton@claytondoesthings.xyz" + the old comments still (cut off in the image because it doesn't work in development mode).</figcaption>
</figure>
<p>Unfortunately, it looks pretty ugly in my opinion. Fortunately, the whole site looks kinda ugly in my opinion, so it doesn't really change anything. It's a problem for another day.</p>
]]></content:encoded></item><item><title>Mathematical Proof: You Should Just Start Reading in Your Target Language</title><description>For Christmas 2 years ago, I received every light novel of Re:Zero in Japanese, but I still can't read them fluently because I am still not good at Japanese. So, in this blog post, I create a model to demonstrate the rapid progress one would make by just starting to read in one's target language.</description><media:description type="plain">For Christmas 2 years ago, I received every light novel of Re:Zero in Japanese, but I still can't read them fluently because I am still not good at Japanese. So, in this blog post, I create a model to demonstrate the rapid progress one would make by just starting to read in one's target language.</media:description><link>https://claytonhickey.me/blog/mathematical-proof-you-should-just-start-reading-in-your-target-language/</link><guid>https://claytonhickey.me/blog/mathematical-proof-you-should-just-start-reading-in-your-target-language/</guid><pubDate>Mon, 25 Mar 2024 17:36:40 EDT</pubDate><itunes:image href="https://claytonhickey.me/blog/mathematical-proof-you-should-just-start-reading-in-your-target-language/Re-Zero-recognition-graph.webp"/><content:encoded><![CDATA[<p><span lang="en">Read directly: </span><a href="https://claytonhickey.me/blog/mathematical-proof-you-should-just-start-reading-in-your-target-language/">https://claytonhickey.me/blog/mathematical-proof-you-should-just-start-reading-in-your-target-language/</a></p><script id="MathJax-script" src="/scripts/mathjax/tex-mml-chtml.js"></script>
<h1>Mathematical Proof: You Should Just Start Reading in Your Target Language</h1>
<p>The goal is to find a function to approximate the ease of reading as a function as progress through a book with the assumption that nothing is known at the beginning of reading.</p>
<p>To create a model to simulate one's mind when reading a book, let's first set up some variables.</p>
<p>Let \(n=\)the number of unique words in the book</p>
<p>Let \(L=\)the total number of words in the book</p>
<p>We will consider the list of unique words in the book to be ordered from most frequent to least frequent and numbered 1 to \(n\)</p>
<p>Let \(p(w)\) be a function that gets the frequency of the \(w\)th word in the list</p>
<p>According <a href="https://en.wikipedia.org/wiki/Zipf%27s_law" target="_BLANK">Zipf's Law</a>, the frequency of each word will be equal to \(p(w)=\frac{f_1}{w}\) where \(f_1\) is the frequency of the most frequent word (\(w=1\)).</p>
<p>The sum of the frequencies of the words, \(\sum_{w=1}^{n}p(w)\), will be equal to \(100\%\) simply because the chance of a given word being any word in the list of all possible words is \(100\%\).</p>
<p>Therefore, to find \(f_1\) so that we can fully define \(p(w)\), we need to find what value of \(f_1\) will make the equality \(\sum_{w=1}^{n}p(w)=\sum_{w=1}^{n}\frac{f_1}{w}=100\%\) true.</p>
<p>\(\sum_{w=1}^{n}\frac{f_1}{w}=100\%\)</p>
<p>is equivalent to</p>
<p>\(f_1*\sum_{w=1}^{n}\frac{1}{w}=100*\frac{1}{100}\)</p>
<p>because multiplying each term of the sum by \(f_1\) is the same as multiplying the whole sum by \(f_1\) and \(\%=\frac{1}{100}\) by definition. Simplifying the right side and then dividing each side by \(\sum_{w=1}^{n}\frac{1}{w}\) to isolate \(f_1\) then yields:</p>
<p>\(f_1=\frac{1}{\sum_{w=1}^{n}\frac{1}{w}}\)</p>
<p>This cannot be simplified any further because \(\sum_{w=1}^{n}\frac{1}{w}\) is the partial sum of the <a href="https://en.wikipedia.org/wiki/Harmonic_series_(mathematics)#Partial_sums" target="_BLANK">harmonic series</a> which does not have a simpler solution, but you can use a calculator to calculate it. It can also be approximated by \(\frac{1}{ln(n)}\) (a slight overestimate).</p>
<p>Continuing expanding on the model:</p>
<p>Let \(r=\) the chance of learning a word after seeing it</p>
<p>Let \(k(w,i)=\)the probability of remembering the \(w\)th most frequent word after reading \(i\) words</p>
<p>by the opposite:</p>
<p>\(k(w,i)=100\%-\)the probability of not remembering the \(w\)th most frequent word after reading \(i\) words</p>
<p>from \(i\) repeated independent events (not really independent, but it's only a slight underestimate):</p>
<p>\(k(w,i)=100\%-(\)the probability of not learning the \(w\)th most frequent word after reading a word\()^i\)</p>
<p>by the opposite:</p>
<p>\(k(w,i)=100\%-(100\%-\)the probability of learning the \(w\)th most frequent word after reading a word\()^i\)</p>
<p>\(k(w,i)=100\%-(100\%-\)the probability of reading the \(w\)th most frequent word\(*\)the probability of learning a word after seeing it\()^i\)</p>
<p>\(k(w,i)=100\%-(100\%-p(w)*r)^i\)</p>
<p>converting from percents \(100\%=1\):</p>
<p>\(k(w,i)=1-(1-p(w)*r)^i\)</p>
<p>This completes the definition of \(k(w,i)\) because \(r\) is a variable we manually manipulate, \(p(w)\) is already defined, and \(w\) and \(i\) are inputs.</p>
<p>Let \(e_w(i)=\)the probability of remembering the \(i\)th word read</p>
<p>\(e_w(i)=\)the sum of the probabilities of remembering each word after reading \(i\) words weighted by the probability of seeing each word</p>
<p>\(e_w(i)=\sum_{w=1}^{n}(\)the probability of remembering the \(w\)th most frequent word\(*\)the probability of seeing the \(w\)th most frequent word\()\)</p>
<p>\(e_w(i)=\sum_{w=1}^{n}(k(w,i)*p(w))\)</p>
<p>This completes the definition of \(e_w(i)\).</p>
<p>Let \(a=\)the average sentence length</p>
<p>Let \(e_s(i)=\)the probability of remembering all the words in the next sentence after reading \(i\) words</p>
<p>\(e_s(i)=\)the probability of remembering the next \(a\) words after reading \(i\) words</p>
<p>by repeated \(a\) repeated independent events (assuming nothing was learned from the next \(a\) words):</p>
<p>\(e_s(i)=(\)the probability of remembering a word after reading \(i\) words\()^a\)</p>
<p>\(e_s(i)=(e_w(i))^a\)</p>
<p>Let \(E_w(t)=\)the chance of remembering the next word after reading \(t\) percent of the book</p>
<p>\(E_w(t)=e_w(\)how many words read after reading \(t\) percent of the book\()\)</p>
<p>\(E_w(t)=e_w(\)the number of words in the book\(*\)the percent of words read\(*\frac{1}{100\%})\)</p>
<p>\(E_w(t)=e_w(\frac{L*t}{100\%})\)</p>
<p>Let \(E_s(t)=\)the chance of remembering the next sentence after reading \(t\) percent of the book</p>
<p>\(E_s(t)=e_s(\)how many words read after reading \(t\) percent of the book\()\)</p>
<p>\(E_w(t)=e_s(\)the number of words in the book\(*\)the percent of words read\(*\frac{1}{100\%})\)</p>
<p>\(E_w(t)=e_s(\frac{L*t}{100\%})\)</p>
<p>This completes the model as we have found a few functions \((e_w(i), e_s(i), E_w(t), E_s(t))\) to estimate the ease of reading as a function of progress. Below is an implementation of the model you can manipulate (note: not all the input variables will be used depending on the calculation).</p>
<script>
    function calculate_f_1() {
        let harmonicSum = 0;
        for (let w = 1; w <= calculator_n.valueAsNumber; w++) {
            harmonicSum += 1/w;
        }
        return 1/harmonicSum;
    }

    function calculate_p(f_1, w) {
        return f_1/w;
    }

    function calculate_k(f_1, i, w) {
        return 1-(1-calculate_p(f_1, w)*calculator_r.valueAsNumber/100)**i;
    }

    function calculate_e_w(f_1, i) {
        let e_w = 0;
        for (let w = 1; w <= calculator_n.valueAsNumber; w++) {
            let p = calculate_p(f_1, w);
            e_w += (1-(1-p*calculator_r.valueAsNumber/100)**i)*p;
        }
        return e_w;
    }

    function calculate_e_s(f_1, i) {
        return (calculate_e_w(f_1, i))**(calculator_a.valueAsNumber);
    }

    function calculate_i() {
        return Math.floor(calculator_L.valueAsNumber*calculator_t.valueAsNumber/100);
    }

    function calculateModel(e) {
        if (calculator_action.value === "find E_w") {
            calculation_output.innerText = `\\(E_w(t)=${calculate_e_w(calculate_f_1(), calculate_i())*100}\\%\\)`;
            MathJax.typeset();
        }  else if (calculator_action.value === "solve E_w") {
            let e_w = calculator_E_w.valueAsNumber/100;
            let f_1 = calculate_f_1();
            let max_e_w = calculate_e_w(f_1, calculator_L.valueAsNumber);
            if (max_e_w < e_w) {
                calculation_output.innerText = `Target value is greater than the max, ${max_e_w*100}%`;
                return false;
            }
            let delta = max_e_w;
            let t = 0.5;
            let min = 0;
            let max = 1;
            while (Math.abs(delta) >= 0.001 && max-min > 0.001) {
                t = (min+max)/2;
                console.log(`testing t=${t}`);
                delta = e_w-calculate_e_w(f_1, Math.floor(calculator_L.valueAsNumber*t));
                if (delta > 0) {
                    min = t;
                } else if (delta < 0) {
                    max = t;
                } else {
                    break;
                }
            }
            calculation_output.innerText = `\\(t=${t*100}\\%\\)`;
            MathJax.typeset();
        } else if (calculator_action.value === "find E_s") {
            calculation_output.innerText = `\\(E_s(t)=${calculate_e_s(calculate_f_1(), calculate_i())*100}\\%\\)`;
            MathJax.typeset();
        } else if (calculator_action.value === "solve E_s") {
            let e_s = calculator_E_s.valueAsNumber/100;
            let f_1 = calculate_f_1();
            let max_e_s = calculate_e_s(f_1, calculator_L.valueAsNumber);
            if (max_e_s < e_s) {
                calculation_output.innerText = `Target value is greater than the max, ${max_e_s*100}%`;
                return false;
            }
            let delta = max_e_s;
            let t = 0.5;
            let min = 0;
            let max = 1;
            while (Math.abs(delta) >= 0.001 && max-min > 0.001) {
                t = (min+max)/2;
                console.log(`testing t=${t}`);
                delta = e_s-calculate_e_s(f_1, Math.floor(calculator_L.valueAsNumber*t));
                if (delta > 0) {
                    min = t;
                } else if (delta < 0) {
                    max = t;
                } else {
                    break;
                }
            }
            calculation_output.innerText = `\\(t=${t*100}\\%\\)`;
            MathJax.typeset();
        }

        return false;
    }
    
    document.addEventListener("DOMContentLoaded", () => calculateModel())
</script>
<form onsubmit="return calculateModel()">
    <select name="action" id="calculator_action">
        <option value="find E_w">Find \(E_w(t)\), the chance of remembering the next word after reading \(t\) percent of the book</option>
        <option selected="" value="solve E_w">Solve \(E_w(t)\), the chance of remembering the next word after reading \(t\) percent of the book, for \(t\)</option>
        <option value="find E_s">Find \(E_s(t)\), the chance of remembering the next sentence after reading \(t\) percent of the book</option>
        <option value="solve E_s">Solve \(E_s(t)\), the chance of remembering the next sentence after reading \(t\) percent of the book, for \(t\)</option>
    </select>
    <br><label for="n">\(n\), number of unique words</label>
    <input name="n" id="calculator_n" type="number" min="1" step="1" value="7519">
    <br><label for="L">\(L\), length of the book</label>
    <input name="L" id="calculator_L" type="number" min="1" step="1" value="52997">
    <br><label for="r">\(r\), chance of remembering (a percent)</label>
    <input name="r" id="calculator_r" type="number" min="0" max="100" value="50">
    <br><label for="a">\(a\), average sentence length</label>
    <input name="a" id="calculator_a" type="number" min="1" step="1" value="20">
    <br><label for="t">\(t\), percent of book read</label>
    <input name="t" id="calculator_t" type="number" min="0" max="100" value="0">
    <br><label for="E_w">\(E_w(t)\), chance of remembering the next word after reading \(t\) percent of the book</label>
    <input name="E_w" id="calculator_E_w" type="number" min="0" max="100" value="50">
    <br><label for="E_s">\(E_s(t)\), chance of remembering the next sentence after reading \(t\) percent of the book</label>
    <input name="E_s" id="calculator_E_s" type="number" min="0" max="100" value="10">
    <br><input type="submit" value="Calculate">
    <p id="calculation_output">Output</p>
</form>
<p>Based on the model, for me to have a 50% of remembering the next word when reading the first volume of Re:Zero, which as 7519 unique words and 52997 words total (according jpdb.io: <a href="https://jpdb.io/novel/1611/re-zero-starting-life-in-another-world" target="_BLANK">https://jpdb.io/novel/1611/re-zero-starting-life-in-another-world</a>), assuming I knew 0 Japanese before reading and that I had a 50% chance of learning a word each time I saw it (probably assisted by Anki), I would only have to read about 1.27% of the book (or about 4 pages) to have about a 50% chance knowing the next word, which is much less than I thought.</p>
<figure><img src="/blog/mathematical-proof-you-should-just-start-reading-in-your-target-language/Re-Zero-recognition-graph.webp"><figcaption>A graph of the predicted recognition chance of Re:Zero Volume 1 showing word recognition rapidly increasing at the beginning and leveling off at around 80-90% after reading 20% of the book and sentence recognition increasing slowly, with some acceleration towards the end, to about 20%.</figcaption></figure>
<p>By using <a href="https://github.com/themoeway/yomitan" target="_BLANK">Yomitan</a> for reading on the web, <a href="https://takoboto.jp/" target="_BLANK">Takoboto</a> for dictionary lookup on mobile (and creating Anki cards), and Google's Japanese handwriting OCR, I have reduced the friction of looking up new words a lot. So, that combined with the promising predictions has made pushing through reading difficult material a lot more encouraging.</p>
]]></content:encoded></item><item><title>My Current Projects</title><description>A slightly lengthy outline of my current projects.</description><media:description type="plain">A slightly lengthy outline of my current projects.</media:description><link>https://claytonhickey.me/blog/my-current-projects/</link><guid>https://claytonhickey.me/blog/my-current-projects/</guid><pubDate>Mon, 11 Mar 2024 18:42:26 EDT</pubDate><itunes:image href="https://claytonhickey.me/blog/my-current-projects/stick-figure-on-a-computer.webp"/><content:encoded><![CDATA[<p><span lang="en">Read directly: </span><a href="https://claytonhickey.me/blog/my-current-projects/">https://claytonhickey.me/blog/my-current-projects/</a></p><h1>My Current Projects</h1>
<p>I was talking to <a href="https://haydenshuker.com" target="_BLANK">Hayden Shuker</a> yesterday and I realized I haven’t really outlined any of my current projects on this blog, so I shall.</p>
<h2>This Blog</h2>
	<p>Over spring break, I rewrote my blog to be statically generated with OCaml and untethered from NixOS’s configuration. In the following diagram, you may see how I made this decision:</p>
	
<figure><img src="old-vs-new-blog-process.webp" alt="Funny diagram describing the old vs new process."><figcaption>Previously, to create a new blog post, I would have to copy the standard HTML header, edit the header for the blog post, write the blog post in HTML, add the post to the RSS feed, add the post to the sitemap, commit and push the changes to GitHub, ssh into the server computer, paste the new revision ID into the NixOS configuration, rebuild, copy the new hash from the failed build, paste the hash into the NixOS configuration, rebuild, post a thread for comments on mastodon, add the mastodon thread ID for comments, commit and push the changes to GitHub, paste the new revision ID into the NixOS configuration, rebuild, copy the new hash from the failed build, paste the hash into the NixOS configuration, and rebuild. Now, I just add a folder with the metadata, HTML, and assets, commit and push  the changes to GitHub, add the mastodon thread ID for comments, and commit and push the changes to GitHub.</figcaption></figure>

<p>I chose OCaml because it can run like an interpreted language while still having types, and I thought I learned it in college last semester (I forgot). In the following diagram, you will understand why a compiled language is unnecessary:</p>

<figure><img src="why-ocaml.webp" alt="Short diagram explaining why an interpreted language like OCaml"><figcaption>When using a compiled language to make a static site generator, you first have to compile the static site generator and then run it, but since you only need to run it once, you need to compile every time you use it. With an interpreted language, the program just runs, which will almost always be faster than compiling and then running simply because of less layers in-between.</figcaption></figure>

<p>Unfortunately, you may have noticed that all the blog posts became inaccessible (shoutout to <a href="https://haydenshuker.com" target="_BLANK">Hayden</a> for notifying me). That is because of this fun little line, <code>Sys.mkdir "www" 777</code>. The "777" is supposed to make the "www" folder, which stores all the content for the website, accessible to all users of the systems - including the system user, nginx, that serves the website to users. "777" refers to the "unix?" command <code>chmod 777 <file></file></code> to make things fun and quirky. Apparently, by default, the "777" in chmod is in octal (base 8 instead of normal base 10 numbers). So, the "777", in normal numbers, is actually 511. Fortunately, OCaml does not randomly change the base of numbers depending on the function, but that means that "777" was not the correct input into <code>Sys.mkdir "www"</code> for the desired output (the correct input is "0o777" to make it octal) and I got folders with wonky permissions, somehow making all the website’s files except blog posts publicly accessible. You may wonder how I did not catch this mistake, but the answer is quite simple: I programmed the website on Windows, which ignores Unix’s funny file permissions, and it was really <a href="https://stackoverflow.com/questions/70633829/create-directory-when-it-does-not-exist" target="_BLANK">Stack Overflow</a>’s fault if you really think about it:</p>

<figure><img src="/blog/my-current-projects/stack-overflow-wrong-mkdir-ocaml.png" alt="A stack overflow answer saying to write 777 with a comment by Adam Dingle saying that’s wrong and to instead use 0o777"><figcaption>A stack overflow answer saying to write 777 with a comment by Adam Dingle saying that’s wrong and to instead use 0o777</figcaption></figure>

<p>If only I read <a href="https://stackoverflow.com/users/4034070/adam-dingle" target="_BLANK">Adam Dingle</a>’s comment.</p>

<p>Now that everything’s fixed, I’m currently writing this with my new workflow, HTML in Google Docs:</p>

<figure><img src="/blog/my-current-projects/google-doc-html.png" alt="The previous figure written in Google Docs in HTML format"><figcaption>The previous figure written in Google Docs in HTML format</figcaption></figure>

<p>Seems to be working nicely, despite it looking cursed.</p>
<h2>Tutor Engine</h2>
	<p>I’m starting a startup based on my work on a language learning app for the past 4 years. I finished developing a prototype last December. After testing the prototype with my brother and my dad and getting some feedback from some professors, I’m confident in the method. The prototype though is ugly, unintuitive, doesn’t work on mobile, and too reliant on alpha-stage open source projects. So, I’m rewriting it in <a href="https://flutter.dev/" target="_BLANK">Flutter</a>. For an end user, the interface will simply be: choose some books, TV shows, movies, language exams, etc. as their next learning goals, receive an automatically generated "shortest path" to their goal, press "study", receive precise instruction and minimal immersive exercises based on a simple &amp; tunable <a href="https://en.wikipedia.org/wiki/Spaced_repetition" target="_BLANK">spaced repetition algorithm</a>, exit "study" at any time, receive cool screen precisely documenting your progress.</p>
<h2>Workspace</h2>
	<p>I was previously writing a GUI-based programming language to solve the problem of compilers abstracting away machine code too much. In a way, programming in a programming language is more like programming a program that programs machine code. So, the idea of the programming language was to show what the resulting machine code would be at every step, but macro-like interactions would still require programming the programming language in the programming language, which seems kind of ridiculous. So, I thought that perhaps just writing machine code would be useful, but machine code is still confusing and just writing it directly wouldn’t allow for writing a program that works on different CPU architectures (and tbh I want it to work for synthetic biology too, but maybe that’s crazy). Currently, I’m enjoying using Neovim for normal programming which gives you a bunch of fun keyboard commands to manipulate things and a fully traversable edit history even with custom macros and command. Thinking about: "why can’t one make a similar environment for machine code?", "Why can’t one make a similar environment that is output format agnostic?". I think I can.</p>
	<p>I started making this in Flutter, but it’s not a high priority. It almost minimally works, though. Still not sure if this makes any sense.</p>
<h2>Some way to simulate proteins accurately and quickly without a supercomputer or statistical AI</h2>
	<p>I believe that there must be some way to simulate proteins accurately and quickly without supercomputer-scale computation power because that would be sad. Learning about other physics experiments before computers, they always had some kind of unique way to model things using physics instead of digital computer algorithms. I think that part of the issue with current efforts to create simulations is an addiction to computer algorithms that are only capable of digital manipulations that suffer from both syncing and locality issues.</p>
	<p>From what I understand, the hard part of protein simulation is simulating the electric (and other field forces) fields that move the particles and their fields about. So, my current working idea is to create something like a "FiPU (Field Processing Unit)" that creates real fields (like, in real life) and measures them (like, in real life) as an accelerator card like GPUs (Graphical Processing Units). However, I worry that I don’t know computer engineering well, don’t have access to semiconductor factories, that it may have to be huge, and that it may not make any sense.</p>
<h2>Solve Aging</h2>
	<p>All of the above projects and me going for a bioengineering degree somehow aid in this project. The blog helps me think and get out of my personal thought bubble, the learning app makes me smarter, the workspace app will hopefully allow simpler design of the required biomolecules, and the simulations will allow those biomolecules to be quickly iteratively tested.</p>
	<p>I want to solve aging because success will theoretically give me at least some multiples of the current expected time I have to do fun things. If you think aging and death somehow gives value to life, I think you’re just coping (unless it's a religious thing). To be extra clear, when I say "solving aging" I mean "getting rid of and/or reversing age-related deterioration", not "stopping and/or reversing maturing".</p>
]]></content:encoded></item><item><title>My User-Control-Focused Stack</title><description>How I use various systems like RSS, Mastodon/Activity Pub, Linode, Nextcloud, and Nix to increase my computational independence.</description><media:description type="plain">How I use various systems like RSS, Mastodon/Activity Pub, Linode, Nextcloud, and Nix to increase my computational independence.</media:description><link>https://claytonhickey.me/blog/my-user-control-focused-stack/</link><guid>https://claytonhickey.me/blog/my-user-control-focused-stack/</guid><pubDate>Sun, 11 Feb 2024 00:32:00 EST</pubDate><itunes:image href="https://claytonhickey.me/blog/my-user-control-focused-stack/thumb.png"/><content:encoded><![CDATA[<p><span lang="en">Read directly: </span><a href="https://claytonhickey.me/blog/my-user-control-focused-stack/">https://claytonhickey.me/blog/my-user-control-focused-stack/</a></p><h1>My User-Control-Focused Stack</h1>
<p>Published: 2024-01-11 by Clayton Hickey</p>
<p>
As someone who likes to have control over what they use and dislikes businesses that infringe on rights that I believe users should have, I have sought more open alternatives to software and hardware than the more closed-off alternatives. For those who share similar preferences, I hope the following can help you get started. Mostly, I wrote this practice.
</p>
<h2>Server Hosting with Linode</h2>
<p>
Unfortunately, the ISP at my house blocks hosting from ports <code>80</code> and <code>433</code>, so I use <a target="_BLANK" href="https://www.linode.com/">Linode</a>. I tried to use <a target="_BLANK" href="https://aws.amazon.com/">AWS</a>, but as a minor at the time of trying, it was too annoying to create an account. Linode is very straightforward which I like. If you want a server, you create a Linode, basically just a cloud-connected computer on the internet. The connection is barebones enough that you can probably install whatever operating system you want. Personally, I run NixOS. On a single Linode, I host nearly every web-connected thing I use.
</p>
<i>If you also want to install NixOS on your Linode server, they have a tutorial: <a href="https://www.linode.com/docs/guides/install-nixos-on-linode/" target="_BLANK">https://www.linode.com/docs/guides/install-nixos-on-linode</a></i><p></p>
<p>
The base linode plan costs $5/month for 1GB RAM and 25GB storage. This was good enough for everything, but a Minecraft server, so I upgraded to the next tier up at $12/month for 2GB RAM and 50GB storage. I also bought 40GB extended storage for $4/month. You will see that I get good use out of this plan as I explain the services I have running on it.
</p>
<figure>
    <img src="/blog/my-user-control-focused-stack/linode.png">
    <figcaption>My single linode server</figcaption>
</figure>
<h2>Operating System/System Manager: NixOS</h2>
<p>
I use <a href="https://nixos.org/" target="_BLANK">NixOS</a> as my main operating system for both personal and server use. NixOS is cool because it allows you to define all the sys-admin type stuff about your system in a single configuration file. While I more often hear the reproducibility - the ability to copy over to another system or easilily - which is cool, especially if you're doing a serverless/sharded service, what I find most useful is the locality of it. The single config file, in one place, I find, significantly reduces the cognitive load compared trying to keep many disparate config files and programs in line with each other in an distro like Arch or Ubuntu. This makes it easier to set it, leave it, and come back. Instead of struggling to figure out how to sign into the Mastodon user or something, all you have to do is search for "mastodon" in the configuration file and possibly check the Mastodon section of the docs/wiki for config options.
</p>
<figure>
    <figcaption>Config for my NixOS server</figcaption>
    <textarea readonly="" rows="16" style="width: 100%">{ config, lib, pkgs, ... }:
let
  ClaytonXYZ = pkgs.callPackage(import (pkgs.fetchFromGitHub {
    owner = "ClaytonDoesThings";
    repo = "ClaytonXYZ";
    rev = "f377d44c0af6543643e3a0f7d6d436310ac28455";
    sha256 = "sha256-E07tCBbK4KJXlkZEAeYVkLzqAHh8T/fMlF2DqUWLqOU=";
  })) {};
  claytonhickeyme = import (pkgs.fetchFromGitHub {
    owner = "clay53";
    repo = "claytonhickey_me";
    rev = "69d2c5805ef4e969a19999e89e346a9d886bdb7a";
    sha256 = "sha256-L1tFapsXypqQ0j8om2PyavwZ4dr/BVl5NvYymNpzWM0=";
  });
  iloveu = import (pkgs.fetchFromGitHub {
    owner = "clay53";
    repo = "iloveu";
    rev = "2d0145d436d8c43ebabd10fb42b51f629bc75a0a";
    sha256 = "sha256-w0pyF2FQhL9y0pIvhxhl1EgeE7VbpzxYimiQInh+NYw=";
  });
  tutor_engine_org = import (pkgs.fetchFromGitHub {
    owner = "clay53";
    repo = "tutor_engine_org";
    rev = "157728cdcaa59d0ce86ed30955a7e38ad53a0fbc";
    sha256 = "sha256-2c1GAMnJNqUEv2WSobuTlKo16zwmngoQP0xOd3M5FBg=";
  });
  # For latest version of Minecraft server
  unstable = import (builtins.fetchTarball https://github.com/nixos/nixpkgs/tarball/nixos-unstable){
    config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [
      "minecraft-server"
    ];
  };
in
{
  imports =
    [
      ./hardware-configuration.nix
    ];

  boot.loader.grub.enable = true;
  networking.hostName = "loadedskypotato"; # Define your hostname.
  networking.networkmanager.enable = true;  # Easiest to use and most distros use this by default.
  networking.usePredictableInterfaceNames = false;
  networking.useDHCP = false;

  time.timeZone = "America/New_York";

  services.openssh = {
    enable = true;
    settings.PermitRootLogin = "yes";
  };

  # List packages installed in system profile. To search, run:
  # $ nix search wget
  environment.systemPackages = with pkgs; [
    neovim
    wget
    inetutils
    mtr
    sysstat
    htop
  ];

  systemd.services = {
    ClaytonXYZ = {
      wantedBy = [ "default.target" ];
      description = "claytondoesthings website";
      environment = {
	STATIC_DIR = "${ClaytonXYZ}/s";
	DOMAIN = "https://claytondoesthings.xyz";
      	ROCKET_PORT = "5000";
      };
      serviceConfig = {
        Type = "simple";
	ExecStart = ''${ClaytonXYZ}/bin/clayton_xyz'';
      };
    };
    iloveu = {
      wantedBy = [ "default.target" ];
      description = "iloveu server";
      serviceConfig = {
        Type = "simple";
	ExecStart = ''${iloveu.server}/bin/iloveu-server --address 127.0.0.1:5001 --password "nonononononono" --transactions-dir /Block/iloveu'';
      };
    };
  };

  services.nextcloud = {
    enable = true;
    package = pkgs.nextcloud27;
    extraApps = {
    	contacts = config.services.nextcloud.package.packages.apps.contacts;
    	calendar = config.services.nextcloud.package.packages.apps.calendar;
    	tasks = config.services.nextcloud.package.packages.apps.tasks;
	listman = pkgs.fetchNextcloudApp rec {
		url = "https://dalliance.net/listman/listman-27.1.3.tar.gz";
		sha256 = "sha256-zHGOHtHq4GFj0HYlk/EV8ATsgclXPYuIBD3eU6W2Mpg=";
	};
	news = pkgs.fetchNextcloudApp rec {
		url = "https://github.com/nextcloud/news/releases/download/25.0.0-alpha3/news.tar.gz";
		sha256 = "sha256-AENBJH/bEob5JQvw4WEi864mdLYJ5Mqe78HJH6ceCpI=";
	};
    };
    extraAppsEnable = true;
    hostName = "nextcloud.claytondoesthings.xyz";
    https = true;
    maxUploadSize = "16G";
    config.adminpassFile = "${pkgs.writeText "adminpass" "nonononononono"}";
    config.adminuser = "clay53";
    home = "/Block/nextcloud";
  };

  services.mastodon = {
    enable = true;
    localDomain = "cdt.social";
    configureNginx = true;
    smtp.fromAddress = "clayton@claytondoesthings.xyz";
    extraConfig.SINGLE_USER_MODE = "true";
    mediaAutoRemove.enable = false;
  };

  services.vaultwarden = {
    enable = true;
    config = {
      DOMAIN = "https://bitwarden.claytonhickey.me";
      SIGNUPS_ALLOWED = false;
      ROCKET_PORT = 5002;
    };
  };

  services.minecraft-server = {
    enable = true;
    eula = true;
    jvmOpts = "-Xmx1024M -Xms512M";
    dataDir = "/Block/mc-server";
    package = unstable.papermc;
    openFirewall = true;
  };

  services.nginx = {
    enable = true;

    recommendedProxySettings = true;
    recommendedTlsSettings = true;

    virtualHosts."claytondoesthings.xyz" = {
      enableACME = true;
      forceSSL = true;
      locations."/" = {
        proxyPass = "http://127.0.0.1:5000";
      };
    };

    virtualHosts."claytonhickey.me" = {
      enableACME = true;
      forceSSL = true;
      locations."/" = {
      	root = "${claytonhickeyme}";
      };
    };

    virtualHosts."tutorengine.org" = {
      enableACME = true;
      forceSSL = true;
      locations."/" = {
      	root = "${tutor_engine_org}";
      };
    };

    virtualHosts."iloveu-api.claytonhickey.me" = {
      enableACME = true;
      forceSSL = true;
      locations."/" = {
        proxyPass = "http://127.0.0.1:5001";
      };
    };

    virtualHosts."iloveu.claytonhickey.me" = {
      enableACME = true;
      forceSSL = true;
      locations."/" = {
      	root = "${iloveu.yew}";
      };
    };

    virtualHosts."${config.services.nextcloud.hostName}" = {
      forceSSL = true;
      enableACME = true;
    };

    virtualHosts."bitwarden.claytonhickey.me" = {
      enableACME = true;
      forceSSL = true;
      locations."/" = {
        proxyPass = "http://127.0.0.1:5002";
      };
    };
  };

  security.acme = {
    acceptTerms = true;
    defaults.email = "clayton@claytondoesthings.xyz";
  };

  networking.firewall.allowedTCPPorts = [
    80
    443
  ];

  system.copySystemConfiguration = true;

  system.autoUpgrade.enable = true;

  system.stateVersion = "23.05";
}</textarea>
</figure>
<p>
In just 215 lines, I have been able to setup:
</p>
<ul>
    <li>a Nextcloud instance with a calandar, tasks, mailing list, file storage and sharing, and an RSS aggregator</li>
    <li>a Mastodon instance</li>
    <li>a custom blog website</li>
    <li>a custom (depracted) project hosting website</li>
    <li>a website for my girlfriend and I to store pictures and videos</li>
    <li>a Minecraft server</li>
    <li>a dedicated website for my language learning app</li>
    <li>and a Vaultwarden/Bitwarden all reverse proxied through NGINX with automatic HTTPS certificate renewal through ACME.</li>
</ul>
<h2>File Storage/Backup with Nextcloud</h2>
<p>
While I don't have many UX qualms with Google Drive, I like to use <a target="_BLANK" href="https://nextcloud.com/files/">Nextcloud</a> file storage to reduce my reliance on Google. This keeps a folder on my desktop, laptop, server, and partially phone, in sync. If you notice on my GitHub, I don't push to public repositories very often. This is because I just have all my code sync through Nextcloud. I didn't like the experience of accidentally forgetting to commit and push when switching devices, so now I just have it always in sync with Nextcloud. Nextcloud files also allows me to automatically backup photos and videos I take on my phone. It also allows me to share and host the files anywhere with the ability to optionally password lock them.
</p>
<h2>Calendar and Tasks with Nextcloud</h2>
<p>
I used to do my calendaring and tasking with <a target="_BLANK" href="https://obsidian.md/">Obsidian</a>. However, I found the system too cumbersome to use and not really the right system for it. So, I turned on Nextcloud <a target="_BLANK" href="https://apps.nextcloud.com/apps/calendar">Calandar</a> and <a target="_BLANK" href="https://apps.nextcloud.com/apps/tasks">Tasks</a>. Through this, I get all the power of Google Calendar, but managed on my own system. I keep my contacts and calendar in sync with my phone through <a target="_BLANK" href="https://f-droid.org/en/packages/at.bitfire.davdroid/">DAVx<sup>5</sup></a>. Tasks are kept in sync with <a target="_BLANK" href="https://f-droid.org/en/packages/at.techbee.jtx/">jtx Board</a>.
</p>
<figure>
    <img src="/blog/my-user-control-focused-stack/nextcloud-calendar-example.png">
    <figcaption>Example of Nextcloud Calendar</figcaption>
</figure>
<p>
To turn these services on, I just had to add <code>calendar = config.services.nextcloud.package.packages.apps.calendar;</code> and <code>tasks = config.services.nextcloud.package.packages.apps.tasks;</code> to <code>services.nextcloud.extraApps = {...}</code>.
</p>
<h2>Contact syncing with Nextcloud</h2>
<p>
I didn't want Google have access to all my contacts, so I turned on <a target="_BLANK" href="https://apps.nextcloud.com/apps/contacts">Nextcloud Contacts</a>.
</p>
<p>
To turn this service on, I just had to add <code>contacts = config.services.nextcloud.package.packages.apps.contacts;</code> to <code>services.nextcloud.extraApps = {...}</code>.
</p>
<h2>Password Management with Vaultwarden</h2>
<p>
I host my own <a target="_BLANK" href="https://github.com/dani-garcia/vaultwarden">Vaultwarden</a>, a Rust rewrite of <a target="_BLANK" href="https://bitwarden.com/">Bitwarden</a>, instance to host my passwords. I have so far experienced no problems with it. It required adding 2 sections to my NixOS config:
</p>
<figure>
    <textarea readonly="" rows="8" style="width: 100%;">services.vaultwarden = {
  enable = true;
  config = {
    DOMAIN = "https://bitwarden.claytonhickey.me";
    SIGNUPS_ALLOWED = false;
    ROCKET_PORT = 5002;
  };
};</textarea>
    <figcaption>enables Vaultwarden</figcaption>
</figure>
<figure>
    <textarea readonly="" rows="7" style="width: 100%;">virtualHosts."bitwarden.claytonhickey.me" = {
  enableACME = true;
  forceSSL = true;
  locations."/" = {
    proxyPass = "http://127.0.0.1:5002";
  };
};</textarea>
    <figcaption>sets up reverse proxy and HTTPS certs when added to <code>services.nginx = {...}</code></figcaption>
</figure>
<h2>Decentralized Social Media with Activity Pub/Mastodon and RSS/Nextcloud News</h2>
<p>
I have found that what I'm most interested in on social media is more article/blog-post style content. While the hot takes and shitposts that can be found on <a target="_BLANK" href="https://x.com">𝕏</a> are sometimes funny, there is almost no utility to them or the follow-up replies. A lot of the times, it feels like there's almost no real conversation occuring on 𝕏. Sometimes people go back and forth, but usually not productively and either way, I will probably never "see" that person/bot ever again.
</p>
<p>
I'm not sure how Mastodon is supposed to solve the problems with 𝕏, but it at least allows users to own their own profile - unless they're on a multi-user instance, which I don't think they should be.
</p>
<p>To create a mastodon instance, I just added these 8 lines to my NixOS config:</p>
<textarea readonly="" rows="8" style="width: 100%;">services.mastodon = {
    enable = true;
    localDomain = "cdt.social";
    configureNginx = true;
    smtp.fromAddress = "clayton@claytondoesthings.xyz";
    extraConfig.SINGLE_USER_MODE = "true";
    mediaAutoRemove.enable = false;
};</textarea>
<p>
I also had to create my user profile, which is a single command described on the NixOS Wiki: <a target="_BLANK" href="https://nixos.wiki/wiki/Mastodon">https://nixos.wiki/wiki/Mastodon</a>.
</p>
<p>
I have found the <a target="_BLANK" href="https://f-droid.org/en/packages/com.keylesspalace.tusky/">Tusky on F-Droid</a> as a nice mobile Mastodon client. I just use the website on desktop.
</p>
<p>
I've always wondered how people keep up-to-date with blogs and stuff, but now it seems obvious: they use <a target="_BLANK" href="https://rss.com/blog/how-do-rss-feeds-work/">RSS</a> (<a target="_BLANK" href="https://www.rssboard.org/rss-specification">specification</a>)! I've heard of RSS bascially since I started using YouTube, but I never understood what it really was or how to use it. RSS is a simple, somewhat bloated IMO (but who cares), universal standard for sharing "feeds" (a list of items/posts). To create an RSS feed on your website, all you have to do is create and maintain a single file. A lot of site generators like Wordpress will do (and probably already have) it for you. Even YouTube has RSS feeds. With that, you can even do what I've always wanted on YouTube: subscribe to a playlist, but not the channel.
</p>
<figure>
    <img src="/blog/my-user-control-focused-stack/nextcloud-news-example.png">
    <figcaption>My Nextcloud News feed</figcaption>
</figure>
<p>
There are a bunch of weird, closed-off, RSS aggregators (a program/service that caches RSS feeds) that I saw you can use, but like, why would you...? Anyway, if you want to just subscribe to RSS feeds on your phone, <a target="_BLANK" href="https://f-droid.org/en/packages/com.tughi.aggregator">Aggregator on F-Droid</a> seems to work perfectly. Of course, I want all my devices to keep in sync, so I use <a target="_BLANK" href="https://apps.nextcloud.com/apps/news">Nextcloud News</a> and the <a target="_BLANK" href="https://f-droid.org/en/packages/de.luhmer.owncloudnewsreader/">Nextcloud News app on F-Droid</a> (costs money on the Google Play Store).
</p>
<p>
To enable Nextcloud News, I added these 4 lines to <code>services.nextcloud.extraApps = {...}</code> in my NixOS config:
</p>
<textarea readonly="" rows="4" style="width: 100%;">news = pkgs.fetchNextcloudApp {
    url = "https://github.com/nextcloud/news/releases/download/25.0.0-alpha3/news.tar.gz";
    sha256 = "sha256-AENBJH/bEob5JQvw4WEi864mdLYJ5Mqe78HJH6ceCpI=";
};</textarea>
<p>
(You may want to get the latest version from <a target="_BLANK" href="https://apps.nextcloud.com/apps/news/releases">https://apps.nextcloud.com/apps/news/releases</a>)
</p>
<h2>Enhanced Usage of YouTube and other video services with YouTube ReVanced and Grayjay</h2>
<p>
I hate watching ads, so on my browser I use <a target="_BLANK" href="https://www.mozilla.org/en-US/firefox/new/">Firefox</a> with <a target="_BLANK" href="https://ublockorigin.com/">UBlock Origin</a>. However, the browser experience on YouTube leaves much to be desired. Luckily, there's <a target="_BLANK" href="https://github.com/ReVanced/revanced-manager">YouTube Revanced</a>, which blocks ads and allows background playback.
</p>
<figure>
    <img src="/blog/my-user-control-focused-stack/revanced-site-screenshot.png">
    <figcaption>Screenshot of <a target="_BLANK" href="https://revanced.app/">https://revanced.app</a> (that official - hopefully not compromised - website for YouTube ReVanced; download from <a target="_BLANK" href="https://github.com/ReVanced/revanced-manager">https://github.com/ReVanced/revanced-manager</a> if you want to be safe)</figcaption>
</figure>
<p>
If you long for the ability to use multiple platforms including YouTube, PeerTube, Odysee, Twitch, Kick, Rumble, SoundCloud, Patreon, and Nebula at the same time, you can use <a target="_BLANK" href="https://grayjay.app/">Grayjay</a>.
</p>
<figure>
    <img src="/blog/my-user-control-focused-stack/grayjay-screenshot.png">
    <figcaption>Screnshot of the Grayjay website</figcaption>
</figure>
<p>
Eventually, I hope to replace YouTube ReVanced with GrayJay, but currently, I rely on YouTube recommendations for generating music mixes, which Grayjay does not support.
</p>
<p>
I do feel bad for blocking ads on creators that I watch's videos as they definitely do lose revenue from it, but I don't know what to do about it. My desire to not give Google money/personal data is about equal to my desire to give money to creators. I also don't follow sponsor links because they're usually not interesting/too expensive for me or donate (enough) because I do not have "donating money".
</p>
<h2>Note taking with Obsidian?</h2>
<p>
I still use <a target="_BLANK" href="https://obsidian.md/">Obsidian</a> for notes, but I've been wanting to switch. Generally, the only thing that's keeping me on Obsidian is not feeling like sorting out an alternative.
</p>
<figure>
    <img src="/blog/my-user-control-focused-stack/Simple-Non-Commercial-Open-Source-Notes.jpg">
    <figcaption>I found this video: <a target="_BLANK" href="https://www.youtube.com/watch?v=XRpHIa-2XCE">"Simple, Non-Commercial, Open Source Notes" by "By Default"</a> the best for comparing note taking apps, which I might go back to.</figcaption>
</figure>
<p>
I used to think that cross-linking notes was a killer feature, but I find it infinitely easier to just do a fuzzy search to find a specific note. So, now that I've adopted that my mindset, the options in the video make more sense.
</p>
<h2>Framework Laptop</h2>
<p>
I follow <a target="_BLANK" href="https://www.youtube.com/channel/UCl2mFZoRqjw_ELax4Yisf6w">Louis Rossman</a> and the <a target="_BLANK" href="https://fighttorepair.org/">Right To Repair Movement</a>, so when he recommended the Framework Laptop as the most respective of your rights and I needed something more powerful than my <a target="_BLANK" href="https://www.samsung.com/us/computing/chromebooks/under-12/chromebook-3-11-6-xe500c13-k01us/">Samsung Chromebook 3</a>, I purchased one.
</p>
<h2>Motorola Phone; Possibly Pinephone Pro?</h2>
<p>
When my first phone, a <a target="_BLANK" href="https://www.samsung.com/us/mobile/phones/galaxy-s/samsung-galaxy-s7--32gb---unlocked---black-onyx-sm-g930uzkaxaa/">Samsung Galaxy S7</a> died after 7 years (the last ~1.5 of which being with an open back), I just accepted its fate and let it die. However, I was not about to buy another $1k phone when I don't really care about having a top-of-the-line camera and the performance being practically irrelevant unless I wanted to play Genshin Impact or something. So, the cheapest, reasonably good (had the cellular bands I needed), was a <a target="_BLANK" href="https://www.samsung.com/us/mobile/phones/galaxy-s/samsung-galaxy-s7--32gb---unlocked---black-onyx-sm-g930uzkaxaa/">Motorola G Stylus 2021</a>. The camera isn't that bad and it feels just as fast as my friend's iPhones while having infinitely more freedom and being 1/5 of the price. The battery also lasts all day without issue. Sometimes, it can last 2 days when I forget to charge it at night even after 2 years of use.
</p>
<p>
For Christmas last year, I asked for a <a target="_BLANK" href="https://www.pine64.org/pinephonepro/">Pinephone Pro</a> with the note that it was a completely unreasonable purchase for me to make myself because it was worse than the phone I already had in almost every way and was double the price. Surprisingly, I still received it. Oddly, iirc, it came pre-installed with Sailfish OS, a closed-source Linux distro. To be fair, it did however, have more things working out of the box than NixOS. I may work on improving NixOS support so I can use the phone (lacking GPS, camera, and MMS), but I don't know what I'm doing in that space.
</p>
<h2>Checking the time with Pine Time</h2>
<p>
I use a <a target="_BLANK" href="https://www.pine64.org/pinetime/">Pine Time</a> watch as my main watch. It's pretty good, but not really featureful. I'm really disappointed that it does not currently support displaying Japanese text. However, my Pebble Time has been having trouble, so I'm sticking with it for now.
</p>
<h2>Code editing with NeoVim</h2>
<p>
I'm not that against using <a target="_BLANK" href="https://vscodium.com/">VSCodium</a>, but it stopped working for a bit about a 8 months ago. So, since I was watching <a target="_BLANK" href="https://www.youtube.com/c/theprimeagen">The Primeagen</a> at the time, I switched to <a target="_BLANK" href="https://neovim.io/">NeoVim</a> and haven't looked back. I store my Neovim config within my NixOS config, which is a little scuffed tbh but it works.
</p>
<figure>
    <textarea readonly="" rows="16" style="width: 100%;">vim.opt.guicursor = ""

vim.opt.nu = true
vim.opt.relativenumber = true

vim.opt.tabstop = 4
vim.opt.softtabstop = 4
vim.opt.shiftwidth = 4
vim.opt.expandtab = true

vim.opt.smartindent = true

vim.opt.wrap = false

vim.opt.swapfile = false
vim.opt.backup = false
vim.opt.undodir = os.getenv("HOME") .. "/.vim/undodir"
vim.opt.undofile = true

vim.opt.hlsearch = false
vim.opt.incsearch = true

vim.opt.termguicolors = true

vim.opt.scrolloff = 8
vim.opt.signcolumn = "yes"

vim.opt.updatetime = 50

vim.g.mapleader = " "

vim.opt.wrap = true
vim.opt.linebreak = true
vim.opt.breakindent = true
    
-- better past behavior
vim.keymap.set("x", "&lt;leader&gt;p", "\"_dP")

-- separate vim/global clipboard
vim.keymap.set("n", "&lt;leader&gt;y", "\"+y")
vim.keymap.set("v", "&lt;leader&gt;y", "\"+y")
vim.keymap.set("n", "&lt;leader&gt;Y", "\"+Y")

vim.keymap.set("n", "&lt;leader&gt;d", "\"_d")
vim.keymap.set("v", "&lt;leader&gt;d", "\"_d")

    -- apparently it gets you to bad place
vim.keymap.set("n", "Q", "&lt;nop&gt;")

-- open file browser  
vim.keymap.set("n", "&lt;leader&gt;pv", vim.cmd.Ex)

    local telescope = require("telescope.builtin")
vim.keymap.set("n", "&lt;leader&gt;pf", telescope.find_files, {})
vim.keymap.set("n", "&lt;C-p&gt;", telescope.git_files, {})
vim.keymap.set("n", "&lt;leader&gt;ps", function()
      telescope.grep_string({ search = vim.fn.input("Grep &gt; ") });
end)
    
vim.cmd.colorscheme("catppuccin") 
vim.api.nvim_set_hl(0, "Normal", { bg = "none" })
vim.api.nvim_set_hl(0, "NormalFloat", { bg = "none" })

require("toggleterm").setup()

require'nvim-treesitter.configs'.setup {
  highlight = {
    enable = true,
    additional_vim_regex_highlighting = false,
  },
}

require("treesitter-context").setup {
  
}

local mark = require("harpoon.mark")
local ui = require("harpoon.ui")
vim.keymap.set("n", "&lt;leader&gt;a", mark.add_file)
vim.keymap.set("n", "&lt;C-e&gt;", ui.toggle_quick_menu)
vim.keymap.set("n", "&lt;C-h&gt;", function () ui.nav_file(1) end)
vim.keymap.set("n", "&lt;C-t&gt;", function () ui.nav_file(2) end)
vim.keymap.set("n", "&lt;C-n&gt;", function () ui.nav_file(3) end)
vim.keymap.set("n", "&lt;C-s&gt;", function () ui.nav_file(4) end)

vim.keymap.set("n", "&lt;leader&gt;u", vim.cmd.UndotreeToggle)

    vim.keymap.set("n", "&lt;leader&gt;gs", vim.cmd.Git)

    local cmp = require("cmp")

cmp.setup({
  snippet = {
    expand = function(args)
      require("luasnip").lsp_expand(args.body)
    end
  },
  mapping = cmp.mapping.preset.insert({
        ['&lt;C-b&gt;'] = cmp.mapping.scroll_docs(-4),
        ['&lt;C-f&gt;'] = cmp.mapping.scroll_docs(4),
        ['&lt;C-Space&gt;'] = cmp.mapping.complete(),
        ['&lt;C-e&gt;'] = cmp.mapping.abort(),
        ['&lt;CR&gt;'] = cmp.mapping.confirm({ select = false }), -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items.
        ['&lt;C-CR&gt;'] = cmp.mapping.confirm({ select = true }), -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items.
      }),
      sources = cmp.config.sources({
        { name = 'nvim_lsp' },
        { name = "luasnip" },
      }, {
        { name = 'buffer' },
      })
    })

    -- Set configuration for specific filetype.
    cmp.setup.filetype('gitcommit', {
      sources = cmp.config.sources({
        { name = 'git' }, -- You can specify the `git` source if [you were installed it](https://github.com/petertriho/cmp-git).
      }, {
        { name = 'buffer' },
      })
    })

    -- Use buffer source for `/` and `?` (if you enabled `native_menu`, this won't work anymore).
    cmp.setup.cmdline({ '/', '?' }, {
      mapping = cmp.mapping.preset.cmdline(),
      sources = {
        { name = 'buffer' }
      }
    })

    -- Use cmdline &amp; path source for ':' (if you enabled `native_menu`, this won't work anymore).
    cmp.setup.cmdline(':', {
      mapping = cmp.mapping.preset.cmdline(),
      sources = cmp.config.sources({
        { name = 'path' }
      }, {
        { name = 'cmdline' }
      })
    })
    
local capabilities = require('cmp_nvim_lsp').default_capabilities()
local lspconfig = require("lspconfig")
    lspconfig.rust_analyzer.setup {
      capabilities = capabilities
    }
lspconfig.tsserver.setup {
      capabilities = capabilities
}
    lspconfig.cssls.setup {
      capabilities = capabilities,
  cmd = { "css-languageserver", "--stdio" },
}
lspconfig.jsonls.setup {
      capabilities = capabilities,
  cmd = { "json-languageserver", "--stdio" },
}
    lspconfig.html.setup {
      capabilities = capabilities,
  cmd = { "html-languageserver", "--stdio" },
}
lspconfig.bashls.setup {
  capabilities = capabilities
}
lspconfig.marksman.setup {
  capabilities = capabilities
}
lspconfig.phpactor.setup {
  capabilities = capabilities
}
lspconfig.nil_ls.setup {
  capabilities = capabilities
}
lspconfig.ocamllsp.setup {
  capabilities = capabilities
}

-- require("copilot").setup({})

    -- Use LspAttach autocommand to only map the following keys
    -- after the language server attaches to the current buffer
    vim.api.nvim_create_autocmd('LspAttach', {
      group = vim.api.nvim_create_augroup('UserLspConfig', {}),
      callback = function(ev)

        -- Buffer local mappings.
        -- See `:help vim.lsp.*` for documentation on any of the below functions
        local opts = { buffer = ev.buf }
        vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, opts)
        vim.keymap.set('n', 'gd', vim.lsp.buf.definition, opts)
        vim.keymap.set('n', 'K', vim.lsp.buf.hover, opts)
        vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, opts)
        vim.keymap.set('n', '&lt;C-k&gt;', vim.lsp.buf.signature_help, opts)
        vim.keymap.set('n', '&lt;space&gt;wa', vim.lsp.buf.add_workspace_folder, opts)
        vim.keymap.set('n', '&lt;space&gt;wr', vim.lsp.buf.remove_workspace_folder, opts)
        vim.keymap.set('n', '&lt;space&gt;wl', function()
          print(vim.inspect(vim.lsp.buf.list_workspace_folders()))
        end, opts)
        vim.keymap.set('n', '&lt;space&gt;D', vim.lsp.buf.type_definition, opts)
        vim.keymap.set('n', '&lt;space&gt;rn', vim.lsp.buf.rename, opts)
        vim.keymap.set({ 'n', 'v' }, '&lt;space&gt;ca', vim.lsp.buf.code_action, opts)
        vim.keymap.set('n', 'gr', vim.lsp.buf.references, opts)
        vim.keymap.set('n', '&lt;space&gt;f', function()
          vim.lsp.buf.format { async = true }
        end, opts)
      end,
    })

vim.keymap.set('n', '&lt;space&gt;e', vim.diagnostic.open_float)
    vim.keymap.set('n', '[d', vim.diagnostic.goto_prev)
    vim.keymap.set('n', ']d', vim.diagnostic.goto_next)
    vim.keymap.set('n', '&lt;space&gt;q', vim.diagnostic.setloclist)</textarea>
    <figcaption>My NeoVim config</figcaption>
</figure>
<h2>Development Environment with Nix Shell</h2>
<p>
I heard other developers use <a target="_BLANK" href="https://www.docker.com/">Docker</a> to create reproducable development environments. Luckily, when I was using Arch, I couldn't get Docker to work. When I started using NixOS, I found I could also use <a target="_BLANK" href="https://nixos.org/manual/nix/stable/command-ref/nix-shell">nix-shell</a>. When I run <code>nix-shell</code>, it reads the <code>shell.nix</code> file in my current working directory and creates shell with the specific tools and dependencies I need to develop whatever I'm working on. No more messing with Node Version Manager or pyenv for me.
</p>
<figure>
    <textarea readonly="" rows="13" style="width: 100%;">{ pkgs ? import &lt;nixpkgs&gt; {} }:
pkgs.mkShell {
    buildInputs = with pkgs; [
        nodejs_20
        nodePackages.typescript-language-server
        nodePackages.vscode-css-languageserver-bin
        nodePackages.vscode-json-languageserver-bin
        nodePackages.vscode-html-languageserver-bin
        nodePackages.bash-language-server
    ];

    shellHook = '''';
}</textarea>
    <figcaption>An example <code>shell.nix</code> file used to install NodeJS 20 and linters for Neovim</figcaption>
</figure>
<p>
<code>nix-shell</code> files (and other Nix stuff) can also be used on other Linux distributions and operating systems including MacOS and Windows (with WSL).
</p>
<h2>Personal Website with Web Components (aka: raw HTML and JS)</h2>
<p>
I've used many of the fun JavaScript, Rust, and even PHP web frameworks (albeit, just an outdated version of Laravel/Blade), but none have made me as happy as just writing raw HTML and JS. When I first started web development, I looked for exactly what <a target="_BLANK" href="https://developer.mozilla.org/en-US/docs/Web/API/Web_components#concepts_and_usage">Web Components</a> are, a way to create reusable components of a website: like a nav bar. Unfortunately, Web Components were just being introduced as a concept at the time. Now, they exist, and they do everything I ever wanted React to do.
</p>
<p>
After learning about them in <a target="_BLANK" href="https://www.youtube.com/watch?v=1vF6puwX3bE">"WebComponents Will Outlive Your JavaScript Framework | Prime Reacts"</a> by <a target="_BLANK" href="https://www.youtube.com/@ThePrimeTimeagen">The Primeagen</a>, who was reading <a target="_BLANK" href="https://jakelazaroff.com/words/web-components-will-outlive-your-javascript-framework/">"Web Components Will Outlive Your JavaScript Framework"</a> by Jake Lazaroff, I put Web Components in the back of my mind.
</p>
<p>
Previously, I created this site with a specialized static site generator I made in Rust. Unfortunately, it kind of sucked and I hated working with it. So, when I wanted to update my portfolio (what the homepage of this site is), I decided I would switch to Web Components. Now, I am much happier with the development and actually updating this site again. While it is slower than it was when I generated it with Rust, I decided I didn't care and justified by decision by recalling the Free Software Foundation saying that a website's JavaScript should be readable (which it is because this site isn't compiled at all). That argument doesn't make any sense because before, the website didn't have any JavaScript, but oh well. If I were to make it better, I think the only thing that would make me happier would be to make it with the programming language I'm "developing".
</p>
<p>
Anyway, I'll show the MastodonComments component for this site, which I learned how to create from <a target="_BLANK" href="https://blog.thms.uk/2023/02/mastodon-comments">https://blog.thms.uk/2023/02/mastodon-comments</a>, as an example:
</p>
<figure>
    <textarea readonly="" rows="16" style="width: 100%;">class MastodonComments extends HTMLElement {
    constructor() {
        super();
    }

    connectedCallback() {
        const shadow = this.attachShadow({ mode: "open" });
        const style = document.createElement("style");
        style.innerHTML = `@import "/common.css";`;
        shadow.appendChild(style);
        const container = document.createElement("div");

        const postURL = this.getAttribute("post-url");

        if (postURL) {
            const header = document.createElement("h2");
            const headerA = document.createElement("a");
            headerA.href = postURL;
            headerA.innerText = "Comments from the Fediverse";
            header.appendChild(headerA);
            container.appendChild(header);

            const commentsURL = postURL.replace(/@.+\//, "api/v1/statuses/")+"/context"; 
            fetch(commentsURL).then(response =&gt; {
                if (!response.ok) {
                    container.innerText += "\nBad response when fetching comments";
                    response.text().then(text =&gt; container.innerText += "\n"+text);
                    return;
                }
                response.json().then(data =&gt; {
                    if (data.descendants.length === 0) {
                        container.innerHTML += `&lt;a href="${postURL}"&gt;Be the first to comment&lt;/a&gt;`;
                    }
                    const comments = document.createElement("div");
                    for (const descendant of data.descendants) {
                        const comment = document.createElement("div");

                        const userLine = document.createElement("div");
                        userLine.style = "display: flex; align-items: center;"

                        const avatar = document.createElement("img");
                        avatar.style = "width: 3em; border-radius: 10%;";
                        avatar.src = descendant.account.avatar_static;
                        userLine.appendChild(avatar);

                        const userA = document.createElement("a");
                        const userDisplay = document.createElement("strong");
                        userDisplay.innerText = descendant.account.display_name;
                        userA.appendChild(userDisplay);
                        userA.append(` @${descendant.account.username}@${new URL(descendant.account.url).hostname}`);
                        userA.href = descendant.account.url;
                        userLine.appendChild(userA);

                        comment.appendChild(userLine);

                        const content = document.createElement("div");
                        content.innerHTML = descendant.content;
                        comment.appendChild(content);

                        comments.appendChild(comment);
                    }
                    container.appendChild(comments);
                }).catch(e =&gt; container.innerText += `Failed to parse comments response: ${e}`);
            }).catch(e =&gt; container.innerText += `Failed send comments request: ${e}`);
        } else {
            container.innerHTML = "&lt;h2&gt;Comments have not yet been set up for this post&lt;/h2&gt;";
        }

        shadow.appendChild(container);
    }
}

customElements.define("mastodon-comments", MastodonComments);</textarea>
    <figcaption>MastodonComments component code. The final line registers the class <code>MastodonComments</code> as the html element <code>mastodon-comments</code>.</figcaption>
</figure>
<p>
To use it in an HTML file, make sure it's imported: <code>&lt;script src="/mastodonComments.js"&gt;&lt;/script&gt;</code>. Then, just add <code>&lt;mastodon-comments post-url="https://cdt.social/@clayton/111678761831022044"&gt;&lt;/mastodon-comments&gt;</code> (change the <code>post-url</code> to point to the correct comment thread on Mastodon) anywhere you want.
</p>
<h2>Language Learning with Tutor Engine and Polygloss</h2>
<p>
I have not been fully satisfied by any language learning app other than language exchanges (though, I no longer wish to dedicate to 1:1 foreign exchanges). However, I've recently found <a target="_BLANK" href="https://polygloss.app/">Polygloss</a> to be fun and actually helpful in actually practicing output. I would still call Polygloss <i>good-ish</i> (I'm <i>very</i> critical of language learning apps). Only "conversing" with those who are also just learning the language is probably not the best. Therefore, I am still developing <a target="_BLANK" href="https://tutorengine.org">Tutor Engine</a>. It is not ready for public release, but in developing it, I have experienced rapid improvement in Japanese.
</p>
<figure>
    <img src="/blog/my-user-control-focused-stack/polygloss-screenshot.png">
    <figcaption>Screenshot of the Polygloss website</figcaption>
</figure>
<figure>
    <img src="/blog/my-user-control-focused-stack/tutor-engine-screenshot.png">
    <figcaption>Screenshot of the latest development version of the Tutor Engine Flashcarder</figcaption>
</figure>
<h2>What I still need to do</h2>
<p>
While I do have my email on a custom domain, I still use Google to receive and send emails with it. I would prefer not to rely on Google for my email, but I have not yet had the energy to actually switch. Now that my Linode server uses NixOS, it may be easier to just slap yet another service on it (I think it may also be a Nextcloud app).
</p>
]]></content:encoded></item><item><title>My first semester as a UPenn student</title><description>A description of my semester year as a student at the University of Pennsylvania (UPenn)</description><media:description type="plain">A description of my semester year as a student at the University of Pennsylvania (UPenn)</media:description><link>https://claytonhickey.me/blog/my-first-semester-as-a-upenn-student/</link><guid>https://claytonhickey.me/blog/my-first-semester-as-a-upenn-student/</guid><pubDate>Fri, 29 Dec 2023 03:30:00 EST</pubDate><itunes:image href="https://claytonhickey.me/images/misc/dubois_college_house.jpg"/><content:encoded><![CDATA[<p><span lang="en">Read directly: </span><a href="https://claytonhickey.me/blog/my-first-semester-as-a-upenn-student/">https://claytonhickey.me/blog/my-first-semester-as-a-upenn-student/</a></p><h1>My first semester as a UPenn student</h1>
<p>Published: 2023-12-29 by Clayton Hickey</p>
<p>
    I am extremely grateful for the opportunity to attend a university with such good opportunities as the <a target="_BLANK" href="https://upenn.edu">University of Pennsylvania</a>. I am more grateful still to be able to attend the university and room with my amazing girlfriend from high school, Elayna.
</p>
<figure>
    <img src="/images/misc/dubois_college_house.jpg">
    <figcaption>Where I stay, W.E.B. Dubois College House. Source: https://facilities.upenn.edu/maps/locations/du-bois-college-house-web</figcaption>
</figure>
<h2>Why college</h2>
    Generally, I feel that I am good enough at programming that I could get lucrative programming job (more lucrative than the one I already have and the one I may have as a bioengineer) if not now, soon. So, for most people, that would probably mean that college wouldn't be worth it for them. However, I have always thought that extending human lifespan (including healthspan if you want to be pedantic) would be the most valuable thing for anyone to work on because if one were to succeed in that, they would have (almost) all the time they could want to do whatever else it is they want to do. So, given with the unique resources to work towards such a goal, I chose to go to college despite the signficant debt ($35k/yr but virtually all of the last 3-7 years will be paid through loans) it will leave me in.
<h2>Africana</h2>
<p>
    The first opportunity that was offered to me through the university was to attend the <a target="_BLANK" href="https://africana.sas.upenn.edu/center/academics/summer-institute">Center of Africana Studies Summer Insitute</a>. I was very excited to see what college was like and I was excited about the learning opportunities the program offered, so I joined. Throughout the program, I learned a lot of African history both in Africa and in the United States as well as made friends that I believe will be retained throughout my time at college.
</p>
<h2>Classes</h2>
<p>
    Class selection was extremely stressful. The first round of class selection at UPenn uses a lottery system. I did not receive math (MATH 1410), intro to bioengineering (BE 1000), or physics (PHYS 0150). I tried to contact the individual departments through email during the summer, but none of them could do anything (except the physics department which added me to the class without even responding to my email). I was told to not worry about it and that everything would work out. Everything did work out, but it was because I did worry about it. There is a 3rd party alert system for courses opening up, but I was not able to get math through that system. I was able to get bioengineering, but the section I got meant I would have to go to classes for almost 7 hours straight. I attended both the math class and the bioengineering class without actually having been a student. After the first math class, I talked to the professor who led me up to the math office. Apparently, there were spots still available, just not publically? However, I did receive the last spot, so I consider myself lucky. For the bioengineering class, apparently there were a lot of students who signed up for the course who were not bioengineering students. So, many of them got kicked out, so I would have been able to secure a spot, but I decided stick with the section I had originally because the lab that I joined had their weekly meeting at the same time as the other section. I found the physics 1 class (PHYS 0150) boring (I had done AP Physics 1 and 2 in high school), so I ended up switching to honors physics (PHYS 0170). I ended up switching my chemistry class (CHEM 1011) to the 2nd introduction to computer science class (CIS 1200) since I decided I wanted to either minor or major (decided on minor for now) in computer science on top of my bioengineering major. However, I found the class very easy and mostly annoying with the amount of work (and making us write tests). I should've probably taken chemistry instead, but I did have AP credit for it so I didn't need to and it would make a computer science degree much harder. I wish I would've pushed harder to take the next level of computer science instead of settling with CIS 1200 though.
</p>
<p>
    Classes I ended up with: Intro to Bioengineering (BE 1000), General Chemistry Lab 1 (CHEM 1101), Programming Languages and Techniques 1 (CIS 1200), Calculus 2 (MATH 1410), Honors Physics 1 (PHYS 0170), Writing Seminar: What Data Can Tell Us About Modern India (WRIT 0160-301).
</p>
<figure>
    <img src="/images/misc/fall-2023-course-schedule.png">
    <figcaption>My fall 2023 class schedule</figcaption>
</figure>
<h3>BE 1000 (Intro to Bioengineering)</h3>
<p>
    I found the class content intersting, but it could have been easily cheesed (I didn't though, I took detailed notes on everything). You did not have to learn (almost) anything to get an A in the class. We had no in-person lectures. We were expected to watch about 20-30 minutes of online video lectures each week and do an online quiz (and we had 2 attempts for the quiz - takes the best score and has the same questions). We had biweekly labs whose homework was due 2 weeks after the lab. The labs were interesting, but not much was unique compared to my general chemistry lab. It was nice to have extra practice though. The homework was alright, but it was annoying that it forced us to use non-libre/open source software like Excel (free through school but have to use Windows), Logger Pro (free through school but have to use Windows), and some Adobe software (only available in school library) to complete. We also had biweekly ethics discussions which were interesting and required understanding some academic papers as we had to write paragraphs about them beforehand. Though, to me, it seemed like most of the problems could be fixed by companies not being so (I think needlessly) greedy and not being so restrictive regarding medicine - they should adopt a more open approach as opposed to locking everything down with patents.
</p>
<p>
    I vow to make any bioengineering work I do as open as possible. I hope that being open will even make the current big pharmaseutical companies happy, because they will be able to manufacture my work too. However, I worry it will be hard to convince others to work with me. I worry that I may be perhaps too ideological in this way because my motivation for bioengineering work is not money, it's making progress for all of humanity.
</p>
<h3>CHEM 1101 (Gen Chem Lab 1)</h3>
<p>
    I found the chemistry lab to be fun, but it was at the end of my 7 hour block of classes, so I didn't feel the fun while I was there. We would have 1 lecture and 1 lab weekly which each had an assignment attached. The lecture I think successfully introduced what we would be doing in lab. The lecture assignment felt kind of distracting since it was expected to be done during the lecture, but maybe it helped. The labs introduced a lot of techniques that I think would be useful working in a wetlab. We had to be very verbose in the lab assignment, which I think was useful because that it required in a real chemistry lab, though I found the strictness with the grading of it a little annoying. We had to use this weird, buggy website to complete our lecture and lab assignments which I found annoying. I think it would've been much easier to use something like just Google Docs. I don't <i>think</i> any reasonable chemistry lab would use what we did, but maybe I'm wrong (<a target="_BLANK" href="https://nextcloud.com/office/">Nextcloud Office</a> would be the perfect substitute).
</p>
<h3>CIS 1200</h3>
<p>
    I found <a target="_BLANK" href="https://ocaml.org/">OCaml</a> interesting (it made understanding the <a target="_BLANK" href="https://nixos.org/manual/nix/stable/language/index.html">Nix language</a> a lot easier). At the end of the year, we had someone from Jane Street's OCaml compiler team talk to us which was very interesting. Though, I think he thought my question was stupid. I was in the mode of thinking "the stack" in OCaml was more like "the stack" in Rust than it really was. I don't think my question was that stupid though since I think it is an issue with OCaml language that the goal they were trying to achieve was so difficult (I don't really remember what it was, but it was something about optimizing).
</p>
<p>
    I was dissapointed that halfway through the semester we had to switch to Java. Java took all the fun I had been experiencing in the class out. Java, in my opinion, is an inferior language to both OCaml and Rust (which I use personally - and professionally).
</p>
<p>
    Overall, most of what I learned was OCaml, but I don't think that was justification enough for me personally to have to do all the work the course required. I know other students found the course much more valuable than I.
</p>
<h3>MATH 1410 (Calculus 2)</h3>
<p>
I found MATH 1410 to be moderately difficult. I didn't like that we were expected to learn all the course content outside of class, though I <i>kind of</i> get it since it's a lot of content? Anyone can learn everything (and more) that we learned in the course by watching <a target="_BLANK" href="https://www.youtube.com/playlist?list=PL8erL0pXF3JYm7VaTdKDaWc8Q3FuP8Sa7">Professor Ghrist's CalcBLUE series</a>. Anyway, we had weekly quizzes that were stressful, but not too hard. I mostly studied by doing practice problems (and reviewing the notes I took on the lecture videos) and got on average a 19 out of 20 with most of my mistakes being copy down mistakes, which was slightly above average (the average was much higher than previous semesters). I felt good about the final as well, but I worry the curve won't be too high and I'll still end up with an A-. They are currently being weird with the grading, so I don't really know what's going to happen.
</p>
<h3>PHYS 0170</h3>
<p>
I found PHYS 0170 to be worth the extra effort over PHYS 0150, but it did take up at least 12 hours/week. We had biweekly quizzes that were difficult. I performed slightly above average throughout the course, but I wasn't feeling well during the final and didn't do that good (though I wasn't that much below average - standard deviation was very high). The quizzes and the final consist of completing 2 difficult questions for the quiz and 5 difficult questions for the final, so there's a lot of the points resting on whether one's initial interpretation of the question is valid. So, even if one knows what they're doing, missing some constraint that often was not obvious at the beginning could easily leave one overly pressed for time (making it feel like kind of a gamble). I think I may still get an A, but I'm worried about it. I feel that I definitely learned enough to feel happy about myself either way.
</p>
<p>
We also had a low-stakes lab as part of the course that met weekly. It was kind fun and I think valuable.
</p>
<p>
I connected with more people in honors physics than any of my other classes, which I think added to the value of the course.
</p>
<h3>WRIT 0160-301 (Writing Seminar: What Data Can Tell Us About Modern India)</h3>
<p>
I found the course's <a target="_BLANK" href="https://www.amazon.com/Whole-Numbers-Half-Truths-Cannot/dp/9395073004">assigned reading</a> much less interesting than I expected (I was pretty excited). We had to take very verbose notes on it in a format that I definitely did not like (every writing seminar does though). The book mostly consisted of substantiated commentary about statistics in India, but I expected to learn more about India, the culture, and its languages.
</p>
<p>
The writing assignments weren't so bad and I think helped improve my writing, but I was dissapointed that there wasn't as much 1:1 feedback or detailed instruction on how to write that there was in the sample writing class I had in the Center for Africana Studies Summer Institute. It is very distressing to get highly positive feedback with very minor requests for improvement on drafts from peers and the professor, but then get a poor grade on the final.
</p>
<h2>Dental Pain</h2>
<h3>Possible malpractice</h3>
<p>
To preface, I get cavities decently often (despite brushing my teeth regularly), but I usually never have any pain. In May before the semester started, I chipped one of my molars. After waiting a week in extreme pain, my dentist finally had an appointment where he filled the chip in the tooth. During the filling, he seemed distracted, it seemed like he was trying to fill my tooth and someone else's in a different room at the same time. The next day however, the pain was still extreme. The next few days, the same. I went back to the dentist and asked him why it would still be hurting so much. He said that he may have drilled into the nerve at the center of my tooth. He said that I could either get a root canal or wait to see if it gets better, which he said was possible. The next few months, the pain did not go away, but I pushed through it anyway. About when school started again, the pain got even worse. I started to take Ibuprofen multiple times a day every day. I thought that perhaps the pain may be at a height when it was close to healing, so I didn't worry too much about it at first. But after a month it still hurt.
</p>
<p>
I decided I wanted to go to a dentist to get it checked again. However, my mom was switching jobs so we didn't have dental insurance. So, I tried to go to the school dentist so it would be covered by financial aid. After failing to get in contact with them for a few days (they don't work on weekends, only schedule appointments for the next day, and fill up their appointment book very quickly each day), they told me that they would not take me because the damage had been done by another dentist so it was against their policy. So, I decided to go to another dentist in Philly and ate the entire cost of the X-Rays. They found that it seemed my dentist had failed to fill the entire chip, leaving a pocket inside the tooth next to the nerve that the nerve was leaking into. So, it would definitely not heal on its own and I needed a root canal. They said it was definitely not infected, so I planned to wait until we had secured dental insurance before getting it, which they said would be ok.
</p>
<figure>
    <img src="/images/misc/leaky-nerve-in-tooth.jpg">
    <figcaption>X-Ray of the tooth with the leaky nerve</figcaption>
</figure>
<p>
About a week later, the Ibuprofen I had been taking to ease the pain had completely stopped working. I could not pay attention to anything. It was easily a 9/10 during the day. For the first day, I survived it. The next day, my girlfriend got me some dental anaesthetic gel to ease the pain. It worked great! for about half an hour when it completely stopped working no matter how much was applied. At the time, I had an appointment for a root canal in a week, so I was prepared to wait. When I lied down to try to sleep, the pain quickly rose to a 10/10. I tried to resist it because I didn't want to wake my girlfriend, but I couldn't handle it. So, I sat up and felt very minor relief. However, at this point I had tears streaming down my face from the pain. So, when my sitting up woke my girlfriend, she was understandably concerned. So, we both got up. I knew I had a math quiz the next day and afterwards, I was set to visit home, so I was very stressed about not being able to sleep, possibly for days. The stress, combined with the pain, I began to scream. My girlfriend described it as "blood curdling". The screaming was loud enough to pierce into the next room, and I presume the whole college house, waking our suitemate in the next room. She, thankfully, called the campus medical emergency response team (MERT) for us. After my screaming settled due to the adrenaline numbing the pain and my whole body, my girlfriend led me to the front entrance of the college house.
</p>
<p>
I was met with a nice police officer who tried to settle me. Apparently, MERT had gotten lost in the college house looking for me. The front entrance is the only entrance I thought anyone could use, so they must've come in some other way, but after about 15 minutes, they found me. They asked me a bunch of questions and asked if I wanted to go to the hospital. Since I really needed to do something about the tooth as soon as possible, I agreed to go in the ambulance. The EMT on board was very nice and related to my tooth pain. I was dropped off at the Penn Presbyterian Medical Center emergency department waiting room. After waiting for a few minutes there, I repeated what I had told the EMT and police officer to a nurse. The nurse then led me to a bed in the hallway, despite me telling them that lying doing made it hurt more.
</p>
<p>
For the next 3 hours I stood next to the bed with my girlfriend. I got bored of waiting, so I leaned up against the wall and tried to get some sleep. About 10 minutes later, the doctor finally came and scolded me for not being in the bed. The doctor had me sit down (which I also told the previous person made it hurt more). So, while I was sitting in even more pain, the doctor explained to me that they didn't have any dentists in the hospital (which would have been great to know before I spent ~$400 on an ambulance ride and ~$900 on the visit itself). They said the only thing they could do to me was to give me pain killers. They explained that they would give me a dose of Percoset, a highly addictive narcotic opiod, and a prescription for 5 more to last until I got my root canal. They gave me a dose in the hospital and had me leave immediately. After walking home in the dark with my girlfriend back to the college house, I was still in extreme pain. An hour later, I felt no different. I still could not sleep. The dose of Percoset they gave me did nothing (perhaps they should check to see if the treatment works before sending patients home?). I did some research on the Percoset they had given me. Apparently, it only lasts 6 hours, which with just 5 tablets, definitely would not last a week. It also apparently makes the pain worse when it wares off. I called the hospital and the receptionist told me that I could try to take Tylenol (after I had just said that Percoset wasn't working??). After explaining that the doctor explicitly told me to not take Tylenol because I could overdose, the reciptionist told me that they couldn't do anything.
</p>
<p>
Feeling utterly dissapointed in the hospital, my girlfriend and I waited until 8am when the dentist offices opened. Her and I called nearly every dentist in Philadelphia. Miraculously, we found a dentist who could do the root canal at ~10:30am. I was so grateful they could even take me.
</p>
<p>
Despite my pain, my experience at <a target="_BLANK" href="https://www.rootcanalpa.com/">Excel Endontics</a> was a good as it could've possibly been. After doing scans and finding that it had gotten infected, they began the root canal. For those who don't know, in a root canal, the entire tooth down to the roots is drilled out. They probably gave me over a dozen shots of novacane. However, they couldn't numb the tooth itself until they had reached the nerve within, which they then had to give multiple shots of novacane to properly numb. Despite me flinching once and grabbing the hand of one of the dentists, they were very nice throughout the process.
</p>
<p>
Immediately after the root canal I felt (mostly) better. However, I still didn't do very well on the math quiz. Unfortunately, I found out that day that a root canal wasn't the last step. I would have to get the outside of my tooth drilled away too to put a crown on it. However, that process wasn't so bad, except for being resistant to novacane and it taking a long time.
</p>
<h3>Lasting effects</h3>
<p>
I continue to be resistant to painkillers including novacane, Tylenol, and Ibuprofen, which makes colds extra annoying.
</p>
<p>
During finals week, I went to get a cleaning. They found that I had 3 deep cavities the side of my mouth opposite the tooth that had the root canal, the only side I could eat with for 4.5 months. I assume the cavities formed in the time I had been scared to brush my teeth because it hurt a lot. The only time I could get them filled was the day before my physics final. Unfortunately, the root canal and the crown ate the yearly dental insurance maximum, so we had to pay basically full price. The dentist had to use extra novacane which mostly wore off before the process was finished (I didn't tell him though since it was basically at the end). A few hours after the filling, I was in extreme pain, which I thought was weird because even when I had 7 filling at the same, I had no pain before or after. However, the pain has slowly gone away. About a week later, it's very faint. I assume it was because the novacane wore off so quickly.
</p>
<h2>Lijun Zhou Lab</h2>
<p>
During the summer, I applied to join the Lijun Zhou Lab, a biochemistry lab working on approaches to developing synthetic cells. I was accepted to attend their weekly meetings, but I did not have time to work in the lab fulltime. I am very grateful for the experience so far.
</p>
<h2>Tutor Engine and a research fellowship</h2>
<p>
On Tuesday, November 7th, 2023, I completed the MVP (minimum viable product) of <a target="_BLANK" href="https://tutorengine.org">Tutor Engine</a>, the language (and more) learning app that I've been developing for 4 years. A few days later, I got an email from the college house that they were holding a meeting about the <a target="_BLANK" href="https://collegehouses.upenn.edu/life/chrf">College House Research Fellowship</a> in a few minutes. I thought it was interesting and I suprisingly not that busy that day, so I went. I talked about the app during the meeting, which I think caught the attention of the faculty.
</p>
<p>
A few days later, I emailed one of the faculty members who were at the meeting and had a linguistics background. They were very helpful in completing the application and helping me find a mentor for the program (which was a required part of the application). It was a weird, but cool experience going from barely anyone even knowing about the app I was developing to discussing it with top linguistics professors.
</p>
<p>
During finals week, I found out that I received the fellowship, granting me the opportunity to be more involved with reserach within and between the different college houses and $1500 (that I intend to set aside for the app - though my yearly loss is still $33.5k). I am very grateful for the position.
</p>
<h2>Still can't take Japanese classes</h2>
<p>
For normal language courses at UPenn, it is required to attend classes Monday, Tuesday, Wednesday, and Thursday at the same time. As an engineering student whose course schedule is basically full, it is nearly impossible to schedule. All the Japanese courses next semester are during required classes. If I am able to test out of general chemistry 2, I may be able to take it. However, otherwise, my only choice would be to take Mandarin, but I would also have to request a credit increase (I would be at 6.0 course units, but the normal max is 5.5), so it probably isn't a very good idea. I also want to focus on Japanese for now and not Mandarin.
</p>
<h2>My girlfriend</h2>
<p>
My girlfriend is awesome and has been very important for me to get through this semester. For our year anniversary, we got promise rings which is fun and exciting. We went to many places this year during college including the Phialdelphia Zoo, an obstacle course in the trees, an escape room, Dim Sum many times, Halloween minigolf, and ice skating.
</p>
<figure>
    <img src="/images/misc/clayton-and-elayna-philadelphia-zoo.jpg">
    <figcaption>Her and I at the Phialdelphia Zoo</figcaption>
</figure>
<p>
I rely on her to take pictures, so if you want to see more I recommend checking out her Instagram: <a href="https://www.instagram.com/elaynarinker/">@elaynarinker</a>. She's also starting her own necklace business at: <a href="https://www.instagram.com/thedaintylinks.co/">@thedaintylinks.co</a>.
</p>
<figure>
    <img src="/images/misc/daintylinks-june.png">
    <figcaption>Her new necklace, <a href="https://www.instagram.com/p/C1IYbkbJJt4/?utm_source=ig_web_copy_link">June</a></figcaption>
</figure>
]]></content:encoded></item><item><title>How Should Bail Algorithms Be Used</title><description>Should bail algorithms be used today or in the future? Here's my stance. Written for Tech Roulette 2021, P4M3 - Justice Matrix</description><media:description type="plain">Should bail algorithms be used today or in the future? Here's my stance. Written for Tech Roulette 2021, P4M3 - Justice Matrix</media:description><link>https://claytonhickey.me/blog/how-should-bail-algorithms-be-used/</link><guid>https://claytonhickey.me/blog/how-should-bail-algorithms-be-used/</guid><pubDate>Sat, 10 Jul 2021 00:00:00 EDT</pubDate><itunes:image href="https://claytonhickey.me/blog/how-should-bail-algorithms-be-used/judge-handing-computer-an-L.png"/><content:encoded><![CDATA[<p><span lang="en">Read directly: </span><a href="https://claytonhickey.me/blog/how-should-bail-algorithms-be-used/">https://claytonhickey.me/blog/how-should-bail-algorithms-be-used/</a></p><h1><u>How Should Bail Algorithms Be Used</u></h1>
<p>
    This article is written for the third module of 
    <a href="https://techroulette.xyz/" target="_blank">Tech Roulette</a> 
    2021, Justice Matrix - Project 4. In the last module, we looked at how I would design 
    <a href="https://claytondoesthings.xyz/blog/a-theoretical-algorithm-for-deciding-bail">a theoretical bail algorithm</a>
    . In this post, we're going to look at how these bail algorithms should be used in courts, if at all.
</p>
<h2 style="text-align: center">Pros and cons of bail algorithms</h2>
<div style="text-indent: 0; text-align: center; display: grid; grid-template-columns: 1fr 1fr">
    <div style="display: inline-block;vertical-align: top;">
        <h3>Pros</h3>
        <ul style="list-style: none;padding: 0;"> 
            <li>Fast decisions</li>
            <li>Consistent</li>
        </ul>
    </div>
    <div style="display: inline-block;vertical-align: top;">
        <h3>Cons</h3>
        <ul style="list-style: none;padding: 0;">
            <li>Biased</li>
            <li>Usually no better or worse than people</li>
            <li>Requires lots of data for any accuracy</li>
            <li>Often misused</li>
            <li>Often overpromised on accuracy</li>
        </ul>
    </div>
</div>
<h2>My stance</h2>
<p>
    Both judges and bail algorithms are biased. From the sources provided, 
    it seems that some people seem to believe that algorithms are less biased than people are. 
    Their only advantage is that they're consistent - even if they're consistently bad - 
    and that they can give their answer faster and cheaper (after it's developed). 
    I don't think that bail algorithms should be completely abandoned because they're biased. 
    As with any technology, they are getting better at what they do but clearly, 
    right now, they are not up to the task - at least by themselves. 
    A judge is supposed to give a bail amount with as least bias as possible with the data they have. 
    A bail algorithm's estimate WITH the knowledge of how the bail algorithm was designed, behaves, 
    and works could still be useful data to a judge in making their final 
    decision but should not be mandated in any way. For now, that is the only place I see for these algorithms. 
    Otherwise, they should not be used until there's massive improvement.
</p>
]]></content:encoded></item><item><title>A Theoretical Algorithm for Deciding Bail</title><description>A quick look into creating a computer algorithm for deciding bail for someone awaiting trial. Written for Tech Roulette 2021, P4M2 - Justice Matrix</description><media:description type="plain">A quick look into creating a computer algorithm for deciding bail for someone awaiting trial. Written for Tech Roulette 2021, P4M2 - Justice Matrix</media:description><link>https://claytonhickey.me/blog/a-theoretical-algorithm-for-deciding-bail/</link><guid>https://claytonhickey.me/blog/a-theoretical-algorithm-for-deciding-bail/</guid><pubDate>Sat, 10 Jul 2021 00:00:00 EDT</pubDate><itunes:image href="https://claytonhickey.me/blog/a-theoretical-algorithm-for-deciding-bail/computer-holding-freedom-random.png"/><content:encoded><![CDATA[<p><span lang="en">Read directly: </span><a href="https://claytonhickey.me/blog/a-theoretical-algorithm-for-deciding-bail/">https://claytonhickey.me/blog/a-theoretical-algorithm-for-deciding-bail/</a></p><h1><u>A Theoretical Algorithm for Deciding Bail</u></h1>
<p>Published: 2021-07-10; Updated: 2023-11-22; Authors: Clayton Hickey</p>
<p>
    This article is written for the second module of 
    <a href="https://techroulette.xyz/" target="_blank">Tech Roulette</a> 
    2021, Justice Matrix - Project 4. As stated in the module description, 
    bail is decided by a judge based on the risk of them escaping, crime alleged, 
    and the "dangerousness" of them to others/community. 
    The goal in this article is going to be to assign values to go over how to assign values to each of 
    those points and how to put them together into a final cash value. 
    This theoretical algorithm is going to attempt to be unbiased, but obviously, 
    that is not something that is going to be successful as the processing for deciding bail is inherently biased.
</p>
<h2>Weighing Crime Alleged</h2>
<p>
    For this algorithm, I'm going to make the crime alleged a multiplier that is applied to the final value. 
    For when multiple crimes are alleged, their multipliers are added into one multipler. 
    A list of all possible charges and their associated multipliers would be supplied to calculate this. 
    I imagine for crimes like murder (at least voluntary), 
    crimes relating to extreme dehabilitation or mental damage to others (like rape), 
    and terrrorism that multiplier would be set at Infinity (would not actually be stored as infinity in practice - 
    probably an Rust-like enum) - meaning that no chance for bail is offered. If someone has been charged for the same crime in the past, 
    the multiplier for it is multiplied each time by another value set by the database for the specific crime. 
    Optionally, the multiplier for each crime alleged could also be multiplied by another algorithm (or user-supplied if that's allowed) 
    to estimate the chance the defendant actually committed the crime. This gets us out value of estimated_pressure.
</p>
<h2>Determining risk of escape</h2>
<p>
    In my mind, there are 3 types of escapes. Those where the defendant is found easily like after a week or two, 
    those where a search party and ongoing investigation must be conducted to find them 
    but they are eventually found during the search (not given-up), 
    and those where the defendant is never found. Each of these will be calculated to a chance percentage to be used in the final calculations. 
    Defendants generally cannot escape effectively without the help of another person. So, in order to calculate these, 
    the algorithm will go through each of the person's connections and choose the connection who would give the highest 
    value for each. For each connection, 
    their ability and willingness to help for each type of escape must be calculated (as percentages) and then averaged 
    (for a more complex algorithm, groups may also be taken into account). 
    The ability for a connection to aid in each type of escape varies. For the most basic type, 
    a common scenario I'd imagine would be to keep them in their home. 
    Factors that could go into whether one'd be able to do that could would be how much money they make in excess, 
    how much time do they spend working, do they live with family, 
    do they live with a significant other, do they live with children, and do they have the ability to transport them w/o people seeing. 
    These factors could be run through another algorithm/sub-algorithm to determine the percentage. 
    This same strategy for calculating ability would be applied for the other types of escapes. 
    For the second type of escape that requires an extended search, factors I'd think would be if they have other property not 
    connected to their home they could hide them, 
    how big is that property, how easy is it to track that connection themselves, do they have the ability to move them around, 
    and similar factors from the first one. 
    For the third where they're never found, factions I'd imagine include do they have connections with other governments, 
    do they have passports to other countries, do they have access to private air/sea travel, 
    could they abandon their current livelihood with the amount of money they have, 
    and other factors from the previous. Willingness goes through the same process but has more concurrent factors 
    like could this person forgive the alleged crimes, 
    are they family/friend/other, has this person commited similar crimes, 
    does this person have a life/family that they wouldn't want to abandon. After this has been done, 
    we are left with 3 percentage point chances for each degree/type of escape's success. 
    However, I want to go one step further and take into account the defendant's 
    willingness to escape for each degree. To do this, we take potential_years_free for each, add potential_years_sentenced, 
    subtract potential_added_years_if_caught, 
    divide it all by estimated_years_to_live, and clamp it between 5 and 100% for the percentage chance of each degree. 
    The final variable I want to get out of this is a high bisaed estimate for how long they may escape cut by chance. 
    To do this we take the maximum of these three operations that convert each percentage into a duration (years): 
    chance_degreee_1*3weeks, chance_degree_2*8months, chance_degree_3*estimated_years_to_live. 
    This gets us our value of estimated_years_escaped.
</p>
<h2>Determining dangerousness</h2>
<p>
    Dangerousness is a hard thing to quantify but the unit I'm going to use in order to reach the final cash amount 
    is about maximum damage per year. 
    We can ignore any cases where bail would be denied due to the crimes alleged. 
    I think a decent way to base this off of is potential_years_sentenced*estimated_damage_done_in_crimes_alleged*estimated_crazy_level. 
    This section has been removed because it sucked (deleted 2023-11-22, but I never liked it).
    However, with this, we get our value for estimated_amount_of_damages_per_year_free.
</p>
<h2>Putting it together</h2>
<p>
    The final formula is pretty simple. We just multiply all of our values: algorithmic_bail = estimated_pressure * 
    estimated_years_escaped * estimated_amount_of_damages_per_year_free. 
    Again, this is not expected to be a perfect algorithm devoid of biases, but it's the best I could come up with on a Saturday afternoon.
</p>
]]></content:encoded></item><item><title>Recommendation Algorithms and Ethics</title><description>A not-very-short not-very-source-heavy dive into recommendation algorithms and the ethical questions surrounding them. Written for Tech Roulette 2021, P4M1 - Justice Matrix</description><media:description type="plain">A not-very-short not-very-source-heavy dive into recommendation algorithms and the ethical questions surrounding them. Written for Tech Roulette 2021, P4M1 - Justice Matrix</media:description><link>https://claytonhickey.me/blog/recommendation-algorithms-and-ethics/</link><guid>https://claytonhickey.me/blog/recommendation-algorithms-and-ethics/</guid><pubDate>Fri, 09 Jul 2021 00:00:00 EDT</pubDate><itunes:image href="https://claytonhickey.me/blog/recommendation-algorithms-and-ethics/youtube-handing-viewer-burning-baby.png"/><content:encoded><![CDATA[<p><span lang="en">Read directly: </span><a href="https://claytonhickey.me/blog/recommendation-algorithms-and-ethics/">https://claytonhickey.me/blog/recommendation-algorithms-and-ethics/</a></p><h1><u>Recommendation Algorithms and Ethics</u></h1>
<p id="blog-post-description">
    A not-very-short not-very-source-heavy dive into recommendation algorithms and the ethical questions surrounding them. 
    Written for Tech Roulette 2021, P4M1 - Justice Matrix
</p>
<p id="blog-post-meta">Published: 2021-07-09 GMT; Authors: Clayton Hickey</p>
<div id="blog-post-content">
    <p>
        Recommendation algorithms are only ever increasing in prevelance and complexity. 
        Recommendation algorithms are used in nearly every mainstram application. 
        Examples include YouTube, Twitch, Etsy, Ebay, Amazon, TikTok, Instagram, Twitter, Netflix, 
        Snapchat, Hulu, Disney Plus, Facebook, Google News, and MSN. 
        Being used in so many popular applications, it would almost be weird if someone with access to modern technology 
        did not interact with these recomemendation algorithms every day. 
        Given that, I believe they are an important subject to analyze the ethics of. 
        Keep note that what you are about to read is my opinion and is lacking sources. 
        This article is written for the first module of 
        <a href="https://techroulette.xyz/" target="_blank">Tech Roulette</a>  2021, Justice Matrix - Project 4.
    </p>
    <h2>The goal of recommendation algorithms</h2>
    <p>
        The stated goal of recommendation algorithms shifts from industry to industry. 
        However, one thing stays constant - they are built to maximize profits by maximizing user engagement. 
        I am not against the idea of companies trying to maximize their profits. 
        However, it is important to analyze the means by which they do it and the effects to ensure that it does not 
        violate the rights of any person. 
        It is also important to analyze if eeking out those extra profits hurt other areas of the business.
    </p>
    <h2>Respecting the user's time</h2>
    <p>
        Recommendation algorithms for entertainment/social media are designed to serve the user the content that it thinks 
        will keep the user engaged all the time - they never to give the user content they think will cause them to log off. 
        This makes it the user's decision for whether they should continue to use the platform or to log off. 
        This seems reasonable. Why should the platform decide whether it's best the user log off? They can make their own decisions, right? 
        Obviously, people aren't literally scrolling through TikTok until they die (I think). 
        At some point, outside factors like fatigue, personal needs, 
        and growing boredom from the often reptitiveness generally get users to log off at some point. 
        However, I think another strong motivator is guilt. Everyone has goals for things that they want to accomplish in a day. 
        Spending as much time as they can on Facebook usually isn't one of those things. 
        So, to those concious of the time they're wasting, they feel guilty for continuing to use it. 
        This leads to some treating quitting social media like quitting a bad addiction (because it can be). 
        It's important to note that the best recommendation algorithm that keeps users engaged for as long as possible (per session) 
        isn't the one that always serves the best content. It's the one that starves the user - giving them of satisfaction over time. 
        It makes the user feel that they're "on a hunt" for satisfaction and that if they scroll long enough, eventually, 
        they will get "the big one" and can log off feeling entirely satisfied. 
        This strategy for engagement is not just from recommendation algorithms, 
        but platforms generally makking the content users want harder to find - 
        like hiding posts or making them non-chronological from friends or subscriptions. 
        In doing this, platforms completely eliminate nearly all phycological benefit from the app that the user could have gotten. 
        The best-case scenario for keeping a user happy and productive is to serve them exactly what they want right from the start, 
        the best of the best content. They leave the app as soon as possible, feeling satisfied. 
        Now, that would be great and I'm sure designers have realized that. 
        However, it comes at sacrifice. This approach leads to less engagement in the short term. 
        Many entertainment and social media apps are barely making a profit already and the space is very competitive. 
        Getting users to leave one's app when they're satisfied with what they got from it doesn't always mean that that user is 
        then going to go do something else entirely. Likely, they're going to go to another app. 
        That app may not follow the same practice and instead go for the more invasive approach of the user 
        but that means more engagement for a competitor, and less engagement for the more "friendly one" - 
        until the user decides that the more invasive one is not worth visiting and drops it entirely. 
        This motivates companies looking purely at engagement for being more invasive because their engagement graphs, 
        that likely do not accurately predict the future, show that it's more effective. 
        This leads me to think that this is an issue of an ad-based profit motive. 
        When a business gets their money through advertisements, it leads to a seemingly clear relationship of time engaged to money made. 
        For a purely ad supported platform, it's true - in the short term, until users start to quit. 
        The time-based incentive needs to be dropped which means no advertisements within the app unless the 
        company can restrain themselves from eeking out the tiny profits they get from it by tweaking their recommendation algorithm 
        to take more time from the user. I think this could be done by developing a profit structure centered around rewarding the 
        platform for gaining the user's respect. Doing that is harder to do, harder to maintain. 
        But, I think it would help to solve, or at least improve the relationship that social media platforms have with their 
        users in respect to respecting their time.
    </p>
    <h2>Respecting the user's money</h2>
    <p>
        Recommendation algorithms for shopping platforms run into similar issues as ones for entertainment and social media. 
        Their main objective is to get the user to spend as much money as possible. 
        This is a little less excusable than wasting the user's time (though, time is money - usually) but, 
        it comes with the same defense that the user should be able to limit themselves. It also has the same tactic - 
        make things <i>just</i> hard enough to find so that when they do find the thing they want, 
        they are willing to pay more as it makes it come across as more of a or product due to it being on the second page of Amazon. 
        As a price-concious consumer, my goal is to spend as little money as possible for the best product and I'm generally looking for 
        one specific thing. This means that my goals and that of recommendation algorithm are more or less, not aligned. 
        But are my goals misaligned with the platform itself? Generally not, the platform should want my purchase no matter how much I spend 
        (as long as it's not zero) - they make more than enough margin for server upkeep. 
        Amazon seems to think that no matter how annoying they make their shopping process, that I'll continue to purchase from them - I won't. 
        Their lack of proper filters, easy to find product information, putting the reviews not at the bottom of a never-ending page isn't 
        because they can't do it. They want the user to spend more time, spend more money per session. 
        Another issue arises when one looks at the topics of addictions. 
        What people see when they first go to a store influences their decisions and what they're going to buy. 
        Say someone has been buying Oreos and icecream every time they've purchased from Amazon in the past 6 months. 
        Understandably, the recommendation algorithm would begin to recommend them Oreos and icecream as well as other related treats. 
        Recently, this person has noticed that they're quickly gaining weight and decide it's time to quit Oreos and icecream. 
        Having used Amazon nearly exclusively for a while, they continue to use it when they go to purchase other, more healthy foods instead. 
        However, the first thing they see when they open it is Oreos and icecream, putting it back in their mind. 
        They stick through, they serach for what they want. Alongside of their search, they see Oreos and icream. 
        They continue and put what they want in their cart. They go to their cart, it says, "purchase again: Oreos and icecram" with an simple, 
        easy-to-press button saying "add to cart" next to it. The person decides that maybe a little won't hurt to "ease the transition". 
        Just like that, the person's previous will has been broken. Hiding recomendations, at least specific ones, would be a fair, 
        and simple way to help alleviate this problem (Amazon states they have this option, 
        but it is not where they say it is and I can't find it - it was either removed, moved, or never existed). 
        It would take more will from the person to toggle this option, 
        but it could stop users from having to quit using a service that has their 
        recommendation algorithm "stuck" on products they don't want to see.
    </p><h2>Exacerbating biases</h2>
    <p>
        Recommendation algorithms start out "feeling out" the user - recommending them different things that they may or may or may not enjoy. 
        This is so that it can eventually give them personalized recommendations. 
        This is usually fine when looking at broad topics like gaming, music, makeup, vlogs, horror movies, etc. 
        However, a lot of recommendation algorithms are picking from a pool of content that include 
        propoganda and generally highly opinionated topics. This stuff is usually not recommended right away, but when it is, 
        most recommendation algorithms latch on very hard when someone engages with it because it's very likely that someone who engages with, 
        and seemingly enjoys a specific side of a devicive topic, will want to see more of it. 
        It pulls people into a sort of rabbit hole where everything they see on the platform seems to agree with them and ideas. 
        The more similar content they consume, the more the algorithm holds onto it, giving it "sticking power". 
        What people consume isn't just a reflection of the person, it also influences and changes them. 
        The more and more extreme the content gets, the more the person loses sight of the other side. 
        Especially because it's not unlikely that social media is where they intereact with the most people, and if it seems, 
        that from their perspective, that most people agree with them and that everyone else, must be wrong or off-base. 
        This doesn't make me think that platforms should not host or that recommendation algorithms should not host content with 
        "devisive" topics or even extremist topics (as long as it follows other guidelines and is not illegal). 
        Seeing a variety of perspectives and opinions is what is important to further discussions and bring people closer together. 
        I do believe something has to be done about the segmentation and disunity that platforms with heavy use of 
        recommendation algorithms seem to brew. I'm unsure of whether this should be the jobs of the platforms themselves. 
        Something that may be able to be done that could help is for algorithms to detect when something is devisive in 
        nature and try to recommend content alongside of it with differeing opinions. 
        That solution however, I find makes people angry - 
        like when Twitter and YouTube put warnings on what they determined to be misinformation about Covid19. 
        I've been thinking for a little bit about a project of my own to help solve this problem 
        but there are too many details to include on here - maybe on another blog post (or product launch w).
    </p>
    <h2>Determining who has a job, and who doesn't</h2>
    <p>
        Recommendation algorithms play a huge part into where user engagement is targeted towards. 
        For platforms whose content is provided by multiple people, 
        who are trying to make a profit or even just a living on the content they upload, a new ethics question is brought into play. 
        If people make their livlihoods off of content that is filtered by these algorithms, 
        that makes the algorithm almost the ultimate decider of whether that person's career on the platforms succeeds or fails. 
        It puts a lot of pressure on those creators who may put hours, days, weeks, months, 
        into making something and having its fate not even decided by a curator, boss, or even the people watching it. 
        For algorithms that are not open source for people to analyze how to optimize content for it (most algorithms to "prevent abuse" - 
        I don't believe that point, I think it's to hide certain aspects of it that may or may not be beneficial for everyone, 
        but may make some uncomfortable - it's also because recommendation algorithms are one of a platform's most valuable assets), 
        fear of it changing is also highly prevelant. 
        Creators spend significant amounts of time trying to optimize for a theoretical algorithm 
        that they think is how the one the platform their basing their livlihood's depend on. 
        The stakes here also create some concern for algorithms that are made using machine learning as those can gain unintended biases. 
        Most concerning of these biases include race, sexuality, region, 
        and political slant of the creators and advantages/disadvantges brought by the algorithm for those in 
        specific groups that are not inherently indicitive to the quality of the content they produce but may be shown in 
        statistical analyses due to other, unseen factors (which is what most ML algorithms do).
    </p>
    <h2>Are they necessary?</h2>
    <p>
        All this concern over what recommendation algorithms make and the design considerations when creating them may 
        lead some to want to give up on them entirely. It's a fair thought, before recommendation algorithms, 
        we just asked friends about the latest movie to watch or what newspaper to read. 
        The issue arises when one looks at just how much content is being produced nowadays. 
        One person cannot have near enough time or knowledge to be able to filter through all the new content being made to 
        recommend the best content for someone. Ok, that's kind of a pointless example, 
        so why don't we hire a bunch of people to look through it? There's multiple issues there. 
        First being that those people don't know the person on the other end - it can't be personalized. 
        There are also other ethical questions when having real people go through user-uploaded content. 
        Not everyone can be vetted and sometimes, people post very illegal content - 
        one example being ISIS, who tends to upload some not-very-family-friendly content - as one could imagine. 
        Ok, make an algorithm to filter that out (not getting into that ethical discussion) and then have 
        "recommenders" tag the content for what kind of person would like to watch it and maybe users could identify 
        themselves or take a test and then they'd get the content tagged for them. At this point, 
        it's back at recommendation algorithm with nearly all the same problems - except now, 
        it's calculated by workers probably being paid next to nothing. Hopefully, this has illustrated that recommendation algorithms 
        are a necessary that we have to deal with. But, I don't think they have to be evil. 
        They just need some - or a lot - more improvement.
    </p>
</div>
]]></content:encoded></item></channel></rss>