Dying To WriteDying To Write2023-06-13T00:00:00Zhttps://www.dyingtowrite.comN. S. Reisshello@dyingtowrite.comHSV to RGB integer conversion and the joy of reading techncial research2023-06-13T00:00:00Zhttps://www.dyingtowrite.com/posts/2023/rgb-to-hsv-reading-research-papers/<style>
img {
border: 1px solid black
}
</style>
<p>Recently, I have been obsessed with the idea of a game where you can breed different colored Pokemon, like those old creature simulators <a href="https://www.grophland.com/">Grophland</a> and <a href="https://www.howrse.com/">Howrse</a>. In the normal Pokemon games, you can’t have Pokemon with unique coat colors. Sometimes, there are color and regional variants, but those are limited to what is drawn by artists.</p>
<p>Could I simulate coat color breeding with simplified genetics? <em>Maybe</em> maybe, but let’s try something easier. I need to figure out how to generate randomly colored Pokemon. I don’t care if the colors look good or work well, I just need the ability to swap palettes first.</p>
<p><code>random_rgb(rattata)</code></p>
<p><img src="https://www.dyingtowrite.com/posts/2023/media/random-rats.png" alt=""Mutant colored rattatas, a rat pokemon"" style="border: none; width: 100%;image-rendering: pixelated;" loading="lazy" /></p>
<p>That was easy enough.</p>
<p>Onto the next step: parametrizing transformations between colors. I won’t be covering that in this post. This post is all about overcomplicating things and banging my head on the wall.</p>
<p>More importantly, I encountered a problem.</p>
<p>Sometimes, when converting an RGB color to HSV, and converting back, the RGB was different, just by a tiny bit. The hex code changed one letter. That’s not good. I immediately knew these were caused by floating point errors. Python’s built-in <strong>colorsys</strong> module uses float numbers, so indeed I had rounding errors.</p>
<p>In real life, randomness and mutations are inevitable, but for a game, and especially for a breeding mechanic, I don’t want unintentional randomness. The one thing that makes a game fun is that the game world isn’t as difficult as real life.</p>
<figure class=".float-right">
<img style="border: none" src="https://www.dyingtowrite.com/posts/2023/media/rgb_color_solid_cube.png" alt="Rainbow cube colorspace with Red, Green, and Blue as axes. Gibberish equations spinning around the cube." />
<figcaption>RGB cube of wonder</figcaption>
</figure>
<p>Why do I need to convert between RGB and HSV? Well, the RGB color system is meant for computer monitors. As humans, we don’t consider colors as a mix of red, green, blue. Hue Saturation Value (HSV) is easier to manipulate and conceptualize as pigments.</p>
<p>If I cannot rely on the <strong>colorsys</strong> module to do its job, then I need to figure out how to convert between RGB and HSV without any loss or errors. An internet search brought me to the research paper “Integer-Based Accurate Conversion between RGB and HSV Color Spaces” by Vladimir Chernov and co.</p>
<p>This looks promising! Since I am a degenerate who only knows how to copy and paste, I find the part that says, “The source code of all the tests can be found in the author’s repository [21]. The code is published under open source license.”</p>
<p>Hooray! I click on the link in the reference:</p>
<blockquote>
<p>[21] Chernov Vladimir. Proposed algorithm source code; 2014. <<a href="https://bitbucket.org/chernov/colormath">https://bitbucket.org/chernov/colormath</a>></p>
</blockquote>
<p>And… the repository is gone…</p>
<p><img src="https://www.dyingtowrite.com/posts/2023/media/404.png" alt="the source code link doesn't exist." loading="lazy" /></p>
<p>Well, no matter, the algorithm is written in the research paper. Nothing can possibly go wrong if I follow the 1-2-3 steps conveniently outlined by the researchers… right?</p>
<p><span style="font-size:1.2em">Right?</span></p>
<p>To convert RGV to HSV:</p>
<blockquote>
<p>1. Find the maximum (M), minimum (m) and middle (c) of R, G, and B.</p>
</blockquote>
<p>The <em>middle??</em> What’s the middle of RGB? The average mean, or the median? Since RGB can be visualized as a coordinate in a 3D cube, does it mean the midpoint distance of the RGB vector?</p>
<p>Already, my efforts have gone wrong at the very first step. Nowhere in the paper is the defintion of <em>middle</em> mentioned.</p>
<h2 id="the-meaning-of-middling">The meaning of middling <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/rgb-to-hsv-reading-research-papers/#the-meaning-of-middling">#</a></h2>
<p>In Python and most programming languages, there are <code>max([r,g,b])</code> and <code>min([r,g,b])</code> functions which pick the biggest and smallest numbers of a set. Self-explanatory.</p>
<p>However there’s no <code>mid([r,g,b])</code> function. I reread the paper, again, just to make sure I didn’t miss anything. The word “middle” only appears twice in the CTRL + F word search. Not many results for “mid” either. The closest to a human-like explanation is, “The middle component and sector offset are determined according to previously found maximum (M) and minimum (m).”</p>
<p>Yeah, no.</p>
<p>I opened a trusty search engine and entered terms like:</p>
<p><img src="https://www.dyingtowrite.com/posts/2023/media/duckduck_1.png" alt="Typing into the search engine "c++ middle value 3 dimensions"" loading="lazy" /></p>
<p>This search lead to some really strange answers: <a href="https://stackoverflow.com/a/14676309">Bitwise XOR operator ^ to calculate middle in Java</a>. (Ironically, this discussion contains the solution, but when I tried it, it didn’t work because the code was still incomplete. More on that later)</p>
<p>Ok, so, there’s no standard definition of <em>middle.</em> I’m on my own.</p>
<p>I got sidetracked and read some pages on bitwise shift operators because I cannot ever remember which side is right or left. I’m bad at directions.</p>
<p>Finally, I searched the author’s name and the missing repository: <code>chernov colormath</code>. Luckily for me, after scrolling down quite far, I found <a href="https://www.mathworks.com/matlabcentral/answers/304985-how-to-calculate-mid-value-of-rgb-image-in-matlab">“How to calculate mid value of RGB image in matlab?”</a></p>
<p><img src="https://www.dyingtowrite.com/posts/2023/media/duckduck_2.png" alt="Matlab question and answer forums" loading="lazy" /></p>
<p>The top answer by Walter Roberson contains a link to the source code by the authors of the paper.</p>
<figure><img alt="The source code was moved to a different path" src="https://www.dyingtowrite.com/posts/2023/media/duckduck_endtrail.png" />
<figcaption><em>Thank goodness for BitBucket pointing to the renamed repository.</em></figcaption></figure>
<p>He says that according to the code, the middle is just one of the R,G,B values. So if your red is 100, and your blue is 60, and your green is 20, then the middle is the blue value of 60. Red at 100 is the max, and green at 20 is the min. The last color is neither max nor min, hence, known as the “middle.” Wow. So simple.</p>
<p>Since the source code for the paper is still available online, I can finally port this algorithm into Python, right?</p>
<p>Right?</p>
<p>The RGB to HSV algorithm works fine. When I tried coding the backwards conversion from HSV to RGB, it doesn’t.</p>
<p><img src="https://www.dyingtowrite.com/posts/img/facepalm.jpg" alt="" style="max-width: 30ch" loading="lazy" /></p>
<h2 id="documentation-is-a-lie">Documentation is a lie <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/rgb-to-hsv-reading-research-papers/#documentation-is-a-lie">#</a></h2>
<p>The Chernov paper claims that the algorithm works with no loss or errors. If this claim is true, my only recourse is to examine the source code and follow the implementation.</p>
<p>Long story short, where the research paper describes the steps, it is missing a step.</p>
<p>In math, every step has a corresponding inverse that also converts HSV back to RGB.</p>
<p>The backwards conversion formula was missing the reversal step, which caused the HSV to RGB formula to output incorrect results.</p>
<!-- This inverse is needed because the constant <span style="font-family: serif;">I</span> represents a hexagon sector. The HSV space can be visualized as a hexagon pyramid, and 3D coordinates have negative and postive axes. If the quadrant or sector is in a negative coordinate space, then you want to pick an easier starting point, like how a -540° rotation is the same as a 180° rotation, and the value wraps around. You want to normalize the -540 into 180. This Invert F step does the same thing, but for the HSV hexagon (that's my guess, I'm too lazy to actually check).
However, in the next passage that desribes backwards conversion—from HSV to RGB—it forgets to mention the counterpart to the inversion: -->
<p>I examined their <a href="https://bitbucket.org/chernov/colormath_hsv/src/master/colormath/hsv.cpp">source code</a> and derived the missing step:</p>
<pre><code>if I == 1 or I == 3 or I == 5
then F = E * (I + 1) - H
</code></pre>
<p>It should be performed at around step 5:</p>
<p><img src="https://www.dyingtowrite.com/posts/2023/media/pseudocode_hsvtorgb.png" alt="Snippet from the paper, showing the 7 steps of the HSV to RGB formula" loading="lazy" /></p>
<p>Unfotunately, it is not written out so plainly. It is hidden inside of a nest of if-statements.</p>
<p>I understand C++ is a different language, and the authors wanted to make their program as fast as possible. I also understand that English is not the authors’ native langauge, and I appreciate the work that has gone into the algorithm. It just hurts to read nested if-statements.</p>
<p>Anyway, with my newfound missing pieces, I implemented their HSV to RGB algorithm in Python:</p>
<pre class="language-python"><code class="language-python">E <span class="token operator">=</span> <span class="token number">65537</span><br /><br /><span class="token keyword">def</span> <span class="token function">hsv_to_rgb</span><span class="token punctuation">(</span>h<span class="token punctuation">,</span> s<span class="token punctuation">,</span> v<span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token builtin">tuple</span><span class="token punctuation">[</span><span class="token builtin">int</span><span class="token punctuation">,</span> <span class="token builtin">int</span> <span class="token builtin">int</span><span class="token punctuation">]</span><span class="token punctuation">:</span><br /> <span class="token triple-quoted-string string">"""Note that the hsv must be in the form given in the Chernov paper,<br /> which is ([0-393222], [0-65535], [0-255])<br /> NOT the typical ([0-359, [0-100], [0-100])"""</span><br /> <br /> delta <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>s <span class="token operator">*</span> v<span class="token punctuation">)</span> <span class="token operator">>></span> <span class="token number">16</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">1</span><br /> minimum <span class="token operator">=</span> v <span class="token operator">-</span> delta <br /><br /> <span class="token keyword">if</span> h <span class="token operator"><</span> E<span class="token punctuation">:</span><br /> i<span class="token operator">=</span><span class="token number">0</span><br /> <span class="token keyword">elif</span> h <span class="token operator">>=</span> E <span class="token keyword">and</span> h <span class="token operator"><</span> <span class="token number">2</span> <span class="token operator">*</span> E<span class="token punctuation">:</span><br /> i<span class="token operator">=</span><span class="token number">1</span><br /> <span class="token keyword">elif</span> h <span class="token operator">>=</span> <span class="token number">2</span> <span class="token operator">*</span> E <span class="token keyword">and</span> h <span class="token operator"><</span> <span class="token number">3</span> <span class="token operator">*</span> E<span class="token punctuation">:</span><br /> i<span class="token operator">=</span><span class="token number">2</span><br /> <span class="token keyword">elif</span> h <span class="token operator">>=</span> <span class="token number">3</span> <span class="token operator">*</span> E <span class="token keyword">and</span> h <span class="token operator"><</span> <span class="token number">4</span> <span class="token operator">*</span> E<span class="token punctuation">:</span><br /> i<span class="token operator">=</span><span class="token number">3</span><br /> <span class="token keyword">elif</span> h <span class="token operator">>=</span> <span class="token number">4</span> <span class="token operator">*</span> E <span class="token keyword">and</span> h <span class="token operator"><</span> <span class="token number">5</span> <span class="token operator">*</span> E<span class="token punctuation">:</span><br /> i<span class="token operator">=</span><span class="token number">4</span><br /> <span class="token keyword">else</span><span class="token punctuation">:</span><br /> i<span class="token operator">=</span><span class="token number">5</span><br /><br /> <span class="token comment"># The missing step: sector inversion inverse</span><br /> <span class="token keyword">if</span> i <span class="token operator">==</span> <span class="token number">1</span> <span class="token keyword">or</span> i <span class="token operator">==</span> <span class="token number">3</span> <span class="token keyword">or</span> i <span class="token operator">==</span> <span class="token number">5</span><span class="token punctuation">:</span><br /> f <span class="token operator">=</span> E <span class="token operator">*</span> <span class="token punctuation">(</span>i <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">-</span> h<br /> <span class="token keyword">else</span><span class="token punctuation">:</span><br /> f <span class="token operator">=</span> h <span class="token operator">-</span> <span class="token punctuation">(</span>E <span class="token operator">*</span> i<span class="token punctuation">)</span><br /><br /> mid <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>f <span class="token operator">*</span> delta<span class="token punctuation">)</span> <span class="token operator">>></span> <span class="token number">16</span><span class="token punctuation">)</span> <span class="token operator">+</span> minimum<br /><br /> <span class="token keyword">if</span> i <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">:</span><br /> <span class="token keyword">return</span> v<span class="token punctuation">,</span> mid<span class="token punctuation">,</span> minimum<br /> <span class="token keyword">elif</span> i <span class="token operator">==</span> <span class="token number">1</span><span class="token punctuation">:</span><br /> <span class="token keyword">return</span> mid<span class="token punctuation">,</span> v<span class="token punctuation">,</span> minimum<br /> <span class="token keyword">elif</span> i <span class="token operator">==</span> <span class="token number">2</span><span class="token punctuation">:</span><br /> <span class="token keyword">return</span> minimum<span class="token punctuation">,</span> v<span class="token punctuation">,</span> mid<br /> <span class="token keyword">elif</span> i <span class="token operator">==</span> <span class="token number">3</span><span class="token punctuation">:</span><br /> <span class="token keyword">return</span> minimum<span class="token punctuation">,</span> mid<span class="token punctuation">,</span> v<br /> <span class="token keyword">elif</span> i <span class="token operator">==</span> <span class="token number">4</span><span class="token punctuation">:</span><br /> <span class="token keyword">return</span> mid<span class="token punctuation">,</span> minimum<span class="token punctuation">,</span> v<br /> <span class="token keyword">else</span><span class="token punctuation">:</span><br /> <span class="token keyword">return</span> v<span class="token punctuation">,</span> minimum<span class="token punctuation">,</span> mid</code></pre>
<p>The <a href="https://gitlab.com/kibblab/rgb_to_hsv/-/tree/main">rest of my code can be found here</a>.</p>
<p>In Python, you can write pseudocode almost word-for-word. You can write neat code in C++ too, but C++ programmers are a different breed.</p>
<h2 id="takeaways">Takeaways <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/rgb-to-hsv-reading-research-papers/#takeaways">#</a></h2>
<p>A combination of internet connection failures, either from my end or the BitBucket server, was a timesink. I rely on the internet sooooo much.</p>
<p>I learned a lot from trying to reproduce someone else’s research, and it requires the utmost of patience.</p>
<p>Would I have been able to figure out the missing step without the source code? Maybe if I stared at the paper long enough, I would compare the forward and backwards methods, and deduce that the reversal step was missing.</p>
<p>Or I might have to retrace everything, which means stepping into the authors’ shoes, adopt the mental model of 3 experts and acquire the same knowlege as them, figure out why they made certain decisions, how memory layouts work, how does overflow and integer division work, etc.</p>
<p>I don’t want to say that I’d just give up, but giving up is an option. I could just live with floating point rounding errors.</p>
<p>Maybe I’d continue Googling and searching, hoping someone else solved the problem in a similar fashion.</p>
<p>Could I have used ChatGPT to give me an algorithm?</p>
<p><img src="https://www.dyingtowrite.com/posts/2023/media/6-chatgpt.png" alt="Screenshot of ChatGPT history where I ask about the definition of middle in the context of the Chernov paper." loading="lazy" /></p>
<p>Close, but no cigar. The “middle” refers to the median of my input RGB values.</p>
<p>Long story short, <a href="https://gitlab.com/kibblab/rgb_to_hsv/-/blob/main/convert.py#L154">ChatGPT gave me an algorithm</a> that was wrong, so it didn’t save time for me. Maybe if I was better at prompt writing, I’d get better results, but it’s already hard enough to write in a way that a human understands. How much harder is it to write something a robot can understand?</p>
<hr />
<h2 id="references">References <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/rgb-to-hsv-reading-research-papers/#references">#</a></h2>
<p>Chernov, Vladimir, Jarmo Alander, and Vladimir Bochko. “Integer-Based Accurate Conversion between RGB and HSV Color Spaces.” <em>Computers & Electrical Engineering</em> 46, no. C (August 2015): 328–37. <a href="https://doi.org/10.1016/j.compeleceng.2015.08.005">https://doi.org/10.1016/j.compeleceng.2015.08.005</a>.</p>
Email Improvement Exercise - Localization2023-05-20T00:00:00Zhttps://www.dyingtowrite.com/posts/2023/email-improvement/<p>This is a case study on improving the readability of an internal corporate email. I focus on high-level factors such as organization and audience rather than small details like formatting and diction.</p>
<p>In software development, internationalization is a complex process, and it starts with translating the text of the application. Text labels are called strings.</p>
<p>To translate strings, a software development team typically outsources them to a translation company, which is a process fraught with back-and-forth between customers and product development.</p>
<p>New strings and revisions must be funneled to the localization team, who is responsible for requesting quotes from translation vendors. The localization team sends out a reminder email to other teams, hoping to collect the latest and greatest updates.</p>
<p><img src="https://www.dyingtowrite.com/posts/2023/media/email-inbox-sui.png" alt="A simplified GUI of an email inbox." loading="lazy" /></p>
<p><em class="centered">Ah, the smell of shiny new strings.</em></p>
<p>Other teams have difficulty filling out the collection forms. They’d leave out crucial info like identifier keys for each string. This suggests that non-technical managers are unaware of the reason for unique keys, and they assume that providing the English string is enough.</p>
<p>We want to provide teams a clear set of expectations and guidelines for localization.</p>
<p>Here is an abridged version of the original email:</p>
<blockquote>
<h1 id="reminder-string-freeze">Reminder: String Freeze <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/email-improvement/#reminder-string-freeze">#</a></h1>
<p>ATTENTION: String Freeze for Release V</p>
<p>Dear teams,</p>
<p>The deadline for our string freeze for Release V is coming next week DD, MMM, end of day UTC.</p>
<p><strong>CSV-based strings</strong></p>
<ul>
<li>@LocalizationTeam collects CSVs from Git repositories that are registered with us.</li>
<li>If you need any other CSV to be considered, please mention in the [Link to wiki page].</li>
<li>Also, mail @Name and @LocalizationTeam</li>
</ul>
<p><strong>Non CSV-based repositories:</strong> Any strings from Firebase, backend DB, Azure CosmoDB, share them with us @LocalizationTeam in [this spreadsheet]. If you have trouble accessing the file, let me know in the chat.</p>
<p><strong>Screenshots:</strong> (explanation of why screenshots are helpful for translators, as well as how to name them). Upload your screenshots to [Link to drive]
If you have multiple screenshots, put them in PowerPoint slides and name the slide with <code>TEAM-PRODUCT-RELEASE-V-DATE.pptx</code>.</p>
<p><strong>Useful links and pointers about our Localization Process</strong></p>
<ol>
<li>
<p>CSV</p>
<ul>
<li>(repeats information about how we collect CSVs from Git repositories, and to contact us about CSV repositories so we can track them)</li>
</ul>
</li>
<li>
<p>Database</p>
<ul>
<li>Please inform us about database strings.</li>
<li>Use this format:</li>
</ul>
<div class="scroll-table" style="overflow-x:auto;"><table><thead>
<tr>
<th>Product</th>
<th>Source database</th>
<th>Row Key</th>
<th>English text</th>
<th>Context about the string</th>
</tr>
</thead>
<tbody>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table></div></li>
<li>
<p>Shared Data</p>
<ul>
<li>Please use this format when sharing strings.</li>
</ul>
</li>
<li>
<p>Application Data</p>
<ul>
<li>Please share your strings thru email.</li>
</ul>
</li>
<li>
<p>System Notifications</p>
<ul>
<li>ATTN Product managers, please share UI strings so the technical writing team can review. Also send another email to @LozalizationTeam before the freeze date.</li>
</ul>
</li>
</ol>
<p><strong>Guidelines for introducing UI strings</strong></p>
<ol>
<li>Does the string already exist? Reuse them.</li>
<li>Is the row key a duplicate? Can something be reused from our existing CSV translations?</li>
<li>Is the string a partial string (a fragment string that only has meaning after being rendered with data)? Please provide @LocalizationTeam with context about the string.</li>
<li>Ensure not to have split strings (broken sentences typically used to recombine or render them in a special matter).</li>
<li>Proofread string (value) for spelling and grammar.</li>
<li>Vigilance with symbols being part of string-like, such as quotes, $ @ # ! ~ % & *</li>
<li>Let us know if there is a CSV file not on our list.</li>
</ol>
<p>Thanks and regards,<br />
LocalizationTeam</p>
</blockquote>
<p>I’ve simplified some of the paragraphs. The original message was much longer! It was written by someone who was too busy to make it user friendly. The dates and links that change for every release are placed together for easy access… It was written for the convenience of the original author, who spearheaded a burgeoning localization team.</p>
<h2 id="evaluating-the-message">Evaluating the message <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/email-improvement/#evaluating-the-message">#</a></h2>
<p>I will break down each part of the email and explain my thought process.</p>
<h3 id="the-introduction">The Introduction <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/email-improvement/#the-introduction">#</a></h3>
<blockquote>
<p><strong>Reminder - String Freeze</strong></p>
<p>ATTENTION: String Freeze for Release V.</p>
<p>Dear teams,</p>
<p>The deadline for our string freeze for Release V is coming next week DD, MMM, end of day UTC.</p>
</blockquote>
<p><strong>Lack of Purpose</strong><br />
The email does not explain what a “string freeze” is. In corporate jargon, a “freeze” is commonly known as a promised date, an Estimate Time of Arrival (ETA), for when a task can be completed.</p>
<p>The localization team has to send out work to the translation company; they can’t wait around forever. Great, but every team has work and deadlines. <em>What is this deadline for?</em></p>
<p>The fix: add a sentence about the purpose of the reminder. “This is your chance to request localization from the LocalizationTeam.” It’s a call to action and informs the reader of an opportunity.</p>
<h3 id="the-middle">The Middle <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/email-improvement/#the-middle">#</a></h3>
<p>Right off the bat, the next topic is about the formatting of the strings.</p>
<blockquote>
<p><strong>CSV-based strings</strong></p>
<ul>
<li>@LocalizationTeam collects CSVs from Git repositories that are registered with us.</li>
<li>If you need any other CSV to be considered, please mention that at [Link].</li>
<li>Also, mail @Name and @LocalizationTeam</li>
</ul>
<p><strong>Non CSV-based repositories:</strong> Any strings from Firebase, backend DB, Azure CosmoDB, share them with us @LocalizationTeam in [this spreadsheet]. If you have trouble accessing the file, let me know in the chat.</p>
</blockquote>
<p>However, the heading is ineffective. <strong>Comma Separated Values (CSV)</strong> is a file type, not a process or a task. Also, strings cannot be CSV-based. Well, okay, they can be, but I will explain why that trait is not relevant for this email.</p>
<p>If we simplify the message, it is saying:</p>
<blockquote>
<p><strong>CSVs</strong><br />
We love CSV file format. Developers, it’s better if you store your strings in CSV and give us the GitHub link to it.</p>
<p>If you store strings in a database, then you’ll have to follow our tedious submission process.</p>
</blockquote>
<p>There are CSV strings and not-CSV strings. Two simple categories, right? If we follow the mutually exclusive and collectively exhaustive (MECE) principle, the distinction seems to work.</p>
<p>The email states a few examples of “non-CSV” strings, like database strings.</p>
<p><em>In practice,</em> all strings are implemented in a database eventually. Database performance matters to a developer.</p>
<p><em>In practice,</em> corporate business professionals work with one format: spreadsheets. Only CSV matters to a translator.</p>
<p><em>In practice,</em> strings are both CSV and database-“based.” CSV and non-CSV are not mutually exclusive categories. Hence, the heading doesn’t make sense in the current context.</p>
<p>In the past, the distinction between CSV and database strings might’ve made sense, when the applications and projects were structured differently. However, it doesn’t make sense when you consider the human behind the work. Regardless of what format the strings are in, they need to be reviewed and translated. We should prioritize what the translators want, which is a CSV.</p>
<p>We find the same problem in the next part:</p>
<blockquote>
<p><strong>Useful links and pointers about our Localization Process</strong></p>
<ol>
<li>
<p>CSV</p>
<ul>
<li>(repeats information about the CSV repositories)</li>
</ul>
</li>
<li>
<p>Database</p>
<ul>
<li>Please inform us about database strings.</li>
<li>Use this format…</li>
</ul>
</li>
<li>
<p>Shared Data</p>
<ul>
<li>Please use this format when sharing strings.</li>
</ul>
</li>
<li>
<p>Application Data</p>
<ul>
<li>Please share your strings thru email.</li>
</ul>
</li>
<li>
<p>System Notifications</p>
<ul>
<li>ATTN Product managers, please share UI strings so the technical writing team can review. Also send a different email to @LozalizationTeam before the freeze date.</li>
</ul>
</li>
</ol>
</blockquote>
<p><strong>Unnecessary Repetition</strong><br />
There’s a lot of verbose policy stitched together. The points are not distinct enough from each other. Each point amounts to the same action item: GIVE US YOUR STRINGS FOR REVIEW.</p>
<p>From a localization standpoint, there is no difference between Shared Data, Application Data, or System Notification Strings. Yes, the translator needs the context in which the string will appear, but the categories do not affect the localization manager’s work, the process of collating new strings into batches before sending them out for translation.</p>
<p>We can axe these points and just have one process for all.</p>
<p>No matter if your strings are stored as CSV or not, the tedious submission process is the same. The strings need to be extracted into a translator-friendly CSV format, supplemented with screenshots and context, proofread by technical writers, and filled out by the translation vendor.</p>
<p>I was inspired by the <a href="https://apex-magazine.com/blog/strange-machines-an-anthology-of-dark-user-manualsstrange-machines/">Call for Submission Guidelines</a> for Apex Magazine. Since our string freeze reminder is the same as a call for submissions, we can use the same structure.</p>
<h3 id="the-ending">The Ending <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/email-improvement/#the-ending">#</a></h3>
<p>The last part, the guidelines, are hidden at the bottom.</p>
<blockquote>
<p><strong>Guidelines for introducing UI strings</strong></p>
<ol>
<li>Does the string already exist? Reuse them</li>
<li>Is the row key a duplicate? Can something be reused from our existing CSV translations?</li>
<li>Is the string a partial string (a fragment string that only has meaning after being rendered with data)? Please provide @LocalizationTeam with context about the string.</li>
<li>Ensure not to have split strings (broken sentences typically used to recombine or render them in a special matter)</li>
<li>Proofread string (value) for spelling and grammar</li>
<li>Vigilance with symbols being part of string-like, such as quotes, $ @ # ! ~ % & *</li>
<li>Let us know if there is a CSV file not on our list.</li>
</ol>
</blockquote>
<p>The guidelines are mixed between formatting and process concerns, so it would be best to separate them.</p>
<p>For example, guidelines 1, 2, and 5 are prerequisites before anyone submits anything, and should go near the beginning of the email.</p>
<p>3, 4, and 6 are very similar. Partial strings are a headache for translators who need the full sentence for an accurate translation. Random punctuation is indicative of variables, but they can also be there on purpose. The engineering team should be aware of these guidelines before implementation, and try not to split strings unless needed.</p>
<p>7 is a repeat about how the localization team wants your CSVs.</p>
<p><strong>Mixed Audience</strong><br />
The recipients of the email includes everyone in product development. Although the reminder is mainly aimed at product managers, some of the guidelines include constraints that the engineering team needs to know.</p>
<p>Many product managers want to have their products localized, but it’s not clear how. So, let’s make it easy for them to follow.</p>
<p>These are the elements we need in our new email:</p>
<ul>
<li>Desired Format</li>
<li>Submission Guidelines</li>
<li>Constraints and Limitations</li>
</ul>
<h2 id="results">Results <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/email-improvement/#results">#</a></h2>
<p>After evaluating the main message and the purpose of the email, I can craft a revised version that is much clearer about its purpose.</p>
<p>The revised email:</p>
<blockquote>
<h1 id="string-freeze-for-release-v">String Freeze for Release V <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/email-improvement/#string-freeze-for-release-v">#</a></h1>
<p>Dear Teams,</p>
<p>The String Freeze Deadline for Release V is coming MMM DD at end of day UTC.<br />
This is your chance to request localization from the LocalizationTeam.</p>
<h2 id="new-string-submissions">New String Submissions <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/email-improvement/#new-string-submissions">#</a></h2>
<p>To submit strings for translation:</p>
<ol>
<li>
<p>Before submitting, check for reuse and RowKey conflicts.</p>
<ul>
<li>Does the English string already exist in [L10N CSV]? Consider reusing the string if the context is similar.</li>
<li>Is the RowKey already present in [L10N CSV]? Please do a diligent review to avoid RowKey conflicts.</li>
<li>If existing strings need revision, then submit an email to @LocalizationTeam.</li>
<li>RowKeys are MANDATORY, we will not translate strings without RowKeys provided. We use RowKey+English text to check for uniqueness.</li>
</ul>
</li>
<li>
<p>Format strings according to guidelines (see next section).</p>
</li>
<li>
<p>Add new strings to this spreadsheet: [String Collection]</p>
<ul>
<li>If you can’t populate or access the file, please let us know asap per email or chat!</li>
</ul>
</li>
<li>
<p>Provide supporting screenshots. Screenshots help the translators understand the application.</p>
<ul>
<li>Please place screenshots into [Screenshots Collection]</li>
<li>For multiple screenshots, put them in PowerPoint slides and name the slide as <code>PRODUCT-RELEASE-V-DATE.pptx</code></li>
</ul>
</li>
</ol>
<h2 id="formatting-guidelines">Formatting Guidelines <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/email-improvement/#formatting-guidelines">#</a></h2>
<p>In the submission spreadsheet, our header format is:</p>
<div class="scroll-table" style="overflow-x:auto;"><table><thead>
<tr>
<th>Product</th>
<th>Source database</th>
<th>RowKey</th>
<th>English string</th>
<th>Context about the string</th>
</tr>
</thead>
<tbody>
<tr>
<td>Your team</td>
<td>Database where the string is stored</td>
<td>Identifier key</td>
<td>Text in english</td>
<td>How the string renders in the application</td>
</tr>
</tbody>
</table></div><p><strong>English String</strong></p>
<p>We heavily discourage split strings (sentences which are intentionally broken to multiple parts present at UI in a special manner).</p>
<ul>
<li>We translate on a sentence-by-sentence basis to preserve the meaning.</li>
<li>Provide the entire sentence with variable placeholders. For example:
<ul>
<li><code>We found %d results for “%s”:</code></li>
<li><code>The following file types are not allowed: %s</code></li>
</ul>
</li>
</ul>
<p><strong>Context About the String</strong></p>
<p>To fill out this column, consider:</p>
<ul>
<li>Is the string a partial string that gets its complete meaning when rendered with data?</li>
<li>Specify if symbols and punctuation (“”, ‘’, $, @, !, ~, %, &, *) are variables or part of the string.</li>
<li>Field names or product names which are proper nouns.</li>
</ul>
<p>Examples:</p>
<div class="scroll-table" style="overflow-x:auto;"><table><thead>
<tr>
<th>English string</th>
<th>Context about the string</th>
</tr>
</thead>
<tbody>
<tr>
<td>How would you like to create your #Type?</td>
<td>#Type is a variable</td>
</tr>
<tr>
<td>Select code</td>
<td>Select is a verb, numbers are chosen from a list</td>
</tr>
</tbody>
</table></div><h2 id="file-format">File Format <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/email-improvement/#file-format">#</a></h2>
<p>We prefer CSV files because we keep track of Git CSV repositories and pull the deltas automatically: [Localization Tracker].</p>
<p>If your repo is not included in the Localization Tracker, email @Contact or @LocalizationTeam to add or retire CSV repositories.</p>
<h2 id="scope">Scope <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/email-improvement/#scope">#</a></h2>
<p>We generally do not localize custom client strings. Submitted strings should be for our generic product offerings.</p>
<p>*Exceptions apply, such as a contractual agreement with a client.</p>
<p>Thank you for your cooperation,<br />
LocalizationTeam</p>
</blockquote>
<p>In the revised email, I emphasize the submission process, and provide real examples of confusing strings and how to address pitfalls. The email has gotten longer, which seems contrary to most advice about writing shorter emails. In our case, the managers have a vested interest because localization is often a requirement. Proper headings and introductory clauses help them scan the email.</p>
<p>Maintenance and old processes are still explained in the <strong>File Format</strong> section. The localization team can only promise to maintain our own repositories. Whatever is stored in databases is up to the developers.</p>
<p>I also include a note about scope. Typically, the localization team doesn’t translate bespoke features, except for a few legacy contracts. Going forward, the company wants to avoid this obligation.</p>
<p>Email is not the most searchable or discoverable format. Should these submission guidelines be put into a Word document or shared on a wiki? If the email reduces the amount of incomplete submissions, I think it does its job. Eventually, I would like to have a dedicated document so that the knowledge will not disappear. Strategies for retaining and syndicating knowledge can be discussed at a later time.</p>
Gardening Log 22023-05-01T00:00:00Zhttps://www.dyingtowrite.com/posts/2023/gardening-log-2/<p><em>Previously: <a href="https://www.dyingtowrite.com/posts/2023/gardening-log-1/">Gardening Log 1</a></em></p>
<p>This was a terrible April for planting. The first half of April was almost drought-like and it reached June temperatures.</p>
<p>My family has had better success at planting crops than me. I have experienced misfortune—mostly my fault—like removing the protection of my sunflower seedlng too early (they got eaten the next day), and planting unviable 12-year-old seeds which have long shriveled and given up on life.</p>
<p>In early April, we built frames for the garden beds.</p>
<p><img src="https://www.dyingtowrite.com/posts/2023/media/april/04-04-gardenbed.jpg" alt="On a sunny day, the beds before they have frames" loading="lazy" /></p>
<p><em>Do you like our corner potato bins?</em></p>
<p><img src="https://www.dyingtowrite.com/posts/2023/media/april/04-04-pen.jpg" alt="" loading="lazy" /></p>
<p><em>The first pen. Daikon sprouts already popping; so easy to grow.</em></p>
<p><img src="https://www.dyingtowrite.com/posts/2023/media/april/04-06-pvc.jpg" alt="" loading="lazy" /></p>
<p><em>A 10-foot long PVC pipe (3/4" Schedule 40) can be bent into a parabola when it’s 70℉ degrees outside.</em></p>
<p>Many YouTube gardening videos say that PVC is too brittle to bend. Also, YouTube’s algorithm likes to show me the complicated PVC bending method, where you fill the pipe with sand and then take a hairdryer and heat it up. Geez, that is so much work!</p>
<p>In the winter, yes PVC is too brittle, but in the summer, it’s perfectly doable by hand. The strangely hot weather was an opportune time to bend hoops.</p>
<p>Our beds are 4 feet wide. For beds less than 4 feet, the bend might be too severe for the plastic without a heatgun to soften it.</p>
<p><img src="https://www.dyingtowrite.com/posts/2023/media/april/04-16-gardenbed.jpg" alt="" loading="lazy" /></p>
<p><em>Hoop structures done. One bed has a tall rectangular frame to accomodate tomatoes, which grow to 5 feet.</em></p>
<p>In terms of cost, the hoops are much cheaper than the rectangular frame. For joining the corners, PVC fittings are the expensive parts, but they’re the easiest way to build an 6-feet-tall structure.</p>
<p>The hoops are cornerless, so we save money foregoing fittings. To keep the hoops secure, we screwed in holders to the wood, like these <a href="https://www.walmart.com/ip/27mm-Rigid-Pipe-Strap-304-Stainless-Steel-2-Hole-Clamps-10-Pcs/920015154?wmlspartner=wlpa&selectedSellerId=571">27mm pipe strap clamps</a>.</p>
<p>We used zip-ties to attach a spine to the hoops, and the frame is very sturdy.</p>
<h3 id="hoop-curve-calculator">Hoop Curve Calculator <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/gardening-log-2/#hoop-curve-calculator">#</a></h3>
<p>Using this <a href="https://www.geogebra.org/m/SPA65Fqk">catenary calculator</a>, you can determine the size and appearance of your hoops.</p>
<p><img src="https://www.dyingtowrite.com/posts/2023/media/april/hoop-curve.png" alt="" loading="lazy" /></p>
<p>On this calculator, first set the <em>s = total length of pipe</em>. In my case, <code>s = 10</code> feet. Then set <em>A, B</em> to the width that the hoop will span. In my case, the garden beds are 4 feet wide, so the coordinates are <code>A = (0,0)</code> and <code>b = (4,0)</code> respectively.</p>
<p>Then check the <em>b1</em> value for the height of the hoop. In my case, the hoops ended up around 4.5 feet tall, slightly shorter than the projected value, because the pipe can be bent to have a wider curve.</p>
<p>This calculator is a good starting point to find the limits of pipe length. The curve is negative since this is normally used to calculate chains, but the same math applies to arches.</p>
<hr />
<p><img src="https://www.dyingtowrite.com/posts/2023/media/april/dill.jpg" alt="" loading="lazy" /></p>
<p><em>Dill growing in the herb garden.</em></p>
<p>The 12-year-old dill seeds are thriving! A miracle!</p>
<p><img src="https://www.dyingtowrite.com/posts/2023/media/april/mushroom.jpg" alt="" loading="lazy" /></p>
<p><em>Strange mushrooms, do not eat. The baby yellow ones look like foam sponges, and they mature into a murky swamp black.</em></p>
<p>In the last week of April, a multi-day rain shower descended upon us. I would’ve expected such rain to come earlier.</p>
<h2 id="good-morning-first-day-of-may">Good Morning, First Day of May <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/gardening-log-2/#good-morning-first-day-of-may">#</a></h2>
<p>It’s a nice, brisk morning—</p>
<p><img src="https://www.dyingtowrite.com/posts/2023/media/april/05-01-pollen.jpg" alt="" loading="lazy" /></p>
<p><em>Oak pollen clumps everywhere…</em></p>
<p>Because we had a mild winter this year, and a hot dry stint of weather, the pollen count has increased. Flowers bloomed earlier than usual.</p>
<p><img src="https://www.dyingtowrite.com/posts/2023/media/april/05-01-potato.jpg" alt="" loading="lazy" /></p>
<p><em>Corner potatoes vigorously sprouting.</em></p>
<p><img src="https://www.dyingtowrite.com/posts/2023/media/april/05-01-radishes.jpg" alt="A close view of radish sprouts poking out of the soil." loading="lazy" /></p>
<p><em>Radish seedlings emerging.</em></p>
<p>Unfortunately, our 12-year-old radish seeds failed to bloom, so I replanted fresher ones. Hence they’re a little late this year.</p>
"We All Lift Together" Lyrics Analysis2023-04-22T00:00:00Zhttps://www.dyingtowrite.com/posts/2023/we-all-lift-together-analysis/<p><a href="https://youtu.be/mPTCq3LiZSE">We All Lift Together</a> (written by Keith Power) is a song from the video game Warframe. It’s an excellent piece and I wanted to apply poetry analysis techniques to the lyrics—<a href="https://www.writing.upenn.edu/~afilreis/88/meter.html">scansion analysis</a> in particular.</p>
<p>The music video is great because you can see the heads of the robots lightup with each accented syllable.</p>
<p>Here are the lyrics:</p>
<blockquote>
<p>Cold, the air and water flowing<br />
Hard, the land we call our home<br />
Push to keep the dark from coming<br />
Feel the weight of what we owe</p>
<p>This, the song of sons and daughters<br />
Hide the heart of who we are<br />
Making peace to build a future<br />
Strong, united, working 'til we fall</p>
<p>Cold, the air and water flowing<br />
Hard, the land we call our home<br />
Push to keep the dark from coming<br />
Feel the weight of what we owe</p>
<p>This, the song of sons and daughters<br />
Hide the heart of who we are<br />
Making peace to build a future<br />
Strong, united, working 'til we fall</p>
<p>And we all lift, and we’re all adrift<br />
Together, together<br />
Through the cold mist, 'til we’re lifeless<br />
Together, together</p>
</blockquote>
<h2 id="analysis">Analysis <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/we-all-lift-together-analysis/#analysis">#</a></h2>
<p>Each stanza has 4 lines, so this song would be a quatrain poem.</p>
<p>The refrains are trochaic terameter (stressed-unstressed foot, 4 feet per line). They also rhyme with each other.</p>
<p>The odd lines have 8 syllables. The even lines only have 7 syllables, where their last syllables are drawn-out slant rhymes.</p>
<h3 id="refrain-a">[ REFRAIN A ] <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/we-all-lift-together-analysis/#refrain-a">#</a></h3>
<blockquote>
<p>Cóld, thĕ / aír ănd / wátĕr / flówĭng<br />
Hárd, thĕ / lánd wĕ / cáll oŭr / hóme<br />
Púsh tŏ / kéep thĕ / dárk frŏm / cómĭng<br />
Féel thĕ / wéight ŏf / whát wĕ / ówe</p>
</blockquote>
<p>Starting each line with a stressed syllable conveys urgency and reinforces the underlying rhythm of performing hard labor.</p>
<h3 id="refrain-b">[ REFRAIN B ] <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/we-all-lift-together-analysis/#refrain-b">#</a></h3>
<blockquote>
<p>Thís, thĕ / sóng ŏf / sóns ănd / daúghtĕrs<br />
Híde thĕ / heárt ŏf / whó wĕ / áre<br />
Mákĭng / peáce tŏ / búild ă / fútŭre<br />
Stróng, ŭn/ítĕd, / wórkĭng / 'tíl wĕ / fáll</p>
</blockquote>
<p>In Refrain B, the last line contains 9 syllables, an extra beat from the previous 8 or 7. When the 9th syllable “fall” is sung, a new singer begins Refrain A, so “fall” overlaps with “cold.” I found it a clever way to not let the syllable dangle. The overlap in voices represents how the main singer hands-off their duties to the next member, as if saying, “I’ve done everything I could, it’s your turn to do the rest.”</p>
<h3 id="outro">[ OUTRO ] <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/we-all-lift-together-analysis/#outro">#</a></h3>
<p>The outro uses a combination of different feet.</p>
<blockquote>
<p>Ănd wĕ / áll líft, / ănd wĕ’re / áll ădríft<br />
…<br />
Thrŏugh thĕ / cóld míst, / 'tĭl wĕ’re / lífeléss</p>
</blockquote>
<p>With 4 feet per line, the odd lines have alternating pyrrhic (double unstressed) and spondee (double stressed) feet.</p>
<p>This pattern gives the line a rising tone: “And we all lift–” and it has a sense of continuity. All of the actions are continuous and future-facing, fitting with the theme of working unto death.</p>
<blockquote>
<p>Tŏgéthĕr, / tŏgéthĕr</p>
</blockquote>
<p>Th even lines repeat the chorus “together” as amphibrach dimeter (unstressed-stressed-unstressed foot, 2 feet per line). When a stressed syllable is surrounded by unstressed noise, it gives the impression of a group of people standing alone in a murky wilderness.</p>
<h2 id="conclusion">Conclusion <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/we-all-lift-together-analysis/#conclusion">#</a></h2>
<p>Because it’s a shanty, “We All Lift Together” is sung with a hybrid sing-speak style. I hope that by analyzing its meter, I can explain how the lyrics resonate and support the theme of the song.</p>
When theme is more important than character2023-04-13T00:00:00Zhttps://www.dyingtowrite.com/posts/2023/when-theme-is-more-important-than-character/<p>In creative writing, a lot of advice says to develop well-rounded characters. I think this is important and good advice.</p>
<p>However, I am a theme writer.</p>
<p>This realization did not come to me naturally. After discussing my plot threads, a friend simply told me, “You sound a theme writer.” Just like how there are character writers and plot writers.</p>
<p>It was weird to hear that. I felt like I must be a terrible writer, because I don’t care as much about characterization, plot, or worldbuilding like other writers do. I mean, I work on improving every aspect as best as I can, but if I care about themes so much that it’s evidently where I put the most of my energy into—it becomes my style, and thus I am a theme writer.</p>
<h2 id="what-is-a-theme">What is a theme? <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/when-theme-is-more-important-than-character/#what-is-a-theme">#</a></h2>
<p>A <em>theme</em> is a challenging question married with philosophy. The more preposterous the question, the more motivated I am to seek an answer, an answer only found by writing and exploring the proposition fully. Like a thesis statement.</p>
<p>A theme is a higher-level, abstract connection that ties art together, right? Are some themes better than others? Can some themes be shallow rather than deep? Are themes mostly for the reader to discover, not the writer to dictate?</p>
<p>The most common advice given about writing is to “go on and just write, and let the theme develop naturally. It’s not worth defining a theme in the beginning, or else your work will come out stilted and preachy.” This is good for beginners who don’t have a secure writing habit.</p>
<p>Every musician has to play scales over and over, maybe as a warmup, maybe so they don’t lose their touch. But warmup scales aren’t songs.</p>
<p>I need to distinguish between writing for fun and writing seriously. When writing for funsies, the results are experimental exercises in skillcraft. They’re not <em>stories.</em> They’re unfinished sketches, resembling how artists fill out notebooks of underdeveloped vignettes and crammed strokes in every corner. I write short pieces with a goal in mind, but not always a particular theme.</p>
<p>We differentiate practice from performance. When writing a piece that is meant to perform, then I lead with a theme.</p>
<p>The theme changes over time, just like how a thesis statement changes. As you conduct research and find more evidence, your original thesis might be flat-out wrong, and you adapt.</p>
<p>But no more aimless just-write-and-the-theme-will-come-to-you. No. If I truly care about polishing the work to a high level, write with a theme in mind from the beginning.</p>
<h2 id="is-character-the-most-important-aspect-for-all-stories">Is character the most important aspect for all stories? <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/when-theme-is-more-important-than-character/#is-character-the-most-important-aspect-for-all-stories">#</a></h2>
<p>Before I possessed such conviction, I was lost in the mires of self-doubt.</p>
<p>My initial inspiration was to write about satirical situations drenched with dry cynicism. But in terms of structure, the plot was like a fantasy without a Hero’s Journey, a thriller with too many slice-of-life scenes, a wannabe-horror with less monsters than a museum. The story isn’t funny in the colloquial, slapstick sense of satire.</p>
<p>Is this type of story a hard sell?</p>
<p>I researched and found out about Mennipean satire, which according to Wikipedia:</p>
<blockquote>
<p>The genre of Menippean satire… is characterized by attacking mental attitudes rather than specific individuals or entities…</p>
</blockquote>
<p>Oooh… 💡</p>
<blockquote>
<p>Characterization in Menippean satire is more stylized than naturalistic, and presents people as an embodiment of the ideas they represent.</p>
</blockquote>
<p>I’m not the only person in this world who throws characters by the wayside!</p>
<p>A lot of what I read shares traits with Mennipean satire. Piecemeal fragments, absurdist literary fiction, descent‑into‑madness plots, the unraveling of false and erroneous beliefs, or perhaps stretching a belief fully to the extreme, exaggerated grotesque caricatures.</p>
<p>The postmodern style, a descendant of the ancient Roman Mennipea.</p>
<p>I like content that tackles ethical problems. I love journal outlets such as Vice. This is where I derive most of my inspiration. As they say, input = output. My writing resembles what I read.</p>
<p>I shouldn’t be surprised, but I am.</p>
<p>If I focus on theme, the story will inherently be more philosophical. It might be headier than character-driven stories. This can be good or bad as long as you don’t equate theme with preachiness.</p>
<h2 id="picking-a-theme">Picking a theme <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/when-theme-is-more-important-than-character/#picking-a-theme">#</a></h2>
<p>The process of picking a theme is that I hear or see something, like news or documentary, and ask a “what if” (Writing fan fiction for real life 😂).</p>
<p>However, a “what-if” is not enough motivation. There are so many what-ifs to choose from.</p>
<p>To actually sit down and write, I must identify a selfish component: the what-if has to relate to my writing goals.</p>
<p>I’ll give you an example of mine, a breakdown of my thought process:</p>
<ol>
<li>My current goal is to improve characterization.</li>
<li>I encounter an old news feature about a feral girl who went into therapy.</li>
<li>My messed up mind thinks, “Ok, what if instead of being raised by dogs, she was raised by nothing, and kept bound in a dark room for like, 10 years? Then how would she answer the question, ‘Is childhood your happiest time?’”</li>
</ol>
<p><em>The girl will still answer, “Yes.”</em></p>
<p>Then I wrote a short story about this hypothetical person who answers “yes.”</p>
<p>I wanted to write about the most unusual opinion—not the most realistic—because realism kills the story.</p>
<h2 id="thats-deep-bro">“That’s deep, bro” <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/when-theme-is-more-important-than-character/#thats-deep-bro">#</a></h2>
<p>There does exist <em>bad</em> or <em>uninteresting</em> what-ifs. For example, “What if marginalized peoples become the oppressors?” is really tacky and shallow. Like, anyone who knows anything about history can guess what’s going to happen. That type of question is vague and predictable and you risk parroting history, only with the sides swapped. Of course, this is my personal opinion. People out there really fear class uprisings.</p>
<p>I’m not saying this topic can never be attempted. The film <em>Cloud Atlas</em> (2012) portrays black people as the scholar class in Afro-futurism style, while the white people are savage island country bumpkins. The film portrays many different types of societies, and oppression is not the main focus. Cloud Atlas explores how societies rise and fall, and how myths are propagated and remembered. The film turns up the boldness, making the actors cross-dress as different races and using makeup to alter their facial features. I think this is hilarious and awesome. A lot of people think it’s disturbing and inappropriate.</p>
<p>No matter what you think, actions speak louder than words. <em>Cloud Atlas</em> is an exercise in empathy, a good faith attempt, and I applaud the directors for trying something new.</p>
<p>A reader can judge a writing piece based on the author’s intentions. If you drum up empathy and validation for an unpopular opinion, without conceding to the opposing viewpoint, it comes off disingenuous and selfish. Some types of wish-fulfillment stories will lean into this tendency on purpose.</p>
<p>For me, a theme has to have a philosophical component. I can’t just write about “childhood is the happiest time” or “love conquers all” or “being poor teaches you empathy.” I need a very specific problem, a very specific situation, and a very specific—unrealistic—character.</p>
<p>By exploring an unrealistic character and giving it the treatment and depth that it deserves, the reader will feel something. If you accept the adage that “truth is stranger than fiction,” then your unrealistic character might actually be mildly tame in the grand scheme of things. It’s easy to hammer the nail that sticks out. It’s easy to “tone down” an unrealistic character into palatable mush. <em>Don’t do this.</em> Realism will kill the story.</p>
<h2 id="characters-arent-real-and-they-dont-have-to-be">Characters aren’t real and they don’t have to be <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/when-theme-is-more-important-than-character/#characters-arent-real-and-they-dont-have-to-be">#</a></h2>
<p>I don’t see my characters as real, because they’re not. I don’t care about making them realistic. Backstories, quirks and ticks are decorations on a scarescrow to trick the reader into thinking they’re real. What makes a character interesting aren’t the quirks (uwu), but the theme they’re representing, and the cracks of brittle assumptions.</p>
<p>When they are fictional, they are allowed to grow free from expectations.</p>
<p>I care about a balanced narrative. I care about their ethics, beliefs, the role they play in the story in contrast with dissenters and opposing viewpoints.</p>
<p>In <em>Candide</em> by Voltaire, the man Candide encounters a utopic paradise where everything is abundant and there’s no strife. However, because Candide is dedicated to his personal mission, he decides to leave this “Garden of Eden” of his own volition. Once he leaves he can never come back. The point is to make fun of the protagonist archetype, a proactive do-getter, someone who is so determined and dogged that they don’t know when to quit.</p>
<p>Of course the reader will want to yell at Candide for passing up literal paradise, but Candide is not representative of a relatable or realistic person.</p>
<!--
This is my writing philosophy, and probably my personality leaking through. I've always known that my thought process is like this, that I start from an idea rather than a person. -->
<h2 id="can-you-market-a-theme-book">Can you market a theme book? <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/when-theme-is-more-important-than-character/#can-you-market-a-theme-book">#</a></h2>
<p>At this stage, I’m a wannabe author without novel publishing credentials (yet).</p>
<p>This is not an easy question to answer. I think everything can be marketable if you know what you want to say and why someone would like it.</p>
<p>I know that theme novels are a hard sell. The vast majority of literary agents prefer “high-concept,” which is almost synonymous with “popcorn entertainment.”</p>
<p>There is also the conundrum of popularity: stories that a writer shat out with the least bit of effort become more popular than the treasured magnum opus loved and watered for years.</p>
<p>Case in point: Sherlock Holmes, where Arthur Conan Doyle churned out the most preposterous detective tales that handwaved most of the investigative process, but <a href="https://knowledgenuts.com/arthur-conan-doyle-didnt-care-much-for-sherlock-holmes/?amp=1">readers ate up the concept.</a></p>
<p>I could try writing a story that is more high-concept, but the cosmos have spited me, because the plot needs to be difficult and unformulaic, or else I won’t want to write it.</p>
<p>Wish me luck if I pitch a theme novel. After I manage to revise it in a few years or never, I’ll let you know if I fail or succeed.</p>
<!--
## Sticking the ending
To figure out if there was any merit in theme-prioritized writing, I watched two videos about storytelling a good ending.
---
Tyler Mowery's [How to Write a Great Ending](https://youtu.be/dcYgWiZd2XU?t=302):
Stakes => "What can be gained or lost"
**Three Types of Stakes:**
1. External - the character's action plan, the act of doing to get what they want
2. Internal - relationships and emotions
3. Philosophical - what the characters believe and value, and how these ideas are challenged
All three stakes need to be resolved in some way. A character needs action, but they also need meaningful relationships and beliefs.
---
[The 3 Act Structure: Writing a Showstopping Ending](https://youtu.be/EwsUmh3K5Zw) asks you to ponder these points:
- What are the results of a character's progression: the choices they make at the end are different from what they would've made in the beginning.
- Climax + resolution: succeed or fail, comedy or tragedy?
- Resolution: mirrors the beginning, but slightly tinted. The resolution should answer the main question ("what-if") that drove the story.
- Worldbuilding, themes, and subplots converge with the external plot and character actions.
Identify the **key questions** that have appeared in your narrative, and **answer them.** Then weave an ending.
---
From what I can tell, these two videos describe how a good ending ties most threads togther to a satisfactory degree. It has to address the character's viewpoint. Whether that viewpoint stays the same or not, it needs to be obvious what their stance becomes.
But.. what does it mean to make your point *obvious*? You need evidence. Details. Scenes. Actions speak louder than words, and you only have words to depict action.
Having a strong theme will help with creating a strong ending.
## Query Blurbs
There's tons of advice on writing a query letter when trying to find a trade agent, especially the blurb. I assume that for a low-concept, genreless story, it's better to keep the blurb short. 150 words.
200 words--you're kind of stretching it and over explaining.
Because I don't care about imaginary characters as people, I cannot talk about their predicament in depth. But the themes that motivated me to write the story, the juxtaposition of vulgar elegance which prevails in Mennipean satire, I have to put them front and center.
Typically, a blurb needs 3 ingredients:
1. The protagonist's personality
2. The inciting incident
3. Cool/fun/entertainment factor
This is the greatest secret to fiction: if you have a strong theme, those 3 ingredients are easily supplied.
- When the character is an embodiment of a theme, natural conflicts arise from it. You can always find an incident or a dissenter who spits in the face of your theme. This becomes the basis of a character arc, an antagonist, or a conflict.
- The plot is derived from theme, and it kicks off at the inciting incident which reveals deeper stakes than initially presented.
- Coolness factor is your permission to exercise some creative liberty. Highlight your strengths as an author: whether it's the worldbuilding, voice and style, plotting, tropes, etc. Highlight the strengths of the story, what makes the story worth reading.
The QueryShark blog says that a query should answer these questions:
- What does the main character want?
- What's blocking them from getting it?
- ~~What choices do they face?~~
- What's at stake ~~with those choices~~?
When your character embodies a theme, all 3 of those questions are basically answered. It is no trouble writing the query, so the rest of your efforts are a matter of working on your style and pitch materials instead of selling a story that is dead and lifeless.
Personally I don't find the "What choices do they face?" question very interesting to answer. When you are writing about an unrealistic character, you can't rely on relatibility. If you are writing about a wildly deviant experience, or about someone from a marginalized community, how is the mainstream going to understand the rationale behind of character? Also, many blurbs present [false dilemmas](https://en.m.wikipedia.org/wiki/False_dilemma), and when you read the story, of course the author goes for a cop out, a compromise between the original choices. Honestly, don't even mention the choices unless "making a choice" is actually the crux of your theme.
## Does theme matter?
Only if you're a theme writer aspiring to have a thematic style. Not everyone has the desire to be concerned with such, and that's okay. Take a look at the different types of story and see if any of their definitions resonate with you.
Most professional authors will be able to change their style, like how actors can switch between a few distinct personalities.
-----------------
I was joking about the novel being genreless. It's categorized `fantasy` because properly functioning universal healthcare is a fantasy.
> Dear Agent Name,
>
> In the Sect of Numentum, medical training starts young. An apprentice named Timonius works at a clinic. Timo follows the rules to the best of his ability, but sometimes, impulses get the better of him. Few things excite him more than opening up a ribcage, and he uses magic to cleanse disease and annoying morons alike.
>
> After a monsoon sweeps away houses, refugees overwhelm the system. Among them, an oracle visits for checkups. During times of trouble, the oracle will be taken to the summit and sacrificed to a deity. Concordia was raised as a piñata, and she accepts her fate, but acceptance cannot soothe her anguish.
>
> Timo befriends Concordia and attends to her, counting down the days she has left. There are many things he doesn't understand, so he won't step out of line. He shouldn't stretch a finger beyond his garden–yet sometimes, a friend feels like an extension of yourself.
>
> I am seeking representation for *Clinical Dropout* (80,000 words), a dark fantasy with roots in Mennippean satire. The story combines the character-driven approach of *Grendel* by John Gardner with the ominous atmosphere of *Black Sun* by Rebecca Roanhorse. This would be my debut novel.
>
> I've had short stories published in *Slouching Beast Journal, Dark Drabbles,* and *Sci-Fi Lampoon.*
>
> Thank you for your consideration,
> Name Name
## Themes for longer stories
The feral girl situation makes a good short story, but does my thematic pickiness apply to novels? I think it does. More challenging questions are needed.
First is the protagonist, a question that asks, "Can a person overcome XYZ flaw?" And the answer is either yes or no, comedy or tragedy. It doesn't have to be a monumental change, maybe the needle of a moral compass moves a tiny bit in the positive or negative direction. Or the character can be static. What does the end result communicate? Does the character improve, regress, or stay the same? Just pick 1 answer that seems most interesting. Nothing too complicated.
I admit that I discovered new themes as I wrote more of the novel. But at the same time, they were themes that were sitting in the back of my head for a while. I've always had the ideas, but was too afraid to express them until I wrote enough of a story where I realized I could express them here.
- "What if child sacrifice is normalized? What is it like to be raised as a sacrifice?"
- "How does a society operate with a utopic universal healthcare, where there are no wait times and miracles happen on a daily basis?"
- "Yes, this society does have magical universal healthcare and it's relatively fair and transparent (can you tell I'm American?)."
- "What's the catch?"
And then the story develops from there. In order to explore this theme fully, I'm going to need characters who defend the current system and characters who wish to transform it.
I don't like political intrigue, so I'm not going to write about the politics. But I need to hint that they exist, otherwise, my treatment of this society will seem underdeveloped.
I can't cover every topic, so I go back to my protagonist and think about the types of activities they would be involved in, and limit my writing to those.
-->
Scheduling doctor appointments2023-03-23T00:00:00Zhttps://www.dyingtowrite.com/posts/2023/doctor-appointment/<p>Well, this sounds embarrassing, but I scheduled a doctor’s appointment by myself for the first time.</p>
<p>I know how to use the internet and look up lists of doctors, but I don’t know how to actually <em>choose</em> a doctor.</p>
<p>I asked my mother for tips. She told me: “Call the medical group first, then the insurance company.”</p>
<p>First I tried calling my insurance company. Their support number was conveniently obfuscated on their website, underneath the “I want to buy insurance packages” advertisement. My goal was to get a list of in-network doctors who do annual physical checkups.</p>
<p>I called the support number, and the yapping of the robo-voice gave me anxiety.</p>
<p>I waited until a real person responded. Then my connection had issues and it went silent. I said, “Hello? Hello?” several times but no response.</p>
<p>After several seconds, I heard a voice: “—was saying ‘hello?’ a lot so maybe the connection was broken, can you come see if there’s an issue as I pull up the info?'” and then the call ended.</p>
<p>I redialed the same number, but hearing robo-voice advertising made me so angry that I hung up immediately.</p>
<p>Several days later, I called the local medical group as I should have. I asked about getting a <strong>Primary Care Doctor.</strong> They told me to use their doctor finder website. At least I got the name of the department: <strong>Internal Medicine.</strong></p>
<p>You know, this whole time I thought it would be <strong>Family Doctor</strong> or <strong>General Practitioner</strong> or something more friendly-sounding. Maybe this differs region by region.</p>
<p>As a kid, my checkups were done with a <strong>pediatrician</strong> but I’m not a kid anymore so I shouldn’t ask a pediatrician. I guess when I’m old I’ll have to get a <strong>geriatrician.</strong></p>
<p>Why can’t we just say “doctor for kids” or “doctor for elders?” Like, “doctorforkids” has less syllables than “pediatrician.” Isn’t “doctorfrkids” like how the Germans name things? Like how “kindergarten” just means “kidgarden?”</p>
<p>I mean, loanwords can be fun, but it is infuriating to read a list of doctors and half of the specialties are written in bastardized Greek. I bet Greek people have an easier time looking up doctors.</p>
<p>Anyway, I searched for Internal Medicine doctors who were accepting new patients, then called their office. While making an appointment, I specified the doctor’s name. If you don’t do this they might book you a random physician.</p>
<p>You can make fun of me for getting so anxious about phone calls, but I don’t like listening to robo advertisement. This whole process just feels exhausting. I’m gonna have to do this every time I change insurance? What happens if I lose insurance? What if my doctor dies or retires or switches careers?</p>
Topjoy Buttefly E701 (E-Reader Review)2023-03-18T00:00:00Zhttps://www.dyingtowrite.com/posts/2023/topjoy-butterfly-e701-ereader-review/<p>The <a href="https://topjoy.shop/products/topjoy-butterfly-pocket-sized-true-color-des-screen-e-reader">TopJoy Butterfly: Pocket-Sized True Color DES Screen E-Reader</a> is an e-reader created by the Chinese manufacturer Topjoy.</p>
<p>It features a Display Electronic Slurry (DES) screen, which means that it has a richer color display.</p>
<p>I got the 7.8 PRO version as a <a href="https://www.kickstarter.com/projects/topjoy/topjoy-butterfly-pocket-sized-true-color-des-screen-e-reader/description">Kickstarter backer</a>, which has 64 GB storage. It was shipped in late 2022. I haven’t really had much of a chance to play around with it until now.</p>
<p>I will review this device’s screen and overall experience.</p>
<p>I also explain how to transfer existing books from your computer onto the e-reader.</p>
<h2 id="reading-experience">Reading Experience <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/topjoy-butterfly-e701-ereader-review/#reading-experience">#</a></h2>
<p>The E701 screen uses 300 DPI when in monochrome mode. For color mode, the display is only 150 DPI.</p>
<p>The text is much sharper when you turn on monochrome mode. It’s better than physical books. The color mode is fairly vibrant and naturalistic compared to OLED screens. I do not own another color e-reader, so I can only make comparisons with my laptop and phone.</p>
<h3 id="backlight">Backlight <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/topjoy-butterfly-e701-ereader-review/#backlight">#</a></h3>
<p>The Topjoy has a backlight for reading in the dark. You can adjust the brightness on the fly, either by swiping down the top drawer, or by swiping up the bottom Progress toolbar.</p>
<p>When the backlight is turned off, the screen is grey and dark compared to typical loose-leaf paper:</p>
<p><img src="https://www.dyingtowrite.com/posts/2023/media/e701/e701-no-backlight.jpg" alt="Comparison between lined paper and E701 without backlight" loading="lazy" /></p>
<p>The backlight is needed for the E701 to equal the brightness of regular paper. I have mine set at level 3, which is around 15% brightness.</p>
<h3 id="color-screen">Color screen <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/topjoy-butterfly-e701-ereader-review/#color-screen">#</a></h3>
<p>To test the color display, I used several <a href="https://storybundle.com/comics">comics from Storybundle</a>. Storybundle offers both EPUB and PDF versions of their deals, and all files are DRM-free so I can load them onto my e-reader.</p>
<p>Here is a comparison of a comic page on my computer (left) vs. the same page on the E701 (right):</p>
<p><img src="https://www.dyingtowrite.com/posts/2023/media/e701/e701-comparison.jpg" alt="A comic page is split in the middle, where the right half shows the actual colors on an RGB screen, and the left half shows the E701 screen display" class="centered" loading="lazy" /></p>
<p><em>Source:</em> Umbagog <em>by Fable Siegel</em></p>
<p>The E701 display looks like watercolor, making the oranges more muted. It resembles newspaper, more solid and less saturated.</p>
<p>When you flip through pages, there are some “ghost” artifacts, where outlines from the previous page faintly appear on the current page. This is more noticable for black and very dark pages.</p>
<p>I found the comics display to be hit and miss. Dialogue-heavy comics with small fonts are difficult to read at 150 DPI, and there’s no zoom function in the default Reader app, so you might have to download a 3rd-party app. Stories with large dialogue bubbles and bold artstyles are fine.</p>
<h2 id="default-reader">Default Reader <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/topjoy-butterfly-e701-ereader-review/#default-reader">#</a></h2>
<p>The default Reader app is servicable. You can always install other apps if needed, but that is outside the scope of this review.</p>
<p>On the left hand navigation, there is a <strong>Reader</strong> option. Tap on it to access your library.</p>
<p><img src="https://www.dyingtowrite.com/posts/2023/media/e701/e701-reader-page.jpg" alt="Reader library homepage" class="centered" loading="lazy" /></p>
<h3 id="library-organization">Library Organization <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/topjoy-butterfly-e701-ereader-review/#library-organization">#</a></h3>
<p>You can create bookshelves for various collections.</p>
<p><img src="https://www.dyingtowrite.com/posts/2023/media/e701/e701-folder-naming.jpg" alt="Creating a "comics" folder." class="centered" loading="lazy" /></p>
<p>Despite the fact that it says “folder,” the newly created folder uses a bookshelf icon.</p>
<p>Books do not always belong to one genre or category, so it would be nice if you could assign a book to several shelves, like on Goodreads. However, the Reader does not let you place a book into multiple bookshelves.</p>
<p>I like to make backups, and I want to segment my comics, magazines, novels, and textbooks, so I find the filesystem mysterious. <a href="https://www.dyingtowrite.com/posts/2023/topjoy-butterfly-e701-ereader-review/#filesystem">I talk more about the filesystem here.</a></p>
<p>If you keep your book management within the E701 only, it’s probably okay. Most people stick to Kindle/Google Books/reading apps, and occasionally download a free book from the internet.</p>
<blockquote>
<p>⚠ <strong>Issue with bookshelves:</strong><br />
When you sort the library to show items <strong>By Name,</strong> bookshelves disappear from the list. They are still searchable if you use the search feature. The bookshelves reappear when you set the sort to <strong>By update time</strong> instead of <strong>By Name.</strong></p>
</blockquote>
<h3 id="acceptable-formats">Acceptable Formats <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/topjoy-butterfly-e701-ereader-review/#acceptable-formats">#</a></h3>
<p>To read <code>.cbz</code> files, you need an app like CDisplayEx or <a href="https://github.com/koreader/koreader">KOReader</a>. Since I don’t want to download another app, this section will only cover the default Reader.</p>
<p><strong>Recommendation:</strong> use PDFs for comics and graphic novels. EPUB images tend to be improperly formatted and scale terribly in the e-reader.</p>
<p>For example, this EPUB file has too much whitespace:</p>
<p><img src="https://www.dyingtowrite.com/posts/2023/media/e701/e701-epub-comics.jpg" alt="An epub page has a few inches of whitespace padding the actual comic page" class="centered" loading="lazy" /></p>
<p><em>Source:</em> The 12 Labours of Gastrophobia <em>by Daisy Finch McGuire</em></p>
<p>By swiping up from the bottom of the screen, the Progress Toolbar appears. You can adjust the display font and margins, or activate Write mode and scribble on the book.</p>
<ul>
<li>The magnifying glass icon is actually for search, not zoom in.</li>
</ul>
<!-- Even if the device itself is okay, some creators don't format their PDFs for electronic devices. For example, one comic had a PDFs formatted as if going to the printing press, and then they just dump that file onto the consumer who is going to use an e-reader. -->
<h3 id="how-to-activate-google-services">How to activate Google Services <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/topjoy-butterfly-e701-ereader-review/#how-to-activate-google-services">#</a></h3>
<p>The E701 is not automatically certified for Google services. It requires an additional step before you can download apps from Google Play.</p>
<ol>
<li>After logging into your Google account within the e-reader, go to <strong>Settings > Preferences</strong> and scroll down to the bottom.</li>
<li>Tap on the entry <strong>GSF ID - Click here to bind the device…</strong>
<ul>
<li>Go through the prompts, and you will be taken to the <a href="https://www.google.com/android/uncertified/"><strong>Device registration</strong></a> page.</li>
<li>The E701 device ID is automatically copied in the clipboard.</li>
</ul>
</li>
<li>Paste the ID into the <strong>Google Services Framework Android ID</strong> textbox.</li>
<li>Check the Capatcha and tap the <strong>Register</strong> button.</li>
</ol>
<p>Your GSF ID appears underneath the <strong>Registered Android IDs</strong> section, and Google services are activated for your e-reader.</p>
<h2 id="look-and-feel">Look and Feel <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/topjoy-butterfly-e701-ereader-review/#look-and-feel">#</a></h2>
<p>Weight-wise, the E701 feels a bit heavy. The company specifications say the E701 is 315 grams.</p>
<p>My E701 does have slight screen defects, where bright spots appear in the lower left corner. I am lucky that they are not too noticable, but screen defects are a common complaint from Kickstarter backers.</p>
<h3 id="external-case">External Case <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/topjoy-butterfly-e701-ereader-review/#external-case">#</a></h3>
<p>The porftolio case which comes with the E701 has a magnetic cover, so the e-reader automatically sleeps and awakens when you cover and uncover it.</p>
<p>The case is a barrier to the charging port, and my USB-C connector sits loose in the port and is easily knocked off while moving.</p>
<p>The default charger fits through the case just fine, because the hole is designed for it.</p>
<p>Basically, if your USB-C connector plug is too wide, the case hinders it.</p>
<p><img src="https://www.dyingtowrite.com/posts/2023/media/e701/e701-usb-c-cable.jpg" alt="Line drawing of a USB-C that indicates the plug plastic, the junction between sheath and connector" class="centered" loading="lazy" /></p>
<p><em>Diagram source: <a href="https://inmu3.ru/raspinovka-usb-type-c.html">Распиновка USB Type C кабеля по цветам</a></em></p>
<h3 id="microphone-and-audio">Microphone and Audio <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/topjoy-butterfly-e701-ereader-review/#microphone-and-audio">#</a></h3>
<p>Apparently, the E701 has a microphone. You can connect Bluetooth headphones, but I have not tested this, nor do I care to. I don’t listen to audiobooks and I’d rather record audio with an actual microphone.</p>
<p>I might update this section in the future when I have time to test.</p>
<h3 id="battery-life">Battery Life <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/topjoy-butterfly-e701-ereader-review/#battery-life">#</a></h3>
<p>With the E701 turned off for about 4 months, the battery drained from 100% to around 65% (eyeball estimate).</p>
<p>I turned off the percentage display because the screen flickers too much when the number changes.</p>
<p>With wi-fi turned on, the batterly life is very poor. It is recommended to turn off wi-fi and Bluetooth when you don’t need it.</p>
<h3 id="build-quality">Build Quality <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/topjoy-butterfly-e701-ereader-review/#build-quality">#</a></h3>
<p>I have heard of people who received defective E701s, where the screen and the adhesive are already peeling off the chassis.</p>
<p>Luckily mine is fine, and has a decent build quality for the price. So far, nothing is peeling apart within the 4 months that I’ve owned the device. Also, I live in a temperate climate that is balanced between four seasons, and there’s very little extremes in terms of humidity and temperature.</p>
<p>I don’t think the E701 is waterproof, and I’m not going to test this.</p>
<h4 id="smudging-and-artifacts">Smudging and Artifacts <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/topjoy-butterfly-e701-ereader-review/#smudging-and-artifacts">#</a></h4>
<p>There are Reddit reviews about <a href="https://www.reddit.com/r/TopJoyButterfly/comments/z65176/topjoy_butterfly_des_screen_degradation_avoid_des/">DES screen degradation</a> happening within 4 months of usage.</p>
<p>After a week of heavy usage, the battery indicator became spottier:</p>
<p><img src="https://www.dyingtowrite.com/posts/2023/media/e701/e701-battery-indicator-fade.jpg" alt="" loading="lazy" /></p>
<p>When I first got my E701, the battery indicator was entirely black and solid. Now, the display is fading along the edges. While reading a book, the text nearest the bottom edge of the screen is lighter. It’s still readable but it can be distracting.</p>
<p>I suspect that my device will eventually degrade too. A smudge in the corner developed into a permanent grey tint:</p>
<p><img src="https://www.dyingtowrite.com/posts/2023/media/e701/e701-grey-blob.jpg" alt="A permanent grey smudge covers up the pencil icon" loading="lazy" /></p>
<p>Where the smudge is located, the ghost of the icon lingers longer than other ghost artifacts.</p>
<p>I cannot speak to the long-term durability of the E701. When the time comes, I will update this post about wear and tear and whether it looks like the Reddit post.</p>
<h3 id="conflict-of-interest">Conflict of Interest <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/topjoy-butterfly-e701-ereader-review/#conflict-of-interest">#</a></h3>
<p>There is a paradox with color e-ink. When you offer a color e-ink display, people will browse through more intensive media like comics, images, and advertisements. The screen degrades faster with higher refresh rates.</p>
<p>Devices like the Kindle product line can last for 10 years, but they are limited to monochrome display, they can’t browse the internet, and they don’t have writing capabilities on most products. The refresh rate is forced to be very low.</p>
<p>I suspect with the E701, the same principles apply. If you limit yourself to slow media and monochrome mode, the screen will degrade slowly like a Kindle. If you browse App stores frequently in color mode, or doodle a lot, it will degrade in 4 months.</p>
<p>From a conceptual standpoint, color e-ink is a contradiction and has trouble fulfilling the demands of the average consumer. It’s possible that this invention leads to more e-waste.</p>
<p>Real ink and paper still has a leg up on vibrant colors and preventing eyestrain.</p>
<h2 id="note-taking">Note-taking <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/topjoy-butterfly-e701-ereader-review/#note-taking">#</a></h2>
<p>For note-taking, the out-of-the-box stylus is usable.</p>
<p>The E701 differentiates between skin contact and stylus input, using the same technology as low-end Wacom tablets. This means that Wacom styluses will work with the E701.</p>
<p>Strokes are placed slightly south from the tip by a millimeter. For example:</p>
<p><img src="https://www.dyingtowrite.com/posts/2023/media/e701/e701-stylus-offset.jpg" alt="Showing the tip of the stylus and where the stroke actually starts" loading="lazy" /></p>
<p><em>The diagonal stroke begins slightly offset from the tip instead of under the tip. I also have trouble closing boxes and connecting strokes on the same vertex.</em></p>
<p>The accuracy is about what I’d expect for an e-reader. I wish it was more precise, but I can take notes and underline alright.</p>
<h2 id="filesystem">Filesystem <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/topjoy-butterfly-e701-ereader-review/#filesystem">#</a></h2>
<p>The Reader app uses a virtual filesystem for its bookshelves. Despite being labeled “folders,” the bookshelves are not actual folders which you can access from a computer.</p>
<p>A virtual filesystem has benefits. For example, on Goodreads, you can assign a book into multiple bookshelves, because digital media is not actually limited to one bookshelf. Each bookshelf is akin to a virtual folder. However, the E701 default Reader does not allow you to assign books to multiple bookshelves, so I don’t see the purpose of the virtual filesystem, and much of the benefits are lost.</p>
<p>If you have bookshelves with books, and you move the files around, the E701 Reader virtual filesystem goes out of sync with the actual files. The books will be considered non-existent on the E701, and you’ll have to remove ghost entries from the E701.</p>
<p>As long as you don’t move or rename the E701 files using your computer, you should be okay. I wish I can export my bookshelves, categories and lists.</p>
<h3 id="how-to-sideload-ebooks">How to sideload ebooks <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/topjoy-butterfly-e701-ereader-review/#how-to-sideload-ebooks">#</a></h3>
<p>You can transfer any compatible file into the E701, a process sometimes referred to as “sideloading.”</p>
<p><strong>Prerequisite:</strong></p>
<ul>
<li>A USB-C cable that allows data transfer.
<ul>
<li>The default USB-B cable that comes with your E701 is a charging cable only. It cannot transfer data.</li>
<li>I use my smartphone’s USB-C cable.</li>
</ul>
</li>
</ul>
<p>Once the E701 is connected, it appears mounted in your file explorer:</p>
<p><img src="https://www.dyingtowrite.com/posts/2023/media/e701/e701-filesystem.jpg" alt="The E701 internal storage and folders" loading="lazy" /></p>
<ol>
<li>Click on the E701 Internal Storage until you see a list of folders.</li>
<li>Copy your files into either the <code>/Book</code> or <code>/Downloads</code> folder.
<ul>
<li>Do not create any child folders within these directories.</li>
<li>I prefer to dump all of my EPUBs and PDFs into <code>/Book</code>.</li>
</ul>
</li>
</ol>
<p>After the files are copied into the folder, they appear in the Reader library.</p>
<h2 id="topjoy-company-values">Topjoy Company Values <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/topjoy-butterfly-e701-ereader-review/#topjoy-company-values">#</a></h2>
<p><a href="https://topjoy.shop/pages/our-story">The Topjoy company story</a> indicates they are primarily a manufacturing and R&D company, not a B2C company. I am okay with giving money to the manufacturing team instead of buying from dropshippers.</p>
<p>Many Kickstarter comments mention that the shipping logistics have been bungled for many backers who never received their devices. I am fairly lucky that my device arrived at all.</p>
<p>The company’s front cannot handle overseas customers, and in general, consumer-facing services are not part of their mission statement.</p>
<h2 id="personal-values">Personal Values <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/topjoy-butterfly-e701-ereader-review/#personal-values">#</a></h2>
<p>Why would I throw money at an unknown product? There’s a couple reasons:</p>
<ul>
<li>To stick a middle finger at certain companies.</li>
<li>To support the development of DES technology.</li>
</ul>
<p>I invested into the Kickstarter because the e-reader sits outside of the Amazon Kindle and Google monopolies. Google services is opt-in instead of forced upon you, which can be an advantage. I still use Google apps, but I want to avoid buying into walled-gardens as much as possible. Even the Kobo has an app store, and I don’t want to register for another account to have my data collected.</p>
<p>However, using alternative technology means that you should be somewhat techy: comfortable with downloading open-source or lesser-known software.</p>
<p>As usual, it’s a sacrifice between convenience, novelty, and control.</p>
<h2 id="closing-thoughts">Closing Thoughts <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/topjoy-butterfly-e701-ereader-review/#closing-thoughts">#</a></h2>
<p>I would not recommend this product to the general consumer. Currently, DES technology is still unstable and has questionable longevity until further advancements are made. Like most crowd-funded campaigns, Topjoy raises money for R&D.</p>
<p>If you want a reliable product with customer service, stick to consumer brands like Kobo, Amazon, Boox or reMarkable. These companies also offer cloud storage, which is almost considered essential nowadays.</p>
<p>As for the product itself, the DES e-ink screen is good for reading black-and-white media, such as mangas. The color comics look decent, but ghost artifacts can be distracting. Since I mostly want to read text and other slow media, the color display is just a bonus.</p>
<p>The Topjoy Butterfly is available on <a href="https://www.alibaba.com/product-detail/Topjoy-Butterfly-HD-E-Reader-BLE_1600751548172.html">Alibaba</a>, but I don’t think it’s particularly worth it until the DES screen defects are fixed.</p>
<p>Despite the flaws of early-grade technology, I hope to make my E701 last for a long while.</p>
<p><strong>🎥 Video References</strong></p>
<ul>
<li><a href="https://youtu.be/oynq1UxB7cw">TopJoy Butterfly 7.8 inch unboxing</a></li>
<li><a href="https://youtu.be/v2EUsLf0m0Q">Bright sunlight demo of colour electronic paper DES display</a></li>
<li><a href="https://youtu.be/H5Hq4YIRJBg">Finally. Color e-reader「TopJoy Butterfly」Enjoy reading without eye strain.</a></li>
<li><a href="https://youtube.com/shorts/J5DsBdyDXg4">Showcase of the E601 (6 in. model)</a></li>
</ul>
Suffocating2023-03-11T00:00:00Zhttps://www.dyingtowrite.com/posts/tales/suffocating/<p>From since before I learned to speak, I found the act of living pointless. What was the point of moving your arms when your mother swaddled you tighter and made them go still? What was the point of screaming to drown out the shouting when it made them shout back louder? What was the point of repeating the monotonous jaw motion of chewing to tame a mechanical hunger? Why differentiate <em>beef</em> and <em>pork</em> when everything is chicken? Why should I follow my parents when I have my own legs?</p>
<p><em>What is wrong with this world?</em> Ever since I had been born, I asked this question every day.</p>
<p>Society confused me. I thought, with all of these colorful people waltzing to and fro, people who came in different shapes and sizes, they would burst into unique songs, and someone could give me an answer about the meaning of rainbows. Each person speaks with their own accent and their own voice, until they spoke to me. Then they all sounded arrogant.</p>
<p>The thing I hate the most is the condescension. As if repeating the rules could freeze the rules solid. When a parent stomps their foot or turns a cold shoulder, those say much more than some rules. Why do people scream so much about rules? Why do they worship chains, and what are they trying to lock up? Do we hide secrets from each other, and keep our stash of pleasure to ourselves, and refuse to share? What drives someone to smile or frown? If only I could find out how to untangle these rituals.</p>
<p>I often said to my mother, “I want you to leave me alone! I hate you and I will kill you if you come closer!” Imagine that a much bigger creature storms up to you and responds, “No, I won’t leave you alone because you said the words ‘hate’ and ‘kill.’ I need to teach you a lesson about disrespect.” Why do you need to teach me a lesson at this particular moment? What lesson could you possibly teach that is worth anything? You know I’m just exaggerating? Why are other people allowed to joke around with the words ‘hate’ and ‘kill’ but I’m not? We can have a discussion about word choice later, so why do you have your panties in a bunch? Why do you care about words so much? I found myself making shorter statements to save my breath. Sometimes I skipped the part about asking to leave me alone: “I’ll kill you!”</p>
<p>“I won’t leave you alone because you punched a hole in the wall.”</p>
<p>“I won’t leave you alone because you threatened to commit suicide, and I care about you.”</p>
<p>“I won’t leave you alone because I know how hard it is for you to find someone that understands you.”</p>
<p>“I won’t leave you alone because you’re going to run off and do something dumb.”</p>
<p>This is what the majority of human beings are. They are egotistical maniacs. None of them accept ‘No’ for an answer, none of their brains can comprehend a single word, much less a simple sentence. I wonder if they just enjoy ignoring you or if they understand better when you pierce their buttholes instead of their ears.</p>
<p>I punched a dent in the wall because the pain in my knuckles is a small price to pay for my relief. But you know what? I’m scolded for expressing myself. I’m scolded while I’m fixing it. I get it, it takes money to fix a hole and it’s inconvenient, but it’s just a fucking wall. It’s not like I punched your throat. What is the point of making amends when people still hate you? I don’t want to go through the trouble just to be piled with more vitriol. I fixed the wall, okay? What other “fixing” is there? Oh, I can’t do anything right? Fine.</p>
<p>There came a day when the big bullies were not so big anymore, a day that I was more capable. I’ve tried words, and words accomplish nothing. They are hindrances to anyone who knows how to get shit done. Think about it before you call me a remorseless killer.</p>
Angry Writing Style2023-02-22T00:00:00Zhttps://www.dyingtowrite.com/posts/2023/angry-writing-style/<p>What constitutes an angry writing style? Is it a good idea to make anger part of your brand?</p>
<p>I remember searching the internet about “angry writing style.” Google, DuckDuckGo, Bing, name the engine. Pouring over results like a hydrochondriac, I found a few articles which proved I am not alone.</p>
<p>One of the results was <a href="https://bookhaven.stanford.edu/2017/06/on-susan-sontag-she-was-always-an-angry-writer/">On Susan Sontag: “she was always an angry writer”</a>. I hadn’t heard of Susan Sontag, a sign of my uncultured upbringing. After reading the internet’s praise of her style, I read her collection of essays <em>On Photography.</em> While reading them, I discovered my spirit animal (er, spirit writer?)</p>
<p>There is Charles Bukowski. Gritty. Contemporary. Transgressive. He wrote a prose-poem <a href="https://allpoetry.com/The-Most-Beautiful-Woman-In-Town">“The Most Beautiful Woman In Town”</a>.</p>
<p>There is a blog called <a href="http://blog.angryasianman.com/">Angry Asian Man</a> which is about social issues. I guess there are people out there who are unapologetically angry and smack boldness onto t-shirts.</p>
<p>But what does this mean? What makes an angry writing style appealing? We live in an age where social media threads easily derail when a commenter ventures into the territory of the personal political. People swear to delete their social media apps and go on a mental detox. We try to promote mental health awareness and self-care reminders. What benefit does an angry writing style have in this day and age?</p>
<p>Both Susan Sontag and Charles Bukowski have punchy writing styles, and arguably, they also have angry writing styles. However, I don’t know if “punchy” is the only way to categorize a style as angry.</p>
<h2 id="what-is-anger">What is anger? <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/angry-writing-style/#what-is-anger">#</a></h2>
<p>In university I attended a screening of <a href="https://www.nfb.ca/film/angry_inuk/">Angry Inuk</a>, a documentary about the Inuit seal trade and social media backlash. It also introduced me to the idea that anger management is a skill.</p>
<p>Inuit culture teaches toddlers how to quietly deal with anger. When a toddler throws a tantrum, the parent mocks the bad behavior, either by copycatting or responding in a playful manner. When the toddler is confused, the parent uses this opportunity to explore their feelings.</p>
<p>As adults, the tradition continues. If you have a vendetta against someone, then you go to your enemy and arrange a theatrical showing. Both sides bring out their drums and rap at each other. Not exactly rap, but you get the point. A battle of emotions rather than violence. Imagine a civil settlement where the jury plays instruments and you’re chanting torts.</p>
<p>In a tundra where survival is difficult enough, it makes sense. “Blowing up” puts you and the community in danger. <a href="https://www.npr.org/sections/goatsandsoda/2019/03/13/685533353/a-playful-way-to-teach-kids-to-control-their-anger">How Inuit Parents Teach Kids To Control Their Anger</a> describes more details about an anthropologist’s takeaways.</p>
<p>Indulging in your anger and “letting it out” only reinforces rageful catharsis and trains you to lash out more often. Anger can be addicting.</p>
<blockquote>
<p>Research has found that “letting it rip” with anger actually escalates anger and aggression and does nothing to help you (or the person you’re angry with) resolve the situation.</p>
<p>—<a href="https://www.apa.org/topics/anger/control">Control anger before it controls you (American Psychological Association)</a></p>
</blockquote>
<p>The same APA article also says, “There is also a cultural belief that every problem has a solution, and it adds to our frustration to find out that this isn’t always the case. The best attitude to bring to such a situation, then, is not to focus on finding the solution, but rather on how you handle and face the problem.”</p>
<p>Anger that is quiet, delayed, and kept frozen until the time is right for the thaw. It accumulates into a shit show of the funny variety. Storytelling, satire and parody are the tools used to control it. This paints a very different style of anger from what southerners are accustomed to.</p>
<p><a href="https://www.theguardian.com/books/2014/sep/24/terry-pratchett-angry-not-jolly-neil-gaiman">This article written by Neil Gaiman</a> talks about how Terry Pratchett, the author of a fantasy satire series, was an angry person.</p>
<blockquote>
<p>Terry looked at me. He said: “Do not underestimate this anger. This anger was the engine that powered Good Omens.” I thought of the driven way that Terry wrote, and of the way that he drove the rest of us with him, and I knew that he was right.</p>
</blockquote>
<p>I’ve always had the idea that satire is a manifestation of anger. Comedy also. Yet, at the same time, they might just be effective coping methods. The angrier you are, the funnier you are?</p>
<p>Processing our anger is the key to defeating it.</p>
<h2 id="anger-as-coal-not-fire">Anger as coal, not fire <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/angry-writing-style/#anger-as-coal-not-fire">#</a></h2>
<p>As much as cultural influence has an impact on our values and coping methods, some people are born hotheaded. Even if they trained to keep a tight lip, we as humans like to judge and assess each other, and some people just expect more out of life and get frustrated when they can’t or refuse to lower those expectations. I wonder if entitlement and anger are related? Anger and disappointment?</p>
<p>Outrage is such a common occurrence. To have a book which features <em>no outrage</em> whatsoever might be decried as unrealistic—or a relief. Actually, that sounds interesting for a story. What would subdued anger look like over the course of a novel? The “cold protagonist” is scary because they have their shit together. When they don’t, the situation must be really bad… It’s a popular trope: to watch the iceberg collapse.</p>
<p>What is so appealing about anger? Of course, I don’t like the outrage that is all too common on social media, the traumadump that is all too common in editor slush piles (I am guilty of both).</p>
<p>If I read a piece with an angry writing style, what am I looking for? The kind of anger that crawls under you skin? <em>How?</em> Do the sentence structures have an erratic cadence? Is anger found in the diction, or in the subject matter?</p>
<p>Is angry writing actually effortless and just a lazy button to trigger emotional response? Because written words usually have no tone of voice, many readers interpret neutral text as aggressive. It’s like how loud people think quiet people are snobby. Extending strangers the courtesy of small talk is polite and thoughtful, so how dare someone else randomly hate you before you’ve even met! For gregarious folks, avoidance is an expression of dislike. <em>Those quiet snobs!</em> They’re right, of course. I’m picky and I hate everyone by default.</p>
<p>Wait… there’s a difference between aggression and anger, right? Even if they’re similar concepts? <a href="https://www.uncannymagazine.com/article/talons-can-crush-galaxies/">Our Talons can Crush Galaxies</a> has an aggressive title right from the onset. The story’s writing isn’t the most beautiful, but it’s definitely pointed.</p>
<p>Can aggressive writing be beautiful? Some readers find beauty in the little gross cavities of our lives.</p>
<p>Transgressive fiction? Transgressive means marginalized. Found on the edge. Taboo. It could include anger, but it’s not the main purpose… unless you’re Inuk writing about the cultural taboo of expressing anger.</p>
<p>Anger is ugly. There’s nothing beautiful about it. Anger is lip service to the human condition. What’s the point of depicting anger if we get enough criticism and pain from real life? I too want to write <a href="https://shenandoahliterary.org/712/lizard-luck/">inspiring, gorgeous literature that swallows easy like butter,</a> but I have not been blessed to have a beautiful outlook. Maybe this endeavor will end in disappointment.</p>
<p>Like most of my ramblings, long after I’ve written down a few thoughts, I continue to ponder this topic endlessly. Should I purposely seek out different types of anger and how to express it? Is this even a good idea? Do I want to be known as an angry writer? If I tell you, “I’m an angry writer,” you’re going to have preconceptions. Reverse psychology doesn’t work here.</p>
<p>I still have no idea how to answer, “What does anger accomplish in literature?” Does focusing on anger make a story better or worse? Is it beneficial to read angry literature? Surely, some literature has to spark from anger, but anger and passion are not to be mistaken as the same things. Is writing angrily just the easy way out? Maybe you can comment and chime in with your thoughts.</p>
Gardening Log 1 (with planting schedule infographic)2023-02-15T00:00:00Zhttps://www.dyingtowrite.com/posts/2023/gardening-log-1/<p>As our family investigates permaculture and sustainability and the joy of being poor farmers, we set up some raised garden beds in our 1/4 acre lot. This year is really warm. Thursday’s weather forecast is 64℉ (18℃). In the middle of winter! When it’s supposed to be the coldest time of year!</p>
<p><img src="https://www.dyingtowrite.com/posts/2023/media/garden-bed-1.jpg" alt="" loading="lazy" /></p>
<p><em>Some lavenders found their way in a front bed built just for them.</em></p>
<p><img src="https://www.dyingtowrite.com/posts/2023/media/garden-bed-2.jpg" alt="" loading="lazy" /></p>
<p><em>Remnants of construction: Broken up sod and a bare path yet to be covered with woodchips.</em></p>
<p>We still need to build hoop frames and put netting over the garden beds.</p>
<h2 id="sowing-preferences">Sowing Preferences <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/gardening-log-1/#sowing-preferences">#</a></h2>
<p>According to various YouTube videos, some plants do better when sowed directly outside, and others are better started indoors because of our short growing season.</p>
<p><strong>Direct Sow</strong></p>
<p>The seeds are really tiny, or the plant species dislikes transplant shock.</p>
<ul>
<li>Peas</li>
<li>Beans</li>
<li>Some melons</li>
<li>Carrots</li>
<li>Beets</li>
<li>Alfafa</li>
</ul>
<p><strong>Indoor Start</strong></p>
<ul>
<li>Tomatoes</li>
<li>Zucchinis</li>
<li>Cucumbers</li>
<li>Peppers</li>
<li>Eggplants</li>
</ul>
<!-- ## Soil: peat
Hold moisture, light airy, pH neutral
Make your own: 40% compost 60% coconut fiber
> Temperature: 80-90 F -->
<h2 id="planting-schedule-infographic">Planting Schedule Infographic <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/gardening-log-1/#planting-schedule-infographic">#</a></h2>
<p><img src="https://www.dyingtowrite.com/posts/2023/media/PLANTING_SCHEDULE.svg" alt="" loading="lazy" /></p>
<blockquote>
<p>Download formats:</p>
<p><a href="https://www.dyingtowrite.com/posts/2023/media/PLANTING_SCHEDULE.ods">ODS (Excel, LibreOffice Calc)</a> | <a href="https://www.dyingtowrite.com/posts/2023/media/PLANTING_SCHEDULE.pdf">PDF Version</a> | <a href="https://www.dyingtowrite.com/posts/2023/media/PLANTING_SCHEDULE.svg">SVG (InkScape, Illustrator)</a></p>
</blockquote>
<p>I stole the design from <a href="https://www.ufseeds.com/new-jersey-vegetable-planting-calendar.html">Vegetable Planting Calendar</a>.</p>
<p>Improvements over theirs (because I’m a technical writer so I have to one-up them):</p>
<ul>
<li>
<p>Ordered crops based on time, so the earliest starters come first.</p>
</li>
<li>
<p>Indicated which seeds are simply better to direct sow outside. The * marks which ones are typically direct sowed.</p>
<ul>
<li>For example, Okra can be started inside as a decorative variety, so it has a green section. Okra is a warm-climate plant.</li>
<li>Some seeds are just so fussy that you might as well start outside, like peas and carrots.</li>
<li>Herbs like basil, thyme, oregano: they can be grown indoors in a pot… almost indefinitely if taken care of. Use your discretion.</li>
</ul>
</li>
<li>
<p>Flowers!</p>
</li>
</ul>
<p>It’s not the prettiest looking thing. I initially made the infographic in LibreOffice because I had a lot of numbers to cross-reference between with our seed packet intructions and general internet wisdom.</p>
<p>I dragged rectangles around until the bars lined up. Each bar consists of up to 3 rectangles: a green bar, a gradient between green and yellow for transition seedlings, and a bar for yellow to harvest. In LibreOffice, you can copy-paste rectangles into a cell and they line up the the upper left corner of that cell.</p>
<p>Then I saved it as an intermediary PDF, opened the PDF in Inkscape, arranged the text so it looks ok, and saved it as a final final PDF.</p>
<p>Save yourself the trouble and download a template that’s ready to go.</p>
<h3 id="last-frost-date">Last Frost Date <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/gardening-log-1/#last-frost-date">#</a></h3>
<p>The Last Frost Date is super subjective, because it depends on how much volume you’re planning to push out (as a business versus as a hobby), where you live, and your risk tolerance.</p>
<p>After consulting several last-frost-date calculators, I determined May 5th as the Last Frost Date of our climate (USDA Zone 6b), because it’s close to Mother’s Day, and I like the number 5.</p>
<p>Then I used <a href="https://www.johnnyseeds.com/growers-library/seed-planting-schedule-calculator.html">Seed-Starting Date Calculator</a> for some of the seeds we had, because it’s comprehensive. It needs your Last Frost Date.</p>
<h2 id="experiments">Experiments <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/gardening-log-1/#experiments">#</a></h2>
<p>I’m not a green thumb, and I’m not familiar with agricultural practices at all, so the most I can do is read a lot and prepare to the best of my ability. I want to try a few things: companion planting, germinating old seeds, and pest control.</p>
<h3 id="three-sisters-method">Three Sisters Method <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/gardening-log-1/#three-sisters-method">#</a></h3>
<p>The Three Sisters growing method is a touted form of companion planting from North America. The staple crops of corn, bean, and squash are grown together. It saves space for subsistence farmers.</p>
<p>Corn is the eldest sister who provides stability. Bean is the middle sister who provides nutrition (mostly nutrition for humans, but it’s also a nitrogen-fixing plant). Squash is the protective sister who shades the ground, keeping it moist and free of weeds.</p>
<p>There are dissenters who argue this method sucks, because modern crop varieties are ill-suited to ancient methods, and the Three Sister’s method is no more than just wives’ tales.</p>
<p>This spring I will experiment with a version that hopefully works in our day and age. There are actually a few different interpretations of the Three Sister’s Method.</p>
<h4 id="sunflower">Sunflower <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/gardening-log-1/#sunflower">#</a></h4>
<p><img src="https://www.dyingtowrite.com/posts/2023/media/3-sisters-seeds.jpg" alt="Seed packets of Mammoth sunflower, Kentucky Wonder pole beans, and Early Prolific summer squash." loading="lazy" /></p>
<p>I’m going to try this method. Instead of corn, use sunflower.</p>
<p>Corn needs to grow in blocks to wind pollinate, otherwise you’ll harvest no corn. They also need a lot of fertilizer and water. With the decline of bees, I’m not so confident that growing corn is worth it.</p>
<p>Sunflowers can attract birds and other pests away from our vegetables, so they would be great to grow along a fence.</p>
<p>Instructions:</p>
<ol>
<li>Create mounds about 18" in diameter.</li>
<li>Sow a sunflower seed in the center of each mound.</li>
<li>Insert halved water bottles as protection from animals who like to eat seedlings.</li>
<li>When the sunflowers are big enough, like 3", take out the water bottles.</li>
<li>When sunflowers are 6" high, plant 1 pole bean for each sunflower, or 2 pole beans on each side of a sunflower, or 3 in a triangle formation. When they grow up they can ground the sunflower like a tent pitch.</li>
<li>At the same time, plant a squash around the edge of the mound, or between mounds.
<ul>
<li>Modern squash plants grow huge, especially vine varieties.</li>
<li>Don’t grow them where you need to walk.</li>
</ul>
</li>
<li>Check daily, take out weeds, and train the beans and squash to grow neatly.</li>
</ol>
<p>Overall ratio of sunflower:bean:squash is close to 2:2:1.</p>
<p>Some people argue that sunflowers are allelopathic, which means they’re poisonous to beans, but I think it’s a bit overblown.</p>
<p>Raising up mounds, mulching and fertilizer, and planting the seeds in a sensible location are more important. Taking into account where the sun shines on our yard, I will plant the shorter plants closer to the sunspot. If we have to prune the sunflowers so their leaves don’t block everything, then so be it.</p>
<p>Something like:</p>
<p><img src="https://www.dyingtowrite.com/posts/2023/media/sun-angles-3-sisters.png" alt="Sun shining at an angle, so that the squash, beans, and sunflower all receive light." class="centered" loading="lazy" /></p>
<h4 id="autumn-harvest-low-maintenance-version">Autumn Harvest (Low Maintenance Version) <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/gardening-log-1/#autumn-harvest-low-maintenance-version">#</a></h4>
<p>This is the low-maintenance version where you don’t have to visit your crops very often and inadvertently compact the soil around your Three Sisters mound.</p>
<p>Grow a hard and tall/strong corn variety, like dent corn. Grow fall-harvest varieties that are left on the stalk until they dry.</p>
<p>Dry corn, dry beans, dry gourds and winter squash (like pumpkin).</p>
<h4 id="plot-wise-rotation">Plot-wise Rotation <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/gardening-log-1/#plot-wise-rotation">#</a></h4>
<p>Grow one variety per plot, but rotate every year.</p>
<ul>
<li>Year 1: Grow corn, harvest the corn, and leave the dry stalks in the ground.</li>
<li>Year 2: Grow beans up the dead stalks.</li>
<li>Year 3: Smash everything down the next spring and plant squash.</li>
</ul>
<p>Then back to corn.</p>
<h3 id="will-12-year-old-seeds-sprout">Will 12-year-old seeds sprout? <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/gardening-log-1/#will-12-year-old-seeds-sprout">#</a></h3>
<p>We have dill and sage seeds that are 12 years old. Their best-by dates are from 2009. Let’s see if any of them survived.</p>
<h3 id="pinwheels">Pinwheels <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/gardening-log-1/#pinwheels">#</a></h3>
<p>In order to deter birds, we will need a few pinwheels around our plots. Also, the pinwheels need to be moved every week. The reflective ones flash like turbines of death, so I wouldn’t be surprised if a bird just goes, “Nope!”</p>
<h2 id="watering-schedule">Watering schedule <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/gardening-log-1/#watering-schedule">#</a></h2>
<p>Water every 2-3 days once your plants have adult leaves. If you water too frequently, the crops won’t grow deep roots because of learned helplessness. As long as there’s enough water on the surface, they’ll just stay there comfortably. For root crops like carrots, you really want them to reach down.</p>
<p>Anyway, that about sums up my thoughts for this season. We’ll see how to harvest sunflowers before the birds eat all of them, or how many fungicides and pesticides we’ll need.</p>
<hr />
<p><em>Next: <a href="https://www.dyingtowrite.com/posts/2023/gardening-log-2/">Gardening Log 2</a></em></p>
[Review] Iowa Review 51/22023-02-12T00:00:00Zhttps://www.dyingtowrite.com/posts/reviews/iowa-review-51-2/<p><em>The Iowa Reivew</em> is one of the major American literary magazines.</p>
<p>I bought a year-long subscription, and this is the first subscription that I’ve gotten in print. It comes as a book.</p>
<p>For <a href="https://iowareview.org/issue/volume-51-issue-2-spring-2022">Volume 51 Issue 2</a>, which came out in Spring 2022 (I know, I know, this review is written late) a lot of the stories are unique. It’s much slimmer than the Summer 2022 issue.</p>
<p>Experimental typesetting is prominently featured in many stories. There’s one story about a tornado, “Inclemency” by Steffan Triplett, and the words are as pointed as a tornado. Compared to traditional novels, which stick to uniform blocks and don’t experiment with unorthodox word placement as much, it’s great to see authors who play with the space. I think novels that include illustrations and word tricksy are fun, and I’d love to see more of that in the market. But alas, I suppose you only find this playfulness in literary shorts.</p>
<p>I absolutely love the palindromes written by Colin Kostelecky. They are impressive on a technical level. “Ode to a Harbor Wind” is gorgeous.</p>
<p>“Rot” by Kirsten Veil Aguilar is a funny story about feeling disconnected in our communities and neighborhoods.</p>
[Review] Come Closer by Sarah Gran2023-02-10T00:00:00Zhttps://www.dyingtowrite.com/posts/reviews/gran-sarah_come-closer/<p>A woman is haunted by a seductress.</p>
<p><a href="https://www.goodreads.com/book/show/220772.Come_Closer" class="float-left"><img class="review" src="https://images-na.ssl-images-amazon.com/images/S/compressed.photo.goodreads.com/books/1309198030i/220772.jpg" alt="Link to Goodreads page" /></a></p>
<p>Gran writes the story with a neutral prose. I don’t want to describe her prose as bland, but in its unoffensiveness, it flows like water off a duck’s back, as elegant as the quintessential everyday woman: the relatable human trying to live her best life.</p>
<p>Since this is a horror story, it has a tragic ending where sin prevails. The merit of the book is the journey of transformation, the insidious, unassuming descent into madness, although the protagonist hardly considers herself mad.</p>
<p>There isn’t any gore or super explicit content. There are allusions to Christian alternative canon.</p>
<p>If you’re looking for something insiduous, like a splinter crawling under your callouses, <em>Come Closer</em> is a pleasant, short read that delivers exactly that.</p>
Finding Writing Friends2023-01-30T00:00:00Zhttps://www.dyingtowrite.com/posts/2023/finding-writing-partners/<p>I have a couple of online friends that I try to call and text consistently. That’s probably the most I can manage for now, since I get nervous about joining a group and I’m not willing to commit to consistent critique for a large number of folks.</p>
<p>To find potential writing partners, on Reddit there’s <a href="https://www.reddit.com/r/WriteWithMe/">r/WriteWithMe</a>, although you can try Facebook or Goodreads forums. The process is the same for all of them:</p>
<ol>
<li>Post about your expectations. Do you want an accountability partner? A cheerleader or coach type? Same timezone? Writing in similar genres?</li>
<li>Collect safe contact info on a safe platform.</li>
<li>Connect.</li>
</ol>
<p>Voice calling implicitly asks for people to be in a certain time zone, but I also state my own timezone. If I want to do real-time instead of asynchronous communtation, then I will request that we are close enough in timezone.</p>
<p>One some people reach out, or I reach out to them, I suggest we schedule an introductory Discord call. I might also ask to share each other’s writing samples beforehand.</p>
<p>In the call itself, I ask about commitment and seriousness level, like, “Do you want to be published? Would you self-publish or try for traditional? What do you want out of this relationship? What can I do for you? Do you like schedules or do you like spontaneous?” For me it’s important that we explain our different approaches and stances. How someone answers those questions is telling. I’m serious about the craft and I fear being overbearing, so it’s easier if the other person wants similar things as me.</p>
<p>Since I’m older and have had formal training in a field of writing, I’d <em>prefer</em> adults who have completed formal training in any field and can handle criticism.</p>
<p>Even then, there’s always exceptions.</p>
<p>When someone says they write for fun, it’s not an automatic rejection. It depends on their person’s sample/style, whether we can give comments and critiques, and whether they accept my goals and I accept theirs. One partner decided to drop the writing hobby, but we have shared interests so I keep in touch.</p>
<p>A teenager who is trying to submit to a writing competition; they are more likely level-headed and understand competing with bigger players, compared to an adult just writing for fun, for therapy, or for exploration only. So I’d keep in touch with this teenager.</p>
<p>I don’t always click with everyone I meet, but you can kinda feel it during the introductions.</p>
<h2 id="success-factor">Success Factor <a class="direct-link" href="https://www.dyingtowrite.com/posts/2023/finding-writing-partners/#success-factor">#</a></h2>
<p>The most influencial factor when connecting with other writers is sharing writing samples early. Sometimes I fail to share a sample for whatever reason, and my lack of reciprocation kills the momentum. It’s the same when the other person is reluctant to share. When both sides share a small piece and overcome that vulnerability, it builds trust. I shouldn’t be surprised about this, but I can’t help it. I constantly wonder about what it takes to develop platonic relationships.</p>
<p>It doesn’t have to be a long writing sample. For example, I pasted a poem I wrote into a DM chat. My friend asked me to read it out loud! I was nervous and chuckled a lot. They asked why I was nervous, and when I hestiated too long, they started reading the first line in a horrible British accent. I said, “Ok, I’ll read it.” I tried to read in a natural, non-chalant and casual voice. Since my poem has a rhyme scheme, there is a rhythm when performing it. I don’t want to say that it <em>forces</em> a rhythm, but it kinda does.</p>
<p>It was fun. Positive stress.</p>
<p>Later, they shared a link to some of their worldbuilding collections, which I am aware is a very precious act. I took a look, asked about their project, and that was that.</p>
<p>There is something to be said about knowing expectations and skill level. For more casual friends, I share snippets like poetry. For someone who has longer prose, I share a piece that matches the traits of their main project. You know what I mean: the chameleon habit.</p>
<p>It takes several meetings to find people. Making friends never really gets easier, and I have to constantly remind myself to take a leap of faith. I try to follow up with further invitations, but sometimes I get tired of being proactive and I ghost. 👻</p>
<!-- Both give and take are important. Try to reach out. Nobody likes overly pushy people, but nobody likes overly passive either. The best way to strike a balance is to practice the roles of recipient and lead. Reach out when its uncomfortable, sit back when you're antsy and itching eagerly. -->
WCAG 2.1 Conformance Levels2022-12-12T00:00:00Zhttps://www.dyingtowrite.com/posts/2022/wcag-2-1-conformance-levels-checklist/<p>This page organizes the Web Content Accessibility Guidelines (WCAG) success criteria by conformance level into a list. This meant to help you work your way up to AA and AAA.</p>
<ul>
<li><a href="https://www.dyingtowrite.com/posts/2022/wcag-2-1-conformance-levels-checklist/#what-are-levels-of-conformance">What are levels of conformance?</a></li>
<li><a href="https://gitlab.com/kibblab/scripts/-/blob/main/wcag/dist/wcag-2.2-levels.md">Next version: WCAG 2.2</a></li>
</ul>
<p>The WCAG is organized according to Perceivable, Operable, Understandable, Robust (POUR) principles, but in practice, developers and managers are focused on meeting requirements. Organizing the criteria based on ease and complexity is more suited for work.</p>
<h2 id="level-a">Level A <a class="direct-link" href="https://www.dyingtowrite.com/posts/2022/wcag-2-1-conformance-levels-checklist/#level-a">#</a></h2>
<p>1.1.1 <a href="https://www.w3.org/WAI/WCAG21/Understanding/non-text-content">Non-text Content</a><br />
1.2.1 <a href="https://www.w3.org/WAI/WCAG21/Understanding/audio-only-and-video-only-prerecorded">Audio-only and Video-only (Prerecorded)</a><br />
1.2.2 <a href="https://www.w3.org/WAI/WCAG21/Understanding/captions-prerecorded">Captions (Prerecorded)</a><br />
1.2.3 <a href="https://www.w3.org/WAI/WCAG21/Understanding/audio-description-or-media-alternative-prerecorded">Audio Description or Media Alternative (Prerecorded)</a><br />
1.3.1 <a href="https://www.w3.org/WAI/WCAG21/Understanding/info-and-relationships">Info and Relationships</a><br />
1.3.2 <a href="https://www.w3.org/WAI/WCAG21/Understanding/meaningful-sequence">Meaningful Sequence</a><br />
1.3.3 <a href="https://www.w3.org/WAI/WCAG21/Understanding/sensory-characteristics">Sensory Characteristics</a><br />
1.4.1 <a href="https://www.w3.org/WAI/WCAG21/Understanding/use-of-color">Use of Color</a><br />
1.4.2 <a href="https://www.w3.org/WAI/WCAG21/Understanding/audio-control">Audio Control</a><br />
2.1.1 <a href="https://www.w3.org/WAI/WCAG21/Understanding/keyboard">Keyboard</a><br />
2.1.2 <a href="https://www.w3.org/WAI/WCAG21/Understanding/no-keyboard-trap">No Keyboard Trap</a><br />
2.1.4 <a href="https://www.w3.org/WAI/WCAG21/Understanding/character-key-shortcuts">Character Key Shortcuts</a><br />
2.2.1 <a href="https://www.w3.org/WAI/WCAG21/Understanding/timing-adjustable">Timing Adjustable</a><br />
2.2.2 <a href="https://www.w3.org/WAI/WCAG21/Understanding/pause--stop--hide">Pause, Stop, Hide</a><br />
2.3.1 <a href="https://www.w3.org/WAI/WCAG21/Understanding/three-flashes-or-below-threshold">Three Flashes or Below Threshold</a><br />
2.4.1 <a href="https://www.w3.org/WAI/WCAG21/Understanding/bypass-blocks">Bypass Blocks</a><br />
2.4.2 <a href="https://www.w3.org/WAI/WCAG21/Understanding/page-titled">Page Titled</a><br />
2.4.3 <a href="https://www.w3.org/WAI/WCAG21/Understanding/focus-order">Focus Order</a><br />
2.4.4 <a href="https://www.w3.org/WAI/WCAG21/Understanding/link-purpose-in-context">Link Purpose (In Context)</a><br />
2.5.1 <a href="https://www.w3.org/WAI/WCAG21/Understanding/pointer-gestures">Pointer Gestures</a><br />
2.5.2 <a href="https://www.w3.org/WAI/WCAG21/Understanding/pointer-cancellation">Pointer Cancellation</a><br />
2.5.3 <a href="https://www.w3.org/WAI/WCAG21/Understanding/label-in-name">Label in Name</a><br />
2.5.4 <a href="https://www.w3.org/WAI/WCAG21/Understanding/motion-actuation">Motion Actuation</a><br />
3.1.1 <a href="https://www.w3.org/WAI/WCAG21/Understanding/language-of-page">Language of Page</a><br />
3.2.1 <a href="https://www.w3.org/WAI/WCAG21/Understanding/on-focus">On Focus</a><br />
3.2.2 <a href="https://www.w3.org/WAI/WCAG21/Understanding/on-input">On Input</a><br />
3.3.1 <a href="https://www.w3.org/WAI/WCAG21/Understanding/error-identification">Error Identification</a><br />
3.3.2 <a href="https://www.w3.org/WAI/WCAG21/Understanding/labels-or-instructions">Labels or Instructions</a><br />
4.1.1 <a href="https://www.w3.org/WAI/WCAG21/Understanding/parsing">Parsing</a><br />
4.1.2 <a href="https://www.w3.org/WAI/WCAG21/Understanding/name--role--value">Name, Role, Value</a></p>
<h2 id="level-aa">Level AA <a class="direct-link" href="https://www.dyingtowrite.com/posts/2022/wcag-2-1-conformance-levels-checklist/#level-aa">#</a></h2>
<p>1.2.4 <a href="https://www.w3.org/WAI/WCAG21/Understanding/captions-live">Captions (Live)</a><br />
1.2.5 <a href="https://www.w3.org/WAI/WCAG21/Understanding/audio-description-prerecorded">Audio Description (Prerecorded)</a><br />
1.3.4 <a href="https://www.w3.org/WAI/WCAG21/Understanding/orientation">Orientation</a><br />
1.3.5 <a href="https://www.w3.org/WAI/WCAG21/Understanding/identify-input-purpose">Identify Input Purpose</a><br />
1.4.3 <a href="https://www.w3.org/WAI/WCAG21/Understanding/contrast-minimum">Contrast (Minimum)</a><br />
1.4.4 <a href="https://www.w3.org/WAI/WCAG21/Understanding/resize-text">Resize text</a><br />
1.4.5 <a href="https://www.w3.org/WAI/WCAG21/Understanding/images-of-text">Images of Text</a><br />
2.4.5 <a href="https://www.w3.org/WAI/WCAG21/Understanding/multiple-ways">Multiple Ways</a><br />
2.4.6 <a href="https://www.w3.org/WAI/WCAG21/Understanding/headings-and-labels">Headings and Labels</a><br />
2.4.7 <a href="https://www.w3.org/WAI/WCAG21/Understanding/focus-visible">Focus Visible</a><br />
3.1.2 <a href="https://www.w3.org/WAI/WCAG21/Understanding/language-of-parts">Language of Parts</a><br />
3.2.3 <a href="https://www.w3.org/WAI/WCAG21/Understanding/consistent-navigation">Consistent Navigation</a><br />
3.2.4 <a href="https://www.w3.org/WAI/WCAG21/Understanding/consistent-identification">Consistent Identification</a><br />
3.3.3 <a href="https://www.w3.org/WAI/WCAG21/Understanding/error-suggestion">Error Suggestion</a><br />
3.3.4 <a href="https://www.w3.org/WAI/WCAG21/Understanding/error-prevention-legal--financial--data">Error Prevention (Legal, Financial, Data)</a><br />
4.1.3 <a href="https://www.w3.org/WAI/WCAG21/Understanding/status-messages">Status Messages</a></p>
<h2 id="level-aaa">Level AAA <a class="direct-link" href="https://www.dyingtowrite.com/posts/2022/wcag-2-1-conformance-levels-checklist/#level-aaa">#</a></h2>
<p>1.2.6 <a href="https://www.w3.org/WAI/WCAG21/Understanding/sign-language-prerecorded">Sign Language (Prerecorded)</a><br />
1.2.7 <a href="https://www.w3.org/WAI/WCAG21/Understanding/extended-audio-description-prerecorded">Extended Audio Description (Prerecorded)</a><br />
1.2.8 <a href="https://www.w3.org/WAI/WCAG21/Understanding/media-alternative-prerecorded">Media Alternative (Prerecorded)</a><br />
1.2.9 <a href="https://www.w3.org/WAI/WCAG21/Understanding/audio-only-live">Audio-only (Live)</a><br />
1.3.6 <a href="https://www.w3.org/WAI/WCAG21/Understanding/identify-purpose">Identify Purpose</a><br />
1.4.6 <a href="https://www.w3.org/WAI/WCAG21/Understanding/contrast-enhanced">Contrast (Enhanced)</a><br />
1.4.7 <a href="https://www.w3.org/WAI/WCAG21/Understanding/low-or-no-background-audio">Low or No Background Audio</a><br />
1.4.8 <a href="https://www.w3.org/WAI/WCAG21/Understanding/visual-presentation">Visual Presentation</a><br />
1.4.9 <a href="https://www.w3.org/WAI/WCAG21/Understanding/images-of-text-no-exception">Images of Text (No Exception)</a><br />
2.1.3 <a href="https://www.w3.org/WAI/WCAG21/Understanding/keyboard-no-exception">Keyboard (No Exception)</a><br />
2.2.3 <a href="https://www.w3.org/WAI/WCAG21/Understanding/no-timing">No Timing</a><br />
2.2.4 <a href="https://www.w3.org/WAI/WCAG21/Understanding/interruptions">Interruptions</a><br />
2.2.5 <a href="https://www.w3.org/WAI/WCAG21/Understanding/re-authenticating">Re-authenticating</a><br />
2.2.6 <a href="https://www.w3.org/WAI/WCAG21/Understanding/timeouts">Timeouts</a><br />
2.3.2 <a href="https://www.w3.org/WAI/WCAG21/Understanding/three-flashes">Three Flashes</a><br />
2.3.3 <a href="https://www.w3.org/WAI/WCAG21/Understanding/animation-from-interactions">Animation from Interactions</a><br />
2.4.8 <a href="https://www.w3.org/WAI/WCAG21/Understanding/location">Location</a><br />
2.4.9 <a href="https://www.w3.org/WAI/WCAG21/Understanding/link-purpose-link-only">Link Purpose (Link Only)</a><br />
2.5.5 <a href="https://www.w3.org/WAI/WCAG21/Understanding/target-size">Target Size</a><br />
2.5.6 <a href="https://www.w3.org/WAI/WCAG21/Understanding/concurrent-input-mechanisms">Concurrent Input Mechanisms</a><br />
3.1.3 <a href="https://www.w3.org/WAI/WCAG21/Understanding/unusual-words">Unusual Words</a><br />
3.1.4 <a href="https://www.w3.org/WAI/WCAG21/Understanding/abbreviations">Abbreviations</a><br />
3.1.5 <a href="https://www.w3.org/WAI/WCAG21/Understanding/reading-level">Reading Level</a><br />
3.1.6 <a href="https://www.w3.org/WAI/WCAG21/Understanding/pronunciation">Pronunciation</a><br />
3.2.5 <a href="https://www.w3.org/WAI/WCAG21/Understanding/change-on-request">Change on Request</a><br />
3.3.5 <a href="https://www.w3.org/WAI/WCAG21/Understanding/help">Help</a><br />
3.3.6 <a href="https://www.w3.org/WAI/WCAG21/Understanding/error-prevention-all">Error Prevention (All)</a></p>
<h2 id="what-are-levels-of-conformance">What are levels of conformance? <a class="direct-link" href="https://www.dyingtowrite.com/posts/2022/wcag-2-1-conformance-levels-checklist/#what-are-levels-of-conformance">#</a></h2>
<blockquote>
<p>WCAG 2.0 guidelines are categorized into three levels of conformance in order to meet the needs of different groups and different situations: A (lowest), AA (mid range), and AAA (highest)… Level A sets a minimum level of accessibility and does not achieve broad accessibility for many situations. For this reason, <strong>UC recommends AA conformance for all Web-based information.</strong><br />
–<a href="https://www.ucop.edu/electronic-accessibility/standards-and-best-practices/levels-of-conformance-a-aa-aaa.html">University of California</a></p>
</blockquote>
<p>Level AA conformance includes 100% of A criteria and 100% of AA criteria.</p>
<blockquote>
<p>For Level AA conformance, the Web page satisfies all the Level A and Level AA Success Criteria, or a Level AA conforming alternate version is provided.</p>
<p>–<a href="https://www.w3.org/WAI/WCAG21/Understanding/conformance">Understanding Conformance Requirements</a></p>
</blockquote>
<h2 id="references">References <a class="direct-link" href="https://www.dyingtowrite.com/posts/2022/wcag-2-1-conformance-levels-checklist/#references">#</a></h2>
<ul>
<li><a href="https://www.w3.org/WAI/WCAG21/quickref/">WCAG Implementation Quick Ref</a> for techniques and examples.</li>
<li><a href="https://www.w3.org/TR/WCAG20-TECHS/aria">ARIA Techniques</a> for developer/HTML specific techniques.</li>
</ul>
[Review] Black Sun by Rebecca Roanhorse2022-10-17T00:00:00Zhttps://www.dyingtowrite.com/posts/reviews/roanhorse_rebecca-black_sun/<p>A forgotten god returns on the day of an eclipse to punish the enemies of his clan.</p>
<p><a href="https://www.goodreads.com/book/show/50892360-black-sun" class="float-left"><img class="review" src="https://images-na.ssl-images-amazon.com/images/S/compressed.photo.goodreads.com/books/1601212809i/50892360.jpg" alt="Link to Goodreads page" /></a></p>
<p>I will mention that I am feeling extra critical and biased, because I am writing a novel with a similar concept to <em>Black Sun.</em> Also, this is a multi-POV book, and I prefer books with less POV characters.</p>
<p>The story has lore tidbits at the beginning of each chapter. The first one, attributed to a fictional <em>The Florentine Codex,</em> is intriguing and beautiful. The world-building is weighty and has been thought out extensively.</p>
<blockquote>
<p>“Dangerous,” Serapio said, instinctively.</p>
<p>“Powerful,” Powageh added, voice soft. “Too powerful for humans. Best we stick to sacrificing people the old ways, with wars and famine and despot rulers.” Xir voice was thick with bitterness.</p>
</blockquote>
<p>Unfortunately, I skipped a lot of passages. I was disappointed with the amount of exposition. The exposition style is common among female authors, where an excessive amount of sentences are dedicated to the web of relationships between characters. When I’m at a cocktail party, sure I can tolerate the small talk of, “Where did you meet each other? At the grocery store? Wow that’s funny, I met them there too, what good memories!” but in book form, it comes off banal.</p>
<p>The banality is further exacerbated with milquetoast characters. There are 4 POV characters from different echelons of society, and with each POV shift, I’m introduced to yet another social hierarchy and set of etiquette. What makes the characters boring is that they all have the same tendency among them: every single character is introduced as having niceness as their main trait. The high priest who is understanding and compassionate about the oppressed minorities’ plight, even after she’s almost assassinated by an extremist from said minority group. The scrappy love interest, a sailor woman, who is always misunderstood and demeaned but tries to save her crew from drowning. A warrior who is best buds with his giant flying crow. A traumatized man who also loves crows and his motivation in life is to… protect his crow friends? Then he kills everyone except the love interest.</p>
<p>There isn’t a clear antagonist, not even a struggle of Man vs. Self. If there was any moral struggle, I must’ve missed it from skipping pages, or it was not conveyed well. There is no theme either, unless “trust and be nice to people because life sucks” is supposed to be the theme?</p>
<p>The prose is decent, but structural issues made the plot weaker than expected. <em>Black Sun</em> is supposed to be the first of a trilogy, so a book that’s entirely setup is disappointing. If you don’t mind a longer payoff and you enjoy world-building and the type of exposition that I mentioned, maybe you’ll get more out of the book than I did.</p>
[Review] The Left Hand of Darkness by Urusla K. Le Guin2022-09-25T00:00:00Zhttps://www.dyingtowrite.com/posts/reviews/le_guin_ursula_k-the_left_hand_of_darkness/<p>An envoy’s expedition to a faraway planet takes him to places he never would’ve expected.</p>
<p>I’ve been meaning to read this famous book by Le Guin. It definitely deserves praise for smooth-rolling prose and exploring the societal ramifications of alien biology. It was interesting how the protagonist’s bias was slowly revealed. At first he seemed respectful and gregarious, but his inner thoughts grew judgy until his life was put in danger.</p>
<p><a href="https://www.goodreads.com/book/show/18423.The_Left_Hand_of_Darkness" class="float-left"><img class="review" src="https://images-na.ssl-images-amazon.com/images/S/compressed.photo.goodreads.com/books/1488213612i/18423.jpg" alt="Link to Goodreads page" /></a></p>
<blockquote>
<p>Winter is an inimical world; its punishment for doing things wrong is sure and prompt: death from cold or death from hunger. No margin, no reprieve. A man can trust his luck, but a society can’t; and cultural change, like random mutation, may make things chancier. So they have gone very slowly. At any one point in their history a hasty observer would say that all technological progress and diffusion had ceased. Yet it never has. Compare the torrent and the glacier. Both get where they are going.</p>
</blockquote>
<p>The landscape and scenery, although beautifully written, is drawn out too long, and I skimmed over a few paragraphs at a time. Maybe in the 70s a lengthy recount of the environment was expected, but in 2022 it’s a bit much, especially the parts where a man on an Artic expedition writes scrumpulous details in a diary, which he wouldn’t be if the trip was as taxing as described, and an oral culture as strong as it revered.</p>
<p>Perhaps by describing the cold so often, this book makes you want to curl up in blankets.</p>
[Review] A Shameful Life by Osamu Dazai2022-09-02T00:00:00Zhttps://www.dyingtowrite.com/posts/reviews/dazai_osamu-a_shameful-life/<p>A man in despair tries to assuage his loneliness, but gets entangled with scandals and debauchery.</p>
<p><a href="https://www.goodreads.com/book/show/40736061-a-shameful-life" class="float-right"><img class="review" src="https://images-na.ssl-images-amazon.com/images/S/compressed.photo.goodreads.com/books/1530930949i/40736061.jpg" alt="Link to Goodreads page" /></a></p>
<p>Originally titled <em>Ningen shikkaku,</em> I read the more recent English translation by Mark Gibeau. In a way, this book has a similar feel to <em>The Stranger</em> by Albert Camus. <em>A Shameful Life</em> is a 1st-person narrative from a man who wanders around like an alien to society.</p>
<p>The Japanese culture encourages people to speak politely and indirectly. Hence, the narrator, Yozo, harbors a great fear of being unable to understand the circumlocution of others. However, you don’t need to speak Japanese to understand the concept of lying, keeping masks, and acting polite to people you don’t like.</p>
<blockquote>
<p>The moment I was asked what I wanted I ceased to want anything at all.</p>
</blockquote>
<p>The novel does not have a defined plot, or it has what I would call a French plot. The narrator does not die, per say, but the story ends abruptly with no closure.</p>
<blockquote>
<p>Just as when people go on about how if you throw away three grains of rice with your lunch and ten million other people do the same then so many bushels of rice are wasted, or when they say that if ten million people conserved just one tissue each day then so many tons of pulp would be saved, and so on. How terrified I used to be of this kind of “scientific accounting.” Whenever I wasted so much as a single grain of rice, each time I blew my nose I was haunted by visions of a mountain of rice, of mountains of pulp going to waste. I grew despondent, as if I’d committed some terrible crime. Yet, in the end, these were but “scientific lies,” “statistical lies,” “mathematical lies.” Nobody was going to go around and collect each of those three grains of rice.</p>
</blockquote>
<p>The protagonist’s alienation is very profound, and his paranoia and attitudes towards women are also misogynistic and unsavory. If you keep reading, it becomes more ironic than insulting, when he holds so much contempt for his friends too.</p>
<p>Overall, the translation is well-written and the perspective is unique. Dazai manages to nail the introspection without being too long-winded. If you are looking for a curiously bleak trip, then <em>A Shameful Life</em> would fit the bill.</p>
[Review] The Library at Mount Char by Scott Hawkins2022-08-10T00:00:00Zhttps://www.dyingtowrite.com/posts/reviews/hawkins_scott-the_library_at_mount_char/<p>Cruel and usual punishment doled out by a loving Father is one way to raise some angry kids and end the world.</p>
<p><a href="https://www.goodreads.com/book/show/26892110-the-library-at-mount-char" class="float-left"><img class="review" src="https://images-na.ssl-images-amazon.com/images/S/compressed.photo.goodreads.com/books/1453225113i/26892110.jpg" alt="Link to Goodreads page" /></a></p>
<p>This book is a real trip. It deserves a lot of praise for having an intriguing hook and carrying the premise through.</p>
<p>The dialogue and narration are superb. Mythological aspects of an alternate dimension are also fun to read about, and despite some gruesome torture, the book’s overall tone is half absurd. It’s also lighter on the brain, as it doesn’t introduce too many foreign linguistic terms like the book <em>A Clockwork Orange</em> would. TLAMC has decent world-building for being a mix of contemporary and mythological.</p>
<blockquote>
<p>There was something about her now, something like a hooded cobra, swaying.</p>
</blockquote>
<p>The plot wavers around the climax. The climax features a side antagonist instead of the main antagonist, which felt like a weird decision on the author’s part. I also felt like the usage of time manipulation wasn’t that well done, a bit “handwavey,” because it stole a large chunk of character development from the protagonist. Like side characters have more backstory than the <em>protagonist</em> because of… memory loss? Then the explanation got hammered in at the end. Bleh. Maybe it’s just me, but I found this “memory loss” trope a bit annoying. I guess the author wanted to focus on areas they are better at handling.</p>
<p>As I’ve mentioned, despite the story having a cosmic horror bend, it has genuine funny moments that come from character development. In a way, you could say that TLAMC is a love letter to childhood, with a mysticism similar to <em>The Chronicles of Narnia.</em> Except a little more apocalyptic and less kid appropriate.</p>
Broken Link Checker2022-08-01T00:00:00Zhttps://www.dyingtowrite.com/posts/2022/broken-link-checker/<p>A common task for documenation maintenance is to scour the pages for broken links.</p>
<p>There’s many advanced link checkers, but they web scrape with UI automation for the worst case scenario, like websites that have fancy dynamic client-sided rendering where you have to wait for the JavaScript to inject the HTML elements, and the only way to get URLs is to wait for them to load in a headless browser. Some of these link checkers will also recursively crawl through the URLs of every connected page. They may also authenticate and authorize crawlers to load pages that are behind a VPN or firewall.</p>
<p>However, it’s a lot of overhead for documentation sites, which tend to be simpler, and the page counts are known already.</p>
<p>The blog post <a href="https://www.christopheryee.org/blog/bulk-url-checker-curl/">Bulk URL Checker with cURL</a> discusses how to use a shell script to check many links. You don’t need to download entire Python or NPM modules if you already have a Bash shell.</p>
<p>If I have a local copy of the documentaion, and I’m the only person who cares, then I’d want to run this on my work computer with little to no setup. In my case, I don’t have a Bash shell on Windows. I do have PowerShell 7.1 installed. Although I could use Bash on windows by downloading Cygwin or logging into a WSL instance, I just want to get my link checking done on my native system without any more software.</p>
<h2 id="one-liners">One-liners <a class="direct-link" href="https://www.dyingtowrite.com/posts/2022/broken-link-checker/#one-liners">#</a></h2>
<p>Assuming you have a list of links you want to check, such as <strong>./links.txt</strong> with a link on each line:</p>
<pre><code>https://en.wikipedia.org/
http://h2020.myspecies.info/
http://weevil.info/
http://cbdkhlfmnrtvwsxz.neverssl.com/online
https://8.8.8.8/
http://8.8.8.8/
https://www.amazon.com/error
http://www.example.com/stuff
</code></pre>
<p>In Linux, you can use a 1-liner to get the results in the console:</p>
<pre class="language-bash"><code class="language-bash"><span class="token function">xargs</span> <span class="token parameter variable">-P</span> <span class="token number">100</span> <span class="token parameter variable">-n</span> <span class="token number">1</span> <span class="token function">curl</span> --connect-timeout <span class="token number">10</span> <span class="token parameter variable">-Iso</span> /dev/null <span class="token parameter variable">-w</span> <span class="token string">"%{url_effective}<span class="token entity" title="\t">\t</span>%{http_code}<span class="token entity" title="\t">\t</span>%{redirect_url}<span class="token entity" title="\n">\n</span>"</span> <span class="token operator"><</span> ./links.txt</code></pre>
<p>The PowerShell 1-liner equivalent would be:</p>
<pre class="language-powershell"><code class="language-powershell"><span class="token function">Get-Content</span> <span class="token punctuation">.</span><span class="token operator">/</span>links<span class="token punctuation">.</span>txt <span class="token punctuation">|</span> <span class="token function">ForEach-Object</span> <span class="token operator">-</span><span class="token keyword">Parallel</span><span class="token punctuation">{</span> curl <span class="token operator">--</span><span class="token function">connect-timeout</span> 10 <span class="token operator">-</span>Iso <span class="token operator">/</span>dev/null <span class="token operator">-</span>w <span class="token string">"%{url_effective}\t%{http_code}\t%{redirect_url}\n"</span> <span class="token variable">$_</span> <span class="token punctuation">}</span> <span class="token operator">-</span>ThrottleLimit 100</code></pre>
<p><code>xargs -P 100</code> lets you run up to 100 commands in parallel, and <code>-n 1</code> feeds 1 line from the input file at a time (the PS equivalent is <code>ForEach-Object -Parallel{ } -ThrottleLimit 100</code>).</p>
<p>The <code>curl -I</code> flag is short for <code>curl --HEAD</code> which returns the server’s metadata instead of the page’s entire content. There might be servers that aren’t compliant with the HEAD method, but most modern servers are, so it’s better to use it.</p>
<h2 id="a-bigger-script">A Bigger Script <a class="direct-link" href="https://www.dyingtowrite.com/posts/2022/broken-link-checker/#a-bigger-script">#</a></h2>
<p>We can make a utility that accepts not just a *.txt, but other extension and entire directories. Then, we can spit out a tab-separated value (TSV) file for people who want to view the results in a spreadsheet.</p>
<div class="scroll-table" style="overflow-x:auto;"><table><thead>
<tr>
<th>Requires</th>
<th>Source repository</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://curl.se/">curl cli</a> and <a href="https://docs.microsoft.com/en-us/powershell/scripting/install/installing-powershell?view=powershell-7.2">Powershell 7</a>+</td>
<td>📁 <a href="https://gitlab.com/kibblab/scripts/-/tree/main/linkchecker">Scripts and examples on GitLab</a></td>
</tr>
</tbody>
</table></div><p>This script is called <strong>linkchecker.ps1</strong></p>
<p>Use <code>.\linkchecker.ps1 -help</code> or <code>.\linkchecker.ps1 -h</code> for a list of commands.</p>
<pre class="language-powershell"><code class="language-powershell"><span class="token keyword">param</span><span class="token punctuation">(</span><br /> <span class="token punctuation">[</span>Alias<span class="token punctuation">(</span><span class="token string">'p'</span><span class="token punctuation">)</span><span class="token punctuation">]</span><br /> <span class="token namespace">[string]</span><span class="token variable">$path</span><span class="token punctuation">,</span><br /> <span class="token punctuation">[</span>Alias<span class="token punctuation">(</span><span class="token string">'o'</span><span class="token punctuation">)</span><span class="token punctuation">]</span><br /> <span class="token namespace">[string]</span><span class="token variable">$output</span> = <span class="token string">'.\linkstatus.tsv'</span><span class="token punctuation">,</span><br /> <span class="token namespace">[switch]</span><span class="token variable">$dryrun</span><span class="token punctuation">,</span><br /> <span class="token punctuation">[</span>Alias<span class="token punctuation">(</span><span class="token string">'h'</span><span class="token punctuation">)</span><span class="token punctuation">]</span><br /> <span class="token namespace">[switch]</span><span class="token variable">$help</span><br /><span class="token punctuation">)</span><br /><br /><span class="token variable">$accept</span>=@<span class="token punctuation">(</span> <span class="token string">'html'</span><span class="token punctuation">,</span> <span class="token string">'htm'</span><span class="token punctuation">,</span> <span class="token string">'markdown'</span><span class="token punctuation">,</span> <span class="token string">'md'</span><span class="token punctuation">,</span> <span class="token string">'yaml'</span><span class="token punctuation">,</span> <span class="token string">'yml'</span><span class="token punctuation">,</span> <span class="token string">'json'</span><span class="token punctuation">,</span> <span class="token string">'xml'</span><span class="token punctuation">,</span> <span class="token string">'svg'</span><span class="token punctuation">)</span><br /><br /><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$help</span><span class="token punctuation">)</span><span class="token punctuation">{</span><br />@<span class="token string">"<br /><br /> SYNOPSIS<br /> Check broken links from a static html page or a text list. Creates a TSV file with their status.<br /> File extensions checked: <span class="token variable">$accept</span><br /><br /> USAGE<br /> linkchecker.ps1 -path PATH [-output OUTPUT]<br /><br /> -p, -path The input path. Can be a directory and will recurse through children<br /> -o, -output The output TSV file. Default is '<span class="token variable">$output</span>'<br /> -dryrun Show links to be checked but don't make any HTTP calls<br /> -h, -help Guidance menu<br />"</span>@<br /><span class="token keyword">Exit</span> 0<br /><span class="token punctuation">}</span><br /><br /><span class="token variable">$rgx</span>=<span class="token string">'(http|https)://[^\"<>{}\(\)\t,]+'</span><br /><br /><span class="token comment"># Check if folder</span><br /><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token function">Get-Item</span> <span class="token variable">$path</span><span class="token punctuation">)</span><span class="token punctuation">.</span>PSIsContainer<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token variable">$files</span>=<span class="token punctuation">(</span><span class="token function">Get-ChildItem</span> <span class="token punctuation">.</span> <span class="token operator">-</span>Recurse <span class="token operator">-</span>File<span class="token punctuation">)</span><span class="token punctuation">.</span>FullName<br /> <span class="token variable">$links</span>=<span class="token punctuation">(</span><span class="token variable">$files</span> <span class="token punctuation">|</span> <span class="token function">ForEach-Object</span> <span class="token operator">-</span><span class="token keyword">Parallel</span><span class="token punctuation">{</span><br /> <span class="token function">Get-Content</span> <span class="token variable">$_</span> <span class="token punctuation">|</span> <span class="token function">Select-String</span> $<span class="token punctuation">(</span><span class="token variable">$using</span>:rgx<span class="token punctuation">)</span> <span class="token operator">-</span>All <span class="token punctuation">|</span> <span class="token keyword">foreach</span> <span class="token punctuation">{</span><span class="token variable">$_</span><span class="token punctuation">.</span>Matches<span class="token punctuation">.</span>Value<span class="token punctuation">}</span><br /> <span class="token punctuation">}</span> <span class="token operator">-</span>ThrottleLimit 100 <span class="token punctuation">)</span><br /><span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><br /> <span class="token variable">$ext</span>=<span class="token punctuation">(</span><span class="token function">Split-Path</span> <span class="token operator">-</span>Path <span class="token variable">$path</span> <span class="token operator">-</span>Leaf<span class="token punctuation">)</span><span class="token punctuation">.</span>Split<span class="token punctuation">(</span><span class="token string">"."</span><span class="token punctuation">)</span><span class="token punctuation">[</span>1<span class="token punctuation">]</span><span class="token punctuation">;</span><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$ext</span> <span class="token operator">-in</span> <span class="token variable">$accept</span> <span class="token punctuation">)</span><span class="token punctuation">{</span><br /> <span class="token variable">$links</span>=<span class="token punctuation">(</span> <span class="token function">Get-Content</span> <span class="token variable">$path</span> <span class="token punctuation">|</span> <span class="token function">Select-String</span> <span class="token variable">$rgx</span> <span class="token operator">-</span>All <span class="token punctuation">|</span> <span class="token keyword">foreach</span> <span class="token punctuation">{</span><span class="token variable">$_</span><span class="token punctuation">.</span>Matches<span class="token punctuation">.</span>Value<span class="token punctuation">}</span> <span class="token punctuation">)</span><br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><br /> <span class="token variable">$links</span>=@<span class="token punctuation">(</span> <span class="token function">Get-Content</span> <span class="token variable">$path</span> <span class="token punctuation">)</span><br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span><br /><br /><span class="token variable">$links</span> = <span class="token punctuation">(</span><span class="token variable">$links</span> <span class="token punctuation">|</span> <span class="token function">Sort-Object</span> <span class="token punctuation">|</span> <span class="token function">Get-Unique</span><span class="token punctuation">)</span><br /><br /><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$dryrun</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">Write-Output</span> <span class="token variable">$links</span><span class="token punctuation">;</span> <span class="token keyword">Exit</span> 0 <span class="token punctuation">}</span><br /><br /><span class="token function">Write-Output</span> <span class="token string">"Checking <span class="token function">$<span class="token punctuation">(</span><span class="token variable">$links</span><span class="token punctuation">.</span>length<span class="token punctuation">)</span></span> URLs..."</span><br /><br /><span class="token variable">$callTime</span> = <span class="token function">Measure-Command</span> <span class="token punctuation">{</span><br /> <span class="token function">Set-Content</span> <span class="token operator">-</span>Path <span class="token variable">$output</span> <span class="token string">"url`tstatus`tredirect"</span><br /> <span class="token variable">$links</span> <span class="token punctuation">|</span> <span class="token function">ForEach-Object</span> <span class="token operator">-</span><span class="token keyword">Parallel</span><span class="token punctuation">{</span><br /> curl <span class="token operator">--</span><span class="token function">connect-timeout</span> 10 <span class="token operator">-</span>Iso <span class="token operator">/</span>dev/null <span class="token operator">-</span>w <span class="token string">"%{url_effective}\t%{http_code}\t%{redirect_url}\n"</span> <span class="token variable">$_</span><br /> <span class="token punctuation">}</span> <span class="token operator">-</span>ThrottleLimit 100 <span class="token punctuation">|</span> <span class="token function">Add-Content</span> <span class="token operator">-</span>Path <span class="token variable">$output</span> <br /><span class="token punctuation">}</span><br /><br /><br /><span class="token function">Write-Output</span> <span class="token string">"Done. Time to complete was <span class="token variable">$callTime</span>"</span></code></pre>
<p><strong>Basic usage:</strong> Outputs a file called <code>linkstatus.tsv</code>.</p>
<pre><code>pwsh linkchecker.ps1 README.md
</code></pre>
<p><strong>Explicit arguments:</strong> specify the input path and output filename.</p>
<pre><code>pwsh linkchecker.ps1 -path ./examples/test.json -o 2022-07-29.tsv
</code></pre>
<p><strong>Dry run:</strong> show links to be checked without making network calls.</p>
<pre><code>pwsh linkchecker.ps1 . -dryrun
</code></pre>
<p>This lists all the links found in the current directory. To actually run the checker: <code>pwsh linkchecker.ps1 .</code></p>
<p><strong>Interpreting TSV results</strong></p>
<p>A TSV/CSV can be opened in Excel, Google and LibreOffice.</p>
<ul>
<li>A status between <code>400</code>-<code>499</code> is broken.</li>
<li><code>500</code>+ might be temporarily unavailable, not necessarily broken</li>
<li><code>000</code> means the link timed out after 10 seconds.</li>
</ul>
<h3 id="complete-example">Complete Example <a class="direct-link" href="https://www.dyingtowrite.com/posts/2022/broken-link-checker/#complete-example">#</a></h3>
<p>A PowerShell script to create a CSV named after today’s date, only containing failed links.</p>
<pre class="language-powershell"><code class="language-powershell"><span class="token variable">$input</span>=<span class="token string">'./examples/links.txt'</span><br /><br /><span class="token comment"># Check links</span><br /><span class="token variable">$TempFile</span> = <span class="token function">New-TemporaryFile</span><span class="token punctuation">;</span><br /><span class="token punctuation">.</span>\linkchecker<span class="token punctuation">.</span>ps1 <span class="token operator">-</span>path <span class="token variable">$input</span> <span class="token operator">-</span>o <span class="token variable">$TempFile</span><span class="token punctuation">;</span><br /><br /><span class="token comment"># Filter for bad links</span><br /><span class="token variable">$errored</span>=<span class="token punctuation">(</span> <span class="token function">Import-Csv</span> <span class="token operator">-</span>Path <span class="token variable">$TempFile</span> <span class="token operator">-</span>Delimiter <span class="token string">"`t"</span> <span class="token punctuation">|</span> <span class="token function">Sort-Object</span> status <span class="token punctuation">|</span> <span class="token function">Where-Object</span> <span class="token punctuation">{</span><span class="token variable">$_</span><span class="token punctuation">.</span>status <span class="token operator">-gt</span> 399 <span class="token operator">-or</span> <span class="token variable">$_</span><span class="token punctuation">.</span>status <span class="token operator">-lt</span> 100 <span class="token punctuation">}</span> <span class="token punctuation">)</span><span class="token punctuation">;</span><br /><br /><span class="token comment"># Name a CSV report after today's date.</span><br /><span class="token variable">$date</span>=<span class="token punctuation">(</span> <span class="token function">Get-Date</span> <span class="token operator">-</span>Format <span class="token string">'yyyy-MM-dd'</span> <span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token variable">$errored</span> <span class="token punctuation">|</span> <span class="token function">Export-Csv</span> <span class="token string">"<span class="token variable">$date</span>.csv"</span><br /><br /><span class="token function">Remove-Item</span> <span class="token operator">-</span>Recurse <span class="token operator">-</span>Force <span class="token variable">$TempFile</span></code></pre>
<p>If I run this script on August 1st, 2022, I should get a file called <strong>2022-08-01.csv</strong></p>
<h2 id="references">References <a class="direct-link" href="https://www.dyingtowrite.com/posts/2022/broken-link-checker/#references">#</a></h2>
<ul>
<li>JSON test file comes from <a href="https://github.com/ajv-validator/ajv/tree/master/spec/remotes">ajv json validator</a></li>
</ul>
[Review] Ring Shout by P. Djèlí Clark2022-07-31T00:00:00Zhttps://www.dyingtowrite.com/posts/reviews/clark_p_djeli-ring_shout/<p>In a fight against interdimensional beings, the oppressed form a resistance against a monster invasion. Will their homebrew folk magic be enough to overcome temptation?</p>
<p><a href="https://www.goodreads.com/book/show/49247242-ring-shout" class="float-left"><img class="review" src="https://i.gr-assets.com/images/S/compressed.photo.goodreads.com/books/1580134382l/49247242.jpg" alt="Link to Goodreads page" /></a></p>
<p><em>Ring Shout</em> is a novella with an alternate history timeline. In this world, the Ku Klux Klan are cultsits who have been possesed by alien predators. The story features a heroine who prevails against them.</p>
<p>The story features a mostly female cast which I thought was interesting. There are some disturbing scenes of torture.</p>
<p>In terms of linguistic merits, the character Nana Jane speaks in phonetically spelled-out Gullah, which is a foreign language in and of itself despite having many English loanwords. I skimmed over most of her dialogue since I couldn’t understand it.</p>
<p>The novella does feel a bit overstuffed with research, and some of the narration felt on the nose. Because it’s written in 1st person, when the protagonist mentions cultural practices, it comes off expository instead of naturally. Normally, people never put subconscious assumptions into words unless a foreigner comes along and asks about it, or challenges them. But, I cannot completely fault Clark for honoring a real life culture.</p>
<p>Otherwise, if you want a romp in an alternate reality, with some good old time bending and evil spirits, try <em>Ring Shout</em>.</p>