<rss version="2.0"><channel><title>Brian Hamrick&apos;s Blog</title><link>https://www.brianhamrick.com/blog</link><description>Thoughts about whatever comes to mind.</description><docs>http://www.rssboard.org/rss-specification</docs><item><title>The &quot;Bad at Randomness&quot; Fallacy</title><link>https://www.brianhamrick.com/blog/bad-at-randomness-fallacy</link><pubDate>Wed, 17 Sep 2025 23:59:59 UTC</pubDate><description>&lt;p&gt;In this post I want to talk about something that I&apos;m calling the &amp;quot;Humans are
bad at randomness&amp;quot; fallacy. If you&apos;ve read any discussions on a game with
random mechanics, you&apos;ve almost certainly seen a conversation that goes
something like this:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Person 1: I just had  happen to me multiple
times in a row! Something has to be broken with the RNG.&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;Person 2: Nah, that&apos;s just how randomness works. Humans are bad at
intuitively understanding randomness. It&apos;s just your confirmation
bias / negativity bias driving you to think it&apos;s bugged when there&apos;s
actually nothing wrong.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;It&apos;s not wrong to say that humans have biases that cause them to have a hard
time judging whether something is properly random, but in my observations of
these discussions, this argument is invoked almost as a reflex. There&apos;s
seemingly no real consideration given to the complaint before dismissing it
as just &amp;quot;Humans are bad at randomness.&amp;quot;&lt;/p&gt;&lt;p&gt;This often results in either no investigation or a very cursory investigation
into the randomness, and as such even when there are, in fact, bugs that
significantly affect the random outcomes, those bugs can live for an
extremely long time.&lt;/p&gt;&lt;p&gt;Let&apos;s take a look at some real life examples.&lt;/p&gt;&lt;h2&gt;Pok&#195;&#169;mon Red/Blue/Yellow&lt;/h2&gt;&lt;p&gt;This story takes place around 2013. The speedrun route for Pok&#195;&#169;mon Yellow (the
plan for beating the game as fast as possible) involves catching a level 6
Nidoran Male at the grass before Viridian Forest. Unfortunately, the chance for
an encounter in that grass to be the desired level 6 Nidoran Male is only 5%
(13/256, to be precise). Since each extra encounter adds a lot of time to a run
where the goal is to be as fast as possible, speedrunners would typically only
look at a couple encounters before starting over from the beginning.&lt;/p&gt;&lt;p&gt;The most active Pok&#195;&#169;mon Yellow speedrunner at the time started noticing
something interesting. If the first encounter they got was a level 6 Nidoran
Female, and then they got the second encounter on the third step afterward
(the game prevents you from getting an encounter on the first two steps,
so this is the earliest possible time), then they swore that it was almost
always a level 6 Nidoran Male.&lt;/p&gt;&lt;p&gt;In this story, I was Person 2, at least at first. I said that they must have
just been remembering the coincidences. But, to no surprise to the reader
given the topic of this post, I was wrong.&lt;/p&gt;&lt;p&gt;It turned out that the Tool-Assisted Speedrun community had noticed similar
weirdness in the encounters being generated a few years prior. Tool-assisted
speedruns, or TASs for short, are created with the help of emulators which
allows the authors to select exactly which frame each button press lands on.
For most random behaviors in the game, adjusting a button press by a frame or
two could change the result entirely. But, for encounters, such changes might
cause encounters to appear or disappear as expected, when there were
encounters, the sequence of encounters would only change very mildly.&lt;/p&gt;&lt;p&gt;The culprit is that the game maintains two random bytes. Although the game
isn&apos;t using anything like a modern RNG, each of the random bytes on its own
is unpredictable enough to be considered random. However, due to the
&lt;a href=&quot;http://wiki.pokemonspeedruns.com/index.php?title=Pok%C3%A9mon_Red/Blue/Yellow_DSum_Manipulation&quot; target=&quot;_blank&quot;&gt;specifics of the RNG&lt;/a&gt;,
the sum of the two random bytes only changes relatively slowly.&lt;/p&gt;&lt;p&gt;Most randomness in the game only used a single one of the two bytes, and so
moving the event by a frame would result in a essentially unrelated result
(although, in theory it would be possible to observe some patterns if you looked
at the results on enough consecutive frames). But encounters used both random bytes,
one to determine whether an encounter happens, and the other to determine which encounter
it is.&lt;/p&gt;&lt;p&gt;The strange behavior that was noticed was because the fact that an encounter happens
constrains the first random byte, which in combination with the sum also constrains
the second random byte. Since the sum only changes slowly over time, so too does
the subset of encounter types that are possible.&lt;/p&gt;&lt;p&gt;Release date: February 1996 (JP), September 1998 (US)&lt;/p&gt;&lt;p&gt;Behavior figured out: &lt;a href=&quot;https://tasvideos.org/1671S&quot; target=&quot;_blank&quot;&gt;August 2007&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;Slay the Spire&lt;/h2&gt;&lt;p&gt;The bug in this case was significantly more obvious than the one in the Pok&#195;&#169;mon case,
but given the ease with which it could have been identified, I think the time it lasted
past the game&apos;s release is still surprisingly long!&lt;/p&gt;&lt;p&gt;Slay the Spire is a card game where each card has an energy cost to play. There
are relics in the game which provide various effects. One of them, Snecko Eye,
randomizes the cost of each drawn card to a uniform number from 0 to 3.&lt;/p&gt;&lt;p&gt;In a pattern quite typical of these issues, some players hated the relic,
saying that they felt that it kept putting them in situations where all their
cards cost 3 energy (the baseline maximum for a turn), and resulting in them
losing the game. Other players countered with mathematical calculations
that show that on average you&apos;d be able to play more cards with Snecko Eye
than without, and that it&apos;s just negativity bias that&apos;s causing the dislike.&lt;/p&gt;&lt;p&gt;The developer of the game also posted the line of code where the energy costs
were being generated:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;int newCost = AbstractDungeon.cardRandomRng.random(3); // random between 0-3&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;It&apos;s so simple, it couldn&apos;t possibly be wrong.&lt;/p&gt;&lt;p&gt;It turned out that the RNG in the game was being reseeded on every floor in such
a way that the sequence of generated numbers was exactly the same, offset by
one result per floor. So for fights on two adjacent floors, if you had Snecko
Eye, you&apos;d get the exact same sequence of energy costs, but offset by one
card. There could be further deviations if other parts of the fight consumed
random numbers as well.&lt;/p&gt;&lt;p&gt;The result of this bug is that if you look at the overall distribution of energy
costs across a large number of runs, you&apos;ll see each one generated one quarter
of the time, as expected. However, within a single run, since the generated
costs were repeating floor after floor, lopsided distributions where one
cost was favored over the other were significantly more likely than it would
have been with independently random events.&lt;/p&gt;&lt;p&gt;Release date (EA): November 2017&lt;/p&gt;&lt;p&gt;Bug &lt;a href=&quot;https://www.reddit.com/r/slaythespire/comments/7yph7x/snecko_eye_stats/&quot; target=&quot;_blank&quot;&gt;noticed&lt;/a&gt;
and &lt;a href=&quot;https://www.reddit.com/r/slaythespire/comments/7yxcpa/snecko_eye_costs_are_kind_of_predictable/&quot; target=&quot;_blank&quot;&gt;elaborated&lt;/a&gt;:
February 2018&lt;/p&gt;&lt;h2&gt;MapleStory&lt;/h2&gt;&lt;p&gt;One of the features that MapleStory added is called &amp;quot;inner ability&amp;quot;. Your
character gets three lines which each can provide a stat bonus. You can
reroll the lines to try to find more desirable stats, and while rerolling
them you can lock the lines that you like by paying a bit more of the
reroll currency.&lt;/p&gt;&lt;p&gt;I don&apos;t remember any suspicions of something being wrong with the system,
until suddenly a Korean post showed a method of increasing the chances of
the lines that you want, called the &amp;quot;recipe method&amp;quot;.&lt;/p&gt;&lt;p&gt;Behind the scenes, there&apos;s a big list of all the possible inner ability
lines. For illustrating the issue, let&apos;s just imagine that the list has
100 items, so we&apos;re generating three distinct numbers from 1 to 100.&lt;/p&gt;&lt;p&gt;When generating the first two numbers, everything was uniform as expected.
However, when generating the last number, instead of picking uniformly
from the remaining 98 numbers, the game would first make a 50-50 choice
of whether the third number would be between the other two or not between
them.&lt;/p&gt;&lt;p&gt;So if you locked lines 40 and 50, you&apos;d have a 50 percent chance that the
rolled third line would be between 41 and 49 (and then uniform between
those nine), and a 50 percent chance that the rolled third line would be
one of the other 89 options (1-39 and 51-100). This means that you&apos;re
significantly more likely to get what you want if you first roll the
two of your desired lines that &amp;quot;sandwich&amp;quot; your third desired line
in a small interval.&lt;/p&gt;&lt;p&gt;Similar to the Slay the Spire example, if you were to look at the
probabilities of each individual line appearing on no-lock rolls,
you&apos;d see a uniform distribution. You would see lopsided distributions
if you looked specifically at rolls that locked lines, especially ones
that locked two lines, because not all lines would be equally likely
to be locked by players.&lt;/p&gt;&lt;p&gt;After this got publicized, it got patched out within a few months.&lt;/p&gt;&lt;p&gt;Inner ability added to the game: July 2012&lt;/p&gt;&lt;p&gt;Bug figured out: &lt;a href=&quot;https://www.inven.co.kr/board/maple/2299/6345057&quot; target=&quot;_blank&quot;&gt;February 2021&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;Destiny 2&lt;/h2&gt;&lt;p&gt;I don&apos;t personally play Destiny 2, so my narration for this example may
be less reliable than the others.&lt;/p&gt;&lt;p&gt;Destiny 2 weapons have &amp;quot;perks&amp;quot;, which are extra effects from a list of
possibilities. Each weapon can have two ability perks, and players would grind
looking for the best combination. At one point, a bunch of players started
feeling that they couldn&apos;t find the combination they were looking for.&lt;/p&gt;&lt;p&gt;The two perks for a weapon typically have 6 options (although some have more or
fewer), so the desired combination is expected to be a 1/36 chance. Some people
started feeling like they were not getting it in a reasonable time and started
&lt;a href=&quot;https://xcancel.com/SparkD2_/status/1848142767102317000&quot; target=&quot;_blank&quot;&gt;thinking that the perks were weighted&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;In keeping with the pattern, the initial responses were that
&lt;a href=&quot;https://www.reddit.com/r/DestinyTheGame/comments/1g909c9/former_test_mercenary_bungie_theres_no_mechanism/&quot; target=&quot;_blank&quot;&gt;the engine literally can&apos;t weight perks&lt;/a&gt;,
and
&lt;a href=&quot;https://www.reddit.com/r/DestinyTheGame/comments/1g91i00/destiny2team_hey_all_we_had_a_conversation_with/lt342nx/&quot; target=&quot;_blank&quot;&gt;it&apos;s &amp;quot;just RNG&amp;quot; and &amp;quot;statements of feel&amp;quot;&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Some members of the community were still not convinced, and &lt;a href=&quot;https://www.light.gg/god-roll/popular/trait-combos/faq/&quot; target=&quot;_blank&quot;&gt;built tools to crowd-source drop rates&lt;/a&gt;.
Eventually the effort culminated in &lt;a href=&quot;https://docs.google.com/document/d/1MrVSaU3WzXJkQwmNFiRSSd9hwLGFontEbhxLQZ6ITt0/edit?tab=t.0#heading=h.j5vgozmbpjsx&quot; target=&quot;_blank&quot;&gt;very convincing data indicating that perk combinations are non-uniform&lt;/a&gt;. (The linked document is probably a better narrator for this issue than my post).&lt;/p&gt;&lt;p&gt;Notice that it&apos;s perk &lt;i&gt;combinations&lt;/i&gt; that are non-uniform. The individual perks are uniform,
much like what happened in the other examples. Eventually, Bungie took another closer
look at the perk generation code and confirmed that the issue was real. To their credit,
they also posted a &lt;a href=&quot;https://www.bungie.net/7/en/News/article/dev_insights_perk_rng_issue&quot; target=&quot;_blank&quot;&gt;nice article describing the cause of the issue&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;As an external observer, it&apos;s not clear to me exactly how long the bug was present in the game.
It sounds like it may have been all the way starting from the release.&lt;/p&gt;&lt;p&gt;Release: September 2017&lt;/p&gt;&lt;p&gt;Bug found: October/November 2024&lt;/p&gt;&lt;h2&gt;Takeaways&lt;/h2&gt;&lt;p&gt;None of these examples appear to involve the game companies having any intent
to deceive the players. Furthermore, looking at the random events in a
one-dimensional fashion (looking at the distribution of a single variable)
would not have revealed any of these problems.&lt;/p&gt;&lt;p&gt;Unfortunately, every time that I&apos;ve seen a game company attempt an analysis
of their own random systems without external guidance investigates solely
along these one-dimensional lines. They collect the aggregate appearance
rate of individual items, and if each of them appears at the expected rate,
they conclude that there are no issues.&lt;/p&gt;&lt;p&gt;While it&apos;s true that people tend to be bad at evaluating randomness, it&apos;s
important to realize that this applies just as much to the developers
as to the players. The fact that the developers are bad at distinguishing
fair randomness from unfair randomness means that when a bug is introduced
that causes unfair randomness, that bug is disproportionately likely
to go through testing without being noticed, get shipped to the final
product, and then escape notice for a long time even after that.&lt;/p&gt;&lt;p&gt;Furthermore, game developers are generally not statisticians, cryptographers,
randomized algorithm specialists, or anything similar. It&apos;s not expected
that they have a lot of experience in the myriad of ways that random number
generation could go subtly wrong. So when they miss these kinds of bugs,
it&apos;s very understandable. But I do object to the way that the &amp;quot;Humans are
bad at randomness&amp;quot; line frequently gets delivered in a very condescending way,
despite the fact that many of the games probably do have statisticians,
cryptographers, and such in their audience.&lt;/p&gt;&lt;p&gt;To sum up my current thoughts on the subject:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;If the developer&apos;s aren&apos;t acting in bad faith (e.g. intentionally publishing
false or &lt;a href=&quot;https://www.reddit.com/r/HobbyDrama/comments/go2dfu/mobile_games_monkeygate_or_how_a_lone_browser/&quot; target=&quot;_blank&quot;&gt;misleading
rates&lt;/a&gt;),
then the appearance rates of individual items is likely to be correct, since
it&apos;s relatively easy to test and notice devations.&lt;/li&gt;&lt;li&gt;We can expect that joint distributions of items are probably not tested,
and because of the combinatorial explosion, each individual combination
is less frequent and it is hard to notice if the rates are off without
playing a lot. Players tend to play the game more than developers do,
and sometimes the data required is even beyond a single player.&lt;/li&gt;&lt;li&gt;The fact that humans are bad at intuiting fair randomness means that
the randomness can deviate from fair by a considerable amount before
people start noticing it. There will be a baseline frequency of
complaints due to the people who perceive fair as unfair, but when
the complaints rise above that baseline, it probably means things
are &lt;i&gt;very&lt;/i&gt; wrong.&lt;/li&gt;&lt;li&gt;If a developer says they&apos;ve investigated the RNG without explaining
their methodology, it&apos;s likely that the investigation only looked
at the most obvious ways that things could be broken (like individual
item rates being wrong), and shouldn&apos;t be considered strong evidence that
there aren&apos;t less obvious issues.&lt;/li&gt;&lt;li&gt;Even bugs that produce quite significant deviations from fair in
joint distributions can live for months or years while people complaining
are dismissed as simply being humans that are bad at understanding randomness.&lt;/li&gt;&lt;/ul&gt;</description></item><item><title>How I use pronouns in 2025</title><link>https://www.brianhamrick.com/blog/pronoun-usage-2025</link><pubDate>Tue, 13 May 2025 23:59:59 UTC</pubDate><description>&lt;p&gt;I was recently in a discussion about singular &amp;quot;they&amp;quot;. I have plenty of thoughts
on the topic that I might turn into a separate post, but the discussion
prompted me to look for research that had been done on questions such as:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;What portion of people treat singular &amp;quot;they&amp;quot; as grammatical?&lt;/li&gt;&lt;li&gt;Are people of certain ages (e.g. younger) more likely to treat it as grammatical?&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;In the process of looking for answers to these questions, I found
&lt;a href=&quot;https://linguistics.washington.edu/research/graduate/pronouns-raising-and-emerging&quot; target=&quot;_blank&quot;&gt;Kirby Conrod&apos;s PhD thesis&lt;/a&gt;
on the topic, and discovered that there&apos;s way more going on with singular
&amp;quot;they&amp;quot;, and pronouns in general, than I had previously realized. I also
realized that I could not reliably remember whether my personal
&lt;a href=&quot;https://en.wikipedia.org/wiki/Idiolect&quot; target=&quot;_blank&quot;&gt;idiolect&lt;/a&gt;&apos;s grammar had changed
with regards to pronoun usage in the last 5, 10, or 20 years. As such,
I thought it would be interesting to go through several of the examples 
in the literature and list whether they are grammatical for me. It will
be interesting to see whether any of them change some number of years in
the future.&lt;/p&gt;&lt;p&gt;I&apos;m not going to write anything on the answers to the above questions
in this post. If they interest you, I recommend reading Conrod&apos;s thesis
that explores it in depth.&lt;/p&gt;&lt;h2&gt;A very quick primer on notation&lt;/h2&gt;&lt;p&gt;In texts about linguistics, example sentences are given, and it is important to be able
to write out both grammatically correct and grammatically incorrect sentences. A
grammatically correct example typically does not carry any additional marking, but
here I&apos;ll be explicitly adding a check mark (&#226;&#156;&#147;) for sentences that I accept.&lt;/p&gt;&lt;p&gt;Sentences with incorrect grammar are marked with an asterisk (*). Sentences that
are possibly grammatical but dispreferred are marked with a question mark (?).
When I give an example with a question mark, I will try to also give a rephrasing
that I believe I would be more likely to say. For sentences that some people will
accept and some will reject, the research often uses a percent sign (%).
Since I&apos;m focusing on my personal idiolect, I won&apos;t use that here, but I expect
that many readers will disagree with my judgments on some of the examples.&lt;/p&gt;&lt;h2&gt;Singular they&lt;/h2&gt;&lt;p&gt;Getting this topic out of the way first. In a &lt;a href=&quot;https://www.glossa-journal.org/article/id/4942/&quot; target=&quot;_blank&quot;&gt;2017 paper&lt;/a&gt;,
Bjorkman points out that &amp;quot;singular they&amp;quot; doesn&apos;t refer to a single usage pattern,
but rather several different ones, and some English speakers will accept some usages
while not accepting all of them.&lt;/p&gt;&lt;p&gt;Most commonly accepted is what&apos;s known as an epicene usage of &amp;quot;they&amp;quot;, and I accept
these usages as grammatical.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&#226;&#156;&#147;Everyone should know their own phone number.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;When people say that singular they is hundreds of years old, it&apos;s usually backed up
by an epicene example.&lt;/p&gt;&lt;p&gt;Next is the use of &amp;quot;they&amp;quot; to refer to a definite person whose gender is known
(and, for the purposes of this example, that person doesn&apos;t use &amp;quot;they&amp;quot; as a
non-binary pronoun), but is referred to in a non-gendered way. This usage is
also grammatical for me.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&#226;&#156;&#147;Our eldest child broke their leg.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Finally, there is the use of &amp;quot;they&amp;quot; to refer to a specific person that was named
(again, assuming said person does not use non-binary &amp;quot;they&amp;quot;), or is referred to
by a gender-specific noun.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;?Janet said they cancelled the exam.&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;?My sister broke their leg.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Before I started writing this post, I thought I would judge these sentences as
grammatical. Upon reading them again, I believe if I were producing the sentences
myself, I would use gendered pronouns for both: &amp;quot;Janet said she cancelled the exam.&amp;quot;
and &amp;quot;My sister broke her leg.&amp;quot; Thus, I&apos;ve judged them as dispreferred here. In the
case of a name that does not suggest a particular gender, I might use &amp;quot;they&amp;quot;.
This also includes cases where the person is referred to by their family name and
without a gendered title.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&#226;&#156;&#147;Did Chris say that they would be late?&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Conrod also briefly mentions a similar usage where &amp;quot;they&amp;quot; is variable, but with
gender-specific semantics:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;?Every male professor needs to be respectful to their TAs.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Similar to the above examples, this is somewhere between invalid and dispreferred for me.
I believe I would say &amp;quot;Every male professor needs to be respectful to his TAs.&amp;quot; instead.&lt;/p&gt;&lt;p&gt;Overall, this makes me what Bjorkman called an &amp;quot;innovative they user&amp;quot;. Of course,
it might be significantly less innovative in 2025 than it was in 2017.&lt;/p&gt;&lt;h2&gt;Quality, Quantity, and Relation&lt;/h2&gt;&lt;p&gt;In chapter 4 of their thesis, Conrod discusses pronoun choice for speakers for whom
definite singular they is grammatical. Those speakers will regularly be producing sentences
where either a gender specific pronoun (he/she/etc) or a gender non-specific (they) pronoun
could be used, and Conrod lists three maxims that guide this choice.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Quantity - Give as much information as the speaker knows.&lt;/li&gt;&lt;li&gt;Quality - Don&apos;t give information that the speaker is not sure about.&lt;/li&gt;&lt;li&gt;Relation - Give information that is relevant to the discussion.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;These maxims frequently conflict, and different speakers may prioritize them differently.
For example, one speaker might value Relation over Quantity, and use &amp;quot;they&amp;quot; to refer to
someone whose gender they know if they feel the gender is not relevant for the conversation.
On the other hand, a different speaker might value Quantity over Relation, and use gendered
pronouns in the same situation.&lt;/p&gt;&lt;p&gt;I am going to set aside the ranking of Quality for my speech for now. I believe that there
have been cases that I&apos;ve assigned an assumed gender to an anonymous person when it was
unwarranted, but I also believe that I don&apos;t do it particularly frequently. It&apos;s hard to
judge purely via introspection.&lt;/p&gt;&lt;p&gt;On the question of Quantity versus Relation, I believe I clearly rank Quantity above Relation.
That is to say, I would prefer to say:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;My friend visited her parents over the weekend.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;over&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;My friend visited their parents over the weekend.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;if I have a particular female friend in mind, even if the fact that she&apos;s female is not relevant.
Interestingly, this example also shows the opposite ranking in a different aspect of the sentence:
I wouldn&apos;t include the friend&apos;s name if I didn&apos;t feel it was relevant (e.g. if I didn&apos;t think said
friend would be a continued topic of discussion).&lt;/p&gt;&lt;h2&gt;Depronominalization&lt;/h2&gt;&lt;p&gt;Conrod mentions a phenomenon of using a pronoun preceded by a determiner, which
they call depronominalization. Surprisingly, these are marked as acceptable
without further comment in Conrod&apos;s thesis, but they are all ungrammatical to
me. I&apos;m not sure whether these judgments were assigned by Conrod based on their
own idiolect, or if there is evidence that a wider section of speakers use this
construction.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;*I was looking for the other he.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;In contrast, if the pronoun is a name instead, I am perfectly happy to use this construction.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&#226;&#156;&#147;I was looking for the other Chris.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;A &lt;a href=&quot;https://instruct.uwo.ca/french/815a/papers/CowperHall.pdf&quot; target=&quot;_blank&quot;&gt;2009 paper by Cowper and Hall&lt;/a&gt;
gives several examples, which I&apos;ll present here out-of-order and grouped based on my judgments.
All of them are listed as grammatical in the paper.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;?Is that a he or a she? Neither; it&apos;s an it.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This example is the closest to being acceptable to me. I think I&apos;ve heard the construction
&amp;quot;is a he&amp;quot; enough times as meaning &amp;quot;is appropriately referred to as &apos;he&apos;&amp;quot; that it sounds
not entirely wrong to me, but I would primarily use a different phrasing:
&amp;quot;Is that a male or a female? It&apos;s neither.&amp;quot; (Note: This sentence would refer to a non-human.
For humans, the construction would be &amp;quot;Are they male or female?&amp;quot;) I can&apos;t think of a parallel
construction to &amp;quot;it&apos;s an it&amp;quot;, but the answer using &amp;quot;it&amp;quot; as a pronoun would
implicitly indicate that &amp;quot;it&amp;quot; is the appropriate pronoun.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;*&amp;quot;Lady, you are the cruell&apos;st &lt;b&gt;she&lt;/b&gt; alive,
If you will lead these graces to the grave
And leave the world no copy&amp;quot;
(William Shakespear, _Twelfth Night I.v.241-243).&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This example is ungrammatical to me. I would use the construction &amp;quot;the cruell&apos;st woman alive&amp;quot;.
I can understand what is being said here, likely because of the simplicity of being
able to mentally substitute out &amp;quot;she&amp;quot; with a word meaning roughly &amp;quot;a person who
can be appropriately referred to by &apos;she&apos;&amp;quot;.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;*The &lt;b&gt;they&lt;/b&gt;s are not individual &lt;b&gt;he&lt;/b&gt;s and &lt;b&gt;she&lt;/b&gt;s with votes (Jenkins 1973).&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Like the previous example, this is ungrammatical to me. However, unlike the previous example,
I struggle to even understand what is being said here to be able to rephrase it.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;*&amp;quot;You say to &lt;b&gt;me&lt;/b&gt;-wards, your affection&apos;s strong;
Pray love me little, so you love me long&amp;quot;
(Robert Herrick, &amp;quot;Love me little, love me long&amp;quot;).&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;I can&apos;t say I&apos;ve seen the construction &amp;quot;me-wards&amp;quot; before. I am guessing here
that it means &amp;quot;in my direction&amp;quot;, trying to be slightly different from &amp;quot;say to
me&amp;quot;.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&#226;&#156;&#147;&amp;quot;&apos;Roses are worth more dried than alive&apos; - such a &lt;b&gt;you&lt;/b&gt; thing to say.&amp;quot;
(The Tragically Hip, &amp;quot;Impossibilium&amp;quot;).&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;?It just looked absolutely &lt;b&gt;us&lt;/b&gt; somehow.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;quot;Such a you thing to say&amp;quot; is a construction that I might use, with the meaning
of &amp;quot;That is a thing to say that features that would strongly suggest to me that
the speaker is you.&amp;quot; In the second example, trying to use &amp;quot;us&amp;quot; with a similar
meaning is more difficult because of the number mismatch. There are no
qualities that could strongly suggest that &amp;quot;it&amp;quot; is &amp;quot;us&amp;quot;, because the use of
&amp;quot;it&amp;quot; presupposes that the referent is singular, while &amp;quot;us&amp;quot; would require a
plural referent.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;*a &lt;b&gt;she&lt;/b&gt;-wolf&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;*a &lt;b&gt;he&lt;/b&gt;-man&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;*the &lt;b&gt;Me&lt;/b&gt;-Decade, the &lt;b&gt;We&lt;/b&gt;-Decade&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;I&apos;ve marked these as ungrammatical because even if I did use these constructions,
I do not believe it would be accurately described as a pronoun usage.
Specifically, I believe I would only use these phrases if they were &lt;a href=&quot;https://en.wikipedia.org/wiki/Lexical_item&quot; target=&quot;_blank&quot;&gt;lexical
items&lt;/a&gt; or, in other words, names
for concepts that happen to have a pronoun as part of its etymology.&lt;/p&gt;&lt;p&gt;For example, I might expect that &amp;quot;the Me-Decade&amp;quot; would be a name given to a
decade where there was a popular philosphical movement that put more emphasis
on one&apos;s self, but to my knowledge no such decade exists (Actually, after
writing that, on a whim I decided to do a search and it appears there is such a
term referring to the 1970s). Upon some more reflection as I&apos;m writing now, I
wonder if the Cowper and Hall gave this example with the intention for
&amp;quot;Me-Decade&amp;quot; to mean &amp;quot;The decade in which I was born&amp;quot;, but that would not be
an interpretation that I give to the phrase.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&#226;&#156;&#147;Mini-&lt;b&gt;Me&lt;/b&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This example differs from the previous three in where the pronoun appears.
I would happily use this construction to mean &amp;quot;something that strongly
resembles a smaller version of me.&amp;quot;&lt;/p&gt;&lt;h2&gt;Pronouns as pseudo-articles&lt;/h2&gt;&lt;p&gt;In the same Cowper-Hall paper, they give these examples with judgments that match mine.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&#226;&#156;&#147;&lt;b&gt;You&lt;/b&gt; linguists are an eccentric lot.&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&#226;&#156;&#147;They won&apos;t have an easy time convincing &lt;b&gt;us&lt;/b&gt; linguists.&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;*&lt;b&gt;They&lt;/b&gt; linguists are an eccentric lot.&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;*They won&apos;t have an easy time convincing &lt;b&gt;him&lt;/b&gt; linguist.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;However, when I read these examples, I immediately reacted that a slight rephrasing of the
third one is grammatical for me:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&#226;&#156;&#147;&lt;b&gt;Them&lt;/b&gt; linguists are an eccentric lot.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;I think this example is very strange! Later in the section, Cowper and Hall do mark that
&amp;quot;them linguists&amp;quot; is accepted by part of the population as an accusative, but in the
example I&apos;ve given here, the accusative pronoun is used in a phrase that&apos;s in a position
where we would expect the nominative case.&lt;/p&gt;&lt;p&gt;This strangeness also carries over to the plural first person pronouns. I, as
I suspect is common, accept &amp;quot;we linguists&amp;quot; as a nominative:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&#226;&#156;&#147;We linguists are an eccentric lot.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;However, I &lt;i&gt;also&lt;/i&gt; accept &amp;quot;us linguists&amp;quot; in the same position, and maybe would even
prefer that construction!&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&#226;&#156;&#147;Us linguists are an eccentric lot.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;I suspect that I&apos;m in a tiny minority on this one.&lt;/p&gt;&lt;p&gt;In line with the judgments given by Cowper and Hall, all of the attempts at a singular
construction are ungrammatical for me.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;*I linguist am an eccentric person.&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;*You linguist are an eccentric person.&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;*(He/Him/She/Her) linguist is an eccentric person.&lt;/p&gt;&lt;/blockquote&gt;&lt;h2&gt;Closing&lt;/h2&gt;&lt;p&gt;I found this an interesting exercise. I came across both constructions that I
accept that typically aren&apos;t accepted, and constructions that I don&apos;t accept
that typically are (or, at least were presented as uncontroversially accepted).
It&apos;s also surprisingly difficult to read a sentence and apply a grammatical
judgment, especially when the meaning is clear even if the sentence is
ungrammatical.&lt;/p&gt;</description></item><item><title>I built a Voron</title><link>https://www.brianhamrick.com/blog/voron-zero</link><pubDate>Fri, 31 May 2024 23:59:59 UTC</pubDate><description>&lt;p&gt;I&apos;ve had my &lt;a href=&quot;https://vorondesign.com/voron0.2&quot; target=&quot;_blank&quot;&gt;Voron 0&lt;/a&gt; up and running for
about two months now, and I wanted to write a bit about my build experience.&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/static/images/voron0/voron0.jpg&quot; alt=&quot;The built Voron&quot;&gt;&lt;/p&gt;&lt;p&gt;I had loved the look of the Voron 0 for a while, bought an LDO kit on Black
Friday last year, and finally got around to building it. There&apos;s a lot of
options for kits on the market, and LDO&apos;s is one of the priciest, if not the
singular priciest. I was drawn to it over the other kit options for a few
reasons:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;LDO has an excellent reputation in the 3D printer community, with their kits
having quality parts and nothing that is effectively mandatory to replace.&lt;/li&gt;&lt;li&gt;They provide a 100W bed heater, over the &amp;quot;stock&amp;quot; 60W option. The comparison
videos that I saw between LDO&apos;s bed heater and the other bed heater options
made this a likely upgrade that I&apos;d want to do if I built a different kit.&lt;/li&gt;&lt;li&gt;LDO&apos;s kit comes with all the wire terminations already crimped. That&apos;s a huge
time saver. Not only does it mean I don&apos;t have to do the crimping myself,
but I think their crimping was more likely to be good than my attempts
(I&apos;ve only done a small amount of crimping and have had several of them
fail), so it also probably saved me time on debugging bad wire connections.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Before moving on, I should also mention that buying a kit is a no-brainer
choice for almost everyone. It will generally be cheaper to buy a kit
and separately buy any part upgrades that you want than to self-source
everything, even though it&apos;ll mean that you end up with extra parts that
you aren&apos;t using. A lot of hardware parts are sold in packs that aren&apos;t
conveniently close to the number required, and also may have cheaper
bulk pricing. You also save a lot of shipping costs by getting everything
in a single shipment.&lt;/p&gt;&lt;p&gt;Rather than a full self-source, there&apos;s another interesting option of buying
sub-kits. For example, you can get &lt;a href=&quot;https://dllpdf.com/voron-v0.2-frame-kit&quot; target=&quot;_blank&quot;&gt;a kit of frame
components&lt;/a&gt;, &lt;a href=&quot;https://dllpdf.com/voron-v0.1-motion-and-drive&quot; target=&quot;_blank&quot;&gt;a kit of motion
components&lt;/a&gt;, and so on.
I think that for this route to be worthwhile, you need to have a decent number
of parts in mind that you&apos;re going to replace, and even then I would probably
not recommend it for a first build, since it makes it much more likely that you
overlook some key part when ordering and have to wait for a new delivery
mid-build.&lt;/p&gt;&lt;p&gt;I&apos;ve heard several people say that the Voron 0 is the most difficult Voron
to build because of its small size, but overall I still wouldn&apos;t say it was
that difficult. However, it does take a decent amount of time. I think I
spent roughly 50 hours on the build process, though if I were to build a
second one I&apos;m confident I would be able to go much faster.&lt;/p&gt;&lt;p&gt;For someone looking to do their own build, I&apos;d give two pieces of advice.
First, take each step slow and understand what you&apos;re doing. Second,
don&apos;t be afraid to go backwards in the process to change something.
Even with reading the manual as closely as I could, I had to go back and
fix mistakes multiple times. At least one was caused by misreading the
manual, but there were other cases that were much harder to avoid.
For example, I was using
&lt;a href=&quot;https://github.com/VoronDesign/VoronUsers/tree/main/printer_mods/zruncho/V0_No_Drop_Nuts&quot; target=&quot;_blank&quot;&gt;No Drop Nuts&lt;/a&gt;
and would use them again, but there were a couple times that I found
that the nut holders that I used were preventing the nuts from getting
to the right positions, so I had to take apart part of the frame to
swap them out. Even though it feels a bit demotivating to undo
your precious work, it was never a particularly arduous task. Each
step backwards just involved loosening a few screws, sliding out
some extrusions, and then putting everything back into place.&lt;/p&gt;&lt;p&gt;After the mechanical parts of the build, there&apos;s also several steps
involved in configuring the software, both the firmware running
on the printer (&lt;a href=&quot;https://www.klipper3d.org/&quot; target=&quot;_blank&quot;&gt;Klipper&lt;/a&gt;), and the slicer.
Steps like fine-tuning the Z offset and configuring the extrusion multiplier
definitely require patience, but once I got through the full process,
I felt like the parts I was getting out of the Voron were higher quality
than the ones I&apos;ve gotten out of the Bambu X1C.&lt;/p&gt;&lt;p&gt;It&apos;s likely that I could do a similar tuning process to improve the quality
of my X1C prints, but I&apos;d be relying on the Bambu firmware to have equivalent
options to the ones in Klipper. This reminds me a lot of one of the advantages
of running Linux: if there&apos;s something you don&apos;t like, it&apos;s extremely likely
that you are able to change it, and also a reasonably high chance that someone
else did it before you and you can reuse their work. With the Voron, this
advantage also extends to the physical parts, and there&apos;s a huge set of mods
in the community to pick from.&lt;/p&gt;&lt;p&gt;As for mods that I&apos;m looking at incorporating into my build, the biggest one
is &lt;a href=&quot;https://github.com/zruncho3d/ZeroPanels&quot; target=&quot;_blank&quot;&gt;ZeroPanels&lt;/a&gt;, which makes it much
easier to un-enclose the printer for things like access to various parts.
I&apos;m also intrigued by the
&lt;a href=&quot;https://github.com/MasturMynd/Pandora&quot; target=&quot;_blank&quot;&gt;Pandora gantry&lt;/a&gt;, although I don&apos;t yet
have plans that would require the extra travel room.&lt;/p&gt;&lt;p&gt;Finally, I already have components for a &lt;a href=&quot;https://github.com/JaredC01/Galileo2&quot; target=&quot;_blank&quot;&gt;Galileo 2 standalone
extruder&lt;/a&gt;, which I would install along
with the &lt;a href=&quot;https://github.com/chirpy2605/voron/tree/main/V0/Dragon_Burner&quot; target=&quot;_blank&quot;&gt;Dragon Burner
toolhead&lt;/a&gt;.  I
don&apos;t have any complaints about the print quality from the Mini Stealthburner,
which is the &amp;quot;stock&amp;quot; Voron 0 toolhead, but during assembly I had a bit of
trouble with the extruder parts where the shaft of the drive gear seemed to be
a bit undersized so I could barely get it onto the extruder stepper, and
couldn&apos;t get the set screw in at all. So far, the extruder seems to be working
with no problem without the set screw (the gear is just holding itself in place
as a result of it being a tight fit), but I wanted to have a backup extruder
option on hand in case it ever started failing. The printed parts for both of
these were some of the first prints I did after finishing the calibration.&lt;/p&gt;&lt;p&gt;I&apos;ve been using my Voron 0 to print out the pieces of my new Face Turning
Octahedron design. As I&apos;ve been assembling it, I&apos;ve already noticed even
more places for possible improvements, but that will have to be the topic
of a different post.&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/static/images/voron0/fto_v2_in_progress.jpg&quot; alt=&quot;In-progress FTO&quot;&gt;&lt;/p&gt;&lt;p&gt;Of course, there&apos;s one last question: Will I be building another printer?
Right now, I don&apos;t think I have the need. The Voron 0 and Bambu X1C cover
the amount of printing that I do for myself, and also mean that I have
redundancy if an issue arises with one of them. I had been eyeing the
potential of building a &lt;a href=&quot;https://github.com/zruncho3d/DuelingZero&quot; target=&quot;_blank&quot;&gt;Dueling Zero&lt;/a&gt;
to give me access to faster and less wasteful two-material prints allowing
the use of a different material for supports, but I&apos;ve gotten the surface
finish of supported surfaces beyond what I expected and good enough for my
purposes right now, despite using only a single material.&lt;/p&gt;&lt;p&gt;It &lt;i&gt;would&lt;/i&gt; be a fun build, though...&lt;/p&gt;</description></item><item><title>3D Printing a Computer Cover</title><link>https://www.brianhamrick.com/blog/computer-cover</link><pubDate>Sun, 17 Mar 2024 23:59:59 UTC</pubDate><description>&lt;h2&gt;The Problem&lt;/h2&gt;&lt;p&gt;A while back, I got a new computer. Since the chip shortage was still ongoing,
the easiest way to get a good graphics card was to buy a prebuilt PC. The PC
overall was great, and even better after I installed liquid cooling which made
it run effectively silently. The difference is so large that it feels similar
to switching from a HDD to an SSD. I&apos;ll probably never run a desktop with air
cooling again.&lt;/p&gt;&lt;p&gt;Anyway, the computer had a fatal flaw.&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/static/images/computer_cover/uncovered_top.jpg&quot; alt=&quot;Top of computer&quot;&gt;&lt;/p&gt;&lt;p&gt;The power button sits flush with the top of the case. Inky, one of our cats, is
fond of using my desktop tower as a stepping stone to get on top of my desk,
and shortly after I got the PC, she stepped on the power button and it
dutifully turned off.&lt;/p&gt;&lt;p&gt;For a while, I had been using a very simple solution of putting a book on top
of the power button. The book distributed the force so that the power button
wouldn&apos;t move enough to trigger. Unfortunately, recently Inky had been pushing
the book to the side or off of the tower completely, leaving the power button
exposed. So far I had managed to avoid any incidents, but it was only a matter
of time. And, you know, what if I wanted to actually read the book?&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/static/images/computer_cover/book_cover.jpg&quot; alt=&quot;Power button covered with book&quot;&gt;&lt;/p&gt;&lt;h2&gt;Using FreeCAD&lt;/h2&gt;&lt;p&gt;I started doing a bit of 3D modeling around a year and a half ago, but I had so
far only done the modeling in OpenSCAD. OpenSCAD was great for me because I
knew how to write code, but didn&apos;t know how to do CAD. However, I was starting
to run into some of the limitations of OpenSCAD, most notably the difficulty of
creating fillets due to it representing bodies as meshes, which means that it
has no concept of an edge to be filleted.&lt;/p&gt;&lt;p&gt;I decided this would be a good project to try out a more standard CAD program,
or at least one that uses boundary representation (B-rep) instead of meshes, so
that I would have access to better fillets. From what I can tell, most people
use Fusion 360 for this type of work, but I wanted to try out open alternatives
before committing to Fusion, so FreeCAD it was. I used the main version of
FreeCAD. I considered using realthunder&apos;s assembly3 fork, which I have heard
makes some things more intuitive, but my attempts of getting it installed were
failures, so I stuck with the main version.&lt;/p&gt;&lt;p&gt;The idea for the cover that I&apos;d make was simple: It would be a piece of plastic
slightly larger than the computer tower so that it would sit on top with
minimal movement, and it would have cutouts for the power button, USB ports,
etc, and a grid of holes above the fans. The idea is that when Inky jumps onto
it, her paw won&apos;t go far enough into the power button cutout to actually hit
the power button, but that it would still be easily accessible by human
fingers.&lt;/p&gt;&lt;p&gt;Getting started was a bit rocky. I originally tried using the Part workbench
because it had tools with the names I expected (&amp;quot;extrude&amp;quot;), but then when I
wanted to make a hexagon grid pattern of holes above the computer fans, it
seemed that the tool I wanted (MultiPattern) was only in the PartDesign
workbench. After some confusing research, I decided that PartDesign was the
workbench that I wanted to be using, and the &amp;quot;extrude&amp;quot; equivalent is called
&amp;quot;pad&amp;quot;.&lt;/p&gt;&lt;p&gt;Actually building the model wasn&apos;t too bad, except for the final step of
selecting edges to fillet because rendering the model with the hexagon grid cut
out was extremely slow. Some time after I finished the model, I found out that
the rendering is greatly sped up by enabling the &amp;quot;Use OpenGL VBO&amp;quot; setting.
However, even with that setting enabled, sometimes the rendered view still
slows to single digit FPS and the rest of the UI also becomes unresponsive
until it finishes whatever thinking it had to do (This could be a whole rant on
its own, not specific to FreeCAD).&lt;/p&gt;&lt;p&gt;Model in hand, I went to print it out.&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/static/images/computer_cover/cad_model.png&quot; alt=&quot;3D model&quot;&gt;&lt;/p&gt;&lt;h2&gt;Slicing and Printing&lt;/h2&gt;&lt;p&gt;For 3D printing, I&apos;m currently using a Bambu X1C, which has a build area of
256mm x 256mm. The cover I designed was 432mm x 205mm. Clever use of diagonal
orientation would not be enough to get it to fit into the build volume; I had
to split it up into multiple parts. That&apos;s nothing unusual for 3D printing, but
since I had previously only designed small parts, it was my first personal
experience with cutting up a model.&lt;/p&gt;&lt;p&gt;I ended up cutting up the model into three parts, which each could be printed
flat on the build plate. I liked this because the main exposed surface of the
final product would be the first layer of the print. The first layer picks up
the surface pattern of the build plate. I&apos;m using a textured PEI sheet, and I
really like the way that it makes first layers turn out.&lt;/p&gt;&lt;p&gt;For the two joints, I used different methods. The frontmost and middle pieces
were separated in the middle of a featureless area, so I used a dovetail joint
there. The middle and back pieces were cut in the middle of the grid of holes,
so I didn&apos;t expect a dovetail joint to do well. I used connector pins, which
make horizontal holes in the two pieces and two small cylinders to additionally
print.&lt;/p&gt;&lt;p&gt;This was actually my second try at cutting up the model. I originally did
dovetails on the thin sides of the part, and tried to print the three pieces
standing up. This would have had the advantage that I could print all three
pieces in the same print job, but it had downsides of exposing a side composed
of layer lines and being a much more difficult print due to the hexagon grid
being vertical. My attempt at printing this way ended up with a nozzle clog a
few hours in (also a new experience!), which eventually resulted in me
replacing the nozzle entirely when I kept getting partial clogs reappearing
after trying less drastic unclogging methods.&lt;/p&gt;&lt;p&gt;Anyway, let&apos;s take a look at the final result.&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/static/images/computer_cover/covered_top.jpg&quot; alt=&quot;The cover on top of the computer tower&quot;&gt;&lt;/p&gt;&lt;h2&gt;The Verdicts&lt;/h2&gt;&lt;h3&gt;FreeCAD&lt;/h3&gt;&lt;p&gt;I didn&apos;t find the UI of FreeCAD as bad as it&apos;s suggested by some of the reviews
I found online. It did take some time to get used to it, and it wasn&apos;t obvious
at the beginning whether I should expect to use Part or PartDesign. However, it
was really frustrating to do an incidental action on the model viewer and have
the entire application stall until the action was finished, meaning I couldn&apos;t
access any menus, move to a different stage of the model (which would be
simpler to render), and so on.&lt;/p&gt;&lt;p&gt;For my next design project, I will probably try a programmatic CAD option that
still uses B-rep. I think it will be nice having three distinct and very
separate steps of editing the model, calculating the model geometry, and
viewing the model. Calculating the model geometry is expected to take a decent
amount of time, and sometimes I noticed a mistake in my parameters while it was
happening, so it would be useful to be able to kill the step and go straight
back to editing. Also, FreeCAD mostly recalculates after every single change,
which means that when updating multiple parts of the model, I had to wait a
significant amount of time between each edit, even if I didn&apos;t actually care
about visually inspecting the result.&lt;/p&gt;&lt;h3&gt;Modeling based off of a photograph&lt;/h3&gt;&lt;p&gt;When making the cutouts for the power button and ports, I imported a top-down
photo of the computer top into FreeCAD and built the sketch based on the
photograph. This technique lets you match the part that you&apos;re building on
without making a lot of measurements.&lt;/p&gt;&lt;p&gt;It worked acceptably, but the power button is noticeably off center in its
cutout. I&apos;ll probably just take the bunch of measurements in the future.&lt;/p&gt;&lt;h3&gt;Joints for the 3D print&lt;/h3&gt;&lt;p&gt;The dovetail joint was excellent. The two pieces fit together very cleanly and
it doesn&apos;t show super obviously in the final result.&lt;/p&gt;&lt;p&gt;On the other hand, I don&apos;t like the way that the connector pin joint came out.
The pins didn&apos;t slide into the holes easily, and I didn&apos;t want to try sanding
or filing them down to a slightly smaller size, so I just pushed the two pieces
together as much as I could, and there&apos;s a very clear gap still. In the future,
if I want this kind of joint I&apos;ll plan to do it myself in the model instead of
relying on the slicer. Doing it myself in CAD means that I can more easily
control things like the amount of clearance to leave for the pins and a chamfer
to help align it when pressing it into the part.&lt;/p&gt;&lt;p&gt;The slicer also only let me do a single dovetail joint in the middle of the
part, but it might have also been a good solution to do two small dovetails
outside the grid of holes, which is again something that I could do if I
modeled the joint myself.&lt;/p&gt;&lt;h2&gt;The Culprit&lt;/h2&gt;&lt;p&gt;Of course I can&apos;t leave this post without a picture of the cat that caused the whole thing.&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/static/images/computer_cover/inky.jpg&quot; alt=&quot;Inky&quot;&gt;&lt;/p&gt;</description></item><item><title>A 2024 Update</title><link>https://www.brianhamrick.com/blog/update-mar-2024</link><pubDate>Fri,  1 Mar 2024 23:59:59 UTC</pubDate><description>&lt;p&gt;About two weeks ago was my last day working at Google. I&apos;m still not sure to
what extent I want to write about my time there, so at least in this post I
won&apos;t be going into any details for why I left. One of the big effects the job
had on me was that I generally had very little energy after getting home, and
so all my personal projects ended up getting put aside.&lt;/p&gt;&lt;p&gt;Now that I&apos;ve left the job, I&apos;m looking forward to spending time working on a
bunch of these personal projects that got more or less abandoned, and maybe
some that I thought of but never started. One of them, as you might have
guessed by the fact that you&apos;re reading this, is that I&apos;m hoping to start
writing on this blog again.&lt;/p&gt;&lt;p&gt;After I stopped regularly posting blog posts in 2017, I had multiple people
tell me that they really enjoyed reading the posts and were hoping that I would
revive the blog. I appreciate the support a lot, and unfortunately the blog was
one of those projects that I felt like I couldn&apos;t dedicate much energy to due
to work. So, now is a great time to write again!&lt;/p&gt;&lt;p&gt;Some things will be the same as before, and some will be different. I want the
blog to be something that I enjoy updating, which will hopefully lead to it
actually getting updated. I don&apos;t know how obvious it was to readers, but my
old posts were generally written with very little proofreading or editing.
That part will stay the same! I&apos;ve seen plenty of people burn out on their
hobbies from putting a high expectation of quality on themselves, and they end
up not posting anything or focusing on an alternate venue where they feel they
can get away from those expectations.&lt;/p&gt;&lt;p&gt;The big thing that will be different is that I&apos;m not going to try to stick to
any sort of schedule for writing and publishing posts. In the previous period
of posts, I tried to have a post up every week on Wednesday. The result was
that I didn&apos;t write much outside of Wednesdays, and I spent pretty much all of
Wednesday writing to get something out. I don&apos;t know to what extent that
directly contributed to me no longer updating the blog, but I&apos;d like to try it
differently this time. So updates will be irregular based around when I&apos;m
motivated to write.&lt;/p&gt;&lt;p&gt;The subject matters of my posts always varied quite widely, and I expect
they&apos;ll have a big variety going forward as well, but I also want to try having
series of posts around projects as I do work on them. One of those projects is
this website itself.&lt;/p&gt;&lt;p&gt;The website is written in Haskell, using
&lt;a href=&quot;https://hackage.haskell.org/package/warp-tls&quot; target=&quot;_blank&quot;&gt;warp-tls&lt;/a&gt; as the underlying web
server. It wouldn&apos;t have been particularly problematic to leave things as they
were if all I wanted to do was add more blog posts, but for any more intensive
code changes, I really wanted to be using an up-to-date version of Haskell, and
I also thought it might be interesting to write about what I needed to do to
get the code up to speed given that it was previously being compiled with GHC
7.10.3, a release from 2015.&lt;/p&gt;&lt;p&gt;It turned out that there was actually next to no work to be done: after
installing &lt;code&gt;ghcup&lt;/code&gt; and using it to install the lastest &lt;code&gt;ghc&lt;/code&gt; and &lt;code&gt;cabal&lt;/code&gt;, the
only compile errors I had were from &lt;code&gt;Data.Time.Calendar&lt;/code&gt; adding values named
&lt;code&gt;January&lt;/code&gt;, &lt;code&gt;February&lt;/code&gt;, etc, which conflicted with values of the same name that
my code defined. I also had a couple warnings about using &lt;code&gt;tail&lt;/code&gt; (Aside: I&apos;m
extremely happy that the Haskell community decided to put warnings on the
partial functions in Prelude), so I replaced them with &lt;code&gt;drop 1&lt;/code&gt;, which was
easier than refactoring with &lt;code&gt;NonEmpty&lt;/code&gt; and fine for my use case.&lt;/p&gt;&lt;p&gt;Here is the entire diff:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;diff --git a/src/Models/Blog.hs b/src/Models/Blog.hs
index c308c78..e87c424 100644
--- a/src/Models/Blog.hs
+++ b/src/Models/Blog.hs
@@ -92 +92 @@ older_entry =
-        (id_ b2, b1)) (zip entries (tail entries)))
+        (id_ b2, b1)) (zip entries (drop 1 entries)))
@@ -95 +95 @@ newer_entry =
-        (id_ b1, b2)) (zip entries (tail entries)))
+        (id_ b1, b2)) (zip entries (drop 1 entries)))
diff --git a/src/Util/Date.hs b/src/Util/Date.hs
index bd17106..d04582c 100644
--- a/src/Util/Date.hs
+++ b/src/Util/Date.hs
@@ -5 +5 @@ import Data.String
-import Data.Time.Calendar
+import Data.Time.Calendar hiding (January, February, March, April, May, June, July, August, September, October, November, December)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Pretty boring!&lt;/p&gt;&lt;p&gt;The other thing I decided to update was the DigitalOcean droplet that the site
is running on. I hadn&apos;t updated the Ubuntu distribution since I created the
droplet nine years ago, so it was running Ubuntu 14.04.&lt;/p&gt;&lt;p&gt;The update procedure is theoretically pretty simple: &lt;code&gt;sudo apt update&lt;/code&gt;, &lt;code&gt;sudo
apt upgrade&lt;/code&gt;, then &lt;code&gt;do-release-upgrade&lt;/code&gt; to get to the next release. Since I was
four releases behind, I&apos;d have to do this procedure 4 times (14 to 16, 16 to
18, 18 to 20, and then 20 to 22). Unfortunately, when I got to updating from 18
to 20, things went wrong.&lt;/p&gt;&lt;p&gt;The droplet wasn&apos;t reachable over the internet, and eventually I figured out
that it wasn&apos;t booting properly. It seemed to just hang at some point, with the
last message on screen being &lt;code&gt;Finished Helper to synchronize boot for
ifupdown...&lt;/code&gt;. It wasn&apos;t clear what actually was going wrong, since there
weren&apos;t any error logs, and I ended up restoring to the snapshot I made before
doing any work, so after a few hours of frustration I was back to 14.04. At
least my website was back up.&lt;/p&gt;&lt;p&gt;Upon retracing my steps, this time creating a new snapshot after each release
update, I got the exact same failure trying to update from 18 to 20.
Eventually, I stumbled across a post that suggested that the update might be on
a bad kernel, which prompted me to look into updating the kernel without doing
a release update. What I found was actually the opposite: My droplet was still
using the same kernel after each release update!&lt;/p&gt;&lt;p&gt;This was because the droplet was still on the legacy kernel management, which
meant that the kernel on the disk image was being totally ignored. A simple
switch on the droplet configuration got me on the expected kernel, and from
there the updates from 18 to 20 and 20 to 22 worked without incident.&lt;/p&gt;&lt;p&gt;Out of curiosity, after the updates were done I ran &lt;code&gt;wrk&lt;/code&gt; to see how well the
site handles load and found that it can indeed be hug-of-death&apos;d. I humbly ask
that readers don&apos;t try replicating my experiment. It&apos;s not at the top of the
list of things I want to work on, but I might try to improve how it handles
high load.&lt;/p&gt;&lt;p&gt;One of the projects that I have plans to work on is my 3D printed face turning
octahedron, which I &lt;a href=&quot;https://www.reddit.com/r/Cubers/comments/17iqmhc/some_turns_on_my_3d_printed_fto/&quot; target=&quot;_blank&quot;&gt;posted on
Reddit&lt;/a&gt;
a while ago. Since that post, I&apos;ve figured out a way to solve one of its
biggest flaws, but didn&apos;t have the energy to incorporate it into a new design.
The puzzle already went through many design iterations to get it to turn as
well as it does, and I plan to write up a dedicated post with more details.&lt;/p&gt;&lt;p&gt;Until next time!&lt;/p&gt;</description></item></channel></rss>