<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.9.2">Jekyll</generator><link href="https://blog.reiterate.app/feed.xml" rel="self" type="application/atom+xml" /><link href="https://blog.reiterate.app/" rel="alternate" type="text/html" /><updated>2024-01-16T18:03:55-08:00</updated><id>https://blog.reiterate.app/feed.xml</id><title type="html">Reiterations</title><subtitle>Essays on self-improvement, software development, and esports.</subtitle><author><name>rattroupe</name></author><entry><title type="html">Shaking Off the Rust</title><link href="https://blog.reiterate.app/personal%20development/2024/01/16/shaking-off-the-rust/" rel="alternate" type="text/html" title="Shaking Off the Rust" /><published>2024-01-16T18:03:00-08:00</published><updated>2024-01-16T18:03:00-08:00</updated><id>https://blog.reiterate.app/personal%20development/2024/01/16/shaking-off-the-rust</id><content type="html" xml:base="https://blog.reiterate.app/personal%20development/2024/01/16/shaking-off-the-rust/"><![CDATA[<p>One of the problems with a complex game like <em>League of Legends</em> is how easy it is to get rusty. If you don’t play every day, you can 
quickly lose ability, and when you come back to the game you’ll find it much more difficult to play, even for a short absence of a week or two.
Reiterate can help you get back on track quickly.</p>

<!--more-->

<div class="image-container mb-4"><figure><img src="/public/images/2024/rusty-robot.png" width="120%" alt="An old abandoned robot rusts away, abandoned in a field." class="mx-auto" /><figcaption>An old abandoned robot rusts away, abandoned in a field. Image by <a href="https://openai.com">Dall-E</a>.</figcaption></figure></div>

<h3 id="keeping-a-record">Keeping a Record</h3>

<p>Reiterate works by having you identify issues with your own play and recording clips to help you focus on each one. As a by-product of this
process, you have a record of every skill you feel is important to focus on.</p>

<p>When you’re away from the game for an extended period, it can be easy to forget what you were working on in the first place. Reiterate can 
act as a bookmark for you, keeping your place, so you can pick up your routine where you left off.</p>

<p>If you don’t follow a regular routine, it’s easy to get lost. Recording your skills and motivations should be a part of that routine. A
training session should be more than “I played the game for an hour every day.” If that’s all that you do, and you take a break, then
when you pick the game up again you’ll find yourself making the same mistakes all over again, and worse, you won’t even know which mistakes
you’re repeating.</p>

<h3 id="review">Review</h3>

<p>My own personal Reiterate session currently has 30 clips in it. That’s a lot, but keep in mind that I also use the
<strong><a href="https://reiterate.app/manual#focus-limit">Focus Limit</a></strong> and <strong><a href="https://reiterate.app/manual#repeat-limit">Repeat Limit</a></strong> settings.
Those settings ensure that in any one particular session, I’m only focusing on a small subset of my entire session clip group.</p>

<p>I took a break from League recently, and when I came back it was very nice to be able to scroll through the titles of my session clips.
Just reading the titles, not even playing the clips, was enough to make me think, <em>ah, yes, that’s what I was working on</em>. It’s like
a bookmark into your own personal development. Without those clips, I probably would have stumbled through my first few games, remembering
the skills I needed to work on only after failing them in an actual game. And even then, I probably wouldn’t have been able to remember
all thirty of the skills that I’m currently developing. Something would have inevitably been lost.</p>

<h3 id="learned-skills">Learned Skills</h3>

<p>One technique I like to tell people about is the <em>Learned Skills</em> session. If you make a session called <em>Learned Skills</em> then you can
move clips there once you feel you don’t need them any more. It’s satisfying to hear a clip during a session and you think, <em>I don’t
need to hear that any more</em>. You’ve successfully internalized the skill. You can simply mute the clip, and it won’t play in that session
any more. That’s fine. But then you can also add it to the <em>Learned Skills</em> session. That session will act as a repository for all the
skills that Reiterate has helped you improve on. As that session list grows, it becomes concrete evidence of how much you’ve grown.</p>

<p>It can also serve as a useful review tool. Every so often, you can scroll through the titles just to remind yourself of how far you’ve come.
And you can also play that session in an actual game. You’ll probably not need to hear most of what is played, but perhaps there’s some
skill that’s atrophied and you’ll find you need to work on it some more. This way, you can keep all your skills in top condition.</p>]]></content><author><name>Rat Troupe</name><email>rattroupe@reiterate-app.com</email></author><category term="personal development" /><category term="tips" /><category term="reiterate" /><summary type="html"><![CDATA[One of the problems with a complex game like League of Legends is how easy it is to get rusty. If you don’t play every day, you can quickly lose ability, and when you come back to the game you’ll find it much more difficult to play, even for a short absence of a week or two. Reiterate can help you get back on track quickly.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blog.reiterate.app/public/images/2024/rusty-robot.png" /><media:content medium="image" url="https://blog.reiterate.app/public/images/2024/rusty-robot.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">The First Step Towards Change is Acceptance</title><link href="https://blog.reiterate.app/personal%20development/2024/01/05/the-first-step-towards-change-is-acceptance/" rel="alternate" type="text/html" title="The First Step Towards Change is Acceptance" /><published>2024-01-05T15:55:00-08:00</published><updated>2024-01-05T15:55:00-08:00</updated><id>https://blog.reiterate.app/personal%20development/2024/01/05/the-first-step-towards-change-is-acceptance</id><content type="html" xml:base="https://blog.reiterate.app/personal%20development/2024/01/05/the-first-step-towards-change-is-acceptance/"><![CDATA[<p>The new year is a time when people traditionally look back at the past, and forwards towards the future. Accepting your past is often
the key towards changing your future. Last year I read an article with an interesting point about looking backward.</p>

<!--more-->

<div class="image-container mb-4"><figure><img src="/public/images/2024/stepping-into-mirror.png" width="100%" alt="A man looks into the mirror and his mirrored self looks back. He's preparing to step forward, into his own past self." class="mx-auto" /><figcaption>A man looks into the mirror and his mirrored self looks back. He's preparing to step forward, into his own past self. Image by <a href="https://openai.com">Dall-E</a>.</figcaption></figure></div>

<p>At the start of 2022 the Guardian ran an article titled <a href="https://www.theguardian.com/lifeandstyle/2022/jan/01/new-year-same-old-you-the-secret-to-self-improvement-is-embracing-your-messy-imperfect-life">New Year, Same Old You!</a>.
This is one of many self-improvements essays that all tend to come out around New Year’s, but I felt this one had some nice points, and in
particular I felt it tied in with Reiterate in some important ways. I don’t think it’s become at all irrelevant in the two years its spent
sitting in my ideas pile.</p>

<p>New Year’s is a time when people traditionally look to improve themselves. Much of the advice that is given in regards to lists of resolutions
is also applicable to people trying to improve at esports. Some people want to quit smoking; other people want to quit throwing away winning games.
New Year’s resolutions can fail for the same reasons people improve to climb, and the main reason is that the person who is trying to improve
is the same person who is devising the plan to improve. Let’s face it: if you’re hardstuck silver, why would you follow the advice of someone
who is hardstuck silver to get out?</p>

<blockquote>
  <p>No one awakens in the morning, looks in the mirror and says, ‘I think I will repeat my mistakes today… but frequently, 
this replication of history is precisely what we do.</p>
</blockquote>

<p>This is a way to get trapped in a perpetuating cycle of self-loathing. If you start by imagining yourself at your new rank, you inevitably
feel bad about your current rank. This makes it even harder to change your playstyle, and when you inevitably fail to climb, you feel even
worse about yourself.</p>

<h3 id="acceptance">Acceptance</h3>

<p>The way out of this spiral is to embrace who you are at this moment. Accept your current rank, accept all the mistakes and misplays you make,
accept your flaws. There’s nothing bad about making mistakes, everyone makes mistakes. Making a poor play does not make you a bad person.</p>

<p>Many people dream about achieving their goals. How good it will feel when they finally have that Diamond border. But here’s an experiment.
Instead of imagining how you’ll feel when you achieve the rank you desire, try something else. Imagine a future where you <strong>never</strong> climb
any higher than where you are right now. You will be hardstuck at this rank for the rest of your life. Really try to imagine that scenario.
How does it make you feel? Does it feel awful? Make you depressed? Stick with that. Keep exploring that feeling, because that’s what’s
holding you back.</p>

<blockquote>
  <p>Paradoxically, accepting that you’re just not a confident [player] and you’re always going to [lose games]
will begin to make you feel more comfortable and less anxious [about your play].</p>
</blockquote>

<p>Only by accepting who you are can you find the foundation upon which you can build your new skills.</p>

<h3 id="reiterate">Reiterate</h3>

<p>As I’ve worked with Reiterate to improve my own play, I’ve accumulated a long list of flaws. Reiterate forces you to examine your own play
and put into words (and voice) what your problems are. Every clip that I’ve recorded into Reiterate is an admission of a flaw. Some of those
flaws I’ve managed to eradicate. There are clips that will play and I think, <em>I don’t need that anymore</em>, and I remove it from my active
session.</p>

<p>There are also clips that have been there for months. And that’s okay too. Maybe there are issues with my gameplay that I will never
be able to fix. Perhaps my efforts would be better spent focusing on other issues, then. I’ll have to accept that there are some skills
that are beyond my reach.</p>

<p>My current session has thirty clips. Scrolling through it, it’s laughable to think that I’ll ever run out of clips to record or work on.
Pruning down the list, taking a clip and saying “I think I’ll retire this one,” is not a failure. It’s a way of being more productive,
of focusing my efforts onto areas where I will see the most improvement.</p>

<p><a href="https://www.theguardian.com/lifeandstyle/2022/jan/01/new-year-same-old-you-the-secret-to-self-improvement-is-embracing-your-messy-imperfect-life">Read the original article</a></p>]]></content><author><name>Rat Troupe</name><email>rattroupe@reiterate-app.com</email></author><category term="personal development" /><category term="psychology" /><summary type="html"><![CDATA[The new year is a time when people traditionally look back at the past, and forwards towards the future. Accepting your past is often the key towards changing your future. Last year I read an article with an interesting point about looking backward.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blog.reiterate.app/public/images/2024/stepping-into-mirror.png" /><media:content medium="image" url="https://blog.reiterate.app/public/images/2024/stepping-into-mirror.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">2023 Recap</title><link href="https://blog.reiterate.app/misc/2023/12/12/2023-recap/" rel="alternate" type="text/html" title="2023 Recap" /><published>2023-12-12T10:00:00-08:00</published><updated>2023-12-12T10:00:00-08:00</updated><id>https://blog.reiterate.app/misc/2023/12/12/2023-recap</id><content type="html" xml:base="https://blog.reiterate.app/misc/2023/12/12/2023-recap/"><![CDATA[<p>I’ve been blogging for three years now. Here’s a look back at what I did for 2023.</p>

<!--more-->

<div class="image-container mb-4"><figure><img src="/public/images/2023/retrospective.heic" width="100%" alt="A whimsical interpretation of looking back at the past year's events." class="mx-auto" /><figcaption>A whimsical interpretation of looking back at the past year's events. Image by <a href="https://openai.com">Dall-E</a>.</figcaption></figure></div>

<p>I only managed to write twelve posts this year (not counting this one). That’s less than half of 2022’s total of 30. Partly that’s due
to all the technical work I’ve been doing. I haven’t abandoned this blog by any means. There’s two ways I can “work on my blog”. The first
is by writing new content, and the second is technical work. I did a lot of technical work last year, but that means I didn’t have time
to create a lot of new content</p>

<h2 id="technical-improvements">Technical Improvements</h2>

<p>The biggest technical improvement is the <a href="/software/2023/11/13/restyling-with-tailwind-css/">conversion to Tailwind CSS</a>. That’s something
I’ve wanted to do for a long time and I’m glad I got it done. The old blog theme was basically one of the default themes that came with
Jekyll and it didn’t match the rest of the site. This new theme is… well, it’s not much of a theme, but it shouldn’t be too hard
to add some nice styling bit by bit. I look at it as a fresh starting place.</p>

<p>The Tailwind system I integrated is nice and clean. I was able to get rid of several css files from the old theme, so the site should be
more efficient and load faster.</p>

<p>Another big change was moving to Mastodon. I got rid of the Twitter links and set up a system to 
<a href="/software/2023/03/03/adding-mastodon-links-to-jekyll/">automatically post to Mastodon</a>
whenever I posted here on the blog. I actually had someone contact me with a couple suggestions, and I think they might be
using my plugin on their own blog. It always feels nice to have someone find your work to be useful.</p>

<p>This year I also <a href="/software/2023/07/08/debian-12-bookworm-upgrade-report/">upgraded to Debian Bookworm</a>. That gave me a chance
to test out my <a href="/software/2023/04/16/using-ansible-to-deploy-new-servers/">Ansible migration system</a>.</p>

<h2 id="gaming-and-philosophy-posts">Gaming and Philosophy Posts</h2>

<p>Keeping with the trend from previous years, about half my posts were on my gaming and self-improvement philosophies. I wrote about
how <a href="/personal%20development/2023/06/05/communion-fatigue/">you need to rest your communions skills</a> as much as your wrists. Incremental
improvement is an important focus, and sometimes <a href="/personal%20development/2023/05/26/how-to-be-less-bad/">trying to be less bad</a> can be a good
approach. Finally, I looked at how important <a href="/personal%20development/2023/01/30/voice-lessons/">hearing a coach’s voice</a> can be for professional
athletes, something I feel justifies Reiterate’s approach for esports.</p>

<h2 id="elon-musk">Elon Musk</h2>

<p>One of my most populat posts this year was the one where I explained 
<a href="/misc/2023/12/01/goodbye-twitter/">why I’m leaving Twitter</a>. I’m not sure how I feel about that. It didn’t exactly go viral, but
it did get boosted and favorited on Mastodon, something that hasn’t happened with any of my other posts. For someone like myself who
has basically no audience, it was startling to see complete strangers clicking that boost button.</p>

<p>That post is my rant-iest post yet, and I’m not exactly proud of that. It’s easy to get a reaction by being incindiary. That’s not something
I want to be known for, though. I’m not going to take that post’s popularity as a sign that I should be more extreme in my views. Quite
the opposite. This is a personal blog; it’s a place for me to expand on my own thoughts, and if other people want to follow along that’s fine.
I can rant sometimes, but in the end I feel this palce is better off with more measured discourse.</p>

<h2 id="looking-forward">Looking Forward</h2>

<p>Reiterate is in a pretty good place right now. This year I upgraded it to use all the modern Swift concurrency affordances. It’s still
written in AppKit, not SwiftUI, so I suppose that’s the last major upgrade it will need to be a fully “modern” app. Feature-wise,
I’d say it’s complete. I use it every day in my own gameplay, and I think it’s useful.</p>

<p>I see more and more pieces with people asking <a href="https://dotesports.com/league-of-legends/news/is-lol-dead-how-many-people-still-play-league">Is League Dying?</a>, usually followed by lots of statistics to make the case that it isn’t.
But it all feels kind of forced. Reiterate is not tied to League. I use it for League, mostly, but there’s nothing in the app that
says it can’t be used for any other game. So if League does retire, Reiterate can continue on in some other form. I’m not worried about that.</p>]]></content><author><name>Rat Troupe</name><email>rattroupe@reiterate-app.com</email></author><category term="misc" /><category term="communion" /><category term="reiterate" /><category term="psychology" /><category term="jekyll" /><summary type="html"><![CDATA[I’ve been blogging for three years now. Here’s a look back at what I did for 2023.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blog.reiterate.app/public/images/2023/retrospective.heic" /><media:content medium="image" url="https://blog.reiterate.app/public/images/2023/retrospective.heic" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Goodbye Twitter</title><link href="https://blog.reiterate.app/misc/2023/12/01/goodbye-twitter/" rel="alternate" type="text/html" title="Goodbye Twitter" /><published>2023-12-01T17:52:00-08:00</published><updated>2023-12-01T17:52:00-08:00</updated><id>https://blog.reiterate.app/misc/2023/12/01/goodbye-twitter</id><content type="html" xml:base="https://blog.reiterate.app/misc/2023/12/01/goodbye-twitter/"><![CDATA[<p>I’ve removed all Twitter links from my site.
<!--more--></p>

<div class="image-container mb-4"><img src="/public/images/2023/empty-birdcage.png" width="120%" alt="An empty birdcage sits forlorn and forgotten, ready for the trash heap" class="mx-auto" /></div>

<p>I spent quite a bit of time integrating this site with Twitter. I tried 
<a href="/software/2021/07/19/twitter-issues/">working with Bridgy to handle backlinks</a>, and set up Jekyll plugins
to <a href="/software/2021/07/21/bridgy-publishing/">automate the POSSE process</a>
so it would post links to my Twitter account. But I’ve taken all that down now. The reason, of course, is Elon Musk.</p>

<h3 id="the-enshittification-of-twitter">The Enshittification of Twitter</h3>

<p>There have been so many articles written on Twitter’s decline. I don’t feel I need to recap them all here. But aside from
all the hate speech, anti-semitic remarks, and garbage posts, the sheer fact that Elon is now running things is enough
to make me want to quit.</p>

<p>I’m not under any delusion that my quitting Twitter will somehow be the spark that turns things around. Elon Musk is not going
to browse this site and have some sort of revelation that he either needs to vacate the site, or turn things over to someone
who knows how to run it. And my leaving Twitter is not going to engender some sort of mass exodus (not that that isn’t happening
already).</p>

<p>(As an aside, I find it amusing how every news article that mentions Twitter is still calling it “X, formerly known as Twitter”. This
  has to be the worst corporate renaming ever. How long is it going to be referred to as the social media site “formerly known as Twitter”?
  Every day that continues get a chuckle out of me. I’m just going to call it Twitter.)</p>

<h3 id="mastodon">Mastodon</h3>

<p>I’ve linked this account to Mastodon. I made a <a href="/software/2023/03/03/adding-mastodon-links-to-jekyll/">Jekyll plugin</a>
that handles posting for me, so everything is as automated as it was
before with Twitter. It’s even better, in fact, since I’m calling the Mastodon APIs directly and I don’t have to go through a third
party site like Bridgy.</p>

<p>It looks like <a href="https://brid.gy/about#rip-twitter">Bridgy no longer works with Twitter</a> anyway.</p>

<h3 id="dump-elon">Dump Elon</h3>

<p>As I said, I’m not leaving Twitter to start some kind of movement. I’m leaving Twitter for myself. I don’t want to be associated
with anything to do with Elon Musk, and now that includes Twitter.</p>

<p>I’ll never by a Tesla, either. I don’t think you can separate Telsa from Elon Musk. If you own a Tesla, you’re basically saying,
“I agree with everything Elon Musk says, and I support him.”</p>

<p>Elon Musk is a <a href="https://plus.thebulwark.com/p/elon-musk-the-bigot-in-full">bigot</a>,
a <a href="https://www.dailykos.com/stories/2023/11/27/2208277/-Is-this-Elon-Musk-s-most-racist-tweet-yet">racist</a>,
a <a href="https://www.independent.co.uk/news/world/americas/elon-musk-twitter-transgender-hate-speech-b2351923.html">homophobe</a>,
and an <a href="https://www.cnn.com/2023/11/17/business/elon-musk-reveals-his-actual-truth/index.html">anti-Semite</a>.</p>

<p>I don’t think he’s that smart, either. Some people believe he’s some sort of suer-genius, but that doesn’t square with <a href="https://www.vanityfair.com/news/2022/04/elon-musk-twitter-terrible-things-hes-said-and-done">all the stories
showing him to be a grade-A moron</a>.</p>

<p>He’s not even a good businessman. He’s made some of the worst business decisions in the history of capitalism.</p>

<p>Elon Musk seems to be good at one thing: he works hard, and he has the ability to drive the people who work under him to commit
to insane work schedules. That’s it. He’s basically a slave driver.</p>

<h3 id="narcissist">Narcissist</h3>

<p>Have you heard of <a href="https://en.wikipedia.org/wiki/Impostor_syndrome">Impostor Syndrome</a>? That’s when people think they’re not as good as
they actually are, and they don’t deserve the praise they get for the work they do. Musk is basically the opposite of that. He’s a
narcissist. He believes he’s the center of everything, that he can do and understand everything, and he deserves recognition for
everything he does.</p>

<table>
  <thead>
    <tr>
      <th>Officers</th>
      <th>Industrious</th>
      <th>Lazy</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Clever</td>
      <td>Appoint to<br />General Staff</td>
      <td>Appoint to<br />Highest Leadership</td>
    </tr>
    <tr>
      <td>Stupid</td>
      <td>DANGER</td>
      <td>Good for<br />Simple Tasks</td>
    </tr>
  </tbody>
</table>

<p>This chart comes from German General Kurt Von Hammerstein-Equord.</p>

<blockquote>
  <p>I divide my officers into four classes as follows: the clever, the industrious, the lazy, and the stupid. Each officer always possesses two of these qualities. Those who are clever and industrious I appoint to the General Staff. Use can, under certain circumstances, be made of those who are stupid and lazy. The man who is clever and lazy qualifies for the highest leadership posts. He has the requisite nerves and the mental clarity for difficult decisions. But whoever is stupid and industrious must be got rid of, for he is too dangerous.
(Von Hammerstein, 1933)</p>
</blockquote>

<blockquote>
  <p>You can use the brilliant but lazy man as a strategist, a brilliant but energetic man as a Chief of Staff, but God help you with a dumb but energetic man.
(Douglas MacArthur)</p>
</blockquote>

<p>Musk clearly belongs to the “Stupid but Industrious” category. The fact that he has a lot of money means he’s a danger to society.
Our best hope is that he someday attempts something so stupid that he kills himself. He’s <a href="https://en.wikipedia.org/wiki/Elon_Musk_vs._Mark_Zuckerberg">come close</a>
already, but he didn’t get called out (unlike how he was forced to go through on his purchase with Twitter).</p>

<p>Anyway, that’s enough armchair psychology on Elon Musk. I don’t think I’ve said anything that hasn’t already been said about him,
but it feels good to get off my chest.</p>]]></content><author><name>Rat Troupe</name><email>rattroupe@reiterate-app.com</email></author><category term="misc" /><category term="mastodon" /><summary type="html"><![CDATA[I’ve removed all Twitter links from my site.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blog.reiterate.app/public/images/2023/empty-birdcage.png" /><media:content medium="image" url="https://blog.reiterate.app/public/images/2023/empty-birdcage.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Restyling with Tailwind CSS</title><link href="https://blog.reiterate.app/software/2023/11/13/restyling-with-tailwind-css/" rel="alternate" type="text/html" title="Restyling with Tailwind CSS" /><published>2023-11-13T15:25:00-08:00</published><updated>2023-11-13T15:25:00-08:00</updated><id>https://blog.reiterate.app/software/2023/11/13/restyling-with-tailwind-css</id><content type="html" xml:base="https://blog.reiterate.app/software/2023/11/13/restyling-with-tailwind-css/"><![CDATA[<p>I’ve revamped the styling on the blog, completely replacing the old (and rather dated) theme with Tailwind CSS. That also meant
changing the build process to accomodate Tailwind.
<!--more--></p>

<div class="image-container mb-4"><img src="/public/images/2023/splashing-paint.png" width="120%" alt="Closeup of a paintbrush splashing colored paint blobs across a canvas" class="mx-auto" /></div>

<p>I’ve been wanting to update the blog for some time, and it’s finally complete. There’s a few little details that need
to be fixed, but it looks good enough to publish at this point.</p>

<p>The old blog was styled with an old Jekyll theme which was serviceable enough but looked dated when compared to the main
site, which I had redone with Tailwind CSS. Now the blog matches with some clean Tailwind of its own. Perhaps it’s a little
too stark at this point. Brutalilst, you might say. But I can spice it up at my leisure.</p>

<h3 id="how-to-integrate-tailwind-css-and-jekyll">How to integrate Tailwind CSS and Jekyll</h3>

<p>The blog is a complete system on its own, which is why it kept its own styling when I updated the main site. The blog is
a static website built by <a href="https://jekyllrb.com">Jekyll</a>. I liked Tailwind when I used it to update the main site, so I wanted
to use it again on the blog. When I researched how to integrate Tailwind and Jekyll, most of the solutions pointed to
<a href="https://postcss.org">PostCSS</a>. That’s a Node wrapper around a process to automate buiding CSS. You need the <code class="language-plaintext highlighter-rouge">jekyll-postcss</code> gem
to integrate PostCSS into Jekyll, and for that you need to install <code class="language-plaintext highlighter-rouge">npm</code>.</p>

<p><code class="language-plaintext highlighter-rouge">npm</code> is the Node Package Manger. It’s how most JavaSceipt-written pacakges are managed, but it’s had quite
 a few <a href="https://blog.checkpoint.com/securing-the-cloud/review-of-recent-npm-based-vulnerabilities/">security issues</a> recently.
And it’s huge and unwieldly. And I thought, why do I want to infect my whole blog system, which is designed to be as simple
as possible, with <code class="language-plaintext highlighter-rouge">npm</code>? So I wanted to do better.</p>

<p>I felt it should be possible to run Tailwind without adding a dependency to <code class="language-plaintext highlighter-rouge">npm</code>. As it turns out, you <em>can</em> do that.</p>

<h3 id="tailwind-standalone">Tailwind Standalone</h3>

<p>First, we need to get rid of <code class="language-plaintext highlighter-rouge">npm</code> in Tailwind. Tailwind is JavaScript, and normally installed through <code class="language-plaintext highlighter-rouge">npm</code>, but they have
a special <a href="https://tailwindcss.com/blog/standalone-cli">standalone package</a>
you can use without having to go through <code class="language-plaintext highlighter-rouge">npm</code>. It’s pretty easy to install. It’s just one file you can download anywhere.</p>

<h3 id="jekyll-integration">Jekyll Integration</h3>

<p>Next, I needed a plugin that would call Tailwind to render my CSS every time I rebuilt the site. That wasn’t too hard either.
I’ve posted the code <a href="https://gist.github.com/reiterate-app/fc8d766be5f200c80a5830409b31a45a">here on my GitHub</a>. To use it,
put that code in your <code class="language-plaintext highlighter-rouge">_plugins</code> directory.</p>

<p>Next, create <code class="language-plaintext highlighter-rouge">tailwind.config.js</code> in your blog root directory that should look something like this:</p>
<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cm">/** @type {import('tailwindcss').Config} */</span>
<span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="p">{</span>
  <span class="na">content</span><span class="p">:</span> <span class="p">[</span><span class="dl">"</span><span class="s2">./*.{html,js}</span><span class="dl">"</span><span class="p">,</span>
    <span class="dl">"</span><span class="s2">./_includes/**/*.{html,js}</span><span class="dl">"</span><span class="p">,</span>
    <span class="dl">"</span><span class="s2">./_layouts/**/*.{html,js}</span><span class="dl">"</span><span class="p">,</span>
    <span class="dl">"</span><span class="s2">./_posts/**/*.md</span><span class="dl">"</span><span class="p">,</span>
    <span class="dl">"</span><span class="s2">./_drafts/*.md</span><span class="dl">"</span><span class="p">,</span>
    <span class="dl">"</span><span class="s2">./public/js/*.js</span><span class="dl">"</span><span class="p">,</span>
    <span class="dl">"</span><span class="s2">./_plugins/*.rb</span><span class="dl">"</span>
  <span class="p">],</span>
  <span class="na">theme</span><span class="p">:</span> <span class="p">{</span>
    <span class="na">extend</span><span class="p">:</span> <span class="p">{},</span>
  <span class="p">},</span>
  <span class="na">plugins</span><span class="p">:</span> <span class="p">[</span>
    <span class="nx">require</span><span class="p">(</span><span class="dl">'</span><span class="s1">@tailwindcss/forms</span><span class="dl">'</span><span class="p">),</span>
    <span class="nx">require</span><span class="p">(</span><span class="dl">'</span><span class="s1">@tailwindcss/typography</span><span class="dl">'</span><span class="p">),</span>
    <span class="p">],</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Depending on your blog layout, you might want to adjust your <code class="language-plaintext highlighter-rouge">content</code> specification. These are all the directories where Tailwind
will look for you using its utility classes to build the css file.</p>

<p>Next, I created a jekyll plugin to call Tailwind whenever it generates the blog. It’s pretty simple, one short file which 
I have here as a gist: <a href="https://gist.github.com/reiterate-app/fc8d766be5f200c80a5830409b31a45a">Jekyll Tailind Plugin</a>.
Place that file in your <code class="language-plaintext highlighter-rouge">_plugins</code> directory.</p>

<p>To configure it, all you need to do is tell it where you downloaded the Tailwind binary that you downloaded. In your <code class="language-plaintext highlighter-rouge">_config</code>,
add a section like so:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">tailwind</span><span class="pi">:</span>
  <span class="na">script</span><span class="pi">:</span> <span class="s">/usr/local/bin/tailwindcss</span>
</code></pre></div></div>

<p>Of course you should substitute in the actual path of where your tailwindcss binary is.</p>

<p>That should do it! You can now use Tailwind to style your Jekyll blog, and you don’t need npm, yarn, or PostCSS. Of course,
now you have the real hard work ahead of you: having to strip out all of your old css styling and replacing it with Tailwind utility classes.
Have fun!</p>]]></content><author><name>Rat Troupe</name><email>rattroupe@reiterate-app.com</email></author><category term="software" /><summary type="html"><![CDATA[I’ve revamped the styling on the blog, completely replacing the old (and rather dated) theme with Tailwind CSS. That also meant changing the build process to accomodate Tailwind.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blog.reiterate.app/public/images/2023/splashing-paint.png" /><media:content medium="image" url="https://blog.reiterate.app/public/images/2023/splashing-paint.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Reiterate 1.6.0 release</title><link href="https://blog.reiterate.app/software/2023/09/26/reiterate-1-6-0-release/" rel="alternate" type="text/html" title="Reiterate 1.6.0 release" /><published>2023-09-26T14:23:00-07:00</published><updated>2023-09-26T14:23:00-07:00</updated><id>https://blog.reiterate.app/software/2023/09/26/reiterate-1-6-0-release</id><content type="html" xml:base="https://blog.reiterate.app/software/2023/09/26/reiterate-1-6-0-release/"><![CDATA[<p>Version 1.6.0 of Reiterate has been released and is now available.</p>

<!--more-->

<div class="image-container mb-4"><img src="/public/images/2023/reiterate-1.6.0-waves.png" width="120%" alt="An abstract representation of you audio clip reflected back and forth as a series of overlapping kaleidoscopic waves" class="mx-auto" /></div>

<p>Reiterate 1.6.0 has the following updates:</p>

<ul>
  <li><span class="uppercase text-xs py-0.5 px-1 rounded bg-emerald-700 text-stone-200">fixed</span> The Tag Board did not resize properly if you had more than one line of tags.</li>
  <li><span class="uppercase text-xs py-0.5 px-1 rounded bg-yellow-400 text-teal-900">new</span> Changing tags mid-session immediately updates the play list. (see below)</li>
  <li><span class="uppercase text-xs py-0.5 px-1 rounded bg-sky-500 text-yellow-200">improved</span> Cleaned up some alignment issues in the Settings Tab</li>
  <li><span class="uppercase text-xs py-0.5 px-1 rounded bg-sky-500 text-yellow-200">improved</span> Changes to the speech recognition to make Acknowledgement better</li>
  <li><span class="uppercase text-xs py-0.5 px-1 rounded bg-yellow-400 text-teal-900">new</span> Acknowledgement transcripts. Reiterate will display your speech as you acknowledge clips.</li>
  <li><span class="uppercase text-xs py-0.5 px-1 rounded bg-emerald-700 text-stone-200">fixed</span> Muting/unmuting clips background display</li>
  <li><span class="uppercase text-xs py-0.5 px-1 rounded bg-emerald-700 text-stone-200">fixed</span> Keyboard autohides when tapping other controls in Clip Details</li>
</ul>

<h2 id="mid-session-tag-updates">Mid-session tag updates</h2>

<p>The new tag feature enables a way to use Reiterate I find particularly useful. Imagine you have a problem remembering
to do one particular thing, but it doesn’t come up in every game. For example, say you have trouble remembering
to use item actives. You don’t buy an item with an active ability in every game, so you don’t want Reiterate to 
bug you about it all the time, but when you do buy an item with an active it would be nice if Reiterate focused on
that one issue.</p>

<p>Here is how you can use tags to accomplish this. Record a clip, name it “Item actives”, with an audio reminder that
says something like, “Remember to use your item active!” Next, create a new tag, call it “item”, and assign that tag
to your new clip. That clip is the only clip with the “item” tag.</p>

<p>In your Session view, you’ll see the item tag in the Tag Board. Tap it twice to disable it (so it displays a red slash
through the tag). That way, by default your “Item actives” clip will never play.</p>

<p>Now, while a session is playing, let’s imagine you buy an item with an active ability and you want to be reminded about
that. Tap the item tag in the Play tab Tag Board to enable it (so it’s colored). This will change your play list so
that only clips with that tag will play, and since that clip is the only one with that tag, Reiterate will play
that one clip over and over. Tap the tag again to resume your normal play list.</p>

<h2 id="new-acknowledgement-ui">New Acknowledgement UI</h2>

<div class="image-container mb-4"><img src="/public/images/2023/keep-the-river-warded.jpeg" width="50%" alt="Cropped screenshot of the Reiterate acknowledgement UI" class="mx-auto" /></div>

<p>The interface for Acknowledgement has been reworked. Now, when Reiterate is waiting for you to acknowledge a clip, you’ll see
a pulsing blue bar below the clip title. As you speak words, they will appear in the bar. This way you’ll know that Reiterate is
listening to you (or why it might not be acknowledging a clip).</p>

<p>Also, under Settings, there is a new Vocabulary section. Here you can add a list of words like “gank” that Reiterate might not
recognize because they’re too jargony.</p>

<p><a href="https://apps.apple.com/us/app/reiterate/id1327175207">Download Reiterate on the App Store</a> today!</p>]]></content><author><name>Rat Troupe</name><email>rattroupe@reiterate-app.com</email></author><category term="software" /><category term="reiterate" /><category term="release" /><summary type="html"><![CDATA[Version 1.6.0 of Reiterate has been released and is now available.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blog.reiterate.app/public/images/2023/reiterate-1.6.0-waves.png" /><media:content medium="image" url="https://blog.reiterate.app/public/images/2023/reiterate-1.6.0-waves.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Debian 12 Bookworm Upgrade Report</title><link href="https://blog.reiterate.app/software/2023/07/08/debian-12-bookworm-upgrade-report/" rel="alternate" type="text/html" title="Debian 12 Bookworm Upgrade Report" /><published>2023-07-08T09:50:00-07:00</published><updated>2023-07-08T09:50:00-07:00</updated><id>https://blog.reiterate.app/software/2023/07/08/debian-12-bookworm-upgrade-report</id><content type="html" xml:base="https://blog.reiterate.app/software/2023/07/08/debian-12-bookworm-upgrade-report/"><![CDATA[<p>I’ve updated the Reiterate server to the latest Debian release (bookworm). Here’s a report of everything I had to do.</p>

<!--more-->

<div class="image-container mb-4"><img src="/public/images/2023/bookworm.png" width="120%" alt="A giant worm made out of books" class="mx-auto" /></div>

<p>Overall, Debian 12 is a fantastic release, the latest in a string of excellent updates. I’ve been running this server
on Debian since Day One, and I’ve never regretted it.</p>

<p>As I’ve written before, <a href="/software/2023/04/16/using-ansible-to-deploy-new-servers/">I’m now using Ansible</a> to configure
and document my server setup. One of the reasons for that was so that I could upgrade my server cleanly. Typically, 
if you have a desktop running Debian, you’ll upgrade it using <code class="language-plaintext highlighter-rouge">apt-get dist-upgrade</code> which does the upgrade “in place,”
that is, you keep everything else in your system that isn’t part of the OS. That’s convenient and it’s the option most
people choose, but I like starting from scratch, for three reasons.</p>

<ol>
  <li>
    <p>It avoids the accumulation of cruft. When you keep upgrading in place over and over, it’s like painting your house
a different color every year, just slapping a new coat on top. It works for a while but eventually you need to strip
everything down to the bare wood and start fresh.</p>
  </li>
  <li>
    <p>It keeps me in touch with every part of my server. If I simply upgraded in place every could years, I’d forget
some of the details and wind up in a situation where I had certain files in the system and I didn’t know why. By rebuilding
from scratch I force myself to examine each and every part of the system.</p>
  </li>
  <li>
    <p>It documents my system setup. My Ansible playbook serves as a document of everything my system needs to run. I know
it is a complete and sufficient recipe because I can use it to rebuild the server from scratch.</p>
  </li>
</ol>

<p>However, upgrading is not as simple as replacing “debian11” with “debian12” in my playbook. There’s always a few details
that need to be fixed up, some things that don’t quite work the same way and need to be adjusted. Here’s a report of
everything I needed to clean up after my Debian 12 upgrade.</p>

<h2 id="python-interpreters-are-now-externally-managed">Python interpreters are now externally-managed</h2>

<p>In Debian 12, <a href="https://www.debian.org/releases/bookworm/amd64/release-notes/ch-information.en.html#python3-pep-668">you can no longer use pip to install packages system-wide</a>.
You have to create a virtual environment, and install the packages there. This makes sense from a system management
viewpoint, since you can easily break your system by installing packages into the global library space.</p>

<p>I was using pip to install <a href="https://isso-comments.de">isso</a>, which manages my blog comments. I already had an isso user
account, which I was using to keep things nice and neat, putting the comments database and config files in that
user directory. I didn’t really need to do that but I felt it was “best practice.” Now that I needed to install the
python modules outside of the system directories, having the account already set up seemed perspicacious.</p>

<p>First, I needed to get the proper packages installed to do the virtual environment installed. On the old Debian 11
install I was using <code class="language-plaintext highlighter-rouge">python-dev</code> but that failed with:</p>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Package python-dev is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another <span class="nb">source
</span>However the following packages replace it:
  python-dev-is-python3
</code></pre></div></div>

<p>That’s a very odd name for a package. I guess starting with Debian 12, python2 is officially deprecated and everything
is forced to be python3. This package just makes a link so that any script referring to <code class="language-plaintext highlighter-rouge">/usr/bin/python</code> gets <code class="language-plaintext highlighter-rouge">python3</code>.</p>

<p>The next error was</p>
<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>The virtual environment was not created successfully because ensurepip is not
available.  On Debian/Ubuntu systems, you need to <span class="nb">install </span>the python3-venv
package using the following command.

    apt <span class="nb">install </span>python3.11-venv
</code></pre></div></div>

<p>Which is the new package I needed to actually do the virtual environment install.</p>

<p>Next, I had issues with Ansible. Ansible is finicky about privilege escalation. I wanted to install this in my isso
directory as the isso user, but Ansible doesn’t like becoming users other than root. I tried every combination of
<code class="language-plaintext highlighter-rouge">become_user</code>, <code class="language-plaintext highlighter-rouge">become</code>, <code class="language-plaintext highlighter-rouge">ansible_become_user</code>, but I was unable to get Ansible to do this directly. I ended up
doing the venv install as root, and then <code class="language-plaintext highlighter-rouge">chown</code>-ing everything over to isso. It’s kind of hacky but it works
and I was too frustrated to try and find a cleaner solution.</p>

<h2 id="ruby">Ruby</h2>

<p>The main website is Rails-based, which requires Ruby of course. I happened to be on ruby version 3.1.3, which is
no longer supported anywhere, so I decided to upgrade to the current stable version 3.2.2. I use <code class="language-plaintext highlighter-rouge">rvm</code> to manage my
ruby installs, which… it works, but it seems like there hasn’t been a lot of development work on it lately? I checked
around and it doesn’t seem like there’s <em>any</em> good, well-supported ruby version managers out there right now.</p>

<p>Rvm doesn’t have any binaries pre-compiled (they’re behind on this, there’s some support for Debian 11. I offered to
help compile some binaries but never got a response back). I had to compile ruby from source, and that meant I had
to install some additional packages: <code class="language-plaintext highlighter-rouge">libyaml</code>, <code class="language-plaintext highlighter-rouge">libreadline</code>, and <code class="language-plaintext highlighter-rouge">libffi</code>. After all that, I successfully got the latest
ruby installed.</p>

<h2 id="puma">Puma</h2>

<p>Puma is the application server that sits between nginx and my Rails app. Trying to start up puma gave me an error:</p>
<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>libssl.so.1.1: cannot open shared object file: No such file or directory - /home/deploy/production/vendor/bundle/ruby/3.2.0/gems/puma-6.0.2/lib/puma/puma_http11.so
</code></pre></div></div>

<p>It took me a while to figure out, puma-6.0 has a dependency on libssl-1.1, which is no longer in Debian 12. The current
libssl is 3.0, so I needed up upgrade to puma-6.3 which has the proper libssl dependency.</p>

<h2 id="goaccess">Goaccess</h2>

<p>Goaccess is a small utility I use to parse my web logs and give me statistics. I was calling it with an
<code class="language-plaintext highlighter-rouge">ignore-referer</code> flag, but the version of goaccess in bookworm changed that to <code class="language-plaintext highlighter-rouge">ignore-referrer</code>. I had to
update my wrapper script which was erroring becuase of that.</p>

<p>That <a href="https://en.wikipedia.org/wiki/HTTP_referer">original misspelling</a> should be a warning to every standard
developer that details matter.</p>

<h2 id="fail2ban">Fail2ban</h2>

<p>I use [fail2ban] to block script kiddies. The new version in Debian 12 was now logging warnings:</p>
<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>WARNING <span class="s1">'allowipv6'</span> not defined <span class="k">in</span> <span class="s1">'Definition'</span><span class="nb">.</span> Using default one: <span class="s1">'auto'</span>
</code></pre></div></div>

<p>I fixed that by adding a section in  <code class="language-plaintext highlighter-rouge">/etc/fail2ban/fail2ban.d/local/conf</code></p>
<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">[</span>DEFAULT]
allowipv6 <span class="o">=</span> auto
</code></pre></div></div>

<h2 id="pam-sshd-user_readenv">PAM sshd user_readenv</h2>

<p>There’s a <a href="https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1018106">bug in the sshd PAM config</a> that was spamming
warnings in my log files that look like:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pam_env(sshd:session): deprecated reading of user environment enabled
</code></pre></div></div>

<p>Reading through the bug report, it seems harmless to fix it by removing the <code class="language-plaintext highlighter-rouge">user_readenv</code> flag in <code class="language-plaintext highlighter-rouge">/etc/pam.d/sshd</code>
so I did that.</p>

<h2 id="sudo-flag-file">sudo flag file</h2>

<p>Sudo is now adding a file <code class="language-plaintext highlighter-rouge">.sudo_as_admin_successful</code> in my home dir. Dotfile litter is one of my pet peeves, so I 
disabled this by adding a block into my sudoers.d config file:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># Disable ~/.sudo_as_admin_successful file
Defaults !admin_flag
</code></pre></div></div>

<p>And that was everything! Well, everything Debian-related. The server has been up and running on Debian 12 for
several days now and I’m not seeing any new errors or warnings. Thanks again to everyone on the Debian team
for putting out quality releases!</p>]]></content><author><name>Rat Troupe</name><email>rattroupe@reiterate-app.com</email></author><category term="software" /><category term="debian" /><category term="linux" /><category term="rails" /><summary type="html"><![CDATA[I’ve updated the Reiterate server to the latest Debian release (bookworm). Here’s a report of everything I had to do.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blog.reiterate.app/public/images/2023/bookworm.png" /><media:content medium="image" url="https://blog.reiterate.app/public/images/2023/bookworm.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Communion Fatigue</title><link href="https://blog.reiterate.app/personal%20development/2023/06/05/communion-fatigue/" rel="alternate" type="text/html" title="Communion Fatigue" /><published>2023-06-05T13:52:00-07:00</published><updated>2023-06-05T13:52:00-07:00</updated><id>https://blog.reiterate.app/personal%20development/2023/06/05/communion-fatigue</id><content type="html" xml:base="https://blog.reiterate.app/personal%20development/2023/06/05/communion-fatigue/"><![CDATA[<p>It’s common sense to take a break every so often to rest your wrists between game sessions. But have you ever considered the importance of resting your resilience?</p>

<!--more-->

<div class="image-container mb-4"><img src="/public/images/2023/communion-fatigue.png" width="120%" alt="A figure made of yarn struggles to make it through an urban forest of tangles" class="mx-auto" /></div>

<p>In my previous articles, I delved into how some of the most common debates in the League of Legends community can be reframed through the lens of <a href="/tag/communion">communion skills</a>:</p>
<ul>
  <li><a href="/personal%20development/2022/05/18/mute-all-is-locked-camera/">Should you mute chat or not?</a> 
The question of whether to mute chat or not can be seen as a test of your ability to manage your teammates’ morale, a highly advanced communion skill that requires exceptional effort.</li>
  <li><a href="/personal%20development/2022/07/23/when-to-surrender/">When should you surrender?</a> 
Instead of trying to evaluate the game state and
looking at this as a winnability question, look at it in terms of the communion skills you need to get your team’s
mentality to a place where they can play optimally.</li>
</ul>

<p>Playing effective League of Legends involves executing your communion skills to the best of your ability. You can’t do this 
if you’ve exhaused your resilience reserves. Every time a teammates question mark-pings you, or rages in all chat,
or makes a poor play off tilt, it drains your emotional energy and depletes your mental resources. Once your reserves are completely exhausted, your mental state suffers a catastrophic blow. This is what is commonly referred to as “mental boom”.</p>

<p>Resilience levels vary from person to person. I believe that fortitude can be developed and expanded through practice, allowing you to shoulder greater emotional burdens.  However, there’s no shame in acknowledging when your emotional reserves are running low. In fact, recognizing this is a valuable skill in itself. When you sense that you can no longer tolerate the disruptive behavior of your teammates, it’s time to take a break. Allow yourself to recharge and refresh, so that you can return to the game stronger and more focused in the next session.</p>]]></content><author><name>Rat Troupe</name><email>rattroupe@reiterate-app.com</email></author><category term="personal development" /><category term="esports" /><category term="communion" /><category term="psychology" /><summary type="html"><![CDATA[It’s common sense to take a break every so often to rest your wrists between game sessions. But have you ever considered the importance of resting your resilience?]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blog.reiterate.app/public/images/2023/communion-fatigue.png" /><media:content medium="image" url="https://blog.reiterate.app/public/images/2023/communion-fatigue.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">How to Be Less Bad</title><link href="https://blog.reiterate.app/personal%20development/2023/05/26/how-to-be-less-bad/" rel="alternate" type="text/html" title="How to Be Less Bad" /><published>2023-05-26T15:48:00-07:00</published><updated>2023-05-26T15:48:00-07:00</updated><id>https://blog.reiterate.app/personal%20development/2023/05/26/how-to-be-less-bad</id><content type="html" xml:base="https://blog.reiterate.app/personal%20development/2023/05/26/how-to-be-less-bad/"><![CDATA[<p>Many people feel stuck when they ask themselves, “How can I improve?” A better question to ask might be,
“How can I be less bad?”</p>

<!--more-->

<div class="image-container mb-4"><img src="/public/images/2023/being-less-bad.png" width="120%" alt="A lonely figure stands in the rain at a crossroads" class="mx-auto" /></div>

<p>In the world of esports, self-improvement advice is everywhere. Gamers seeking to level up are bombarded with Reddit boards, coaches, videos, paid communities, and training camps. It’s a never-ending cascade of tips and suggestions that can easily drown out the truly useful information.</p>

<p>Here’s a different approach: instead of focusing on what skills and techniques to acquire, try zeroing in on your weaknesses.</p>

<p>Identifying what you’re doing wrong can be simpler than discovering what you need to do right. The “right” way is often unknown territory, requiring input from coaches and fellow players, followed by a daunting task of sifting through the noise.</p>

<p>In contrast, pinpointing your errors is more straightforward. By reviewing your own games and analyzing each time you died, you can ask yourself, “Why did that happen?”. More often than not, your mistakes will be glaringly apparent. Whether you overextended, miscounted enemy players, or missed a skill shot, closely examining your own games will reveal a treasure trove of shortcomings to address.</p>

<p>The next step? Stop making those mistakes.</p>

<p>Eliminating bad habits is akin to subtracting negatives. The fewer errors you make, the more your overall gameplay will improve. As you consistently eradicate mistakes, your skills will naturally progress.</p>

<p>To streamline this process, try using Reiterate. Transform each blunder into an audio clip and, if desired, turn each negative into a positive. For example, if you are dying because you don’t track the enemy numbers in a team fight,
you can make a clip like, “I will always count the number of enemies before committing to a team fight.”</p>

<p>Once you find you are no longer exhibiting the negative behavior, you can retire the clip. And that’s how you improve
by being less bad.</p>]]></content><author><name>Rat Troupe</name><email>rattroupe@reiterate-app.com</email></author><category term="personal development" /><category term="esports" /><category term="psychology" /><category term="reiterate" /><summary type="html"><![CDATA[Many people feel stuck when they ask themselves, “How can I improve?” A better question to ask might be, “How can I be less bad?”]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blog.reiterate.app/public/images/2023/being-less-bad.png" /><media:content medium="image" url="https://blog.reiterate.app/public/images/2023/being-less-bad.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Reiterate 1.5.1 Release</title><link href="https://blog.reiterate.app/software/2023/05/19/reiterate-1-5-1-release/" rel="alternate" type="text/html" title="Reiterate 1.5.1 Release" /><published>2023-05-19T15:32:00-07:00</published><updated>2023-05-19T15:32:00-07:00</updated><id>https://blog.reiterate.app/software/2023/05/19/reiterate-1-5-1-release</id><content type="html" xml:base="https://blog.reiterate.app/software/2023/05/19/reiterate-1-5-1-release/"><![CDATA[<p>Reiterate version 1.5.1 is now available on the App Store!</p>

<!--more-->

<div class="image-container mb-4"><img src="/public/images/2023/reiterate-151-screenshot.jpeg" width="120%" alt="Reiterate version 1.5.1 screenshot" class="mx-auto" /></div>

<p>It’s been a while since the last official release (1.4.3). I’ve been hard at work adding new features and fixing bugs.
Here’s a quick summary of all the new enhancements you’ll see.</p>

<h1 id="bug-fixes">Bug Fixes</h1>

<ul>
  <li>Crashes
    <ul>
      <li><span class="uppercase text-xs py-0.5 px-1 rounded bg-emerald-700 text-stone-200">fixed</span> If a phone call came in while you were playing a session, it could crash.</li>
      <li><span class="uppercase text-xs py-0.5 px-1 rounded bg-emerald-700 text-stone-200">fixed</span> Trying to create a new clip while a sesion way playing would crash.</li>
      <li><span class="uppercase text-xs py-0.5 px-1 rounded bg-sky-500 text-yellow-200">improved</span> Updated all concurrency code to the modern Swift concurrency system.</li>
      <li><span class="uppercase text-xs py-0.5 px-1 rounded bg-emerald-700 text-stone-200">fixed</span> You could delete the “add new tag” row.</li>
    </ul>
  </li>
  <li>Acknowledgement System
    <ul>
      <li><span class="uppercase text-xs py-0.5 px-1 rounded bg-sky-500 text-yellow-200">improved</span> The background threading system is more robust.</li>
      <li><span class="uppercase text-xs py-0.5 px-1 rounded bg-sky-500 text-yellow-200">improved</span> Adjusted (increased) the time to acknowledge a clip.</li>
      <li><span class="uppercase text-xs py-0.5 px-1 rounded bg-sky-500 text-yellow-200">improved</span> Speech recognition is more robust.</li>
      <li><span class="uppercase text-xs py-0.5 px-1 rounded bg-emerald-700 text-stone-200">fixed</span> If you miss several clips in a row, it won’t spam buzzers at you.</li>
      <li><span class="uppercase text-xs py-0.5 px-1 rounded bg-sky-500 text-yellow-200">improved</span> Contractions are properly recognized.</li>
      <li><span class="uppercase text-xs py-0.5 px-1 rounded bg-sky-500 text-yellow-200">improved</span> The little check and x-marks are now consistent with the standard symbols font.</li>
      <li><span class="uppercase text-xs py-0.5 px-1 rounded bg-sky-500 text-yellow-200">improved</span> The animation that plays while a clip is awaiting acknowledgement is spiffier.</li>
    </ul>
  </li>
  <li>Tags
    <ul>
      <li><span class="uppercase text-xs py-0.5 px-1 rounded bg-sky-500 text-yellow-200">improved</span> The Tagboard on the Play tab will only show tags that are relevant to your current session.</li>
      <li><span class="uppercase text-xs py-0.5 px-1 rounded bg-emerald-700 text-stone-200">fixed</span> If you have no tags, the tag board will be hidden on the Play tab.</li>
      <li><span class="uppercase text-xs py-0.5 px-1 rounded bg-emerald-700 text-stone-200">fixed</span> Newly added tags would not be added to a newly added clip.</li>
      <li><span class="uppercase text-xs py-0.5 px-1 rounded bg-emerald-700 text-stone-200">fixed</span> Newly added tags appear properly on the Tag Board.</li>
      <li><span class="uppercase text-xs py-0.5 px-1 rounded bg-sky-500 text-yellow-200">improved</span> Lines of tags are center-aligned.</li>
      <li><span class="uppercase text-xs py-0.5 px-1 rounded bg-emerald-700 text-stone-200">fixed</span> You can no longer create empty (nameless) tags.</li>
    </ul>
  </li>
  <li>Clip Details
    <ul>
      <li><span class="uppercase text-xs py-0.5 px-1 rounded bg-sky-500 text-yellow-200">improved</span> Reworked how clip details are edited. Instead of in-place in the Clips view, there is a whole separate page that pops up.</li>
      <li><span class="uppercase text-xs py-0.5 px-1 rounded bg-yellow-400 text-teal-900">new</span> There’s a new icon at the left of every clip that graphically shows what kind of clip it is, and when it plays.</li>
      <li><span class="uppercase text-xs py-0.5 px-1 rounded bg-yellow-400 text-teal-900">new</span> Tap the new clip timing icon to select it (with a check mark). When multiple clips are selected you can mute, delete, and tag them in a batch.</li>
      <li><span class="uppercase text-xs py-0.5 px-1 rounded bg-sky-500 text-yellow-200">improved</span> You can cancel tag edits.</li>
      <li><span class="uppercase text-xs py-0.5 px-1 rounded bg-yellow-400 text-teal-900">new</span> Purchased content is labelled as such.</li>
      <li><span class="uppercase text-xs py-0.5 px-1 rounded bg-yellow-400 text-teal-900">new</span> All clip edits can be cancelled.</li>
      <li><span class="uppercase text-xs py-0.5 px-1 rounded bg-emerald-700 text-stone-200">fixed</span> Clips with a colon in the title couldn’t record audio.</li>
      <li><span class="uppercase text-xs py-0.5 px-1 rounded bg-sky-500 text-yellow-200">improved</span> The VU meter has a nicer animation when recording.</li>
      <li><span class="uppercase text-xs py-0.5 px-1 rounded bg-emerald-700 text-stone-200">fixed</span> Cancelling out of Clip Details while recording would crash on next attempt to record.</li>
    </ul>
  </li>
  <li>Session Sidebar menu
    <ul>
      <li><span class="uppercase text-xs py-0.5 px-1 rounded bg-yellow-400 text-teal-900">new</span> Tap the hamburger button to bring up the sidebar. From the sidebar you can switch your current session, edit and delete sessions, bring up the user guide, and more!</li>
    </ul>
  </li>
  <li>Play tab
    <ul>
      <li><span class="uppercase text-xs py-0.5 px-1 rounded bg-sky-500 text-yellow-200">improved</span> The StartSession button is now consistent with standard iOS UI.</li>
      <li><span class="uppercase text-xs py-0.5 px-1 rounded bg-sky-500 text-yellow-200">improved</span> Landscape more UI adjustments.</li>
      <li><span class="uppercase text-xs py-0.5 px-1 rounded bg-sky-500 text-yellow-200">improved</span> Starting a session no longer has a little lag at the very start.</li>
    </ul>
  </li>
  <li>Settings
    <ul>
      <li><span class="uppercase text-xs py-0.5 px-1 rounded bg-emerald-700 text-stone-200">fixed</span> Tapping the Clip Interval in Settings, without changing anything, would leave it in an inconsistent state.</li>
      <li><span class="uppercase text-xs py-0.5 px-1 rounded bg-yellow-400 text-teal-900">new</span> You can set an alert cue to fire after missing (acknowledging) a clip. This is a great way to use alert cues, because they only play when you’re starting to zone out.</li>
    </ul>
  </li>
</ul>

<p><a href="https://apps.apple.com/us/app/reiterate/id1327175207">Download the latest version of Reiterate on the App Store</a></p>]]></content><author><name>Rat Troupe</name><email>rattroupe@reiterate-app.com</email></author><category term="software" /><category term="reiterate" /><category term="release" /><summary type="html"><![CDATA[Reiterate version 1.5.1 is now available on the App Store!]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blog.reiterate.app/public/images/2023/reiterate-151-screenshot.jpeg" /><media:content medium="image" url="https://blog.reiterate.app/public/images/2023/reiterate-151-screenshot.jpeg" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>