<?xml version="1.0" encoding="utf-8" standalone="yes"?><?xml-stylesheet href="/https/plug-world.com/rss.xsl" type="text/xsl"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Home on PlugWorld</title><link>https://plug-world.com/</link><description>Recent content in Home on PlugWorld</description><generator>Hugo -- gohugo.io</generator><language>en-US</language><lastBuildDate>Tue, 09 Dec 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://plug-world.com/index.xml" rel="self" type="application/rss+xml"/><item><title>Fixing Nvidia Hardware Transcoding in Plex Docker Container</title><link>https://plug-world.com/posts/2025/fixing-nvidia-hardware-transcoding-in-plex-docker-container/</link><pubDate>Tue, 09 Dec 2025 00:00:00 +0000</pubDate><guid>https://plug-world.com/posts/2025/fixing-nvidia-hardware-transcoding-in-plex-docker-container/</guid><description>&lt;p&gt;Recently, I&amp;rsquo;ve been having major issues with hardware accelerated transcoding in Plex. It seems that no matter what I did, despite Plex seeing the Nvidia card, it refused to use it for transcoding.&lt;/p&gt;
&lt;p&gt;Heading to the logs only further demonstrated that this was an issue.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker &lt;span style="color:#658b00"&gt;exec&lt;/span&gt; -it plex bash -c &lt;span style="color:#cd5555"&gt;&amp;#34;grep -i &amp;#39;hw&amp;#39; /config/Library/Application\ Support/Plex\ Media\ Server/Logs/Plex\ Media\ Serv
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cd5555"&gt;er.log | tail -20&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Dec 05, &lt;span style="color:#b452cd"&gt;2025&lt;/span&gt; 16:07:41.643 [140280869260088] DEBUG - [Req#588/Transcode] Codecs: testing hevc (decoder) with hwdevice nvdec
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Dec 05, &lt;span style="color:#b452cd"&gt;2025&lt;/span&gt; 16:07:41.644 [140280869260088] DEBUG - [Req#588/Transcode] Codecs: hardware transcoding: opening hw device failed - probably not supported by this system, error: Operation not permitted
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;At least now I can confirm that it&amp;rsquo;s &lt;em&gt;attempting&lt;/em&gt; to use nvdec hardware transcoding.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Recently, I&rsquo;ve been having major issues with hardware accelerated transcoding in Plex. It seems that no matter what I did, despite Plex seeing the Nvidia card, it refused to use it for transcoding.</p>
<p>Heading to the logs only further demonstrated that this was an issue.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>docker <span style="color:#658b00">exec</span> -it plex bash -c <span style="color:#cd5555">&#34;grep -i &#39;hw&#39; /config/Library/Application\ Support/Plex\ Media\ Server/Logs/Plex\ Media\ Serv  
</span></span></span><span style="display:flex;"><span><span style="color:#cd5555">er.log | tail -20&#34;</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>Dec 05, <span style="color:#b452cd">2025</span> 16:07:41.643 [140280869260088] DEBUG - [Req#588/Transcode] Codecs: testing hevc (decoder) with hwdevice nvdec
</span></span><span style="display:flex;"><span>Dec 05, <span style="color:#b452cd">2025</span> 16:07:41.644 [140280869260088] DEBUG - [Req#588/Transcode] Codecs: hardware transcoding: opening hw device failed - probably not supported by this system, error: Operation not permitted
</span></span></code></pre></div><p>At least now I can confirm that it&rsquo;s <em>attempting</em> to use nvdec hardware transcoding.</p>
<p>A recent update of Nvidia Container Toolkit v1.18, <a href="https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/release-notes.html#nvidia-container-toolkit-1-18-0">changed the default mode</a> the runtime injection from &ldquo;legacy&rdquo; to &ldquo;just-in-time-generated CDI.&rdquo; This seemed to have caused some containers (including many Plex setups) that relied on legacy behavior to stop seeing usable NVIDIA libraries/devices inside the container.</p>
<h1 id="the-solution">The Solution</h1>
<p>Add the following entry into your environment variables in your Plex docker container:
<code>LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/nvidia/current</code></p>
<p>Now Nvidia hardware accelerated transcoding should work! 🎉</p>
<p>Big thank you to this <a href="https://www.reddit.com/r/PleX/comments/1otr19k/hardware_transcoding_that_no_longer_works_nvidia/">Reddit post</a> that helped me find the solution.</p>
]]></content:encoded></item><item><title>Releasing My First Udemy Course</title><link>https://plug-world.com/posts/releasing-my-first-udemy-course/</link><pubDate>Thu, 14 Sep 2023 22:09:57 -0600</pubDate><guid>https://plug-world.com/posts/releasing-my-first-udemy-course/</guid><description>&lt;div style="width: 100%"&gt;
&lt;div style="position: relative; padding-bottom: 56.15%; height: 0; overflow: hidden; margin-bottom: 20px;"&gt;
&lt;iframe
style="position: absolute; top: 0; left:0; width: 100%; height: 100%; border: 0;"
loading="lazy";
srcdoc="&lt;style&gt;
* {
padding: 0;
margin: 0;
overflow: hidden;
}
body, html {
height: 100%;
}
img, svg {
position: absolute;
width: 100%;
top: 0;
bottom: 0;
margin: auto;
}
svg {
filter: drop-shadow(1px 1px 10px hsl(206.5, 70.7%, 8%));
transition: all 250ms ease-in-out;
}
body:hover svg {
filter: drop-shadow(1px 1px 10px hsl(206.5, 0%, 10%));
transform: scale(1.2);
}
&lt;/style&gt;
&lt;a href='https://www.youtube.com/embed/xS2msIpSxI0?autoplay=1'&gt;
&lt;img src='https://img.youtube.com/vi/xS2msIpSxI0/hqdefault.jpg'&gt;
&lt;svg xmlns='http://www.w3.org/2000/svg' width='64' height='64' viewBox='0 0 24 24' fill='none' stroke='#ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-play-circle'&gt;&lt;circle cx='12' cy='12' r='10'&gt;&lt;/circle&gt;&lt;polygon points='10 8 16 12 10 16 10 8'&gt;&lt;/polygon&gt;&lt;/svg&gt;
&lt;/a&gt;
"
src="https://www.youtube.com/embed/xS2msIpSxI0"
title=""
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen&gt;
&lt;/iframe&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Welp, I finally did it!
I released my first Udemy course.
And oh boy!
I&amp;rsquo;ve learned a lot along the way.
Lots of things that I wish I knew beforehand.&lt;/p&gt;</description><content:encoded><![CDATA[

<div style="width: 100%">
<div style="position: relative; padding-bottom: 56.15%; height: 0; overflow: hidden; margin-bottom: 20px;">
  <iframe 
    style="position: absolute; top: 0; left:0; width: 100%; height: 100%; border: 0;"
    loading="lazy";
    srcdoc="<style>
      * {
      padding: 0;
      margin: 0;
      overflow: hidden;
      }
      body, html {
        height: 100%;
      }
      img, svg {
        position: absolute;
        width: 100%;
        top: 0;
        bottom: 0;
        margin: auto;
      }
      svg {
        filter: drop-shadow(1px 1px 10px hsl(206.5, 70.7%, 8%));
        transition: all 250ms ease-in-out;
      }
      body:hover svg {
        filter: drop-shadow(1px 1px 10px hsl(206.5, 0%, 10%));
        transform: scale(1.2);
      }
    </style>
    <a href='https://www.youtube.com/embed/xS2msIpSxI0?autoplay=1'>
      <img src='https://img.youtube.com/vi/xS2msIpSxI0/hqdefault.jpg'>
      <svg xmlns='http://www.w3.org/2000/svg' width='64' height='64' viewBox='0 0 24 24' fill='none' stroke='#ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-play-circle'><circle cx='12' cy='12' r='10'></circle><polygon points='10 8 16 12 10 16 10 8'></polygon></svg>
    </a>
    "
    src="https://www.youtube.com/embed/xS2msIpSxI0" 
    title=""
    frameborder="0"
    allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" 
    allowfullscreen>
  </iframe>
</div>
</div>


<p>Welp, I finally did it!
I released my first Udemy course.
And oh boy!
I&rsquo;ve learned a lot along the way.
Lots of things that I wish I knew beforehand.</p>
<p>This course teaches beginners how to make video games using the <a href="https://godotengine.org/">Godot game engine</a>.
At the end of the course users have a fully featured game based on the Atari 2600 game SeaQuest.</p>
<p>If this course looks interesting to you, you can pick it up at <a href="https://www.udemy.com/course/godot-4-retro-remake-design-and-code-a-seaquest-remake/?referralCode=6FC6E1CF43EC009526FA">Udemy here</a>.</p>
<p>Anyways, lets get into the juicy stuff.
If you haven&rsquo;t read my <a href="/https/plug-world.com/posts/seadefender">last post about making this game</a> I recommend you read it.</p>
<hr>
<h1 id="what-i-learned">What I Learned</h1>
<h2 id="1-rebuilding-the-game">1. Rebuilding the Game</h2>





<video autoplay loop muted playsinline controls>


<source src=https://plug-world.com/videos/seadefender/sea-quest-remake-animation-vp9.webm type='video/webm;codecs="vp9,opus"'>


Your browser does not support the video tag.
</video>

<p>This course builds upon the foundations of the previous game I made.
When I started the project, I already had the game made that I wanted to recreate for the course.
The only problem was that the game was a mess.
It needed to be recreated from the ground up to be made simplier for new users.</p>
<p>So I went to work remaking the game once again from the ground up.
Making sure to take simple design approaches and follow Godot&rsquo;s best practices.
This ended up taking quite a bit of time.
And by doing so I was sacrificing the time I could have spent making videos, continuing work on the project.</p>
<p>But ultimately what I learned was that <strong>remaking the entire project prior to recording didn&rsquo;t need to happen.</strong>
Once I began recording videos for the course I found myself still having to make many changes to the project or deviating from the project.</p>
<p>This led to three projects.</p>
<ol>
<li>✅ Fully remade finished course project</li>
<li>🎥 The actual course project (the one I&rsquo;m recording)</li>
<li>📝 The planning course project (based on the course I&rsquo;m recording)</li>
</ol>
<p>So I would take bits and pieces of code from the fully remade course project and put them into the planning course project.
As I&rsquo;m doing so, I&rsquo;m taking notes on what I am doing so I can make the next course video.</p>
<p>This is great until I realized the planning course project is drastically different than the one I intended to be the completed fully remade course project.
At this point I realized it was <strong>a waste of time remaking the entire game prior to recording.</strong></p>
<p>Gamedev is not linear.
Each stage of the project code gets moved, refactored, and game elements tend to change overtime.
This makes it extremely difficult to plan everything in advance.
I made the mistake of overly trying to plan;
instead I should&rsquo;ve just been planning each video individually rather than the whole course.</p>
<p>This takes us to the next thing I learned.</p>
<h2 id="2-planning">2. Planning</h2>
<p>Let me make this clear.
The way you take notes doesn&rsquo;t matter.
You just gotta find what works best for you.
Too many get lost in the abundance of tools and apps out there.
Just find something simple and stick to it, don&rsquo;t make things harder for yourself.</p>
<p>When I started planning this course, I began by writing my notes on paper.
This worked great in the beginning, but it started to become a bottleneck in my process.</p>
<p>I then transitioned to <a href="https://obsidian.md/">Obsidian</a>.
And synced my notes across devices with <a href="https://syncthing.net/">Syncthing</a>.
That way I can easily access my notes on my phone, desktop, and recording computer.</p>
<p>



<figure>
  

  
    
    
  

  
  

  <a href="course-notes-overview.png">
    <picture>
      <source srcset="/posts/releasing-my-first-udemy-course/course-notes-overview_hu_2eb1dc4566f9fb5f.webp" type="image/webp">
      <img src="/https/plug-world.com/posts/releasing-my-first-udemy-course/course-notes-overview_hu_8fdcd4c47845b436.png" alt="course notes overview" loading="lazy" decoding="async" />
    </picture>
  </a>
  
</figure>

</p>
<p>I found this setup to work great for my needs.
I made a Course Overview page that contains a checklist of all the things that need to be implemented.
Each of these things link back to their own page with instructions that I can follow when making videos.</p>
<p>



<figure>
  

  
    
    
  

  
  

  <a href="course-note-example.png">
    <picture>
      <source srcset="/posts/releasing-my-first-udemy-course/course-note-example_hu_d7a4e26720a81cc5.webp" type="image/webp">
      <img src="/https/plug-world.com/posts/releasing-my-first-udemy-course/course-note-example_hu_aabe9e93bcadfbb9.png" alt="course note example" loading="lazy" decoding="async" />
    </picture>
  </a>
  
</figure>

</p>
<p>These notes were extremely useful to me when recording.
It helped to keep me on track and ensure I remember to discuss everything needed.</p>
<h2 id="3-recordingediting-workflow">3. Recording/Editing Workflow</h2>
<p>This was my process&hellip;</p>
<ol>
<li>📝 Plan video</li>
<li>🎥 Record</li>
<li>🖥️ Edit</li>
<li>🔄 Repeat</li>
</ol>
<p>I mean this worked great at the beginning.</p>
<p>But we all know procrastination a little too well.
The problem was that once I finished editing, I would plan the next video and put off recording it.
Cause recording videos kinda isn&rsquo;t my favorite thing.
And I would end up wasting quite a bit of time doing anything else but recording.</p>
<p>So here&rsquo;s the better strategy I found&hellip;</p>
<p>Plan out like three or four videos, and record as many as possible in one session.
That way I can bulk edit and waste less time procrastinating the next video I need to record.
It also gave me a greater sense of accomplishment.
I felt like I was getting much more done which helped to motivate me even more.</p>
<h2 id="4-consider-time">4. Consider Time</h2>
<p>Things always took longer than I thought they would.
I would go into a video thinking it would only be 10 minutes to record.
Nope!
1 hour later, I was actually done recording.</p>
<p>It&rsquo;s difficult to take into account the time it takes to teach.
Even if what I&rsquo;m implementing is really small, sometimes teaching it takes way longer than expected.</p>
<p>I expected this course to only take a few months to complete.
It took 6 months just to record and edit all the videos.
That doesn&rsquo;t take into account the time it took to remake the project.
I probably could&rsquo;ve had it done sooner, but y&rsquo;all know life gets busy.</p>
<h2 id="5-course-promotion">5. Course Promotion</h2>
<p>I created a <a href="https://courses.plug-world.com/seadefender">landing page</a> for the course.
Cause Udemy is lame and your course needs to be public for people to see the landing page.</p>
<p>Now what I could&rsquo;ve done was upload an unfinished course, promote that, and continue to update it till I was finished.
But I didn&rsquo;t like the idea of selling this unfinished course to people.</p>
<p>So wait?
What&rsquo;s the point of the landing page?
Well I wanted to promote the course before it released.
Annnd there&rsquo;s no reason to promote it, if I can&rsquo;t send people somewhere where they can find the course.</p>
<p>



<figure>
  

  
    
    
  

  
  

  <a href="email-form.png">
    <picture>
      <source srcset="/posts/releasing-my-first-udemy-course/email-form_hu_36c2e0ad477b571a.webp" type="image/webp">
      <img src="/https/plug-world.com/posts/releasing-my-first-udemy-course/email-form_hu_cba961e7480f9112.png" alt="email form" loading="lazy" decoding="async" />
    </picture>
  </a>
  
</figure>

</p>
<p>So I threw up a landing page with an email list.
Now people that are interested in the course can drop their email and be notified when it finally drops.
Most people probably hate signing up for email lists, I mean I do too!
So I tried to sweeten the deal by offering exclusive course sales to those that are email list members.</p>
<p>This is also great cause those that are unsure if they want the course or are looking for a better deal.
They can just drop their email, and sometime in the future they&rsquo;ll be notified and they can make the decision if they still want the course.</p>
<p>With this all setup and going, I created one <a href="https://www.youtube.com/watch?v=GZrALMvOwY8">promo video</a> for the course.
The target audience is beginner Godot 4 users.
Rather than directly advertising the course, I made a video solving a simple problem many beginners have.
I showed them how to make a simple level switching system in their games and at the very end I promoted the course.</p>
<p>From this video alone I believe I got 3 email subscribers initially.
Currently I have 7, which probably doesn&rsquo;t sound great.
But keep in mind that these only came from that first <a href="https://www.youtube.com/watch?v=GZrALMvOwY8">promo tutorial</a>, and my <a href="https://www.youtube.com/watch?v=xS2msIpSxI0">course trailer</a> video.
If I created more promo content that showcases the email list I believe that would increase this.</p>
<p>In the end I still believe it&rsquo;s worth while doing the email list.
It just could&rsquo;ve been more effective if I did more promo.
For those that are interested I used <a href="https://buttondown.email/">buttondown.email</a> to handle my email list.
I&rsquo;ve been very pleased with the service so far.</p>
<hr>
<h1 id="course-performance">Course Performance</h1>
<p>Let&rsquo;s get into them stats.
Now as I am writing this, the course has only been out for just over a week.
So it&rsquo;s <em>a little early</em> to be looking at course performance.</p>
<p>



<figure>
  

  
    
    
  

  
  

  <a href="course-performance.png">
    <picture>
      <source srcset="/posts/releasing-my-first-udemy-course/course-performance_hu_750cf452cd25aff2.webp" type="image/webp">
      <img src="/https/plug-world.com/posts/releasing-my-first-udemy-course/course-performance_hu_3b3b3dafacfc6d4e.png" alt="course performance" loading="lazy" decoding="async" />
    </picture>
  </a>
  
</figure>

</p>
<p>Most of my visitors came on the second day.
This was when I released my course trailer video and it led to 10 students enrolled.
I also got a few more people on the email list.</p>
<p>



<figure>
  

  
    
    
  

  
  

  <a href="traffic-and-conversion.png">
    <picture>
      <source srcset="/posts/releasing-my-first-udemy-course/traffic-and-conversion_hu_4c4f0ddb3cab212c.webp" type="image/webp">
      <img src="/https/plug-world.com/posts/releasing-my-first-udemy-course/traffic-and-conversion_hu_ce402d9c03e91298.png" alt="traffic and conversion" loading="lazy" decoding="async" />
    </picture>
  </a>
  
</figure>

</p>
<p>For the first few days most of my page visitors came from my own promotions and links.
Now that I haven&rsquo;t really done any additional promotions, most of my visitors are coming from Udemy search.</p>
<p>I believe that for the first week the course has sold pretty well.
It&rsquo;ll be interesting to see if the course improves once it gets reviews.</p>
<p>I&rsquo;ve learned that it&rsquo;s better to sell the course through your own promotions and conversion that way you get most of the cut.
By using a <strong>referral link</strong> I was able to get most of the money when someone buys the course.
However, when Udemy promotes the course and someone buys it, Udemy will take a large cut around 50%.
So it&rsquo;s important to use <strong>referrals</strong> whenever you can.</p>
<p>Also pricing in Udemy is kinda wacky.
When I created the course I set the price to $59.99.
But once it released Udemy was selling it on sale from $20 to $14.99.
I thought I did something wrong, but nope, this is how it works.
The price that I set to $59.99 is just a backup price.
Most of the time Udemy is going to automatically try to find the best price of the course that&rsquo;ll maximize profits.
You can also plan on the course being on sale for $14.99 quite a bit of the time as well.
Udemy is constantly running site wide course sales, so plan on selling your course at a discount a lot.
There&rsquo;s very few people that&rsquo;ll actually buy the course full price.</p>
<h1 id="conclusion">Conclusion</h1>
<p>Everything that I&rsquo;ve learned:</p>
<ul>
<li>Don&rsquo;t overplan, plan for each video individually</li>
<li>Take notes for each video and follow them while recording</li>
<li>Record videos in bulk, then edit</li>
<li>Teaching usually takes longer than expected, take that into account</li>
<li>Use an email list to help drive additional course sales</li>
<li>Promote the course using <strong>referral links</strong> to get a bigger pay cut</li>
<li>Udemy chooses the price of your course</li>
<li>Site-wide course sales are constantly running</li>
</ul>
<p>If this course sounds interesting, you can find it on <a href="https://www.udemy.com/course/godot-4-retro-remake-design-and-code-a-seaquest-remake/?referralCode=6FC6E1CF43EC009526FA">Udemy here</a>.</p>
<p>Hope this was helpful! Thanks for reading! :)</p>
]]></content:encoded></item><item><title>Sunset</title><link>https://plug-world.com/microblog/sunset/</link><pubDate>Thu, 24 Aug 2023 08:44:41 -0600</pubDate><guid>https://plug-world.com/microblog/sunset/</guid><description>&lt;p&gt;The sunset was crazy today, I&amp;rsquo;m not really a photographer, I mostly take video, but I decided to take a few pictures.&lt;/p&gt;
&lt;p&gt;
&lt;figure&gt;
&lt;a href="0.jpg"&gt;
&lt;picture&gt;
&lt;source srcset="https://plug-world.com/microblog/sunset/0_hu_29a46b9d843b7bac.webp" type="image/webp"&gt;
&lt;img src="https://plug-world.com/microblog/sunset/0_hu_86fb279e99b33589.jpg" alt="0.jpg" loading="lazy" decoding="async" /&gt;
&lt;/picture&gt;
&lt;/a&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;a href="1.jpg"&gt;
&lt;picture&gt;
&lt;source srcset="https://plug-world.com/microblog/sunset/1_hu_2abae9d5358048ab.webp" type="image/webp"&gt;
&lt;img src="https://plug-world.com/microblog/sunset/1_hu_dd711296dd7dcaf4.jpg" alt="1.jpg" loading="lazy" decoding="async" /&gt;
&lt;/picture&gt;
&lt;/a&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;a href="2.jpg"&gt;
&lt;picture&gt;
&lt;source srcset="https://plug-world.com/microblog/sunset/2_hu_a753425775a0b086.webp" type="image/webp"&gt;
&lt;img src="https://plug-world.com/microblog/sunset/2_hu_5e52d726bc4b30db.jpg" alt="2.jpg" loading="lazy" decoding="async" /&gt;
&lt;/picture&gt;
&lt;/a&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;a href="3.jpg"&gt;
&lt;picture&gt;
&lt;source srcset="https://plug-world.com/microblog/sunset/3_hu_a0ed56fb9e79f2ed.webp" type="image/webp"&gt;
&lt;img src="https://plug-world.com/microblog/sunset/3_hu_50cd1b3388cdf426.jpg" alt="3.jpg" loading="lazy" decoding="async" /&gt;
&lt;/picture&gt;
&lt;/a&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;The sky was crazy red, you would&amp;rsquo;ve thought there have been a fire.&lt;/p&gt;
&lt;div style="width: 100%"&gt;
&lt;div style="position: relative; padding-bottom: 56.15%; height: 0; overflow: hidden; margin-bottom: 20px;"&gt;
&lt;iframe
style="position: absolute; top: 0; left:0; width: 100%; height: 100%; border: 0;"
loading="lazy";
srcdoc="&lt;style&gt;
* {
padding: 0;
margin: 0;
overflow: hidden;
}
body, html {
height: 100%;
}
img, svg {
position: absolute;
width: 100%;
top: 0;
bottom: 0;
margin: auto;
}
svg {
filter: drop-shadow(1px 1px 10px hsl(206.5, 70.7%, 8%));
transition: all 250ms ease-in-out;
}
body:hover svg {
filter: drop-shadow(1px 1px 10px hsl(206.5, 0%, 10%));
transform: scale(1.2);
}
&lt;/style&gt;
&lt;a href='https://www.youtube.com/embed/fybPzvOLCZ8?autoplay=1'&gt;
&lt;img src='https://img.youtube.com/vi/fybPzvOLCZ8/hqdefault.jpg'&gt;
&lt;svg xmlns='http://www.w3.org/2000/svg' width='64' height='64' viewBox='0 0 24 24' fill='none' stroke='#ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-play-circle'&gt;&lt;circle cx='12' cy='12' r='10'&gt;&lt;/circle&gt;&lt;polygon points='10 8 16 12 10 16 10 8'&gt;&lt;/polygon&gt;&lt;/svg&gt;
&lt;/a&gt;
"
src="https://www.youtube.com/embed/fybPzvOLCZ8"
title=""
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen&gt;
&lt;/iframe&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I also threw together a quick video. Nothing too special.&lt;/p&gt;</description><content:encoded><![CDATA[<p>The sunset was crazy today, I&rsquo;m not really a photographer, I mostly take video, but I decided to take a few pictures.</p>
<p>



<figure>
  

  
    
    
  

  
  

  <a href="0.jpg">
    <picture>
      <source srcset="/microblog/sunset/0_hu_29a46b9d843b7bac.webp" type="image/webp">
      <img src="/https/plug-world.com/microblog/sunset/0_hu_86fb279e99b33589.jpg" alt="0.jpg" loading="lazy" decoding="async" />
    </picture>
  </a>
  
</figure>






<figure>
  

  
    
    
  

  
  

  <a href="1.jpg">
    <picture>
      <source srcset="/microblog/sunset/1_hu_2abae9d5358048ab.webp" type="image/webp">
      <img src="/https/plug-world.com/microblog/sunset/1_hu_dd711296dd7dcaf4.jpg" alt="1.jpg" loading="lazy" decoding="async" />
    </picture>
  </a>
  
</figure>






<figure>
  

  
    
    
  

  
  

  <a href="2.jpg">
    <picture>
      <source srcset="/microblog/sunset/2_hu_a753425775a0b086.webp" type="image/webp">
      <img src="/https/plug-world.com/microblog/sunset/2_hu_5e52d726bc4b30db.jpg" alt="2.jpg" loading="lazy" decoding="async" />
    </picture>
  </a>
  
</figure>






<figure>
  

  
    
    
  

  
  

  <a href="3.jpg">
    <picture>
      <source srcset="/microblog/sunset/3_hu_a0ed56fb9e79f2ed.webp" type="image/webp">
      <img src="/https/plug-world.com/microblog/sunset/3_hu_50cd1b3388cdf426.jpg" alt="3.jpg" loading="lazy" decoding="async" />
    </picture>
  </a>
  
</figure>

</p>
<p>The sky was crazy red, you would&rsquo;ve thought there have been a fire.</p>


<div style="width: 100%">
<div style="position: relative; padding-bottom: 56.15%; height: 0; overflow: hidden; margin-bottom: 20px;">
  <iframe 
    style="position: absolute; top: 0; left:0; width: 100%; height: 100%; border: 0;"
    loading="lazy";
    srcdoc="<style>
      * {
      padding: 0;
      margin: 0;
      overflow: hidden;
      }
      body, html {
        height: 100%;
      }
      img, svg {
        position: absolute;
        width: 100%;
        top: 0;
        bottom: 0;
        margin: auto;
      }
      svg {
        filter: drop-shadow(1px 1px 10px hsl(206.5, 70.7%, 8%));
        transition: all 250ms ease-in-out;
      }
      body:hover svg {
        filter: drop-shadow(1px 1px 10px hsl(206.5, 0%, 10%));
        transform: scale(1.2);
      }
    </style>
    <a href='https://www.youtube.com/embed/fybPzvOLCZ8?autoplay=1'>
      <img src='https://img.youtube.com/vi/fybPzvOLCZ8/hqdefault.jpg'>
      <svg xmlns='http://www.w3.org/2000/svg' width='64' height='64' viewBox='0 0 24 24' fill='none' stroke='#ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-play-circle'><circle cx='12' cy='12' r='10'></circle><polygon points='10 8 16 12 10 16 10 8'></polygon></svg>
    </a>
    "
    src="https://www.youtube.com/embed/fybPzvOLCZ8" 
    title=""
    frameborder="0"
    allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" 
    allowfullscreen>
  </iframe>
</div>
</div>


<p>I also threw together a quick video. Nothing too special.</p>
]]></content:encoded></item><item><title>Davinci Resolve Export Best Quality</title><link>https://plug-world.com/posts/davinci-resolve-export-best-quality/</link><pubDate>Mon, 14 Aug 2023 12:57:36 -0600</pubDate><guid>https://plug-world.com/posts/davinci-resolve-export-best-quality/</guid><description>&lt;p&gt;These are the best settings I found to achieve the highest quality exports.
Please let me know if I missed something, or if you have any suggestions.&lt;/p&gt;
&lt;p&gt;
&lt;figure&gt;
&lt;a href="export-video-settings.png"&gt;
&lt;picture&gt;
&lt;source srcset="https://plug-world.com/posts/davinci-resolve-export-best-quality/export-video-settings_hu_274393ad76108b9c.webp" type="image/webp"&gt;
&lt;img src="https://plug-world.com/posts/davinci-resolve-export-best-quality/export-video-settings_hu_f0c7d31545111397.png" alt="export-video-settings" loading="lazy" decoding="async" /&gt;
&lt;/picture&gt;
&lt;/a&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;a href="highest-quality.png"&gt;
&lt;picture&gt;
&lt;source srcset="https://plug-world.com/posts/davinci-resolve-export-best-quality/highest-quality_hu_fe3eb8f6107557f5.webp" type="image/webp"&gt;
&lt;img src="https://plug-world.com/posts/davinci-resolve-export-best-quality/highest-quality_hu_d162b78bc31ee42e.png" alt="highest-quality" loading="lazy" decoding="async" /&gt;
&lt;/picture&gt;
&lt;/a&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Yes, there&amp;rsquo;s a reason to my madness.&lt;/p&gt;
&lt;p&gt;Davinci Resolve sucks at regular h264/h265 encodes.
You&amp;rsquo;ll notice no matter what, when you export videos in these format the videos are &lt;strong&gt;blocky&lt;/strong&gt; and low light performance isn&amp;rsquo;t ideal.&lt;/p&gt;
&lt;p&gt;This is why I use the &lt;code&gt;DNxHR&lt;/code&gt; codec, rather than a more efficient codec.
This will generate MASSIVE files.
But that&amp;rsquo;s why I compress them with Handbrake and delete them after.
Which looks way better than exporting straight to h264/h265 in Resolve.&lt;/p&gt;</description><content:encoded><![CDATA[<p>These are the best settings I found to achieve the highest quality exports.
Please let me know if I missed something, or if you have any suggestions.</p>
<p>



<figure>
  

  
    
    
  

  
  

  <a href="export-video-settings.png">
    <picture>
      <source srcset="/posts/davinci-resolve-export-best-quality/export-video-settings_hu_274393ad76108b9c.webp" type="image/webp">
      <img src="/https/plug-world.com/posts/davinci-resolve-export-best-quality/export-video-settings_hu_f0c7d31545111397.png" alt="export-video-settings" loading="lazy" decoding="async" />
    </picture>
  </a>
  
</figure>






<figure>
  

  
    
    
  

  
  

  <a href="highest-quality.png">
    <picture>
      <source srcset="/posts/davinci-resolve-export-best-quality/highest-quality_hu_fe3eb8f6107557f5.webp" type="image/webp">
      <img src="/https/plug-world.com/posts/davinci-resolve-export-best-quality/highest-quality_hu_d162b78bc31ee42e.png" alt="highest-quality" loading="lazy" decoding="async" />
    </picture>
  </a>
  
</figure>

</p>
<p>Yes, there&rsquo;s a reason to my madness.</p>
<p>Davinci Resolve sucks at regular h264/h265 encodes.
You&rsquo;ll notice no matter what, when you export videos in these format the videos are <strong>blocky</strong> and low light performance isn&rsquo;t ideal.</p>
<p>This is why I use the <code>DNxHR</code> codec, rather than a more efficient codec.
This will generate MASSIVE files.
But that&rsquo;s why I compress them with Handbrake and delete them after.
Which looks way better than exporting straight to h264/h265 in Resolve.</p>
<p>Here&rsquo;s my <a href="https://handbrake.fr/">Handbrake</a> settings.</p>
<p>



<figure>
  

  
    
    
  

  
  

  <a href="handbrake-video.png">
    <picture>
      <source srcset="/posts/davinci-resolve-export-best-quality/handbrake-video_hu_ed2e282f225221c.webp" type="image/webp">
      <img src="/https/plug-world.com/posts/davinci-resolve-export-best-quality/handbrake-video_hu_ee09de7a11ab88db.png" alt="handbrake-video-settings" loading="lazy" decoding="async" />
    </picture>
  </a>
  
</figure>

</p>
<p>Now I&rsquo;m no video encoding expert.
These are not the most efficent settings.
But they are fast and most widely supported across devices.
They also work great for video archival, and give me enough data to work with so that I can recompress the video later on if needed.</p>
<p>I also recommend perserving the audio quality.</p>
<p>



<figure>
  

  
    
    
  

  
  

  <a href="handbrake-audio-settings.png">
    <picture>
      <source srcset="/posts/davinci-resolve-export-best-quality/handbrake-audio-settings_hu_543ce13b66947844.webp" type="image/webp">
      <img src="/https/plug-world.com/posts/davinci-resolve-export-best-quality/handbrake-audio-settings_hu_548d6ac2117b0efc.png" alt="handbrake-audio-settings" loading="lazy" decoding="async" />
    </picture>
  </a>
  
</figure>

</p>
<p>This assumes that your source audio is lossless.
Now when you recompress your files you don&rsquo;t sacrifice audio quality.</p>
]]></content:encoded></item><item><title>Bear Lake.</title><link>https://plug-world.com/microblog/bear-lake/</link><pubDate>Sun, 13 Aug 2023 15:01:29 -0700</pubDate><guid>https://plug-world.com/microblog/bear-lake/</guid><description>&lt;div style="width: 100%"&gt;
&lt;div style="position: relative; padding-bottom: 56.15%; height: 0; overflow: hidden; margin-bottom: 20px;"&gt;
&lt;iframe
style="position: absolute; top: 0; left:0; width: 100%; height: 100%; border: 0;"
loading="lazy";
srcdoc="&lt;style&gt;
* {
padding: 0;
margin: 0;
overflow: hidden;
}
body, html {
height: 100%;
}
img, svg {
position: absolute;
width: 100%;
top: 0;
bottom: 0;
margin: auto;
}
svg {
filter: drop-shadow(1px 1px 10px hsl(206.5, 70.7%, 8%));
transition: all 250ms ease-in-out;
}
body:hover svg {
filter: drop-shadow(1px 1px 10px hsl(206.5, 0%, 10%));
transform: scale(1.2);
}
&lt;/style&gt;
&lt;a href='https://www.youtube.com/embed/p0QRq_Z9mYs?autoplay=1'&gt;
&lt;img src='https://img.youtube.com/vi/p0QRq_Z9mYs/hqdefault.jpg'&gt;
&lt;svg xmlns='http://www.w3.org/2000/svg' width='64' height='64' viewBox='0 0 24 24' fill='none' stroke='#ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-play-circle'&gt;&lt;circle cx='12' cy='12' r='10'&gt;&lt;/circle&gt;&lt;polygon points='10 8 16 12 10 16 10 8'&gt;&lt;/polygon&gt;&lt;/svg&gt;
&lt;/a&gt;
"
src="https://www.youtube.com/embed/p0QRq_Z9mYs"
title=""
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen&gt;
&lt;/iframe&gt;
&lt;/div&gt;
&lt;/div&gt;</description><content:encoded><![CDATA[

<div style="width: 100%">
<div style="position: relative; padding-bottom: 56.15%; height: 0; overflow: hidden; margin-bottom: 20px;">
  <iframe 
    style="position: absolute; top: 0; left:0; width: 100%; height: 100%; border: 0;"
    loading="lazy";
    srcdoc="<style>
      * {
      padding: 0;
      margin: 0;
      overflow: hidden;
      }
      body, html {
        height: 100%;
      }
      img, svg {
        position: absolute;
        width: 100%;
        top: 0;
        bottom: 0;
        margin: auto;
      }
      svg {
        filter: drop-shadow(1px 1px 10px hsl(206.5, 70.7%, 8%));
        transition: all 250ms ease-in-out;
      }
      body:hover svg {
        filter: drop-shadow(1px 1px 10px hsl(206.5, 0%, 10%));
        transform: scale(1.2);
      }
    </style>
    <a href='https://www.youtube.com/embed/p0QRq_Z9mYs?autoplay=1'>
      <img src='https://img.youtube.com/vi/p0QRq_Z9mYs/hqdefault.jpg'>
      <svg xmlns='http://www.w3.org/2000/svg' width='64' height='64' viewBox='0 0 24 24' fill='none' stroke='#ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-play-circle'><circle cx='12' cy='12' r='10'></circle><polygon points='10 8 16 12 10 16 10 8'></polygon></svg>
    </a>
    "
    src="https://www.youtube.com/embed/p0QRq_Z9mYs" 
    title=""
    frameborder="0"
    allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" 
    allowfullscreen>
  </iframe>
</div>
</div>


]]></content:encoded></item><item><title>Docker Mailserver Setup</title><link>https://plug-world.com/posts/docker-mailserver-setup/</link><pubDate>Sat, 29 Jul 2023 16:01:33 -0600</pubDate><guid>https://plug-world.com/posts/docker-mailserver-setup/</guid><description>&lt;p&gt;Here&amp;rsquo;s my massive docker compose file.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;version&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#cd5555"&gt;&amp;#39;2&amp;#39;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;&lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;services&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;mailserver&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;image&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;mailserver/docker-mailserver:latest&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;container_name&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;mailserver&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;hostname&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;mail.plug-world.com&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;ports&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- &lt;span style="color:#cd5555"&gt;&amp;#34;25:25&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#228b22"&gt;# SMTP&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- &lt;span style="color:#cd5555"&gt;&amp;#34;143:143&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#228b22"&gt;# IMAP4&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- &lt;span style="color:#cd5555"&gt;&amp;#34;993:993&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#228b22"&gt;# IMAP4 TLS&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- &lt;span style="color:#cd5555"&gt;&amp;#34;465:465&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#228b22"&gt;# ESMTP&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- &lt;span style="color:#cd5555"&gt;&amp;#34;587:587&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#228b22"&gt;# ESMTP&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- &lt;span style="color:#cd5555"&gt;&amp;#34;110:110&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#228b22"&gt;# POP3&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- &lt;span style="color:#cd5555"&gt;&amp;#34;995:995&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#228b22"&gt;# POP3 (with TLS)&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;volumes&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- ./docker-data/dms/mail-data:/var/mail&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- ./docker-data/dms/mail-state:/var/mail-state&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- ./docker-data/dms/mail-logs:/var/log/mail&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- ./docker-data/dms/config:/tmp/docker-mailserver&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- /home/parker/Docker/Swag/config/etc:/swag-ssl:ro&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- /etc/localtime:/etc/localtime:ro&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;environment&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- ENABLE_FAIL2BAN=1&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- SSL_TYPE=manual&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- SSL_CERT_PATH=/swag-ssl/letsencrypt/live/plug-world.com/fullchain.pem&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- SSL_KEY_PATH=/swag-ssl/letsencrypt/live/plug-world.com/privkey.pem&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- PERMIT_DOCKER=connected-networks&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- ONE_DIR=1&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- ENABLE_POP3=1&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#228b22"&gt;# recieving mail&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- ENABLE_AMAVIS=1&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#228b22"&gt;# filtering for spam assassin&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- ENABLE_SPAMASSASSIN=1&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- ENABLE_POLICYD_SPF=1&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#228b22"&gt;# sender email verification&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- SPOOF_PROTECTION=1&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- POSTFIX_MESSAGE_SIZE_LIMIT=52428800&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- ENABLE_CLAMAV=1&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#228b22"&gt;# antivirus&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- ENABLE_OPENDKIM=1&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#228b22"&gt;# email verification&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- ENABLE_OPENDMARC=1&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#228b22"&gt;# also email verification&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- POSTMASTER_ADDRESS=postmaster@plug-world.com&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- MOVE_SPAM_TO_JUNK=1&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;restart&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;unless-stopped&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;stop_grace_period&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;1m&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I recommend reading through the &lt;a href="https://docker-mailserver.github.io/docker-mailserver/latest/config/environment/"&gt;environment variables&lt;/a&gt; before blindly copying my setup. But this configuration has worked really well for my personal needs. Currently I host two emails, a few aliases, and use them to send and receive mail.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Here&rsquo;s my massive docker compose file.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yml" data-lang="yml"><span style="display:flex;"><span><span style="color:#8b008b;font-weight:bold">version</span>:<span style="color:#bbb"> </span><span style="color:#cd5555">&#39;2&#39;</span><span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#8b008b;font-weight:bold">services</span>:<span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">  </span><span style="color:#8b008b;font-weight:bold">mailserver</span>:<span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">    </span><span style="color:#8b008b;font-weight:bold">image</span>:<span style="color:#bbb"> </span>mailserver/docker-mailserver:latest<span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">    </span><span style="color:#8b008b;font-weight:bold">container_name</span>:<span style="color:#bbb"> </span>mailserver<span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">    </span><span style="color:#8b008b;font-weight:bold">hostname</span>:<span style="color:#bbb"> </span>mail.plug-world.com<span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">    </span><span style="color:#8b008b;font-weight:bold">ports</span>:<span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">      </span>- <span style="color:#cd5555">&#34;25:25&#34;</span><span style="color:#bbb">    </span><span style="color:#228b22"># SMTP</span><span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">      </span>- <span style="color:#cd5555">&#34;143:143&#34;</span><span style="color:#bbb">  </span><span style="color:#228b22"># IMAP4</span><span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">      </span>- <span style="color:#cd5555">&#34;993:993&#34;</span><span style="color:#bbb">  </span><span style="color:#228b22"># IMAP4 TLS</span><span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">      </span>- <span style="color:#cd5555">&#34;465:465&#34;</span><span style="color:#bbb">  </span><span style="color:#228b22"># ESMTP</span><span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">      </span>- <span style="color:#cd5555">&#34;587:587&#34;</span><span style="color:#bbb">  </span><span style="color:#228b22"># ESMTP</span><span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">      </span>- <span style="color:#cd5555">&#34;110:110&#34;</span><span style="color:#bbb">  </span><span style="color:#228b22"># POP3</span><span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">      </span>- <span style="color:#cd5555">&#34;995:995&#34;</span><span style="color:#bbb">  </span><span style="color:#228b22"># POP3 (with TLS)</span><span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">    </span><span style="color:#8b008b;font-weight:bold">volumes</span>:<span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">      </span>- ./docker-data/dms/mail-data:/var/mail<span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">      </span>- ./docker-data/dms/mail-state:/var/mail-state<span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">      </span>- ./docker-data/dms/mail-logs:/var/log/mail<span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">      </span>- ./docker-data/dms/config:/tmp/docker-mailserver<span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">      </span>- /home/parker/Docker/Swag/config/etc:/swag-ssl:ro<span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">      </span>- /etc/localtime:/etc/localtime:ro<span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">    </span><span style="color:#8b008b;font-weight:bold">environment</span>:<span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">      </span>- ENABLE_FAIL2BAN=1<span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">      </span>- SSL_TYPE=manual<span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">      </span>- SSL_CERT_PATH=/swag-ssl/letsencrypt/live/plug-world.com/fullchain.pem<span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">      </span>- SSL_KEY_PATH=/swag-ssl/letsencrypt/live/plug-world.com/privkey.pem<span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">      </span>- PERMIT_DOCKER=connected-networks<span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">      </span>- ONE_DIR=1<span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">      </span>- ENABLE_POP3=1<span style="color:#bbb"> </span><span style="color:#228b22"># recieving mail</span><span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">      </span>- ENABLE_AMAVIS=1<span style="color:#bbb"> </span><span style="color:#228b22"># filtering for spam assassin</span><span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">      </span>- ENABLE_SPAMASSASSIN=1<span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">      </span>- ENABLE_POLICYD_SPF=1<span style="color:#bbb"> </span><span style="color:#228b22"># sender email verification</span><span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">      </span>- SPOOF_PROTECTION=1<span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">      </span>- POSTFIX_MESSAGE_SIZE_LIMIT=52428800<span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">      </span>- ENABLE_CLAMAV=1<span style="color:#bbb"> </span><span style="color:#228b22"># antivirus</span><span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">      </span>- ENABLE_OPENDKIM=1<span style="color:#bbb"> </span><span style="color:#228b22"># email verification</span><span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">      </span>- ENABLE_OPENDMARC=1<span style="color:#bbb"> </span><span style="color:#228b22"># also email verification</span><span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">      </span>- POSTMASTER_ADDRESS=postmaster@plug-world.com<span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">      </span>- MOVE_SPAM_TO_JUNK=1<span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">    </span><span style="color:#8b008b;font-weight:bold">restart</span>:<span style="color:#bbb"> </span>unless-stopped<span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">    </span><span style="color:#8b008b;font-weight:bold">stop_grace_period</span>:<span style="color:#bbb"> </span>1m<span style="color:#bbb">
</span></span></span></code></pre></div><p>I recommend reading through the <a href="https://docker-mailserver.github.io/docker-mailserver/latest/config/environment/">environment variables</a> before blindly copying my setup. But this configuration has worked really well for my personal needs. Currently I host two emails, a few aliases, and use them to send and receive mail.</p>
<p>You can install the setup script, this basically just makes it easier to add emails and all that fun stuff without having to use <code>docker exec -ti &lt;CONTAINER NAME&gt; setup</code> every time.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>wget https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/master/setup.sh
</span></span><span style="display:flex;"><span>chmod a+x ./setup.sh
</span></span></code></pre></div><p>For my encryption I&rsquo;m just using the letsencrypt certificates created by my <a href="https://docs.linuxserver.io/images/docker-swag">Swag</a> container. I just mount the swag folder where my encryption keys are stored, and manually specify their paths. This setup will look different if you aren&rsquo;t using <code>swag</code> so make sure you adapt it to your needs.</p>
<h2 id="adding-email-addresses">Adding email addresses</h2>
<div class="highlight"><pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>./setup.sh email add youremailaddress@yourdomain.com
</span></span></code></pre></div><h2 id="dns-setup">DNS Setup</h2>
<ul>
<li>Add a <code>CNAME</code> record named <code>mail</code> that points back to your your domain or public ip.
<ul>
<li>Make sure that you get SSL certificates for this subdomain with letsencrypt or any other provider. In <a href="https://docs.linuxserver.io/images/docker-swag">Swag</a> I just add mail to the subdomain environment variable and it automatically generates certificates for it.</li>
</ul>
</li>
<li>Add an <code>MX</code> record named <code>@</code> that points to <code>mail.yourdomain.com</code></li>
<li>Add a <code>TXT</code> record named <code>@</code> that points to <code>v=spf1 mx ~all</code></li>
<li>Add a <code>TXT</code> record named <code>_dmarc</code> that points to <code>v=DMARC1; p=none; rua=mailto:dmarc.report@yourdomain.com; ruf=mailto:dmarc.report@yourdomain.com; sp=none; ri=86400</code></li>
</ul>
<p>Configure openDKIM I recommend reading <a href="https://docker-mailserver.github.io/docker-mailserver/latest/config/best-practices/dkim_dmarc_spf/">the docs on this</a> first:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>./setup.sh config dkim
</span></span></code></pre></div><p>Make sure to add the DKIM <code>txt</code> record to your DNS after you create it.</p>
<p>After setting up DKIM make sure you restart docker-mailserver.</p>
<h2 id="port-forwarding">Port forwarding</h2>
<p>These are the ports I forwarded for receiving and sending mail.</p>
<table>
  <thead>
      <tr>
          <th>Port</th>
          <th>Purpose</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>25</td>
          <td>SMTP</td>
      </tr>
      <tr>
          <td>587</td>
          <td>ESMTP</td>
      </tr>
      <tr>
          <td>465</td>
          <td>SMTP TLS</td>
      </tr>
      <tr>
          <td>993</td>
          <td>IMAP4 TLS</td>
      </tr>
  </tbody>
</table>
<h1 id="connecting-to-thunderbird">Connecting to Thunderbird</h1>
<p>When you login to your email with <a href="https://www.thunderbird.net/en-US/">Thunderbird</a>, use your email and password that you just created. It will try to probe the server for it&rsquo;s settings, it&rsquo;ll probably ask you to manually configure these settings.</p>
<p>Set the hostname to <code>mail.yourdomain.com</code> on both <code>INCOMING SERVER</code> and <code>OUTGOING SERVER</code>. Then set the port on the <code>INCOMING SERVER</code> to <code>993</code> which is used for <code>IMAP</code>.</p>
<p>Again these are the setting&rsquo;s I used. Obviously this isn&rsquo;t for everyone and you can configure it for <code>POP3</code> instead and only use it for receiving mail. I recommend you get familiar with how email works and configure it the way you want. But this solution has worked great for me.</p>
<p>You should now be able to login to your email address. You can try sending and receiving mail now. Good luck!</p>
<h1 id="adding-email-aliases">Adding email aliases</h1>
<div class="highlight"><pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>./setup.sh <span style="color:#658b00">alias</span> add user+papertrail@domain.com user@domain.com
</span></span></code></pre></div><p>The first argument is the email alias you wish to add. And the second argument is the email you want to alias from. All your emails that go to your email alias will go to the email in the second argument.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>./setup.sh <span style="color:#658b00">alias</span> list
</span></span></code></pre></div><p>You should now see your email alias listed after you created it.</p>
]]></content:encoded></item><item><title>I'm Doing Images Wrong in Hugo</title><link>https://plug-world.com/posts/im-doing-images-wrong-in-hugo/</link><pubDate>Fri, 28 Jul 2023 21:28:04 -0600</pubDate><guid>https://plug-world.com/posts/im-doing-images-wrong-in-hugo/</guid><description>&lt;p&gt;Ahhhhh!&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m so mad at myself.
This site is a mess.
I always knew I was doing something wrong with the images on this site.
I just didn&amp;rsquo;t know the solution.&lt;/p&gt;
&lt;p&gt;My current setup for images was to place them in &lt;code&gt;/static/images/posts/my-post-name/my-image.webp&lt;/code&gt;.
But this sucked.
I had to make sure I optimized each and every image.
I used a script to do this, but it still was very repetitive.
And linking images in my markdown was a pain as well.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Ahhhhh!</p>
<p>I&rsquo;m so mad at myself.
This site is a mess.
I always knew I was doing something wrong with the images on this site.
I just didn&rsquo;t know the solution.</p>
<p>My current setup for images was to place them in <code>/static/images/posts/my-post-name/my-image.webp</code>.
But this sucked.
I had to make sure I optimized each and every image.
I used a script to do this, but it still was very repetitive.
And linking images in my markdown was a pain as well.</p>
<p>At first I used a shortcode for optimizing images.
But that didn&rsquo;t last for long.
Everytime I rebuilt the site it had to optimize the images again.
It made my site builds super slow.
So I quickly abandoned that idea.
But I should&rsquo;ve looked back sooner.</p>
<h1 id="solution">Solution</h1>
<p>Thanks to <a href="https://ericmurphy.xyz/blog/images/">Eric Murphy&rsquo;s post</a> I was guided to a much more elegant solution.</p>
<p>By creating a custom image render layout saved here <code>/layouts/_default/_markup/render-image.html</code> and by using <a href="https://gohugo.io/content-management/page-bundles/#leaf-bundles">page bundles</a>.
Optimized images are as simple as writing images in markdown.</p>
<p>They also don&rsquo;t have the issue of optimizing images every build.
This makes your build times blazingly fast as always.
Having the images in the same directory as the post is also super nice.
This makes writing the images in markdown super intuitive.</p>
<h1 id="conclusion">Conclusion</h1>
<p>If you find yourself in the same shoes I am in.
I urge you to move to this solution.
It will save you time and frustration when making posts.
Hope this helps!</p>
]]></content:encoded></item><item><title>Godot 4: Switching Levels Made Easy</title><link>https://plug-world.com/posts/godot-4-switching-levels-made-easy/</link><pubDate>Tue, 25 Jul 2023 15:25:56 -0700</pubDate><guid>https://plug-world.com/posts/godot-4-switching-levels-made-easy/</guid><description>&lt;p&gt;Level changing is automatic, and doesn&amp;rsquo;t require any extra variables for each level.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;const FILE_BEGIN = &lt;span style="color:#cd5555"&gt;&amp;#34;res://levels/level_&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;func go_to_next_level():
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; var current_scene_file = get_tree().current_scene.scene_file_path
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; var next_level_number = current_scene_file.to_int() + &lt;span style="color:#b452cd"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; var next_level_path = FILE_BEGIN + &lt;span style="color:#658b00"&gt;str&lt;/span&gt;(next_level_number) + &lt;span style="color:#cd5555"&gt;&amp;#34;.tscn&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; get_tree().change_scene_to_file(next_level_path)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Make sure you change your &lt;code&gt;FILE_BEGIN&lt;/code&gt; path to reflect the pattern in which you save levels in your project.&lt;/p&gt;
&lt;p&gt;Hope this helps! Watch the video on &lt;a href="https://youtu.be/GZrALMvOwY8"&gt;YouTube&lt;/a&gt; if you have any questions.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Level changing is automatic, and doesn&rsquo;t require any extra variables for each level.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>const FILE_BEGIN = <span style="color:#cd5555">&#34;res://levels/level_&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>func go_to_next_level():
</span></span><span style="display:flex;"><span>  var current_scene_file = get_tree().current_scene.scene_file_path
</span></span><span style="display:flex;"><span>  var next_level_number = current_scene_file.to_int() + <span style="color:#b452cd">1</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  var next_level_path = FILE_BEGIN + <span style="color:#658b00">str</span>(next_level_number) + <span style="color:#cd5555">&#34;.tscn&#34;</span>
</span></span><span style="display:flex;"><span>  get_tree().change_scene_to_file(next_level_path)
</span></span></code></pre></div><p>Make sure you change your <code>FILE_BEGIN</code> path to reflect the pattern in which you save levels in your project.</p>
<p>Hope this helps! Watch the video on <a href="https://youtu.be/GZrALMvOwY8">YouTube</a> if you have any questions.</p>
]]></content:encoded></item><item><title>Last.fm Recommendations Made Easy with MPV</title><link>https://plug-world.com/posts/lastfm-recommended-script/</link><pubDate>Mon, 17 Jul 2023 14:27:00 -0600</pubDate><guid>https://plug-world.com/posts/lastfm-recommended-script/</guid><description>&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1e889b"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1e889b"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00688b"&gt;user&lt;/span&gt;=plug_world
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -s https://www.last.fm/player/station/user/&lt;span style="color:#00688b"&gt;$user&lt;/span&gt;/recommended &lt;span style="color:#cd5555"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cd5555"&gt;&lt;/span&gt;| cat &lt;span style="color:#cd5555"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cd5555"&gt;&lt;/span&gt;| jq -r &lt;span style="color:#cd5555"&gt;&amp;#39;.playlist[].playlinks[].url&amp;#39;&lt;/span&gt; &lt;span style="color:#cd5555"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cd5555"&gt;&lt;/span&gt;| shuf &lt;span style="color:#cd5555"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cd5555"&gt;&lt;/span&gt;| mpv --playlist=- --no-video
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This script allows you to listen to a user&amp;rsquo;s Last FM recommendations via mpv.&lt;/p&gt;
&lt;p&gt;Just set the &lt;code&gt;user&lt;/code&gt; variable to your username.
Use &lt;code&gt;&amp;lt;&lt;/code&gt; and &lt;code&gt;&amp;gt;&lt;/code&gt; to go backward/forward in the playlist.
Enjoy your music 🎵&lt;/p&gt;</description><content:encoded><![CDATA[<div class="highlight"><pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#1e889b">#!/bin/bash
</span></span></span><span style="display:flex;"><span><span style="color:#1e889b"></span>
</span></span><span style="display:flex;"><span><span style="color:#00688b">user</span>=plug_world
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>curl -s https://www.last.fm/player/station/user/<span style="color:#00688b">$user</span>/recommended <span style="color:#cd5555">\
</span></span></span><span style="display:flex;"><span><span style="color:#cd5555"></span>| cat <span style="color:#cd5555">\
</span></span></span><span style="display:flex;"><span><span style="color:#cd5555"></span>| jq -r <span style="color:#cd5555">&#39;.playlist[].playlinks[].url&#39;</span> <span style="color:#cd5555">\
</span></span></span><span style="display:flex;"><span><span style="color:#cd5555"></span>| shuf <span style="color:#cd5555">\
</span></span></span><span style="display:flex;"><span><span style="color:#cd5555"></span>| mpv --playlist=- --no-video
</span></span></code></pre></div><p>This script allows you to listen to a user&rsquo;s Last FM recommendations via mpv.</p>
<p>Just set the <code>user</code> variable to your username.
Use <code>&lt;</code> and <code>&gt;</code> to go backward/forward in the playlist.
Enjoy your music 🎵</p>
]]></content:encoded></item><item><title>Feeling Alone</title><link>https://plug-world.com/thoughts-and-quotes/alone/</link><pubDate>Wed, 05 Jul 2023 09:33:50 -0600</pubDate><guid>https://plug-world.com/thoughts-and-quotes/alone/</guid><description>&lt;p&gt;I just feel alone.&lt;/p&gt;
&lt;p&gt;I know that&amp;rsquo;s normal.&lt;/p&gt;
&lt;p&gt;Everyone feels alone at points in their life.&lt;/p&gt;
&lt;p&gt;But this time feels different.&lt;/p&gt;
&lt;p&gt;I look back on my life.&lt;/p&gt;
&lt;p&gt;And remember all the things I missed out on.&lt;/p&gt;
&lt;p&gt;All because I prioritized the wrong things.&lt;/p&gt;
&lt;p&gt;But that time is spent.&lt;/p&gt;
&lt;p&gt;I need to look to the future.&lt;/p&gt;
&lt;p&gt;Choose where to spend it now.&lt;/p&gt;</description><content:encoded><![CDATA[<p>I just feel alone.</p>
<p>I know that&rsquo;s normal.</p>
<p>Everyone feels alone at points in their life.</p>
<p>But this time feels different.</p>
<p>I look back on my life.</p>
<p>And remember all the things I missed out on.</p>
<p>All because I prioritized the wrong things.</p>
<p>But that time is spent.</p>
<p>I need to look to the future.</p>
<p>Choose where to spend it now.</p>
]]></content:encoded></item><item><title>Carlsbad</title><link>https://plug-world.com/microblog/carlsbad/</link><pubDate>Mon, 03 Jul 2023 22:09:54 -0600</pubDate><guid>https://plug-world.com/microblog/carlsbad/</guid><description>&lt;p&gt;
&lt;figure&gt;
&lt;a href="img-2.jpeg"&gt;
&lt;picture&gt;
&lt;source srcset="https://plug-world.com/microblog/carlsbad/img-2_hu_ceba2e54ae0c0cc8.webp" type="image/webp"&gt;
&lt;img src="https://plug-world.com/microblog/carlsbad/img-2_hu_ac0a2e2553ae943f.jpeg" alt="" loading="lazy" decoding="async" /&gt;
&lt;/picture&gt;
&lt;/a&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;a href="img-0.jpeg"&gt;
&lt;picture&gt;
&lt;source srcset="https://plug-world.com/microblog/carlsbad/img-0_hu_29f06d68c648ea72.webp" type="image/webp"&gt;
&lt;img src="https://plug-world.com/microblog/carlsbad/img-0_hu_5fadeb14113029ae.jpeg" alt="" loading="lazy" decoding="async" /&gt;
&lt;/picture&gt;
&lt;/a&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;a href="img-1.jpeg"&gt;
&lt;picture&gt;
&lt;source srcset="https://plug-world.com/microblog/carlsbad/img-1_hu_3a7d5f5e2e26084b.webp" type="image/webp"&gt;
&lt;img src="https://plug-world.com/microblog/carlsbad/img-1_hu_59367039c2b8ac2d.jpeg" alt="" loading="lazy" decoding="async" /&gt;
&lt;/picture&gt;
&lt;/a&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;a href="img-3.jpeg"&gt;
&lt;picture&gt;
&lt;source srcset="https://plug-world.com/microblog/carlsbad/img-3_hu_c06bf5638791ec07.webp" type="image/webp"&gt;
&lt;img src="https://plug-world.com/microblog/carlsbad/img-3_hu_97eaaf87798a7dc5.jpeg" alt="" loading="lazy" decoding="async" /&gt;
&lt;/picture&gt;
&lt;/a&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;a href="img-7.jpeg"&gt;
&lt;picture&gt;
&lt;source srcset="https://plug-world.com/microblog/carlsbad/img-7_hu_140558757349b6b6.webp" type="image/webp"&gt;
&lt;img src="https://plug-world.com/microblog/carlsbad/img-7_hu_550b7c654944c287.jpeg" alt="" loading="lazy" decoding="async" /&gt;
&lt;/picture&gt;
&lt;/a&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;a href="img-5.jpeg"&gt;
&lt;picture&gt;
&lt;source srcset="https://plug-world.com/microblog/carlsbad/img-5_hu_b5dd89f2f3452129.webp" type="image/webp"&gt;
&lt;img src="https://plug-world.com/microblog/carlsbad/img-5_hu_e200f856d51cd3b.jpeg" alt="" loading="lazy" decoding="async" /&gt;
&lt;/picture&gt;
&lt;/a&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;a href="img-6.jpeg"&gt;
&lt;picture&gt;
&lt;source srcset="https://plug-world.com/microblog/carlsbad/img-6_hu_675df04f08adc73e.webp" type="image/webp"&gt;
&lt;img src="https://plug-world.com/microblog/carlsbad/img-6_hu_bfe93f90465f4743.jpeg" alt="" loading="lazy" decoding="async" /&gt;
&lt;/picture&gt;
&lt;/a&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;a href="img-4.jpeg"&gt;
&lt;picture&gt;
&lt;source srcset="https://plug-world.com/microblog/carlsbad/img-4_hu_ef69157001190a54.webp" type="image/webp"&gt;
&lt;img src="https://plug-world.com/microblog/carlsbad/img-4_hu_1b39e1e63e9dff3f.jpeg" alt="" loading="lazy" decoding="async" /&gt;
&lt;/picture&gt;
&lt;/a&gt;
&lt;/figure&gt;
&lt;/p&gt;</description><content:encoded><![CDATA[<p>



<figure>
  

  
    
    
  

  
  

  <a href="img-2.jpeg">
    <picture>
      <source srcset="/microblog/carlsbad/img-2_hu_ceba2e54ae0c0cc8.webp" type="image/webp">
      <img src="/https/plug-world.com/microblog/carlsbad/img-2_hu_ac0a2e2553ae943f.jpeg" alt="" loading="lazy" decoding="async" />
    </picture>
  </a>
  
</figure>






<figure>
  

  
    
    
  

  
  

  <a href="img-0.jpeg">
    <picture>
      <source srcset="/microblog/carlsbad/img-0_hu_29f06d68c648ea72.webp" type="image/webp">
      <img src="/https/plug-world.com/microblog/carlsbad/img-0_hu_5fadeb14113029ae.jpeg" alt="" loading="lazy" decoding="async" />
    </picture>
  </a>
  
</figure>






<figure>
  

  
    
    
  

  
  

  <a href="img-1.jpeg">
    <picture>
      <source srcset="/microblog/carlsbad/img-1_hu_3a7d5f5e2e26084b.webp" type="image/webp">
      <img src="/https/plug-world.com/microblog/carlsbad/img-1_hu_59367039c2b8ac2d.jpeg" alt="" loading="lazy" decoding="async" />
    </picture>
  </a>
  
</figure>






<figure>
  

  
    
    
  

  
  

  <a href="img-3.jpeg">
    <picture>
      <source srcset="/microblog/carlsbad/img-3_hu_c06bf5638791ec07.webp" type="image/webp">
      <img src="/https/plug-world.com/microblog/carlsbad/img-3_hu_97eaaf87798a7dc5.jpeg" alt="" loading="lazy" decoding="async" />
    </picture>
  </a>
  
</figure>






<figure>
  

  
    
    
  

  
  

  <a href="img-7.jpeg">
    <picture>
      <source srcset="/microblog/carlsbad/img-7_hu_140558757349b6b6.webp" type="image/webp">
      <img src="/https/plug-world.com/microblog/carlsbad/img-7_hu_550b7c654944c287.jpeg" alt="" loading="lazy" decoding="async" />
    </picture>
  </a>
  
</figure>






<figure>
  

  
    
    
  

  
  

  <a href="img-5.jpeg">
    <picture>
      <source srcset="/microblog/carlsbad/img-5_hu_b5dd89f2f3452129.webp" type="image/webp">
      <img src="/https/plug-world.com/microblog/carlsbad/img-5_hu_e200f856d51cd3b.jpeg" alt="" loading="lazy" decoding="async" />
    </picture>
  </a>
  
</figure>






<figure>
  

  
    
    
  

  
  

  <a href="img-6.jpeg">
    <picture>
      <source srcset="/microblog/carlsbad/img-6_hu_675df04f08adc73e.webp" type="image/webp">
      <img src="/https/plug-world.com/microblog/carlsbad/img-6_hu_bfe93f90465f4743.jpeg" alt="" loading="lazy" decoding="async" />
    </picture>
  </a>
  
</figure>






<figure>
  

  
    
    
  

  
  

  <a href="img-4.jpeg">
    <picture>
      <source srcset="/microblog/carlsbad/img-4_hu_ef69157001190a54.webp" type="image/webp">
      <img src="/https/plug-world.com/microblog/carlsbad/img-4_hu_1b39e1e63e9dff3f.jpeg" alt="" loading="lazy" decoding="async" />
    </picture>
  </a>
  
</figure>

</p>
]]></content:encoded></item><item><title>Pineview Swim</title><link>https://plug-world.com/microblog/pine-view-swim/</link><pubDate>Tue, 27 Jun 2023 13:20:09 -0600</pubDate><guid>https://plug-world.com/microblog/pine-view-swim/</guid><description>&lt;p&gt;
&lt;figure&gt;
&lt;a href="4.jpg"&gt;
&lt;picture&gt;
&lt;source srcset="https://plug-world.com/microblog/pine-view-swim/4_hu_460525e46deb2e1b.webp" type="image/webp"&gt;
&lt;img src="https://plug-world.com/microblog/pine-view-swim/4_hu_c7b3b275a4f3ea00.jpg" alt="" loading="lazy" decoding="async" /&gt;
&lt;/picture&gt;
&lt;/a&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;a href="1.jpg"&gt;
&lt;picture&gt;
&lt;source srcset="https://plug-world.com/microblog/pine-view-swim/1_hu_d0845921f42e5b65.webp" type="image/webp"&gt;
&lt;img src="https://plug-world.com/microblog/pine-view-swim/1_hu_5b812b70f2eed3bb.jpg" alt="" loading="lazy" decoding="async" /&gt;
&lt;/picture&gt;
&lt;/a&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;a href="3.jpg"&gt;
&lt;picture&gt;
&lt;source srcset="https://plug-world.com/microblog/pine-view-swim/3_hu_4a33ea81d4bcf901.webp" type="image/webp"&gt;
&lt;img src="https://plug-world.com/microblog/pine-view-swim/3_hu_b5549316738de9c7.jpg" alt="" loading="lazy" decoding="async" /&gt;
&lt;/picture&gt;
&lt;/a&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;a href="6.jpg"&gt;
&lt;picture&gt;
&lt;source srcset="https://plug-world.com/microblog/pine-view-swim/6_hu_af8552b2cb1736c6.webp" type="image/webp"&gt;
&lt;img src="https://plug-world.com/microblog/pine-view-swim/6_hu_42a123c2dc35e83c.jpg" alt="" loading="lazy" decoding="async" /&gt;
&lt;/picture&gt;
&lt;/a&gt;
&lt;/figure&gt;
&lt;p class="md__image"&gt;
&lt;img src="bereal.jpg" alt="" /&gt;
&lt;/p&gt;
&lt;figure&gt;
&lt;a href="5.jpg"&gt;
&lt;picture&gt;
&lt;source srcset="https://plug-world.com/microblog/pine-view-swim/5_hu_fe8a42a098ad54e1.webp" type="image/webp"&gt;
&lt;img src="https://plug-world.com/microblog/pine-view-swim/5_hu_11fdccf58359110c.jpg" alt="" loading="lazy" decoding="async" /&gt;
&lt;/picture&gt;
&lt;/a&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;a href="2.jpg"&gt;
&lt;picture&gt;
&lt;source srcset="https://plug-world.com/microblog/pine-view-swim/2_hu_8ea2e4e838940535.webp" type="image/webp"&gt;
&lt;img src="https://plug-world.com/microblog/pine-view-swim/2_hu_659b41e7dd73c9c5.jpg" alt="" loading="lazy" decoding="async" /&gt;
&lt;/picture&gt;
&lt;/a&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Night swim in Pineview 🌲&lt;/p&gt;
&lt;p&gt;Just a little bit chilly 🤏&lt;/p&gt;</description><content:encoded><![CDATA[<p>



<figure>
  

  
    
    
  

  
  

  <a href="4.jpg">
    <picture>
      <source srcset="/microblog/pine-view-swim/4_hu_460525e46deb2e1b.webp" type="image/webp">
      <img src="/https/plug-world.com/microblog/pine-view-swim/4_hu_c7b3b275a4f3ea00.jpg" alt="" loading="lazy" decoding="async" />
    </picture>
  </a>
  
</figure>






<figure>
  

  
    
    
  

  
  

  <a href="1.jpg">
    <picture>
      <source srcset="/microblog/pine-view-swim/1_hu_d0845921f42e5b65.webp" type="image/webp">
      <img src="/https/plug-world.com/microblog/pine-view-swim/1_hu_5b812b70f2eed3bb.jpg" alt="" loading="lazy" decoding="async" />
    </picture>
  </a>
  
</figure>






<figure>
  

  
    
    
  

  
  

  <a href="3.jpg">
    <picture>
      <source srcset="/microblog/pine-view-swim/3_hu_4a33ea81d4bcf901.webp" type="image/webp">
      <img src="/https/plug-world.com/microblog/pine-view-swim/3_hu_b5549316738de9c7.jpg" alt="" loading="lazy" decoding="async" />
    </picture>
  </a>
  
</figure>






<figure>
  

  
    
    
  

  
  

  <a href="6.jpg">
    <picture>
      <source srcset="/microblog/pine-view-swim/6_hu_af8552b2cb1736c6.webp" type="image/webp">
      <img src="/https/plug-world.com/microblog/pine-view-swim/6_hu_42a123c2dc35e83c.jpg" alt="" loading="lazy" decoding="async" />
    </picture>
  </a>
  
</figure>






<p class="md__image">
  <img src="bereal.jpg" alt=""  />
</p>






<figure>
  

  
    
    
  

  
  

  <a href="5.jpg">
    <picture>
      <source srcset="/microblog/pine-view-swim/5_hu_fe8a42a098ad54e1.webp" type="image/webp">
      <img src="/https/plug-world.com/microblog/pine-view-swim/5_hu_11fdccf58359110c.jpg" alt="" loading="lazy" decoding="async" />
    </picture>
  </a>
  
</figure>






<figure>
  

  
    
    
  

  
  

  <a href="2.jpg">
    <picture>
      <source srcset="/microblog/pine-view-swim/2_hu_8ea2e4e838940535.webp" type="image/webp">
      <img src="/https/plug-world.com/microblog/pine-view-swim/2_hu_659b41e7dd73c9c5.jpg" alt="" loading="lazy" decoding="async" />
    </picture>
  </a>
  
</figure>

</p>
<p>Night swim in Pineview 🌲</p>
<p>Just a little bit chilly 🤏</p>
]]></content:encoded></item><item><title>The Federated App Problem</title><link>https://plug-world.com/posts/the-federated-app-problem/</link><pubDate>Mon, 19 Jun 2023 14:20:02 -0600</pubDate><guid>https://plug-world.com/posts/the-federated-app-problem/</guid><description>&lt;p&gt;Federated applications have a few problems.
And I really wish it weren&amp;rsquo;t the case, I love the idea and philosophy of these applications.
But I can&amp;rsquo;t see them being mass adopted.&lt;/p&gt;
&lt;h1 id="learning-curve"&gt;Learning curve&lt;/h1&gt;
&lt;p&gt;First thing&amp;rsquo;s first, they&amp;rsquo;re not user intuitive.
People are used to the idea of going to one url whether that be YouTube, Twitter, or Reddit to sign up and create content.
But now users need to understand federation.
There isn&amp;rsquo;t just one server, but many different servers that can read content from each other.
This poses a search engine problem that we&amp;rsquo;ll cover soon.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Federated applications have a few problems.
And I really wish it weren&rsquo;t the case, I love the idea and philosophy of these applications.
But I can&rsquo;t see them being mass adopted.</p>
<h1 id="learning-curve">Learning curve</h1>
<p>First thing&rsquo;s first, they&rsquo;re not user intuitive.
People are used to the idea of going to one url whether that be YouTube, Twitter, or Reddit to sign up and create content.
But now users need to understand federation.
There isn&rsquo;t just one server, but many different servers that can read content from each other.
This poses a search engine problem that we&rsquo;ll cover soon.</p>
<p>But that doesn&rsquo;t matter right, if people know how to sign up for an account they can surely sign up on any of these instances easily.
Yes, but this leads to problems.
Users will all naturally gravitate to one instance, all their friends are there, so they gotta sign up too.
One server gets overloaded, and the traffic doesn&rsquo;t get distributed across all of the other instances.
I mean that&rsquo;s the whole point of federation right??
To distribute the server load which makes it possible for small communities to host large sites full of users and content.
It also grants more freedom to the users and allows them to view and host content in any way they would like.</p>
<p>But when everyone just goes to one or two servers.
It kinda loses its point.</p>
<p>We&rsquo;ve seen this happen before on a mass scale.
Anyone remember email??
Email is federated, I can have an email from one provider and send messages to another provider.
It&rsquo;s great, I can even host my own email list if I want to.
Or view my email in many different application intererfaces.
But Google and Microsoft got in the game.
They give you free emails, in the hopes of forcing users in their ecosystems of services.
Since it&rsquo;s easy and simple and other Google/Microsoft services force you to use their accounts, many people ended up getting and using their emails from them.
This led to a huge marketshare of emails either falling under Google/Microsoft.
Very few individuals use any other providers.
Again, this is where federation falls apart.
It&rsquo;s ultimately about the user&rsquo;s decisions.</p>
<p>And we are seeing the exact same problem with Lemmy, Mastodon, and many other federated services.
Most users all jump onto the same server.
Annnndd, I don&rsquo;t blame them.
I&rsquo;d rather join a decently sized server, cause I know that smaller servers are more likely to randomly get taken down.
Larger servers will most likely have a better uptime and trackrecord.
So I can go into it knowing that my server will be up most of the time.
If I join a server with 3 other people, I wouldn&rsquo;t be suprised if it gets taken down.
I believe this is another big factor that leads people to one big centeral instance.
But this wouldn&rsquo;t be a problem if my credentials didn&rsquo;t get locked into a specific instance.</p>
<h1 id="authentication">Authentication</h1>
<p>Let me know if I&rsquo;m incorrect, I haven&rsquo;t used federated services too much, so correct me if I&rsquo;m wrong.
But in my experience, I haven&rsquo;t seen any service that shares my account logins to other instances.
This means if I create an account at let&rsquo;s say lemmy.one and that instance goes down, then I can&rsquo;t post until that instance goes back up.
I can certainly view content from other instances and still access everything.
But I can&rsquo;t use my lemmy.one login on another instance and continue to use my account.
This essentially steers me away from smaller instances, as stated previously.
If there wasn&rsquo;t instance lockin with my account, then I would have nothing to lose, and happily use smaller instances.</p>
<p>I&rsquo;m sure there&rsquo;s probably many security issues associated with this approach.
It probably explain why no federated service has this functionality.
Maybe a potential solution would be to have a centeralized login server, this would fix the security issue.
But it may also introduce other issues, like when the login server&rsquo;s down, nobody can post or access their accounts.
I don&rsquo;t think there&rsquo;s one <em>correct</em> solution.
But those are just some of my thoughts.</p>
<h1 id="search-engine-optimization">Search Engine Optimization</h1>
<p>Here&rsquo;s the biggest kicker for me.
Search engine indexing for these federated services SUCKS.
Don&rsquo;t tell me it works because you put site:lemmy.ml in your search query.
No.
Google downranks those websites so much that they will almost never come up in your search results organically.
Why??
Federation.
When multiple instances with different domains hosts the exact same content, Google will give these sites very low SEO ranking.</p>
<p>Imagine you worked very hard on your website, you have awesome blog posts and great content.
Now imagine another site copies and pastes these blog posts from your site onto their&rsquo;s using a bots.
And they do this for thousands of websites on the web.
Without a spam filtering system, this one mega website would become the one stop shop for everything.
Anyways, Google combats this by detecting where the content originated from first.
And then they downrank anyone else that uses the same content after you.</p>
<p>So naturally all federated services are gonna have terrible indexing.</p>
]]></content:encoded></item><item><title>Godot Multiplayer LAN vs WAN Explanation</title><link>https://plug-world.com/posts/godot-multiplayer-lan-vs-wan-explanation/</link><pubDate>Mon, 19 Jun 2023 11:21:25 -0600</pubDate><guid>https://plug-world.com/posts/godot-multiplayer-lan-vs-wan-explanation/</guid><description>&lt;blockquote&gt;
&lt;p&gt;hi, I recently followed the godot multiplayer top down tutorial and everything worked perfectly until I uploaded the game to itch and tried to play with a friend. Does the game not support connection between places or did I mess something up?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Of gotten many comments like this ^ all over YouTube and Discord.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s my long explanation about networking, hopefully it makes sense, I&amp;rsquo;m tired of answering the same question, so yall can see it here.&lt;/p&gt;</description><content:encoded><![CDATA[<blockquote>
<p>hi, I recently followed the godot multiplayer top down tutorial and everything worked perfectly until I uploaded the game to itch and tried to play with a friend. Does the game not support connection between places or did I mess something up?</p>
</blockquote>
<p>Of gotten many comments like this ^ all over YouTube and Discord.</p>
<p>Here&rsquo;s my long explanation about networking, hopefully it makes sense, I&rsquo;m tired of answering the same question, so yall can see it here.</p>
<hr>
<p>That requires port forwarding. The game works perfectly fine under the local network, but it requires extra configuration for the wide area network. LAN (local area network) != WAN (wide area network)</p>
<p>But here&rsquo;s the basic idea currently this game runs off of the local network. Meaning all of the devices under are network are handled under the same router. That router assigns ip addresses to each device that connects to it. In Godot we can communicate between each of the clients via their ip addresses. It&rsquo;s a unique identifier that helps it find the devices under the local network.</p>
<p>Now let&rsquo;s talk about connecting outside your local network. Your friend is not connected to your router, instead they have their own router and their own local network. Therefore under the current circumstances it is impossible for your friend to connect to your game. In order for your friend to connect to your game they will have to connect to your public router ip address.</p>
<p>So local and public addresses are different. Every device under your network is assigned a local address. So in order to connect to a certain device you have to be under the same network, and you can find it via it&rsquo;s unique address. Public ip addresses are different. Your router is assigned a public unique ip address. Only your router, no other device on your network is assigned this address. Now I can connect to your friend&rsquo;s router if I know their public ip address. But here&rsquo;s the thing, you can only send data to the router, no other device on their local network will receive data. The router acts as a gateway to the public internet, hence why it has a public ip address. It&rsquo;s able to connect to other routers via their public ip addresses.
But there is this thing called port forwarding. When I send data to the router I can send it to a specific port. Usually websites send data to port 80 and encrypted ssl websites will send data to port 443. Now if I want to for example host a website, I can have a server run under the local network. This server will serve the web pages, so in order to make it accessible to the public internet, I would port forward 80 and 443 to it&rsquo;s local ip address assigned by the router. For example the router gets a request at port 80 and from that it forwards it to the computer on the local network. The computer gets the request, and sends those files back to the router which sends the files back to the person&rsquo;s router that&rsquo;s connecting to the website, which then gets sent back to their local computer. Basically router gets request at port 80 -&gt; forwards to home computer -&gt; sends data back to my router -&gt; sends data to friends router -&gt; sends data to friends computer.</p>
<p>So what you would want to do for your own game is port forward the port we used in the tutorial in the router settings back to the local address of your computer hosting the game. You can access your router&rsquo;s settings via it&rsquo;s ip address which could be 192.168.1.1 or something similar you can find the gateway / router ip address by typing ipconfig in your terminal on Windows.</p>
<p>Known issues:
Your ISP (Internet Service Provider) may not want you port forwarding, as it could potentially pose a security risk.
Your server&rsquo;s local ip address changes every time it boots, so the solution would eventually break. You can request a static ip address for that device in the router settings to fix this issue.
Your public ip address (router&rsquo;s ip address) will change every time it reboots as well. So if the power goes out and comes back, your server will break. You can fix this by requesting a static ip address from your ISP. Although not all ISP&rsquo;s will give you a static ip.
If you don&rsquo;t want to jump through all these hoops to host your game on the local network, you could cloudhost.
There&rsquo;s plenty of places selling VPS hosting, or you can use AWS (Amazon Web Services) which handles almost all of the process for you, you just have to pay for server usage.</p>
<p>Anyways sorry for the long comment, there&rsquo;s a lot to think about when it comes to networking, and it gets pretty complex. Hope this is helpful.</p>
]]></content:encoded></item><item><title>Grad Parties with the Boys</title><link>https://plug-world.com/microblog/grad-parties-with-the-boys/</link><pubDate>Mon, 12 Jun 2023 00:00:00 +0000</pubDate><guid>https://plug-world.com/microblog/grad-parties-with-the-boys/</guid><description>&lt;video autoplay loop playsinline controls&gt;
&lt;source src=https://plug-world.com/videos/grad-party/graduation-party-video-av1.mp4 type='video/mp4;codecs="av01.0.05M.08,opus"'&gt;
&lt;source src=https://plug-world.com/videos/grad-party/graduation-party-video-h264.mp4 type="video/mp4"&gt;
Your browser does not support the video tag.
&lt;/video&gt;</description><content:encoded>




&lt;video autoplay loop  playsinline controls>

&lt;source src=https://plug-world.com/videos/grad-party/graduation-party-video-av1.mp4 type='video/mp4;codecs="av01.0.05M.08,opus"'>



&lt;source src=https://plug-world.com/videos/grad-party/graduation-party-video-h264.mp4 type="video/mp4">

Your browser does not support the video tag.
&lt;/video>

</content:encoded></item><item><title>Raspberry Pi Home Server Setup Notes</title><link>https://plug-world.com/posts/raspberry-pi-home-server-setup-notes/</link><pubDate>Fri, 09 Jun 2023 00:00:00 +0000</pubDate><guid>https://plug-world.com/posts/raspberry-pi-home-server-setup-notes/</guid><description>&lt;p&gt;Cause I&amp;rsquo;m too lazy to lookup all the commands again&amp;hellip;&lt;/p&gt;
&lt;p&gt;Quick update: I actually started using Ansible to configure the Pi.
You can find &lt;a href="https://github.com/HelamanWarrior/pi-server-playbook"&gt;my code repo here&lt;/a&gt; if you are interested.
Code&amp;rsquo;s not the best, still learning but it&amp;rsquo;s been fun.&lt;/p&gt;
&lt;h1 id="docker-section"&gt;Docker Section&lt;/h1&gt;
&lt;p&gt;Apps are fun. Let&amp;rsquo;s begin with those.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s my directory structure. It really doesn&amp;rsquo;t matter, but I found this to be the most simple.&lt;/p&gt;
&lt;p&gt;Make a folder for each application in the home user directory. An example server would look something like&amp;hellip;&lt;/p&gt;</description><content:encoded><![CDATA[<p>Cause I&rsquo;m too lazy to lookup all the commands again&hellip;</p>
<p>Quick update: I actually started using Ansible to configure the Pi.
You can find <a href="https://github.com/HelamanWarrior/pi-server-playbook">my code repo here</a> if you are interested.
Code&rsquo;s not the best, still learning but it&rsquo;s been fun.</p>
<h1 id="docker-section">Docker Section</h1>
<p>Apps are fun. Let&rsquo;s begin with those.</p>
<p>Here&rsquo;s my directory structure. It really doesn&rsquo;t matter, but I found this to be the most simple.</p>
<p>Make a folder for each application in the home user directory. An example server would look something like&hellip;</p>
<div class="highlight"><pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>parker@pi-server:~ $ ls
</span></span><span style="display:flex;"><span>ghost  nginx-proxy-manager  portainer
</span></span></code></pre></div><p>Inside each application folder, it contains a docker-compose.yml file, containing the pieces required to run that application. You will also find a data/ folder inside, containing the application&rsquo;s persistent data. Please note that this may be different based on what your application looks like.</p>
<h2 id="install-docker">Install Docker</h2>
<p><code>curl -sSL https://get.docker.com | sh</code></p>
<p><code>sudo usermod -aG docker $USER</code></p>
<p>Then reboot to see changes.</p>
<h2 id="portainer">Portainer</h2>
<p>Gotta have a webui for viewing container logs and stuff. Makes life so much easier.</p>
<p>Here&rsquo;s what my docker-compose.yml looks like&hellip;</p>
<div class="highlight"><pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yml" data-lang="yml"><span style="display:flex;"><span><span style="color:#8b008b;font-weight:bold">version</span>:<span style="color:#bbb"> </span><span style="color:#cd5555">&#39;3&#39;</span><span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#8b008b;font-weight:bold">services</span>:<span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">  </span><span style="color:#8b008b;font-weight:bold">portainer</span>:<span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">    </span><span style="color:#8b008b;font-weight:bold">image</span>:<span style="color:#bbb"> </span>portainer/portainer-ce:latest<span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">    </span><span style="color:#8b008b;font-weight:bold">container_name</span>:<span style="color:#bbb"> </span>portainer<span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">    </span><span style="color:#8b008b;font-weight:bold">restart</span>:<span style="color:#bbb"> </span>unless-stopped<span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">    </span><span style="color:#8b008b;font-weight:bold">security_opt</span>:<span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">      </span>- <span style="color:#8b008b;font-weight:bold">no</span>-new-privileges:true<span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">    </span><span style="color:#8b008b;font-weight:bold">volumes</span>:<span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">      </span>- /etc/localtime:/etc/localtime:ro<span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">      </span>- /var/run/docker.sock:/var/run/docker.sock:ro<span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">      </span>- ./data:/data<span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">    </span><span style="color:#8b008b;font-weight:bold">ports</span>:<span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">      </span>- <span style="color:#b452cd">9000</span>:<span style="color:#b452cd">9000</span><span style="color:#bbb">
</span></span></span></code></pre></div><h1 id="security-section">Security Section</h1>
<h2 id="put-docker-compose-passwords-in-env">Put Docker Compose passwords in .env</h2>
<p>Just good practice, especially if you upload docker-compose files to Github. Then make sure to add .env to the gitignore.</p>
<p>Please note the <em>syntax will look different</em> based on your <strong>docker compose version.</strong>
In docker compose file&hellip;</p>
<div class="highlight"><pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yml" data-lang="yml"><span style="display:flex;"><span><span style="color:#8b008b;font-weight:bold">env_file</span>:<span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">  </span>- .env<span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#8b008b;font-weight:bold">environment</span>:<span style="color:#bbb">
</span></span></span><span style="display:flex;"><span><span style="color:#bbb">  </span><span style="color:#8b008b;font-weight:bold">very_important_password_variable</span>:<span style="color:#bbb"> </span>${IMPORTANT_PASSWORD}<span style="color:#bbb">
</span></span></span></code></pre></div><p>In the same directory add your .env file. The text contents will look like this&hellip;</p>
<p><code>IMPORTANT_PASSWORD=myverysecurepassword</code></p>
<h2 id="install-ufw">Install ufw</h2>
<p><code>sudo ufw default deny incoming</code></p>
<p><code>sudo ufw default allow outgoing</code></p>
<p><code>sudo ufw allow ssh</code></p>
<p><code>sudo ufw enable</code></p>
<h2 id="ssh-keys">SSH Keys</h2>
<p>Ensure you have ssh keys on both your host machine and your server. Run the following command on both machines.</p>
<p><code>ssh-keygen</code></p>
<p>Then from your host machine&hellip;</p>
<p><code>ssh-copy-id user@pi-server.local</code></p>
<h2 id="unattended-upgrades">Unattended upgrades</h2>
<p>Just for those sweet, sweet automatic system updates. No further configuration is required.</p>
<p><code>sudo apt install unattended-upgrades</code></p>
<h2 id="fail2ban">Fail2ban</h2>
<p><code>sudo apt install fail2ban</code></p>
<p><code>sudo cp /etc/fail2ban/.conf /etc/fail2ban/jail.local</code></p>
]]></content:encoded></item><item><title>Kyston go spin</title><link>https://plug-world.com/microblog/kyston-go-spin/</link><pubDate>Wed, 07 Jun 2023 00:00:00 +0000</pubDate><guid>https://plug-world.com/microblog/kyston-go-spin/</guid><description>&lt;video autoplay loop playsinline controls&gt;
&lt;source src=https://plug-world.com/videos/kyston-go-spin/kyston-go-spin-av1.mp4 type='video/mp4;codecs="av01.0.05M.08,opus"'&gt;
&lt;source src=https://plug-world.com/videos/kyston-go-spin/kyston-go-spin-vp9.webm type='video/webm;codecs="vp9,opus"'&gt;
&lt;source src=https://plug-world.com/videos/kyston-go-spin/kyston-go-spin-h264.mp4 type="video/mp4"&gt;
Your browser does not support the video tag.
&lt;/video&gt;</description><content:encoded><![CDATA[




<video autoplay loop  playsinline controls>

<source src=https://plug-world.com/videos/kyston-go-spin/kyston-go-spin-av1.mp4 type='video/mp4;codecs="av01.0.05M.08,opus"'>


<source src=https://plug-world.com/videos/kyston-go-spin/kyston-go-spin-vp9.webm type='video/webm;codecs="vp9,opus"'>


<source src=https://plug-world.com/videos/kyston-go-spin/kyston-go-spin-h264.mp4 type="video/mp4">

Your browser does not support the video tag.
</video>

]]></content:encoded></item><item><title>Notes on Apple Vision Pro</title><link>https://plug-world.com/posts/notes-on-apple-vision-pro/</link><pubDate>Wed, 07 Jun 2023 00:00:00 +0000</pubDate><guid>https://plug-world.com/posts/notes-on-apple-vision-pro/</guid><description>&lt;p&gt;
&lt;p class="md__image"&gt;
&lt;img src="https://plug-world.com/images/posts/apple-vision-pro/headset.jpg" alt="headset" /&gt;
&lt;/p&gt;
I was impressed when Apple unvailed their new Vision Pro mixed reality headset thingy.
The hardware is absolutely amazing!
But I was still left with dissappointment.
Apple did the basic window user interface.
Come on guys!
That&amp;rsquo;s old technology.&lt;/p&gt;
&lt;p&gt;I wanna see some Tony Stark wacky stuff happenin.
&lt;p class="md__image"&gt;
&lt;img src="https://plug-world.com/images/posts/apple-vision-pro/iron-man-tony-stark.gif" alt="3d-holographic-interface" /&gt;
&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s not bring legacy computing to a new platform.
They are going about the user experience completely wrong.
This new mixed reality interface shouldn&amp;rsquo;t consist of more screens.
Technology should assist in our daily lives not replace it.
I wanted to see a 3D interface that integrates subtlety with the real world, rather than adding more screens that take away from that.
It was always going to be overdone in the beginning.
I&amp;rsquo;m hoping that in the future people realize that more of a minimalistic approach would be better.&lt;/p&gt;</description><content:encoded><![CDATA[<p>



<p class="md__image">
  <img src="/https/plug-world.com/images/posts/apple-vision-pro/headset.jpg" alt="headset"  />
</p>


I was impressed when Apple unvailed their new Vision Pro mixed reality headset thingy.
The hardware is absolutely amazing!
But I was still left with dissappointment.
Apple did the basic window user interface.
Come on guys!
That&rsquo;s old technology.</p>
<p>I wanna see some Tony Stark wacky stuff happenin.




<p class="md__image">
  <img src="/https/plug-world.com/images/posts/apple-vision-pro/iron-man-tony-stark.gif" alt="3d-holographic-interface"  />
</p>

</p>
<p>Let&rsquo;s not bring legacy computing to a new platform.
They are going about the user experience completely wrong.
This new mixed reality interface shouldn&rsquo;t consist of more screens.
Technology should assist in our daily lives not replace it.
I wanted to see a 3D interface that integrates subtlety with the real world, rather than adding more screens that take away from that.
It was always going to be overdone in the beginning.
I&rsquo;m hoping that in the future people realize that more of a minimalistic approach would be better.</p>
<p>I&rsquo;m also concerned that companies, including Apple, that release these mixed reality headsets will be able to control your reality.
Everything you see and hear can be altered and controlled by these companies.</p>
<p>Imagine you are thinking about purchasing a new vehicle.
The headset tracks everything you look at and your conversations.
After gathering this data, the headset becomes aware that you are looking for this new vehicle.
Now you are driving.
Driving and you start to see this new vehicle more.
You think to yourself, maybe it&rsquo;s cause you didn&rsquo;t notice them before.
The money is spent.
You bought this new vehicle.
Unaware that your headset was modifying your environment, replacing different vehicles with this new vehicle.
People continue to believe that their thoughts are their own.
Advertising companies and mixed reality headset corporations continue to control consumer behavior and actions.</p>
<p>This scares me.
Please don&rsquo;t let this happen.
Let&rsquo;s keep this a dystopian fiction.</p>
]]></content:encoded></item><item><title>Senior Week</title><link>https://plug-world.com/microblog/senior-week/</link><pubDate>Sat, 20 May 2023 09:43:29 -0700</pubDate><guid>https://plug-world.com/microblog/senior-week/</guid><description>&lt;video autoplay loop playsinline controls&gt;
&lt;source src=https://plug-world.com/videos/senior-week/senior-week-av1.mp4 type='video/mp4;codecs="av01.0.05M.08,opus"'&gt;
&lt;source src=https://plug-world.com/videos/senior-week/senior-week-vp9.webm type='video/webm;codecs="vp9,opus"'&gt;
&lt;source src=https://plug-world.com/videos/senior-week/senior-week-h264.mp4 type="video/mp4"&gt;
Your browser does not support the video tag.
&lt;/video&gt;</description><content:encoded><![CDATA[




<video autoplay loop  playsinline controls>

<source src=https://plug-world.com/videos/senior-week/senior-week-av1.mp4 type='video/mp4;codecs="av01.0.05M.08,opus"'>


<source src=https://plug-world.com/videos/senior-week/senior-week-vp9.webm type='video/webm;codecs="vp9,opus"'>


<source src=https://plug-world.com/videos/senior-week/senior-week-h264.mp4 type="video/mp4">

Your browser does not support the video tag.
</video>

]]></content:encoded></item><item><title>Dino Park.</title><link>https://plug-world.com/microblog/dino-park/</link><pubDate>Mon, 15 May 2023 15:01:29 -0700</pubDate><guid>https://plug-world.com/microblog/dino-park/</guid><description>&lt;div style="width: 100%"&gt;
&lt;div style="position: relative; padding-bottom: 56.15%; height: 0; overflow: hidden; margin-bottom: 20px;"&gt;
&lt;iframe
style="position: absolute; top: 0; left:0; width: 100%; height: 100%; border: 0;"
loading="lazy";
srcdoc="&lt;style&gt;
* {
padding: 0;
margin: 0;
overflow: hidden;
}
body, html {
height: 100%;
}
img, svg {
position: absolute;
width: 100%;
top: 0;
bottom: 0;
margin: auto;
}
svg {
filter: drop-shadow(1px 1px 10px hsl(206.5, 70.7%, 8%));
transition: all 250ms ease-in-out;
}
body:hover svg {
filter: drop-shadow(1px 1px 10px hsl(206.5, 0%, 10%));
transform: scale(1.2);
}
&lt;/style&gt;
&lt;a href='https://www.youtube.com/embed/2hGHQLy44po?autoplay=1'&gt;
&lt;img src='https://img.youtube.com/vi/2hGHQLy44po/hqdefault.jpg'&gt;
&lt;svg xmlns='http://www.w3.org/2000/svg' width='64' height='64' viewBox='0 0 24 24' fill='none' stroke='#ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-play-circle'&gt;&lt;circle cx='12' cy='12' r='10'&gt;&lt;/circle&gt;&lt;polygon points='10 8 16 12 10 16 10 8'&gt;&lt;/polygon&gt;&lt;/svg&gt;
&lt;/a&gt;
"
src="https://www.youtube.com/embed/2hGHQLy44po"
title=""
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen&gt;
&lt;/iframe&gt;
&lt;/div&gt;
&lt;/div&gt;</description><content:encoded><![CDATA[

<div style="width: 100%">
<div style="position: relative; padding-bottom: 56.15%; height: 0; overflow: hidden; margin-bottom: 20px;">
  <iframe 
    style="position: absolute; top: 0; left:0; width: 100%; height: 100%; border: 0;"
    loading="lazy";
    srcdoc="<style>
      * {
      padding: 0;
      margin: 0;
      overflow: hidden;
      }
      body, html {
        height: 100%;
      }
      img, svg {
        position: absolute;
        width: 100%;
        top: 0;
        bottom: 0;
        margin: auto;
      }
      svg {
        filter: drop-shadow(1px 1px 10px hsl(206.5, 70.7%, 8%));
        transition: all 250ms ease-in-out;
      }
      body:hover svg {
        filter: drop-shadow(1px 1px 10px hsl(206.5, 0%, 10%));
        transform: scale(1.2);
      }
    </style>
    <a href='https://www.youtube.com/embed/2hGHQLy44po?autoplay=1'>
      <img src='https://img.youtube.com/vi/2hGHQLy44po/hqdefault.jpg'>
      <svg xmlns='http://www.w3.org/2000/svg' width='64' height='64' viewBox='0 0 24 24' fill='none' stroke='#ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-play-circle'><circle cx='12' cy='12' r='10'></circle><polygon points='10 8 16 12 10 16 10 8'></polygon></svg>
    </a>
    "
    src="https://www.youtube.com/embed/2hGHQLy44po" 
    title=""
    frameborder="0"
    allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" 
    allowfullscreen>
  </iframe>
</div>
</div>


]]></content:encoded></item><item><title>Prom 2023</title><link>https://plug-world.com/microblog/prom-2023/</link><pubDate>Mon, 17 Apr 2023 22:11:29 -0600</pubDate><guid>https://plug-world.com/microblog/prom-2023/</guid><description>&lt;p&gt;
&lt;p class="md__image"&gt;
&lt;img src="https://plug-world.com/images/microblog/prom-2023/unnamed.webp" alt="unnamed" /&gt;
&lt;/p&gt;
&lt;p class="md__image"&gt;
&lt;img src="https://plug-world.com/images/microblog/prom-2023/shoes.webp" alt="shoes" /&gt;
&lt;/p&gt;
&lt;p class="md__image"&gt;
&lt;img src="https://plug-world.com/images/microblog/prom-2023/group-pic.webp" alt="group-pic" /&gt;
&lt;/p&gt;
&lt;p class="md__image"&gt;
&lt;img src="https://plug-world.com/images/microblog/prom-2023/close-up.webp" alt="close-up" /&gt;
&lt;/p&gt;
&lt;p class="md__image"&gt;
&lt;img src="https://plug-world.com/images/microblog/prom-2023/carson.webp" alt="carson" /&gt;
&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;Prom was amazing with you Sarah!! Loved going to Fremont and Morgan&amp;rsquo;s prom with you 😁&lt;/p&gt;</description><content:encoded><![CDATA[<p>



<p class="md__image">
  <img src="/https/plug-world.com/images/microblog/prom-2023/unnamed.webp" alt="unnamed"  />
</p>






<p class="md__image">
  <img src="/https/plug-world.com/images/microblog/prom-2023/shoes.webp" alt="shoes"  />
</p>






<p class="md__image">
  <img src="/https/plug-world.com/images/microblog/prom-2023/group-pic.webp" alt="group-pic"  />
</p>






<p class="md__image">
  <img src="/https/plug-world.com/images/microblog/prom-2023/close-up.webp" alt="close-up"  />
</p>






<p class="md__image">
  <img src="/https/plug-world.com/images/microblog/prom-2023/carson.webp" alt="carson"  />
</p>

</p>
<p>Prom was amazing with you Sarah!! Loved going to Fremont and Morgan&rsquo;s prom with you 😁</p>
]]></content:encoded></item><item><title>Chimera OS GPD Win 2 Display Orientation Issue</title><link>https://plug-world.com/posts/chimera-os-gpd-win2-display-orientation-issue/</link><pubDate>Tue, 11 Apr 2023 17:58:06 -0600</pubDate><guid>https://plug-world.com/posts/chimera-os-gpd-win2-display-orientation-issue/</guid><description>&lt;p&gt;Solution is to edit the gamescope config, and not the steam-os-compositor-plus config, as the docs on Github are out of date.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;~/.config/environment.d/gamescope-session.conf&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;With the following config&amp;hellip;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00688b"&gt;SCREEN_HEIGHT&lt;/span&gt;=&lt;span style="color:#b452cd"&gt;720&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00688b"&gt;SCREEN_WIDTH&lt;/span&gt;=&lt;span style="color:#b452cd"&gt;1280&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00688b"&gt;STEAMCMD&lt;/span&gt;=&lt;span style="color:#cd5555"&gt;&amp;#34;steam -steamos -pipewire-dmabuf -gamepadui&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00688b"&gt;GAMESCOPECMD&lt;/span&gt;=&lt;span style="color:#cd5555"&gt;&amp;#34;gamescope -e --xwayland-count 2 -O *,eDP-1 -f --force-orientation right&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description><content:encoded><![CDATA[<p>Solution is to edit the gamescope config, and not the steam-os-compositor-plus config, as the docs on Github are out of date.</p>
<p><code>~/.config/environment.d/gamescope-session.conf</code></p>
<p>With the following config&hellip;</p>
<div class="highlight"><pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#00688b">SCREEN_HEIGHT</span>=<span style="color:#b452cd">720</span>
</span></span><span style="display:flex;"><span><span style="color:#00688b">SCREEN_WIDTH</span>=<span style="color:#b452cd">1280</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#00688b">STEAMCMD</span>=<span style="color:#cd5555">&#34;steam -steamos -pipewire-dmabuf -gamepadui&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#00688b">GAMESCOPECMD</span>=<span style="color:#cd5555">&#34;gamescope -e --xwayland-count 2 -O *,eDP-1 -f --force-orientation right&#34;</span>
</span></span></code></pre></div>]]></content:encoded></item><item><title>St. George Spring Break (Short)</title><link>https://plug-world.com/microblog/st-george-spring-break-short/</link><pubDate>Fri, 07 Apr 2023 12:12:18 -0600</pubDate><guid>https://plug-world.com/microblog/st-george-spring-break-short/</guid><description>&lt;video autoplay loop playsinline controls&gt;
&lt;source src=https://plug-world.com/videos/st-george-spring-break/st-george-av1.mp4 type='video/mp4;codecs="av01.0.05M.08,opus"'&gt;
&lt;source src=https://plug-world.com/videos/st-george-spring-break/st-george-vp9.webm type='video/webm;codecs="vp9,opus"'&gt;
&lt;source src=https://plug-world.com/videos/st-george-spring-break/st-george-h264.mp4 type="video/mp4"&gt;
Your browser does not support the video tag.
&lt;/video&gt;
&lt;p&gt;St. George was super fun!&lt;/p&gt;
&lt;p&gt;Didn&amp;rsquo;t have access to a computer, so edited the video on my phone.
Super messy, but it turned out okay.&lt;/p&gt;</description><content:encoded><![CDATA[




<video autoplay loop  playsinline controls>

<source src=https://plug-world.com/videos/st-george-spring-break/st-george-av1.mp4 type='video/mp4;codecs="av01.0.05M.08,opus"'>


<source src=https://plug-world.com/videos/st-george-spring-break/st-george-vp9.webm type='video/webm;codecs="vp9,opus"'>


<source src=https://plug-world.com/videos/st-george-spring-break/st-george-h264.mp4 type="video/mp4">

Your browser does not support the video tag.
</video>

<p>St. George was super fun!</p>
<p>Didn&rsquo;t have access to a computer, so edited the video on my phone.
Super messy, but it turned out okay.</p>
]]></content:encoded></item><item><title>Filter Profanity in Videos</title><link>https://plug-world.com/posts/filter-profanity-in-videos/</link><pubDate>Fri, 10 Mar 2023 11:09:18 -0700</pubDate><guid>https://plug-world.com/posts/filter-profanity-in-videos/</guid><description>&lt;p&gt;By using a shell script from my github repository &lt;a href="https://github.com/HelamanWarrior/swears-begone"&gt;swears-begone&lt;/a&gt; you can filter swearing from your videos.&lt;/p&gt;
&lt;p&gt;After installing the dependencies and downloading the script, you can run the script.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;usage: ./clean-video &amp;lt;input video&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This script utilizes a modified version of OpenAI whispered that can generate timestamps between each word.
It outputs a subtitle &lt;code&gt;srt&lt;/code&gt; file which is sent to &lt;a href="https://github.com/mmguero/cleanvid"&gt;cleanvid&lt;/a&gt; that handles muting the profanity.
By utilizing the timestamps created by &lt;a href="https://github.com/linto-ai/whisper-timestamped"&gt;whisper-timestamped&lt;/a&gt; cleanvid can find the exact location cursing is present and mute the word.&lt;/p&gt;</description><content:encoded><![CDATA[<p>By using a shell script from my github repository <a href="https://github.com/HelamanWarrior/swears-begone">swears-begone</a> you can filter swearing from your videos.</p>
<p>After installing the dependencies and downloading the script, you can run the script.</p>
<pre tabindex="0"><code>usage: ./clean-video &lt;input video&gt;
</code></pre><p>This script utilizes a modified version of OpenAI whispered that can generate timestamps between each word.
It outputs a subtitle <code>srt</code> file which is sent to <a href="https://github.com/mmguero/cleanvid">cleanvid</a> that handles muting the profanity.
By utilizing the timestamps created by <a href="https://github.com/linto-ai/whisper-timestamped">whisper-timestamped</a> cleanvid can find the exact location cursing is present and mute the word.</p>
]]></content:encoded></item><item><title>Use Boring Technology</title><link>https://plug-world.com/posts/use-boring-technology/</link><pubDate>Wed, 22 Feb 2023 21:58:56 -0700</pubDate><guid>https://plug-world.com/posts/use-boring-technology/</guid><description>&lt;p&gt;I stumbled upon this article a while back, &lt;a href="https://mcfunley.com/choose-boring-technology"&gt;Choose Boring Technology&lt;/a&gt;.
And I&amp;rsquo;ve been indirectly thinking about it ever since.&lt;/p&gt;
&lt;p&gt;The words &amp;ldquo;use boring technology&amp;rdquo; just stuck with me.
Every now and then I would think back to this article.
Vaguely remembering the contents, but just that phrase.
A phrase that isn&amp;rsquo;t present in the original article.
An idea that&amp;rsquo;s been molded and developed in the back of my head overtime.
Whenever I would come across new technology and implement it some way, I tend to come back to this idea.
An idea that seemed to say &amp;ldquo;I told you so,&amp;rdquo; everytime I hit a roadblock with new cutting-edge technology.&lt;/p&gt;</description><content:encoded><![CDATA[<p>I stumbled upon this article a while back, <a href="https://mcfunley.com/choose-boring-technology">Choose Boring Technology</a>.
And I&rsquo;ve been indirectly thinking about it ever since.</p>
<p>The words &ldquo;use boring technology&rdquo; just stuck with me.
Every now and then I would think back to this article.
Vaguely remembering the contents, but just that phrase.
A phrase that isn&rsquo;t present in the original article.
An idea that&rsquo;s been molded and developed in the back of my head overtime.
Whenever I would come across new technology and implement it some way, I tend to come back to this idea.
An idea that seemed to say &ldquo;I told you so,&rdquo; everytime I hit a roadblock with new cutting-edge technology.</p>
<p>Over time I&rsquo;ve noticed a correlation between the ideas of &ldquo;use boring technology&rdquo; and &ldquo;keep it simple stupid.&rdquo;
With the emergence and adoption of new technologies complexity is magnified and results in exhausive maintenance.</p>
<p>I&rsquo;m not here to say that the way that the way you use technology is bad.
I personally believe that the way you choose to use technology and what you find works is best for you.
Too often I see people trying to push others away from using a specific application or technology in favor for another.
&ldquo;Why use x when you can use y?&rdquo;
It&rsquo;s understandable if they are simply trying to help them find something better.
But if a user is more happy and comfortable using something like Apple Notes instead of Notion, why should you try to force them?
Some people perfer the minimalism and lack of features that a software provides.
While others perfer the flexilibility and feature rich software and may explore those options.
Sometimes people are just comfortable with that technology and they are perfectly satisfied with what they can do with it.</p>
<p>One day I noticed one of my teachers organizing all their work in physical folders with papers all layed out on a table.
I was intrigued.
Everything nowdays is online, and most people have migrated to that workflow.
Seeing a fully physical workflow was a refresher to me.
As online workflows are very much the same, and offer emulated replicas of the physical counterparts.
She made a comment about how she looked really messy and that she&rsquo;s aware that she can do this all on the computer.
I replied saying that it&rsquo;s totally okay if that works best for you.
Why take the time migrating the workflow to the computer if you are perfectly content with the current physical workflow?
Sure someone may come across and say&hellip;</p>
<blockquote>
<p>Just scan and OCR all your documents that way you can index them digitally and search through them quickly.</p>
</blockquote>
<p>But sometimes it isn&rsquo;t worth the extra effort.
Even if on paper, it looks like a better option.
If the current workflow works just fine right now, why would I need to go through the extra effort to fix it?</p>
<p>It reminds me when I had an issue with a Samsung TV and motion smoothing.
Motion smoothing interpolates the motion and gives movies smoother movement.
As a result of this technology several artifacts on the picture are made, and the pacing of the movement is often lost.
With this knowledge I explicitly disabled all motion smoothing settings on the TV.
I was very happy with the result as the TV wasn&rsquo;t post processing the image anymore.
But I later found that playing any 4k file, I would run into the issue of the TV continuing to motion smooth, despite the settings that explicitly disable it.
I planned on watching Puss in Boots: The Last Wish as a family.
That film contains several animated elements that are at low framerates which would be ruined through motion smoothing.
I had the 4k file loaded and I spent a large amount of my time researching this 4k motion smoothing issue.
After wasting even more time trying to get the TV to boot into service mode, I decided I needed to find another solution.
I then proceeded to download a 1080p version of the movie&ndash;<em>don&rsquo;t worry we bought and own the movie</em>&ndash;to ensure that motion smoothing isn&rsquo;t applied.
And it was as simple as that; the movie looked great and motion smoothing wasn&rsquo;t present.</p>
<p>So why?
Why did I waste my time?
I was so fixated on playing back a 4K file and having this motion smoothing setting disabled, I wasted so much of my time.
And the same phrase came to me, &ldquo;use boring technology.&rdquo;
Instead of trying to go in the complex service mode settings of the TV, I could&rsquo;ve played a 1080p version of the movie.
But that&rsquo;s boring, and that&rsquo;s the point.
So often I am fixated on small technical details in the underlying technology that don&rsquo;t matter.
I build these emotional reactions to these technical details, that if I didn&rsquo;t know were there I would miss.
It&rsquo;s time to change.
I need to stop caring so much for the more technically superior solution and just use the easiest route.
More often than not the easiest route is the best, and not initially following that route leads to regret.</p>
<p>There&rsquo;s a million other ways this phrase applies to everything I do.
I cannot express into words the many ways I have seen this in my life.
But I can express it&rsquo;s importance and significance.
I hope that the future me or you finds this helpful.
Continue to &ldquo;use boring technology.&rdquo;</p>
]]></content:encoded></item><item><title>Samsung Q9fn motion smoothing 4k HDR content</title><link>https://plug-world.com/posts/samsung-q9fn-motion-smooths-4k-hdr-content/</link><pubDate>Sat, 18 Feb 2023 18:02:34 -0600</pubDate><guid>https://plug-world.com/posts/samsung-q9fn-motion-smooths-4k-hdr-content/</guid><description>&lt;p&gt;Samsung Q9FN motion smooths 4k/HDR content despite being disabled in settings.&lt;/p&gt;
&lt;p&gt;Solution: &lt;strong&gt;While playing HDR content&lt;/strong&gt;, go into the TV settings, it should show that the picture is in HDR mode.
Click on the settings button, go to expert picture settings, and disable the motion smoothing settings.
The TV has separate settings for SDR and HDR content.
Disabling the settings for SDR content doesn&amp;rsquo;t disable for HDR.
Wish I would&amp;rsquo;ve thought of this earlier.
Hope this helps!&lt;/p&gt;</description><content:encoded><![CDATA[<p>Samsung Q9FN motion smooths 4k/HDR content despite being disabled in settings.</p>
<p>Solution: <strong>While playing HDR content</strong>, go into the TV settings, it should show that the picture is in HDR mode.
Click on the settings button, go to expert picture settings, and disable the motion smoothing settings.
The TV has separate settings for SDR and HDR content.
Disabling the settings for SDR content doesn&rsquo;t disable for HDR.
Wish I would&rsquo;ve thought of this earlier.
Hope this helps!</p>
]]></content:encoded></item><item><title>Insta360 Studio on Linux</title><link>https://plug-world.com/posts/insta360-studio-on-linux/</link><pubDate>Sun, 12 Feb 2023 11:29:06 -0700</pubDate><guid>https://plug-world.com/posts/insta360-studio-on-linux/</guid><description>&lt;ol&gt;
&lt;li&gt;Download &lt;a href="https://www.insta360.com/download"&gt;Insta360 Studio&lt;/a&gt; :P&lt;/li&gt;
&lt;li&gt;Run through the Insta360 Studio installer in &lt;a href="https://www.winehq.org/"&gt;Wine&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Install &lt;a href="https://github.com/GloriousEggroll/proton-ge-custom"&gt;Proton GE&lt;/a&gt; you can either do this through &lt;a href="https://lutris.net/"&gt;Lutris&lt;/a&gt; or a &lt;a href="https://github.com/GloriousEggroll/proton-ge-custom#installation"&gt;manual install&lt;/a&gt;.
&lt;ul&gt;
&lt;li&gt;Proton GE is required for the videos to properly load inside the app.&lt;/li&gt;
&lt;li&gt;In Lutris if you press the package button next to Wine you can select &amp;ldquo;lutris-GE-Proton&amp;rdquo; to be installed.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;In Lutris click the &lt;strong&gt;+&lt;/strong&gt; button to add a new game.&lt;/li&gt;
&lt;li&gt;You can name it &amp;ldquo;Insta360 Studio&amp;rdquo; and set the runner to Wine.&lt;/li&gt;
&lt;li&gt;In Game options, set the executable to &lt;code&gt;~/.wine/drive_c/Program Files/Insta360 Studio 20XX/Insta360 Studio 20XX.exe&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;Replace &amp;ldquo;XX&amp;rdquo; with the current year.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;In Runner options, set &amp;ldquo;Wine version&amp;rdquo; to Proton.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now you can run Insta360 Studio through Lutris and it should work.
If the app freezes at startup, simply kill it and run it again.&lt;/p&gt;</description><content:encoded><![CDATA[<ol>
<li>Download <a href="https://www.insta360.com/download">Insta360 Studio</a> :P</li>
<li>Run through the Insta360 Studio installer in <a href="https://www.winehq.org/">Wine</a>.</li>
<li>Install <a href="https://github.com/GloriousEggroll/proton-ge-custom">Proton GE</a> you can either do this through <a href="https://lutris.net/">Lutris</a> or a <a href="https://github.com/GloriousEggroll/proton-ge-custom#installation">manual install</a>.
<ul>
<li>Proton GE is required for the videos to properly load inside the app.</li>
<li>In Lutris if you press the package button next to Wine you can select &ldquo;lutris-GE-Proton&rdquo; to be installed.</li>
</ul>
</li>
<li>In Lutris click the <strong>+</strong> button to add a new game.</li>
<li>You can name it &ldquo;Insta360 Studio&rdquo; and set the runner to Wine.</li>
<li>In Game options, set the executable to <code>~/.wine/drive_c/Program Files/Insta360 Studio 20XX/Insta360 Studio 20XX.exe</code>
<ul>
<li>Replace &ldquo;XX&rdquo; with the current year.</li>
</ul>
</li>
<li>In Runner options, set &ldquo;Wine version&rdquo; to Proton.</li>
</ol>
<p>Now you can run Insta360 Studio through Lutris and it should work.
If the app freezes at startup, simply kill it and run it again.</p>
]]></content:encoded></item><item><title>Minecraft Splitscreen Co-op on Steam Deck</title><link>https://plug-world.com/posts/minecraft-splitscreen-co-op-on-steam-deck/</link><pubDate>Sun, 08 Jan 2023 18:13:19 -0700</pubDate><guid>https://plug-world.com/posts/minecraft-splitscreen-co-op-on-steam-deck/</guid><description>&lt;p&gt;
&lt;p class="md__image"&gt;
&lt;img src="https://plug-world.com/images/posts/minecraft-splitscreen-steam-deck/minecraft-split-screen-steam-deck.webp" alt="splitscreen-screenshot" /&gt;
&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;This is the PS3 version of Minecraft running on the Steam Deck.
Currently I get around 40-60 fps while playing with 2 players without any tweaks.&lt;/p&gt;
&lt;p&gt;Why emulate?
Because the native Linux version of Minecraft doesn&amp;rsquo;t support splitscreen co-op.
I opted for the PS3 version because the Nintendo Switch version kept crashing.&lt;/p&gt;
&lt;h2 id="setup-guide"&gt;Setup Guide&lt;/h2&gt;
&lt;p&gt;Install &lt;a href="https://www.emudeck.com"&gt;EmuDeck&lt;/a&gt;, if you haven&amp;rsquo;t already.
This will setup all the emulators and their configurations automatically.&lt;/p&gt;</description><content:encoded><![CDATA[<p>



<p class="md__image">
  <img src="/https/plug-world.com/images/posts/minecraft-splitscreen-steam-deck/minecraft-split-screen-steam-deck.webp" alt="splitscreen-screenshot"  />
</p>

</p>
<p>This is the PS3 version of Minecraft running on the Steam Deck.
Currently I get around 40-60 fps while playing with 2 players without any tweaks.</p>
<p>Why emulate?
Because the native Linux version of Minecraft doesn&rsquo;t support splitscreen co-op.
I opted for the PS3 version because the Nintendo Switch version kept crashing.</p>
<h2 id="setup-guide">Setup Guide</h2>
<p>Install <a href="https://www.emudeck.com">EmuDeck</a>, if you haven&rsquo;t already.
This will setup all the emulators and their configurations automatically.</p>
<p>In order to emulate the PS3 we will be using <a href="https://rpcs3.net">RPCS3</a>.
Put your Minecraft Playstation 3 ROM in <code>~/Emulation/roms/ps3</code></p>
<p>



<p class="md__image">
  <img src="/https/plug-world.com/images/posts/minecraft-splitscreen-steam-deck/game-rom-location.webp" alt="game-rom-location"  />
</p>

</p>
<p>If your rom is a directory with multiple files, then place the directory in the ps3 folder and add <code>.ps3dir</code> to the folder name.</p>
<p>Once you added your rom, launch the <code>RPCS3</code> emulator.
Then in the emulator, in the top left corner press the open button with the folder icon.
Navigate to your game directory <code>~/Emulation/roms/ps3</code>
Select your minecraft folder and then press ok.</p>
<p>You should see Minecraft in the emulator.
Launch the game.
You may see a popup asking to locate the <code>PS3UPDAT.PUP</code> file.
Search for this PS3 firmware file on the internet and download it.
Then select that firmware in the emulator and install it.</p>
<p>Now you should be able to launch and load the game.
You&rsquo;ll notice your controllers aren&rsquo;t working, this is normal, because the Steam Deck is in <code>desktop mode</code>, steam input doesn&rsquo;t work the same.</p>
<p>The solution is to launch the game in <code>game mode</code>.</p>
<h3 id="adding-minecraft-to-steam">Adding Minecraft to Steam</h3>
<p>We need to add a shortcut to the game on Steam that way you can launch it in game mode.
Luckly, with Emudeck installed you can use <a href="https://steamgriddb.github.io/steam-rom-manager/">Steam ROM Manager</a> to automatically grab the metadata and add the game to Steam.</p>
<ol>
<li>Click on the Emudeck launcher on the desktop.</li>
<li>Once EmuDeck launches, click on &ldquo;Tools &amp; stuff&rdquo; in the bottom right.</li>
<li>Then select &ldquo;SteamRomManager.&rdquo;</li>
<li>Click Yes, when it asks to exit steam and launch.</li>
<li>Click Preview in the top left.</li>
<li>Press &ldquo;Generate app list&rdquo; in the bottom left.</li>
<li>Press &ldquo;Save app list&rdquo;</li>
</ol>
<p>After it&rsquo;s saved you can close Steam ROM Manager and Emudeck.
You can then Return to Gaming Mode.
Then you can find the game under Non-Steam games.</p>
<p>



<p class="md__image">
  <img src="/https/plug-world.com/images/posts/minecraft-splitscreen-steam-deck/game-on-homescreen.jpg" alt="minecraft-on-home-screen"  />
</p>

</p>
<p>And boom, you can launch the game and play split-screen co-op with multiple controllers.
It will ask if you want to use a profile when a player joins, just hit B and they will join as guests.
Don&rsquo;t worry even as a guest your save data persists.</p>
<h3 id="minor-tweaks-and-fixes">Minor Tweaks and Fixes</h3>
<p>To fix the audio lag and stuttering, in RPCS3 goto <strong>configuration -&gt; Audio and enable Time Stretching</strong>.</p>
]]></content:encoded></item><item><title>Glacier Trip</title><link>https://plug-world.com/microblog/glacier-trip/</link><pubDate>Fri, 30 Dec 2022 10:29:12 -0700</pubDate><guid>https://plug-world.com/microblog/glacier-trip/</guid><description>&lt;div style="width: 100%"&gt;
&lt;div style="position: relative; padding-bottom: 56.15%; height: 0; overflow: hidden; margin-bottom: 20px;"&gt;
&lt;iframe
style="position: absolute; top: 0; left:0; width: 100%; height: 100%; border: 0;"
loading="lazy";
srcdoc="&lt;style&gt;
* {
padding: 0;
margin: 0;
overflow: hidden;
}
body, html {
height: 100%;
}
img, svg {
position: absolute;
width: 100%;
top: 0;
bottom: 0;
margin: auto;
}
svg {
filter: drop-shadow(1px 1px 10px hsl(206.5, 70.7%, 8%));
transition: all 250ms ease-in-out;
}
body:hover svg {
filter: drop-shadow(1px 1px 10px hsl(206.5, 0%, 10%));
transform: scale(1.2);
}
&lt;/style&gt;
&lt;a href='https://www.youtube.com/embed/RANZHL8IyU4?autoplay=1'&gt;
&lt;img src='https://img.youtube.com/vi/RANZHL8IyU4/hqdefault.jpg'&gt;
&lt;svg xmlns='http://www.w3.org/2000/svg' width='64' height='64' viewBox='0 0 24 24' fill='none' stroke='#ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-play-circle'&gt;&lt;circle cx='12' cy='12' r='10'&gt;&lt;/circle&gt;&lt;polygon points='10 8 16 12 10 16 10 8'&gt;&lt;/polygon&gt;&lt;/svg&gt;
&lt;/a&gt;
"
src="https://www.youtube.com/embed/RANZHL8IyU4"
title=""
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen&gt;
&lt;/iframe&gt;
&lt;/div&gt;
&lt;/div&gt;</description><content:encoded><![CDATA[

<div style="width: 100%">
<div style="position: relative; padding-bottom: 56.15%; height: 0; overflow: hidden; margin-bottom: 20px;">
  <iframe 
    style="position: absolute; top: 0; left:0; width: 100%; height: 100%; border: 0;"
    loading="lazy";
    srcdoc="<style>
      * {
      padding: 0;
      margin: 0;
      overflow: hidden;
      }
      body, html {
        height: 100%;
      }
      img, svg {
        position: absolute;
        width: 100%;
        top: 0;
        bottom: 0;
        margin: auto;
      }
      svg {
        filter: drop-shadow(1px 1px 10px hsl(206.5, 70.7%, 8%));
        transition: all 250ms ease-in-out;
      }
      body:hover svg {
        filter: drop-shadow(1px 1px 10px hsl(206.5, 0%, 10%));
        transform: scale(1.2);
      }
    </style>
    <a href='https://www.youtube.com/embed/RANZHL8IyU4?autoplay=1'>
      <img src='https://img.youtube.com/vi/RANZHL8IyU4/hqdefault.jpg'>
      <svg xmlns='http://www.w3.org/2000/svg' width='64' height='64' viewBox='0 0 24 24' fill='none' stroke='#ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-play-circle'><circle cx='12' cy='12' r='10'></circle><polygon points='10 8 16 12 10 16 10 8'></polygon></svg>
    </a>
    "
    src="https://www.youtube.com/embed/RANZHL8IyU4" 
    title=""
    frameborder="0"
    allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" 
    allowfullscreen>
  </iframe>
</div>
</div>


]]></content:encoded></item><item><title>English Documentary</title><link>https://plug-world.com/microblog/english-documentary/</link><pubDate>Mon, 19 Dec 2022 20:27:15 -0700</pubDate><guid>https://plug-world.com/microblog/english-documentary/</guid><description>&lt;div style="width: 100%"&gt;
&lt;div style="position: relative; padding-bottom: 56.15%; height: 0; overflow: hidden; margin-bottom: 20px;"&gt;
&lt;iframe
style="position: absolute; top: 0; left:0; width: 100%; height: 100%; border: 0;"
loading="lazy";
srcdoc="&lt;style&gt;
* {
padding: 0;
margin: 0;
overflow: hidden;
}
body, html {
height: 100%;
}
img, svg {
position: absolute;
width: 100%;
top: 0;
bottom: 0;
margin: auto;
}
svg {
filter: drop-shadow(1px 1px 10px hsl(206.5, 70.7%, 8%));
transition: all 250ms ease-in-out;
}
body:hover svg {
filter: drop-shadow(1px 1px 10px hsl(206.5, 0%, 10%));
transform: scale(1.2);
}
&lt;/style&gt;
&lt;a href='https://www.youtube.com/embed/QXFNIH6Ws6g?autoplay=1'&gt;
&lt;img src='https://img.youtube.com/vi/QXFNIH6Ws6g/hqdefault.jpg'&gt;
&lt;svg xmlns='http://www.w3.org/2000/svg' width='64' height='64' viewBox='0 0 24 24' fill='none' stroke='#ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-play-circle'&gt;&lt;circle cx='12' cy='12' r='10'&gt;&lt;/circle&gt;&lt;polygon points='10 8 16 12 10 16 10 8'&gt;&lt;/polygon&gt;&lt;/svg&gt;
&lt;/a&gt;
"
src="https://www.youtube.com/embed/QXFNIH6Ws6g"
title=""
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen&gt;
&lt;/iframe&gt;
&lt;/div&gt;
&lt;/div&gt;</description><content:encoded><![CDATA[

<div style="width: 100%">
<div style="position: relative; padding-bottom: 56.15%; height: 0; overflow: hidden; margin-bottom: 20px;">
  <iframe 
    style="position: absolute; top: 0; left:0; width: 100%; height: 100%; border: 0;"
    loading="lazy";
    srcdoc="<style>
      * {
      padding: 0;
      margin: 0;
      overflow: hidden;
      }
      body, html {
        height: 100%;
      }
      img, svg {
        position: absolute;
        width: 100%;
        top: 0;
        bottom: 0;
        margin: auto;
      }
      svg {
        filter: drop-shadow(1px 1px 10px hsl(206.5, 70.7%, 8%));
        transition: all 250ms ease-in-out;
      }
      body:hover svg {
        filter: drop-shadow(1px 1px 10px hsl(206.5, 0%, 10%));
        transform: scale(1.2);
      }
    </style>
    <a href='https://www.youtube.com/embed/QXFNIH6Ws6g?autoplay=1'>
      <img src='https://img.youtube.com/vi/QXFNIH6Ws6g/hqdefault.jpg'>
      <svg xmlns='http://www.w3.org/2000/svg' width='64' height='64' viewBox='0 0 24 24' fill='none' stroke='#ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-play-circle'><circle cx='12' cy='12' r='10'></circle><polygon points='10 8 16 12 10 16 10 8'></polygon></svg>
    </a>
    "
    src="https://www.youtube.com/embed/QXFNIH6Ws6g" 
    title=""
    frameborder="0"
    allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" 
    allowfullscreen>
  </iframe>
</div>
</div>


]]></content:encoded></item><item><title>Ubuntu ACPI Errors Prevent Boot Fix</title><link>https://plug-world.com/posts/acpi-errors-prevent-boot/</link><pubDate>Tue, 06 Dec 2022 15:26:18 -0700</pubDate><guid>https://plug-world.com/posts/acpi-errors-prevent-boot/</guid><description>&lt;p&gt;After installing Kubuntu on my laptop I ran into a ton of ACPI errors upon boot.
Kubuntu managed to install most of the Nvidia packages related to xorg and optimus.
But it failed to install the main nvidia-driver component.
This leads to ACPI errors and a unbootable OS.&lt;/p&gt;
&lt;h2 id="solution"&gt;Solution:&lt;/h2&gt;
&lt;p&gt;TLDR: Launch into recovery mode, install Nvidia gpu drivers.&lt;/p&gt;
&lt;h3 id="launching-in-recovery-mode"&gt;Launching in recovery mode:&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;In grub select Advanced Ubuntu options.&lt;/li&gt;
&lt;li&gt;Launch the latest Ubuntu recovery image.&lt;/li&gt;
&lt;li&gt;Then proceed to launch the OS.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You will find that Ubuntu launches like normal without ACPI errors.
This is only temporary, you will find that screen brightness and many other hardware related functions won&amp;rsquo;t work.&lt;/p&gt;</description><content:encoded><![CDATA[<p>After installing Kubuntu on my laptop I ran into a ton of ACPI errors upon boot.
Kubuntu managed to install most of the Nvidia packages related to xorg and optimus.
But it failed to install the main nvidia-driver component.
This leads to ACPI errors and a unbootable OS.</p>
<h2 id="solution">Solution:</h2>
<p>TLDR: Launch into recovery mode, install Nvidia gpu drivers.</p>
<h3 id="launching-in-recovery-mode">Launching in recovery mode:</h3>
<ol>
<li>In grub select Advanced Ubuntu options.</li>
<li>Launch the latest Ubuntu recovery image.</li>
<li>Then proceed to launch the OS.</li>
</ol>
<p>You will find that Ubuntu launches like normal without ACPI errors.
This is only temporary, you will find that screen brightness and many other hardware related functions won&rsquo;t work.</p>
<h3 id="installing-nvidia-drivers">Installing Nvidia drivers</h3>
<p>Launch the terminal.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>ubuntu-drivers devices
</span></span></code></pre></div><p>Then install the recommended nonfree Nvidia driver.</p>
<p><code>sudo apt-get install nvidia-driver-XXX</code></p>
]]></content:encoded></item><item><title>Uncle Bob's Cabin</title><link>https://plug-world.com/microblog/uncle-bobs-cabin/</link><pubDate>Sat, 19 Nov 2022 13:51:46 -0700</pubDate><guid>https://plug-world.com/microblog/uncle-bobs-cabin/</guid><description>&lt;div style="width: 100%"&gt;
&lt;div style="position: relative; padding-bottom: 56.15%; height: 0; overflow: hidden; margin-bottom: 20px;"&gt;
&lt;iframe
style="position: absolute; top: 0; left:0; width: 100%; height: 100%; border: 0;"
loading="lazy";
srcdoc="&lt;style&gt;
* {
padding: 0;
margin: 0;
overflow: hidden;
}
body, html {
height: 100%;
}
img, svg {
position: absolute;
width: 100%;
top: 0;
bottom: 0;
margin: auto;
}
svg {
filter: drop-shadow(1px 1px 10px hsl(206.5, 70.7%, 8%));
transition: all 250ms ease-in-out;
}
body:hover svg {
filter: drop-shadow(1px 1px 10px hsl(206.5, 0%, 10%));
transform: scale(1.2);
}
&lt;/style&gt;
&lt;a href='https://www.youtube.com/embed/HjU11kgaP5Y?autoplay=1'&gt;
&lt;img src='https://img.youtube.com/vi/HjU11kgaP5Y/hqdefault.jpg'&gt;
&lt;svg xmlns='http://www.w3.org/2000/svg' width='64' height='64' viewBox='0 0 24 24' fill='none' stroke='#ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-play-circle'&gt;&lt;circle cx='12' cy='12' r='10'&gt;&lt;/circle&gt;&lt;polygon points='10 8 16 12 10 16 10 8'&gt;&lt;/polygon&gt;&lt;/svg&gt;
&lt;/a&gt;
"
src="https://www.youtube.com/embed/HjU11kgaP5Y"
title=""
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen&gt;
&lt;/iframe&gt;
&lt;/div&gt;
&lt;/div&gt;</description><content:encoded><![CDATA[

<div style="width: 100%">
<div style="position: relative; padding-bottom: 56.15%; height: 0; overflow: hidden; margin-bottom: 20px;">
  <iframe 
    style="position: absolute; top: 0; left:0; width: 100%; height: 100%; border: 0;"
    loading="lazy";
    srcdoc="<style>
      * {
      padding: 0;
      margin: 0;
      overflow: hidden;
      }
      body, html {
        height: 100%;
      }
      img, svg {
        position: absolute;
        width: 100%;
        top: 0;
        bottom: 0;
        margin: auto;
      }
      svg {
        filter: drop-shadow(1px 1px 10px hsl(206.5, 70.7%, 8%));
        transition: all 250ms ease-in-out;
      }
      body:hover svg {
        filter: drop-shadow(1px 1px 10px hsl(206.5, 0%, 10%));
        transform: scale(1.2);
      }
    </style>
    <a href='https://www.youtube.com/embed/HjU11kgaP5Y?autoplay=1'>
      <img src='https://img.youtube.com/vi/HjU11kgaP5Y/hqdefault.jpg'>
      <svg xmlns='http://www.w3.org/2000/svg' width='64' height='64' viewBox='0 0 24 24' fill='none' stroke='#ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-play-circle'><circle cx='12' cy='12' r='10'></circle><polygon points='10 8 16 12 10 16 10 8'></polygon></svg>
    </a>
    "
    src="https://www.youtube.com/embed/HjU11kgaP5Y" 
    title=""
    frameborder="0"
    allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" 
    allowfullscreen>
  </iframe>
</div>
</div>


]]></content:encoded></item><item><title>Sadies</title><link>https://plug-world.com/microblog/sadies/</link><pubDate>Mon, 14 Nov 2022 15:01:29 -0700</pubDate><guid>https://plug-world.com/microblog/sadies/</guid><description>&lt;video autoplay loop playsinline controls&gt;
&lt;source src=https://plug-world.com/videos/sadies-video/sadies-video-av1.mp4 type='video/mp4;codecs="av01.0.05M.08,opus"'&gt;
&lt;source src=https://plug-world.com/videos/sadies-video/sadies-video-vp9.webm type='video/webm;codecs="vp9,opus"'&gt;
&lt;source src=https://plug-world.com/videos/sadies-video/sadies-video-h264.mp4 type="video/mp4"&gt;
Your browser does not support the video tag.
&lt;/video&gt;
&lt;p&gt;Sadies was a blast with you Hailee!! 😁&lt;/p&gt;</description><content:encoded><![CDATA[




<video autoplay loop  playsinline controls>

<source src=https://plug-world.com/videos/sadies-video/sadies-video-av1.mp4 type='video/mp4;codecs="av01.0.05M.08,opus"'>


<source src=https://plug-world.com/videos/sadies-video/sadies-video-vp9.webm type='video/webm;codecs="vp9,opus"'>


<source src=https://plug-world.com/videos/sadies-video/sadies-video-h264.mp4 type="video/mp4">

Your browser does not support the video tag.
</video>

<p>Sadies was a blast with you Hailee!! 😁</p>
]]></content:encoded></item><item><title>Happiness</title><link>https://plug-world.com/journal/happiness/</link><pubDate>Sun, 30 Oct 2022 09:12:35 -0600</pubDate><guid>https://plug-world.com/journal/happiness/</guid><description>&lt;p&gt;Don&amp;rsquo;t wait for tomorrow to be happy.
Often we think if only I had a new car, or a new phone, or got a new house, than I&amp;rsquo;ll be happy.
Maybe you recieve a short burst of temporary happiness.
But in the end you will still find yourself unhappy.
Happiness is a choice.
You can find happiness in the most unlikely places.
You can be the richest person in the world and still be unhappy.
People with almost nothing may still be more rich with happiness than you.
Your circumstances have little impact on happiness.
Don&amp;rsquo;t look to tomorrow to be happy&amp;hellip; be happy today.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Don&rsquo;t wait for tomorrow to be happy.
Often we think if only I had a new car, or a new phone, or got a new house, than I&rsquo;ll be happy.
Maybe you recieve a short burst of temporary happiness.
But in the end you will still find yourself unhappy.
Happiness is a choice.
You can find happiness in the most unlikely places.
You can be the richest person in the world and still be unhappy.
People with almost nothing may still be more rich with happiness than you.
Your circumstances have little impact on happiness.
Don&rsquo;t look to tomorrow to be happy&hellip; be happy today.</p>
]]></content:encoded></item><item><title>Values</title><link>https://plug-world.com/journal/values/</link><pubDate>Tue, 25 Oct 2022 17:58:35 -0600</pubDate><guid>https://plug-world.com/journal/values/</guid><description>&lt;p&gt;&amp;ldquo;Stop wielding your values as a weapon and start offering them as a gift.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.theatlantic.com/family/archive/2022/04/arguing-with-someone-different-values/629495/"&gt;-Arthur Brooks&lt;/a&gt;&lt;/p&gt;</description><content:encoded><![CDATA[<p>&ldquo;Stop wielding your values as a weapon and start offering them as a gift.&rdquo;</p>
<p><a href="https://www.theatlantic.com/family/archive/2022/04/arguing-with-someone-different-values/629495/">-Arthur Brooks</a></p>
]]></content:encoded></item><item><title>Don't Replace with Technology</title><link>https://plug-world.com/journal/tech-used-to-assist-not-to-replace/</link><pubDate>Tue, 25 Oct 2022 17:55:39 -0600</pubDate><guid>https://plug-world.com/journal/tech-used-to-assist-not-to-replace/</guid><description>&lt;p&gt;Technology should be used to assist daily life, never to replace it.&lt;/p&gt;</description><content:encoded>&lt;p>Technology should be used to assist daily life, never to replace it.&lt;/p>
</content:encoded></item><item><title>Love Is Greater Than Advice</title><link>https://plug-world.com/journal/love-is-greater-than-advice/</link><pubDate>Mon, 17 Oct 2022 19:51:33 -0600</pubDate><guid>https://plug-world.com/journal/love-is-greater-than-advice/</guid><description>&lt;p&gt;&amp;ldquo;People need love more than they need advice. Most people know the right thing to do, they just need someone to believe in them.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;-Lex Fridman&lt;/p&gt;</description><content:encoded><![CDATA[<p>&ldquo;People need love more than they need advice. Most people know the right thing to do, they just need someone to believe in them.&rdquo;</p>
<p>-Lex Fridman</p>
]]></content:encoded></item><item><title>Tech Risk</title><link>https://plug-world.com/journal/tech-risk/</link><pubDate>Mon, 17 Oct 2022 19:31:51 -0600</pubDate><guid>https://plug-world.com/journal/tech-risk/</guid><description>&lt;p&gt;&amp;ldquo;Technology is always this source, of danger, of risk. All of the biggest things that threaten our civilization at the small and large scale, all are connected to misuse of technology we develop. At the same time, it&amp;rsquo;s that very technology that will impower us and save us.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;-Lex Fridman&lt;/p&gt;</description><content:encoded><![CDATA[<p>&ldquo;Technology is always this source, of danger, of risk. All of the biggest things that threaten our civilization at the small and large scale, all are connected to misuse of technology we develop. At the same time, it&rsquo;s that very technology that will impower us and save us.&rdquo;</p>
<p>-Lex Fridman</p>
]]></content:encoded></item><item><title>Improving My Directory Workflow</title><link>https://plug-world.com/posts/improving-my-directory-workflow/</link><pubDate>Fri, 07 Oct 2022 17:58:45 -0600</pubDate><guid>https://plug-world.com/posts/improving-my-directory-workflow/</guid><description>&lt;p&gt;
&lt;p class="md__image"&gt;
&lt;img src="https://plug-world.com/images/posts/improving-my-directory-workflow/rct-in-action.gif" alt="rct in action" /&gt;
&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;This is my most used custom shell script.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1e889b"&gt;#!/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1e889b"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00688b"&gt;directory&lt;/span&gt;=&lt;span style="color:#8b008b;font-weight:bold"&gt;$(&lt;/span&gt;find ~/projects ~/assignments ~/personal -mindepth &lt;span style="color:#b452cd"&gt;0&lt;/span&gt; -maxdepth &lt;span style="color:#b452cd"&gt;1&lt;/span&gt; -type d | fzf&lt;span style="color:#8b008b;font-weight:bold"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;if&lt;/span&gt; [ -z &lt;span style="color:#cd5555"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#00688b"&gt;$1&lt;/span&gt;&lt;span style="color:#cd5555"&gt;&amp;#34;&lt;/span&gt; ]; &lt;span style="color:#8b008b;font-weight:bold"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#658b00"&gt;cd&lt;/span&gt; &lt;span style="color:#cd5555"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#00688b"&gt;$directory&lt;/span&gt;&lt;span style="color:#cd5555"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#658b00"&gt;exec&lt;/span&gt; fish
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#658b00"&gt;exec&lt;/span&gt; ranger &lt;span style="color:#cd5555"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#00688b"&gt;$directory&lt;/span&gt;&lt;span style="color:#cd5555"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b008b;font-weight:bold"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;Please note this is configured for the fish shell.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;If you don&amp;rsquo;t use the fish shell change the exec command to your shell of choice.&lt;/p&gt;
&lt;h2 id="speed-"&gt;Speed 🏃🏻💨&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;rct&lt;/code&gt; was a little script I made to quickly find directories that I use a lot.&lt;/p&gt;</description><content:encoded><![CDATA[<p>



<p class="md__image">
  <img src="/https/plug-world.com/images/posts/improving-my-directory-workflow/rct-in-action.gif" alt="rct in action"  />
</p>

</p>
<p>This is my most used custom shell script.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#1e889b">#!/bin/sh
</span></span></span><span style="display:flex;"><span><span style="color:#1e889b"></span>
</span></span><span style="display:flex;"><span><span style="color:#00688b">directory</span>=<span style="color:#8b008b;font-weight:bold">$(</span>find ~/projects ~/assignments ~/personal -mindepth <span style="color:#b452cd">0</span> -maxdepth <span style="color:#b452cd">1</span> -type d | fzf<span style="color:#8b008b;font-weight:bold">)</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#8b008b;font-weight:bold">if</span> [ -z <span style="color:#cd5555">&#34;</span><span style="color:#00688b">$1</span><span style="color:#cd5555">&#34;</span> ]; <span style="color:#8b008b;font-weight:bold">then</span>
</span></span><span style="display:flex;"><span>    <span style="color:#658b00">cd</span> <span style="color:#cd5555">&#34;</span><span style="color:#00688b">$directory</span><span style="color:#cd5555">&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#658b00">exec</span> fish
</span></span><span style="display:flex;"><span><span style="color:#8b008b;font-weight:bold">else</span>
</span></span><span style="display:flex;"><span>    <span style="color:#658b00">exec</span> ranger <span style="color:#cd5555">&#34;</span><span style="color:#00688b">$directory</span><span style="color:#cd5555">&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#8b008b;font-weight:bold">fi</span>
</span></span></code></pre></div><p><em>Please note this is configured for the fish shell.</em></p>
<p>If you don&rsquo;t use the fish shell change the exec command to your shell of choice.</p>
<h2 id="speed-">Speed 🏃🏻💨</h2>
<p><code>rct</code> was a little script I made to quickly find directories that I use a lot.</p>
<p>Gone are the days of <code>cd ~; cd important-directory/; ls; cd subdirectory; ls; vim important-document.md</code></p>
<p>Now I just run <code>rct</code> and use <code>fzf</code> to search for the directory I need.</p>
<h2 id="keybinds-">Keybinds ⌨️</h2>
<p><code>alt+r</code> launches my terminal with <code>rct</code> running and ready to go.</p>
<p><code>alt+shift+r</code> launches <code>ranger</code> in the directory that I select with <code>rct</code>.</p>
<h2 id="dwm-setup-">DWM Setup 🪟</h2>
<p>Keybinds are added in <code>config.h</code> under the keys variable.</p>
<p><code>{ MODKEY, XK_r, spawn, SHCMD(&quot;st -e rct&quot;) },</code></p>
<p><code>{ MODKEY|ShiftMask, XK_r, spawn, SHCMD(&quot;st -e rct 0&quot;) },</code></p>
]]></content:encoded></item><item><title>Risks</title><link>https://plug-world.com/journal/risks/</link><pubDate>Tue, 20 Sep 2022 16:26:18 -0600</pubDate><guid>https://plug-world.com/journal/risks/</guid><description>&lt;p&gt;&amp;ldquo;It liberates you intellectually and physically to take big, bold risks. I can live a thousand lives; there&amp;rsquo;s so many trajectories. And imagine the greatest possible trajectory, that reveals the most beautiful thing I could possibly create. What is that? I feel like that&amp;rsquo;s a good exercise to think about, because it&amp;rsquo;s also liberating to think that you can do anything.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;-Lex Fridman&lt;/p&gt;</description><content:encoded><![CDATA[<p>&ldquo;It liberates you intellectually and physically to take big, bold risks. I can live a thousand lives; there&rsquo;s so many trajectories. And imagine the greatest possible trajectory, that reveals the most beautiful thing I could possibly create. What is that? I feel like that&rsquo;s a good exercise to think about, because it&rsquo;s also liberating to think that you can do anything.&rdquo;</p>
<p>-Lex Fridman</p>
]]></content:encoded></item><item><title>Hoco Week</title><link>https://plug-world.com/microblog/hoco-week/</link><pubDate>Wed, 14 Sep 2022 14:01:10 -0600</pubDate><guid>https://plug-world.com/microblog/hoco-week/</guid><description>&lt;video autoplay loop playsinline controls&gt;
&lt;source src=https://plug-world.com/videos/hoco-week-video/hoco-week-video-vp9.webm type='video/webm;codecs="vp9,opus"'&gt;
&lt;source src=https://plug-world.com/videos/hoco-week-video/hoco-week-video-h264.mp4 type="video/mp4"&gt;
Your browser does not support the video tag.
&lt;/video&gt;</description><content:encoded>




&lt;video autoplay loop  playsinline controls>


&lt;source src=https://plug-world.com/videos/hoco-week-video/hoco-week-video-vp9.webm type='video/webm;codecs="vp9,opus"'>


&lt;source src=https://plug-world.com/videos/hoco-week-video/hoco-week-video-h264.mp4 type="video/mp4">

Your browser does not support the video tag.
&lt;/video>

</content:encoded></item><item><title>Dad's Birthday Video</title><link>https://plug-world.com/microblog/dads-birthday-video/</link><pubDate>Sat, 10 Sep 2022 10:37:03 -0600</pubDate><guid>https://plug-world.com/microblog/dads-birthday-video/</guid><description>&lt;div style="width: 100%"&gt;
&lt;div style="position: relative; padding-bottom: 56.15%; height: 0; overflow: hidden; margin-bottom: 20px;"&gt;
&lt;iframe
style="position: absolute; top: 0; left:0; width: 100%; height: 100%; border: 0;"
loading="lazy";
srcdoc="&lt;style&gt;
* {
padding: 0;
margin: 0;
overflow: hidden;
}
body, html {
height: 100%;
}
img, svg {
position: absolute;
width: 100%;
top: 0;
bottom: 0;
margin: auto;
}
svg {
filter: drop-shadow(1px 1px 10px hsl(206.5, 70.7%, 8%));
transition: all 250ms ease-in-out;
}
body:hover svg {
filter: drop-shadow(1px 1px 10px hsl(206.5, 0%, 10%));
transform: scale(1.2);
}
&lt;/style&gt;
&lt;a href='https://www.youtube.com/embed/oWQ5EWaqE8c?autoplay=1'&gt;
&lt;img src='https://img.youtube.com/vi/oWQ5EWaqE8c/hqdefault.jpg'&gt;
&lt;svg xmlns='http://www.w3.org/2000/svg' width='64' height='64' viewBox='0 0 24 24' fill='none' stroke='#ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-play-circle'&gt;&lt;circle cx='12' cy='12' r='10'&gt;&lt;/circle&gt;&lt;polygon points='10 8 16 12 10 16 10 8'&gt;&lt;/polygon&gt;&lt;/svg&gt;
&lt;/a&gt;
"
src="https://www.youtube.com/embed/oWQ5EWaqE8c"
title=""
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen&gt;
&lt;/iframe&gt;
&lt;/div&gt;
&lt;/div&gt;</description><content:encoded><![CDATA[

<div style="width: 100%">
<div style="position: relative; padding-bottom: 56.15%; height: 0; overflow: hidden; margin-bottom: 20px;">
  <iframe 
    style="position: absolute; top: 0; left:0; width: 100%; height: 100%; border: 0;"
    loading="lazy";
    srcdoc="<style>
      * {
      padding: 0;
      margin: 0;
      overflow: hidden;
      }
      body, html {
        height: 100%;
      }
      img, svg {
        position: absolute;
        width: 100%;
        top: 0;
        bottom: 0;
        margin: auto;
      }
      svg {
        filter: drop-shadow(1px 1px 10px hsl(206.5, 70.7%, 8%));
        transition: all 250ms ease-in-out;
      }
      body:hover svg {
        filter: drop-shadow(1px 1px 10px hsl(206.5, 0%, 10%));
        transform: scale(1.2);
      }
    </style>
    <a href='https://www.youtube.com/embed/oWQ5EWaqE8c?autoplay=1'>
      <img src='https://img.youtube.com/vi/oWQ5EWaqE8c/hqdefault.jpg'>
      <svg xmlns='http://www.w3.org/2000/svg' width='64' height='64' viewBox='0 0 24 24' fill='none' stroke='#ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-play-circle'><circle cx='12' cy='12' r='10'></circle><polygon points='10 8 16 12 10 16 10 8'></polygon></svg>
    </a>
    "
    src="https://www.youtube.com/embed/oWQ5EWaqE8c" 
    title=""
    frameborder="0"
    allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" 
    allowfullscreen>
  </iframe>
</div>
</div>


]]></content:encoded></item><item><title>Seminary Field Day</title><link>https://plug-world.com/microblog/seminary-field-day/</link><pubDate>Mon, 29 Aug 2022 16:22:26 -0600</pubDate><guid>https://plug-world.com/microblog/seminary-field-day/</guid><description>&lt;div style="width: 100%"&gt;
&lt;div style="position: relative; padding-bottom: 56.15%; height: 0; overflow: hidden; margin-bottom: 20px;"&gt;
&lt;iframe
style="position: absolute; top: 0; left:0; width: 100%; height: 100%; border: 0;"
loading="lazy";
srcdoc="&lt;style&gt;
* {
padding: 0;
margin: 0;
overflow: hidden;
}
body, html {
height: 100%;
}
img, svg {
position: absolute;
width: 100%;
top: 0;
bottom: 0;
margin: auto;
}
svg {
filter: drop-shadow(1px 1px 10px hsl(206.5, 70.7%, 8%));
transition: all 250ms ease-in-out;
}
body:hover svg {
filter: drop-shadow(1px 1px 10px hsl(206.5, 0%, 10%));
transform: scale(1.2);
}
&lt;/style&gt;
&lt;a href='https://www.youtube.com/embed/wkorU9NwsvE?autoplay=1'&gt;
&lt;img src='https://img.youtube.com/vi/wkorU9NwsvE/hqdefault.jpg'&gt;
&lt;svg xmlns='http://www.w3.org/2000/svg' width='64' height='64' viewBox='0 0 24 24' fill='none' stroke='#ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-play-circle'&gt;&lt;circle cx='12' cy='12' r='10'&gt;&lt;/circle&gt;&lt;polygon points='10 8 16 12 10 16 10 8'&gt;&lt;/polygon&gt;&lt;/svg&gt;
&lt;/a&gt;
"
src="https://www.youtube.com/embed/wkorU9NwsvE"
title=""
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen&gt;
&lt;/iframe&gt;
&lt;/div&gt;
&lt;/div&gt;</description><content:encoded><![CDATA[

<div style="width: 100%">
<div style="position: relative; padding-bottom: 56.15%; height: 0; overflow: hidden; margin-bottom: 20px;">
  <iframe 
    style="position: absolute; top: 0; left:0; width: 100%; height: 100%; border: 0;"
    loading="lazy";
    srcdoc="<style>
      * {
      padding: 0;
      margin: 0;
      overflow: hidden;
      }
      body, html {
        height: 100%;
      }
      img, svg {
        position: absolute;
        width: 100%;
        top: 0;
        bottom: 0;
        margin: auto;
      }
      svg {
        filter: drop-shadow(1px 1px 10px hsl(206.5, 70.7%, 8%));
        transition: all 250ms ease-in-out;
      }
      body:hover svg {
        filter: drop-shadow(1px 1px 10px hsl(206.5, 0%, 10%));
        transform: scale(1.2);
      }
    </style>
    <a href='https://www.youtube.com/embed/wkorU9NwsvE?autoplay=1'>
      <img src='https://img.youtube.com/vi/wkorU9NwsvE/hqdefault.jpg'>
      <svg xmlns='http://www.w3.org/2000/svg' width='64' height='64' viewBox='0 0 24 24' fill='none' stroke='#ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-play-circle'><circle cx='12' cy='12' r='10'></circle><polygon points='10 8 16 12 10 16 10 8'></polygon></svg>
    </a>
    "
    src="https://www.youtube.com/embed/wkorU9NwsvE" 
    title=""
    frameborder="0"
    allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" 
    allowfullscreen>
  </iframe>
</div>
</div>


]]></content:encoded></item><item><title>SeaDefender's Unexpected Development</title><link>https://plug-world.com/posts/seadefender/</link><pubDate>Sat, 13 Aug 2022 17:27:51 -0600</pubDate><guid>https://plug-world.com/posts/seadefender/</guid><description>&lt;p&gt;
&lt;p class="md__image"&gt;
&lt;img src="https://plug-world.com/images/posts/seadefender/seadefender-1.gif" alt="seaDefender gameplay gif" /&gt;
&lt;/p&gt;
&lt;/p&gt;
&lt;h2 id="retro-remake"&gt;Retro Remake&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://plug-world.com/seadefender"&gt;SeaDefender&lt;/a&gt; was a game I made based on &lt;a href="https://en.wikipedia.org/wiki/Seaquest_(video_game)"&gt;SeaQuest&lt;/a&gt;.
My intention was to startup a series on YouTube called &lt;em&gt;Retro Remake&lt;/em&gt;.
The idea was to recreate these retro games in a limited amount of time.&lt;/p&gt;
&lt;p&gt;I worked on the game for a few weeks.
Vacation and large gaps in development ultimately led to me putting the project on hold.&lt;/p&gt;
&lt;p&gt;Over vacation I had a lot of fun making some graphics for the series in Blender.
Too bad, I never made the video.&lt;/p&gt;</description><content:encoded><![CDATA[<p>



<p class="md__image">
  <img src="/https/plug-world.com/images/posts/seadefender/seadefender-1.gif" alt="seaDefender gameplay gif"  />
</p>

</p>
<h2 id="retro-remake">Retro Remake</h2>
<p><a href="/https/plug-world.com/seadefender">SeaDefender</a> was a game I made based on <a href="https://en.wikipedia.org/wiki/Seaquest_(video_game)">SeaQuest</a>.
My intention was to startup a series on YouTube called <em>Retro Remake</em>.
The idea was to recreate these retro games in a limited amount of time.</p>
<p>I worked on the game for a few weeks.
Vacation and large gaps in development ultimately led to me putting the project on hold.</p>
<p>Over vacation I had a lot of fun making some graphics for the series in Blender.
Too bad, I never made the video.</p>
<hr>
<p>




<video autoplay loop muted playsinline controls>


<source src=https://plug-world.com/videos/seadefender/sea-quest-remake-animation-vp9.webm type='video/webm;codecs="vp9,opus"'>


Your browser does not support the video tag.
</video>






<video autoplay loop muted playsinline controls>


<source src=https://plug-world.com/videos/seadefender/seaquest-history-lesson-vp9.webm type='video/webm;codecs="vp9,opus"'>


Your browser does not support the video tag.
</video>
</p>
<hr>
<p>It&rsquo;s weird how your perception of your project changes while you are working on it.
When I was working on the game, all I saw was problems.
A flawed game, that didn&rsquo;t work.
And I was burnt out.
You would think that if I based my game off of another that&rsquo;s proven to be successfully, I wouldn&rsquo;t have issues.
Yet, I ran into a lot of design problems.
This was the result of me changing my game so much from the original.
Sure they may look very similar, but mechanically they are very different.</p>
<p>After a lot of burnout, and doubt in the project, I ended the SeaQuest remake.
The project sat for a year.
I came back to it a few times, sad that the project never gotten finished.
While I came back to it, I realized the potential that it had.</p>
<h2 id="tsa-remake">TSA Remake</h2>
<p>It sat until the <a href="https://tsaweb.org/tsa">TSA (Technology Student Association)</a> high school video game design competition.
The theme was &ldquo;Arcade in a Museum.&rdquo;
This was perfect, I could finally finish what I started.
So I decided to recreate the game for the competition.</p>
<p>Technically they gave us a few months to develop the games.
I was very busy, and I didn&rsquo;t know till much later.
So that gave me only a few weeks of development.</p>
<p>Many schools assigned their classes to make a game, and they would recieve a grade at the end.
I wasn&rsquo;t in one of those classes, which was too bad, but I&rsquo;ll still have enough time to finish.</p>
<p>TSA required that you must work in teams.
So I teamed up with my friend Luke.
He has little experience with game dev, but all of his efforts were appriecated.</p>
<p>TSA did have a few requirements for the game&hellip;</p>
<ul>
<li>A full game portfolio</li>
<li>Copyright checklist</li>
<li>Storyboard</li>
<li><a href="https://tsaweb.org/docs/default-source/themes-and-problems-2018-2019/2021-2022/plan-of-work-log.pdf?sfvrsn=eb5864c9_2">Plan of Work Log</a></li>
<li>3 levels that can be played fully through</li>
</ul>
<p>Here&rsquo;s a picture of my &ldquo;storyboard.&rdquo;




<p class="md__image">
  <img src="/https/plug-world.com/images/posts/seadefender/game-mechanics.webp" alt="storyboard picture"  />
</p>

</p>
<p>So apparently the game is supposed to have a story.
I was so worried on finishing the game on time, I didn&rsquo;t have the time to complete a story.
Not gonna lie, having the requirement for &ldquo;story&rdquo; is kinda dumb.
Some games don&rsquo;t have a story, especially arcade games.
Yeah what&rsquo;s the story in space invaders?
Get rid of them!
That&rsquo;s what it is.</p>
<p>I also didn&rsquo;t like the whole level requirement.
Some games don&rsquo;t have your typical &ldquo;levels.&rdquo;
Especially if it&rsquo;s an arcade game, you kinda just keep playing an ever increasing difficulty until you lose.
Think of Asteroids.
Classic, arcade game.
Does that have levels?
Nope!
So uh, I don&rsquo;t see why levels are a requirement.</p>
<p>You can tell the people that created the whole video game design competition system at TSA don&rsquo;t play video games.</p>
<p>So as I was stressing out trying to get the game finished on time, I was also stressed about the portfolio.
There&rsquo;s so many documents you have to sign and make sure you get correct.
The website at the time was a mess, trying to figure out what I needed and making sure everything&rsquo;s correct.</p>
<p>



<p class="md__image">
  <img src="/https/plug-world.com/images/posts/seadefender/seadefender-2.gif" alt="seaDefender gameplay gif"  />
</p>

</p>
<p>For the game, I just added some new enemies, and refined the game mechanics.</p>
<p>Anyways, after crunching like crazy, I finished the game, and the portfolio.
The story had to be absent from the game.
I didn&rsquo;t have the time to work it out.
So I went to submit the game, and spent an hour navigating the site trying to figure out where to submit.
You don&rsquo;t submit to the official TSA site till you go to nationals.
So I needed to figure out how to submit to the <a href="https://utahtsa.org/wp/">Utah TSA site</a>.
Anyways, I figured out I had to hit the &ldquo;register my chapter button,&rdquo; only then to login.
Which then I had to figure out the password from my teacher, who is the chapter adviser.
After he gave me the password, it still failed.
With many variations of failed login attempts I had to try something else.
I had to email the Utah State TSA Advisor to get it submitted.</p>
<p>After that painfull process, the game was submitted and ready.
Here&rsquo;s the <a href="/https/plug-world.com/pdf/seadefender/seadefender-tsa-portfolio.pdf">game&rsquo;s portfolio</a> if anyone wants to see.</p>
<p>The game placed 2nd in the state.
I believe there was around 11 teams that participated in the state competition.
Does this mean I get to go to nationals?
No, but I thought so.
I thought I read something on the website saying that the first 3 teams will go to nationals.
And robotics had 3 teams go to nationals as well, so I assumed we were too.</p>
<p>



<p class="md__image">
  <img src="/https/plug-world.com/images/posts/seadefender/tutorial-shark-killing.gif" alt="tutorial-shark-killing.gif"  />
</p>

</p>
<p>So I kept working on the game.
I noticed that most players have no idea how to play the game.
So I added a tutorial, which was very much needed.</p>
<p>



<p class="md__image">
  <img src="/https/plug-world.com/images/posts/seadefender/lazer-shark.gif" alt="lazer-shark.gif"  />
</p>

</p>
<p>I added <strong>lazer sharks!!</strong>
Just for the memes, idk thought they could be fun.</p>
<p>



<p class="md__image">
  <img src="/https/plug-world.com/images/posts/seadefender/high-score-screen.gif" alt="high-score-screen.gif"  />
</p>

</p>
<p>And I added a high score screen.
I was hoping this would really push the arcade theme of the game.</p>
<p>Anyways, it came time to submit for nationals, and that&rsquo;s when I realized that we weren&rsquo;t going to nationals.
Yeah it was disappointing.
I could blame it on everything else.
But ultimately it was my fault.
I&rsquo;ve accepted it and moved on.
We all fail, we aren&rsquo;t perfect, and we just gotta keep moving forward.
Failure is part of the process, and that&rsquo;s how we learn and grow.
Those that are most successful are those who have failed the most.
It didn&rsquo;t turn out the way I wanted, but that&rsquo;s okay.
Later I realized that wasn&rsquo;t the end for this project.</p>
<h2 id="udemy-remake">Udemy Remake</h2>
<p>So now it&rsquo;s summer and I need to get a job.
My dad suggested that I should do a Udemy course.
I did some research and found that these game development courses can potentially make quite a bit of money.
I already had some experience doing <a href="https://www.youtube.com/plugworld">YouTube tutorials</a> and teaching game development with the <a href="https://godotengine.org/">Godot game engine</a>.
So I think it could potentially work out pretty well.</p>
<p>So I decided to make a Udemy course based on this game.
I guess I haven&rsquo;t done enough remakes yet.
As you might imagine, the code for this game doesn&rsquo;t look too good.
Time to get to work, going through every line of code simplifying and cleaning everything up.
<a href="https://docs.godotengine.org/en/stable/tutorials/best_practices/index.html">Godot&rsquo;s best practices</a> was a very helpful resource for this.</p>
<p>The hard part about making this course is making it as simple as possible.
This is a complex game, and I&rsquo;m trying to make a course for beginners.
So I&rsquo;ll do my best, we&rsquo;ll see how this goes.
Trying to achieve the balance between clean and simple code.
More often than not the cleanest approach usually is the most complex to understand.</p>
<p>Anyways, after remaking the game for the third time, it&rsquo;s now time to record the course.
That&rsquo;s where I&rsquo;m at right now.
In the next part, I&rsquo;m gonna talk about the process of recording and making the course.
Anyways, that&rsquo;s where I&rsquo;m at right now, thanks!</p>
]]></content:encoded></item><item><title>Using a Blog Instead of Social Media</title><link>https://plug-world.com/posts/using-a-blog-instead-of-social-media/</link><pubDate>Tue, 12 Jul 2022 17:09:03 -0600</pubDate><guid>https://plug-world.com/posts/using-a-blog-instead-of-social-media/</guid><description>&lt;p&gt;Crazy right!?&lt;/p&gt;
&lt;h2 id="why-do-this-heres-why"&gt;Why do this? Here&amp;rsquo;s why&amp;hellip;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Addiction
&lt;ul&gt;
&lt;li&gt;Social media is naturally made to be addictive.&lt;/li&gt;
&lt;li&gt;Over the past 10 years, social media has been finetuned to work against you and to push for your attention.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Social Media Impacts the Whole World
&lt;ul&gt;
&lt;li&gt;Most people use social media, it impacts a very large aspect of the world.&lt;/li&gt;
&lt;li&gt;Most social media generally has an &amp;ldquo;algorithm&amp;rdquo; to promote content. This algorithm is always being balanced and modified ever so slightly.
&lt;ul&gt;
&lt;li&gt;They modify it to make people think certain ways, or to promote certain types of content over others. Effectively giving them the ability to brainwash the world.&lt;/li&gt;
&lt;li&gt;Look at those Tiktok challenges. No other platform promoted these challenges as much as Tiktok. It convinced people to do stupid things that they wouldn&amp;rsquo;t have done otherwise.
&lt;ul&gt;
&lt;li&gt;It even got to the point that schools had to shutdown.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Not Being in Control Over Content
&lt;ul&gt;
&lt;li&gt;How are you not in control? You get to choose who you follow. Yep you do, but I constantly get crap in my feed that I don&amp;rsquo;t want to see.&lt;/li&gt;
&lt;li&gt;Things that I don&amp;rsquo;t follow get forced in my face no matter what.&lt;/li&gt;
&lt;li&gt;I want to be in control of the things that I get to see on social media.&lt;/li&gt;
&lt;li&gt;In my opinion it would be best just to be connected with your friends and family. I don&amp;rsquo;t care about the celebrities and all the other junk that gets thrown in my face.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Being a Hypocrite
&lt;ul&gt;
&lt;li&gt;I don&amp;rsquo;t support where social media is headed, and how manipulative it&amp;rsquo;s getting.&lt;/li&gt;
&lt;li&gt;Therefore, I will not use it. &lt;em&gt;Under normal circumstances&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="why-i-kinda-use-social-media"&gt;Why I Kinda Use Social Media&lt;/h2&gt;
&lt;p&gt;A couple of months ago I deleted my Instagram account.
I used it primary with connecting with friends.
And since then I have started to regret it.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Crazy right!?</p>
<h2 id="why-do-this-heres-why">Why do this? Here&rsquo;s why&hellip;</h2>
<ol>
<li>Addiction
<ul>
<li>Social media is naturally made to be addictive.</li>
<li>Over the past 10 years, social media has been finetuned to work against you and to push for your attention.</li>
</ul>
</li>
<li>Social Media Impacts the Whole World
<ul>
<li>Most people use social media, it impacts a very large aspect of the world.</li>
<li>Most social media generally has an &ldquo;algorithm&rdquo; to promote content. This algorithm is always being balanced and modified ever so slightly.
<ul>
<li>They modify it to make people think certain ways, or to promote certain types of content over others. Effectively giving them the ability to brainwash the world.</li>
<li>Look at those Tiktok challenges. No other platform promoted these challenges as much as Tiktok. It convinced people to do stupid things that they wouldn&rsquo;t have done otherwise.
<ul>
<li>It even got to the point that schools had to shutdown.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>Not Being in Control Over Content
<ul>
<li>How are you not in control? You get to choose who you follow. Yep you do, but I constantly get crap in my feed that I don&rsquo;t want to see.</li>
<li>Things that I don&rsquo;t follow get forced in my face no matter what.</li>
<li>I want to be in control of the things that I get to see on social media.</li>
<li>In my opinion it would be best just to be connected with your friends and family. I don&rsquo;t care about the celebrities and all the other junk that gets thrown in my face.</li>
</ul>
</li>
<li>Being a Hypocrite
<ul>
<li>I don&rsquo;t support where social media is headed, and how manipulative it&rsquo;s getting.</li>
<li>Therefore, I will not use it. <em>Under normal circumstances</em></li>
</ul>
</li>
</ol>
<h2 id="why-i-kinda-use-social-media">Why I Kinda Use Social Media</h2>
<p>A couple of months ago I deleted my Instagram account.
I used it primary with connecting with friends.
And since then I have started to regret it.</p>
<p>Here&rsquo;s my philosophy that led to me deleting it.</p>
<blockquote>
<p>If you don&rsquo;t support it, don&rsquo;t use it.</p>
</blockquote>
<p>You know, basically don&rsquo;t be a hypocrite.</p>
<p>Since then, I missed seeing what my friends are up to and connecting to them through that.
So it&rsquo;s hard to support both, you know?
I don&rsquo;t want to support Facebook by using Instagram, but I want to support my friends by seeing and messaging with them on the platform.</p>
<p>So I decided to get back on the platform.
But I have a specific way of going about things that screws over Facebook and Instagram 😂</p>
<h2 id="the-solution">The Solution</h2>
<p>I won&rsquo;t post on Instagram.
I will instead be using my <a href="/https/plug-world.com/microblog">microblog</a>.</p>
<ul>
<li>Posts on my microblog will be similar to how I would post on Instagram.</li>
<li>I will keep my <a href="/https/plug-world.com/posts">blog</a> seperate, because my posts there will be more technical and informational.</li>
</ul>
<p>I use the regular Instagram web client.
I dabbled using <a href="https://instaloader.github.io/">Instaloader</a>.
Which is basically just a Instagram command line scraper, but it almost led to me getting banned.
So I guess I won&rsquo;t be going with that.</p>
<p>Advantages using Instagram web instead of the app&hellip;</p>
<ol>
<li>No ads and less tracking.
<ul>
<li>Using <a href="https://ublockorigin.com/">uBlockOrigin</a> addon to block them along with the <a href="https://f-droid.org/en/packages/us.spotco.fennec_dos/">Mull browser</a>.</li>
</ul>
</li>
<li>No promotion of accounts I don&rsquo;t follow.</li>
<li>Tiktok style stories aren&rsquo;t in the feed.</li>
</ol>
<p>Basically I only see the posts of people I follow.</p>
<p>Anyways, social media is messy and big tech is making it a terrible platform to be on.
Social media isn&rsquo;t all bad, it&rsquo;s definitely being used for good.
But the platforms are designed to work against you for your attention.
So it&rsquo;s best to have alternative ways of reaching others, not just through social media.</p>
<h2 id="get-a-website">Get a Website</h2>
<p>If you are reading this and you don&rsquo;t have a website, I encourage you <strong>get a website!</strong></p>
<p>Everyone uses the same 5 websites, it&rsquo;s important that you own your own land on the internet.
Most people can agree owning a house is much better than having to pay rent in an appartment.
<strong>Do this on the internet!</strong>
Post what you learn on your website, make posts that you would normally only do on Instagram, and put them on your website.</p>
<p>The information you learn is valuable, and your experiences and memories are unreplacable.
With a website you have the freedom to display your information however you want and the freedom to own it.</p>
<p>I have found that this has made me a better writer, and has helped keep my thoughts more clear and organized.
It may seem like a lot of work, but you can get a lot out of doing this.</p>
<p>You can use <a href="https://neocities.org/">Neocities</a>, <a href="https://bearblog.dev">BearBlog</a> or <a href="https://blogger.com">Blogger</a>, just start using something.</p>
<p>I use <a href="https://gohugo.io/">Hugo</a> which is a bit more advanced for the average user, but still very simple once setup.</p>
<h2 id="conclusion">Conclusion</h2>
<p>Social media addiction is really harmful.
Please try to find what works best for you.
I find with this solution I have been able to improve myself, while also maintaining connection with my friends and family.
That&rsquo;s what matters most, do your best to be better, little by little everyday.
You will find that you can do amazing things.</p>
<p>Don&rsquo;t start tomorrow, start today.
Thank you for taking the time to read to read this.
Please <a href="/https/plug-world.com/contact">contact me</a> if you have any questions, or if you just want to talk.
Thanks! 😃</p>
]]></content:encoded></item><item><title>Grub and OS Prober in Arch Linux</title><link>https://plug-world.com/posts/grub-and-os-prober-in-arch-linux/</link><pubDate>Tue, 05 Jul 2022 21:45:46 -0600</pubDate><guid>https://plug-world.com/posts/grub-and-os-prober-in-arch-linux/</guid><description>&lt;p&gt;This guide is tailored to people that are dualbooting Linux and Windows.
The exact same steps can accomplish adding another Linux OS to the bootloader.&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo pacman -S grub efibootmgr os-prober ntfs-3g
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="mounting-windows-drive"&gt;Mounting Windows Drive&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo mount -t ntfs-3g /dev/sda2 /mnt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Don&amp;rsquo;t just copy this command.&lt;/strong&gt;
&lt;em&gt;Make sure you use the correct drive.&lt;/em&gt;
You can find each drive by name when using &lt;code&gt;lsblk&lt;/code&gt;.
Usually you want to mount the smallest partition.
That will contain the boot manager for that specific operating system.
For Windows mine was the second partition, but that may change, so just check yours just in case.&lt;/p&gt;</description><content:encoded><![CDATA[<p>This guide is tailored to people that are dualbooting Linux and Windows.
The exact same steps can accomplish adding another Linux OS to the bootloader.</p>
<h2 id="prerequisites">Prerequisites</h2>
<div class="highlight"><pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo pacman -S grub efibootmgr os-prober ntfs-3g
</span></span></code></pre></div><h2 id="mounting-windows-drive">Mounting Windows Drive</h2>
<div class="highlight"><pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo mount -t ntfs-3g /dev/sda2 /mnt
</span></span></code></pre></div><p><strong>Don&rsquo;t just copy this command.</strong>
<em>Make sure you use the correct drive.</em>
You can find each drive by name when using <code>lsblk</code>.
Usually you want to mount the smallest partition.
That will contain the boot manager for that specific operating system.
For Windows mine was the second partition, but that may change, so just check yours just in case.</p>
<h2 id="enable-os-prober">Enable OS Prober</h2>
<p>Edit <code>/etc/default/grub</code> and uncomment:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#00688b">GRUB_DISABLE_OS_PROBER</span>=<span style="color:#658b00">false</span>
</span></span></code></pre></div><p>This allows OS Prober to scan for other operating systems and add them to the bootloader.</p>
<h2 id="making-grub-the-bootloader">Making Grub the bootloader</h2>
<div class="highlight"><pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo grub-mkconfig -o /boot/grub/grub.cfg
</span></span></code></pre></div><p>Generate grubs config, OS Prober should do it&rsquo;s thing and add all detected operating systems to Grub.
If it misses one, make sure you have it mounted.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=grub --recheck
</span></span></code></pre></div><p>This makes Grub the bootloader.</p>
]]></content:encoded></item><item><title>Fixing Bluetooth Xbox Controllers in Arch Linux</title><link>https://plug-world.com/posts/fixing-xbox-bluetooth-controllers-in-arch-linux/</link><pubDate>Sun, 03 Jul 2022 11:43:17 -0600</pubDate><guid>https://plug-world.com/posts/fixing-xbox-bluetooth-controllers-in-arch-linux/</guid><description>&lt;h2 id="setting-up-bluetooth"&gt;Setting up Bluetooth&lt;/h2&gt;
&lt;p&gt;Since you are on Arch Linux there&amp;rsquo;s a good chance you may not have Bluetooth installed.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo pacman -S bluez bluez-utils
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Bluez provides the Bluetooth protocol stack.
Bluz-utils provides a command line utility to connect bluetooth devices.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl &lt;span style="color:#658b00"&gt;enable&lt;/span&gt; --now bluetooth.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Start the bluetooth service and enable it.&lt;/p&gt;
&lt;h2 id="connecting-the-controller-via-bluetooth"&gt;Connecting the controller via Bluetooth&lt;/h2&gt;
&lt;p&gt;Run &lt;code&gt;bluetoothctl&lt;/code&gt; in the command line to startup the bluetooth utility.&lt;/p&gt;
&lt;p&gt;Run &lt;code&gt;power on&lt;/code&gt; to turn on the bluetooth controller.&lt;/p&gt;</description><content:encoded><![CDATA[<h2 id="setting-up-bluetooth">Setting up Bluetooth</h2>
<p>Since you are on Arch Linux there&rsquo;s a good chance you may not have Bluetooth installed.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo pacman -S bluez bluez-utils
</span></span></code></pre></div><p>Bluez provides the Bluetooth protocol stack.
Bluz-utils provides a command line utility to connect bluetooth devices.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo systemctl <span style="color:#658b00">enable</span> --now bluetooth.service
</span></span></code></pre></div><p>Start the bluetooth service and enable it.</p>
<h2 id="connecting-the-controller-via-bluetooth">Connecting the controller via Bluetooth</h2>
<p>Run <code>bluetoothctl</code> in the command line to startup the bluetooth utility.</p>
<p>Run <code>power on</code> to turn on the bluetooth controller.</p>
<p>Run <code>scan on</code> to get a list of each of the devices and their mac addresses.
Your Xbox controller should show up as &ldquo;Xbox Wireless Controller&rdquo; then copy the mac address.</p>
<p>Run <code>pair yourControllerMacAddress</code>, this will connect your Bluetooth controller.
If you run into pairing issues, proceed to the next section.</p>
<h2 id="controller-firmware-fix">Controller firmware fix</h2>
<p>Is your controller having Bluetooth connection issues?
The solution is to update the firmware in the controller.</p>
<ol>
<li>Jump over to Windows, don&rsquo;t worry this is temporary (you can use a VM too).</li>
<li>Download the Xbox Accessories app from the Microsoft Store.</li>
<li>Plug in the controller to the pc.</li>
<li>Get them updates.</li>
</ol>
<p>Now that the controller is updated, you can switch back to your Arch Linux install.
You can see that the controller can connect over Bluetooth.</p>
<h2 id="fixing-controller-mappings">Fixing controller mappings</h2>
<div class="highlight"><pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo pacman -S linux-headers
</span></span></code></pre></div><p>Make sure you have linux-headers installed.
They are required for the next step.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>yay -S xpadneo-dkms-git
</span></span></code></pre></div><p>Make sure you have the <a href="https://www.tecmint.com/install-yay-aur-helper-in-arch-linux-and-manjaro/">yay aur helper</a> installed.
Then proceed to install xpadneo.
It contains the drivers for the Xbox One wireless controllers.
This fixes the strange behavior of the operating system misinterpreting some of the controls on the controller.
For example, my controller had issues with the right joystick and a few face buttons were mixed up.
After installing the drivers those issues were resolved.</p>
]]></content:encoded></item><item><title>Snowbasin Hike</title><link>https://plug-world.com/microblog/snowbasin-hike/</link><pubDate>Sat, 02 Jul 2022 09:27:45 -0600</pubDate><guid>https://plug-world.com/microblog/snowbasin-hike/</guid><description>&lt;p&gt;Went for a hike up in Snowbasin.
It was just me, Mia and my mom.&lt;/p&gt;
&lt;p&gt;
&lt;figure&gt;
&lt;a href="1.jpg"&gt;
&lt;picture&gt;
&lt;source srcset="https://plug-world.com/microblog/snowbasin-hike/1_hu_11b35a4e27539e1e.webp" type="image/webp"&gt;
&lt;img src="https://plug-world.com/microblog/snowbasin-hike/1_hu_cc475d54af045869.jpg" alt="" loading="lazy" decoding="async" /&gt;
&lt;/picture&gt;
&lt;/a&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Somehow it turned into a 6 mile hike.
Not exactly what we signed up for.
But it wasn&amp;rsquo;t too bad.
Most of it was pretty flat there was a little bit of uphill, but overall pretty gradual.&lt;/p&gt;
&lt;p&gt;
&lt;figure&gt;
&lt;a href="2.jpg"&gt;
&lt;picture&gt;
&lt;source srcset="https://plug-world.com/microblog/snowbasin-hike/2_hu_d8de634ec74b26a5.webp" type="image/webp"&gt;
&lt;img src="https://plug-world.com/microblog/snowbasin-hike/2_hu_5dbe5dfd45ef3874.jpg" alt="" loading="lazy" decoding="async" /&gt;
&lt;/picture&gt;
&lt;/a&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Mia tried to count butterflies, after 12 we lost count.
On the way back we ran into a rattle snake, so that was pretty cool.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Went for a hike up in Snowbasin.
It was just me, Mia and my mom.</p>
<p>



<figure>
  

  
    
    
  

  
  

  <a href="1.jpg">
    <picture>
      <source srcset="/microblog/snowbasin-hike/1_hu_11b35a4e27539e1e.webp" type="image/webp">
      <img src="/https/plug-world.com/microblog/snowbasin-hike/1_hu_cc475d54af045869.jpg" alt="" loading="lazy" decoding="async" />
    </picture>
  </a>
  
</figure>

</p>
<p>Somehow it turned into a 6 mile hike.
Not exactly what we signed up for.
But it wasn&rsquo;t too bad.
Most of it was pretty flat there was a little bit of uphill, but overall pretty gradual.</p>
<p>



<figure>
  

  
    
    
  

  
  

  <a href="2.jpg">
    <picture>
      <source srcset="/microblog/snowbasin-hike/2_hu_d8de634ec74b26a5.webp" type="image/webp">
      <img src="/https/plug-world.com/microblog/snowbasin-hike/2_hu_5dbe5dfd45ef3874.jpg" alt="" loading="lazy" decoding="async" />
    </picture>
  </a>
  
</figure>

</p>
<p>Mia tried to count butterflies, after 12 we lost count.
On the way back we ran into a rattle snake, so that was pretty cool.</p>
<p>



<figure>
  

  
    
    
  

  
  

  <a href="3.jpg">
    <picture>
      <source srcset="/microblog/snowbasin-hike/3_hu_310a9ae700dc9db3.webp" type="image/webp">
      <img src="/https/plug-world.com/microblog/snowbasin-hike/3_hu_37189f5b917133a9.jpg" alt="" loading="lazy" decoding="async" />
    </picture>
  </a>
  
</figure>

</p>
]]></content:encoded></item><item><title>Brave Goggles Changes How I Search</title><link>https://plug-world.com/posts/brave-goggles-changes-how-i-search/</link><pubDate>Sat, 25 Jun 2022 11:59:47 -0600</pubDate><guid>https://plug-world.com/posts/brave-goggles-changes-how-i-search/</guid><description>&lt;p&gt;&lt;a href="https://youtu.be/HZvrgZK43qg"&gt;Watch the video on YouTube&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So if you didn&amp;rsquo;t know Brave, the company behind the &lt;a href="https://brave.com/"&gt;Brave Browser&lt;/a&gt;, created a &lt;a href="https://search.brave.com/"&gt;search engine&lt;/a&gt; not too long ago.
Brave Search is actually a really interesting project.
Brave advertises itself as a private search engine.
Now I&amp;rsquo;m not here to talk about privacy.
Just talking about the features of the project.
But it&amp;rsquo;s up to you to trust them.
Their &lt;a href="https://github.com/orgs/brave/repositories"&gt;source code&lt;/a&gt; is public, but their servers aren&amp;rsquo;t.&lt;/p&gt;</description><content:encoded><![CDATA[<p><a href="https://youtu.be/HZvrgZK43qg">Watch the video on YouTube</a></p>
<p>So if you didn&rsquo;t know Brave, the company behind the <a href="https://brave.com/">Brave Browser</a>, created a <a href="https://search.brave.com/">search engine</a> not too long ago.
Brave Search is actually a really interesting project.
Brave advertises itself as a private search engine.
Now I&rsquo;m not here to talk about privacy.
Just talking about the features of the project.
But it&rsquo;s up to you to trust them.
Their <a href="https://github.com/orgs/brave/repositories">source code</a> is public, but their servers aren&rsquo;t.</p>
<p>Brave created their own indexer for the results in Brave Search.
This is not the case with other search engines like <a href="https://duckduckgo.com/">DuckDuckGo</a> and <a href="https://www.qwant.com/">Qwant</a>.
Both of which use Bing results.
This alone ranks Brave Search above other search engines for me.
Just because it&rsquo;s actually different from the others.</p>
<p>So what are <a href="https://search.brave.com/help/goggles">Brave Goggles</a>?
They are essentially a way of filtering search results.
Or as Brave puts it, &ldquo;Goggles act as a custom re-ranking on top of the Brave search index.&rdquo;
The internet is full of garbage.
So many websites copying each other, all fighting to be at the top.
Gotta make that ad revenue.
But with this new tool allows you to sift through all the garbage on the internet with ease.</p>
<p>



<p class="md__image">
  <img src="/https/plug-world.com/images/posts/brave-goggles-changes-how-i-search/following-goggles.webp" alt="Following Goggles"  />
</p>

</p>
<p>Now you have full control to manually rank your search results.
No more relying on an algorithm to do it for you.
Brave says it best, &ldquo;Goggles allows users to counter any intrinsic biases in the algorithm.&rdquo;
You can try out <a href="https://search.brave.com/goggles">Brave Goggles here</a>.
Take a look at the Brave Goggles <a href="https://github.com/brave/goggles-quickstart/">source code</a>.
If you look at <a href="https://raw.githubusercontent.com/brave/goggles-quickstart/main/goggles/tech_blogs.goggle">&ldquo;Tech Blogs&rdquo;</a> as an example, it shows every domain it is boosting and downranking.
Really simple and easy syntax.
All to make it easy for you to tailor your own results.</p>
<p>



<p class="md__image">
  <img src="/https/plug-world.com/images/posts/brave-goggles-changes-how-i-search/goggles-syntax.webp" alt="Tech blogs Syntax"  />
</p>

</p>
<p>You can even find goggles that the community has made through the <a href="https://search.brave.com/goggles/discover">discovery page</a>.
Whenever you make your custom goggles you will have the choice to make it public.</p>
<p>I started following a few goggles.
They have proven to be very helpful when searching for specific results.
For example I would often look for programming solutions and have to filter with site:stackoverflow.com or site:github.com.
Not anymore.
Now I just use the <a href="https://search.brave.com/goggles/discover?goggles_id=https%3A%2F%2Fsiteproxy.ruqli.workers.dev%3A443%2Fhttps%2Fraw.githubusercontent.com%2FAdventistforever%2Fbrave-programming-goggle%2Fmain%2Fprogramming.goggle">&ldquo;Programming solutions&rdquo;</a> goggle and I get the results I need from Brave Search.</p>
]]></content:encoded></item><item><title>Arch Linux Just Works</title><link>https://plug-world.com/posts/arch-linux-just-works/</link><pubDate>Mon, 20 Jun 2022 09:19:12 -0600</pubDate><guid>https://plug-world.com/posts/arch-linux-just-works/</guid><description>&lt;p&gt;Please note this guide is outdated, I no longer recommend Arch Linux.&lt;/p&gt;
&lt;p&gt;Arch Linux works great on my main desktop, but with it on everything else I&amp;rsquo;m unhappy with it.
This is because I use my main desktop enough that I can keep my computer up to date and maintained.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="intro"&gt;Intro&lt;/h2&gt;
&lt;p&gt;Arch is often not recommended to new Linux users.
This is caused by the fact that you have to run a lot of commands to install and configure your system.
The terminal is scary.
The terminal is made for hackers.
That pushes new users away from it.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Please note this guide is outdated, I no longer recommend Arch Linux.</p>
<p>Arch Linux works great on my main desktop, but with it on everything else I&rsquo;m unhappy with it.
This is because I use my main desktop enough that I can keep my computer up to date and maintained.</p>
<hr>
<h2 id="intro">Intro</h2>
<p>Arch is often not recommended to new Linux users.
This is caused by the fact that you have to run a lot of commands to install and configure your system.
The terminal is scary.
The terminal is made for hackers.
That pushes new users away from it.</p>
<p>Despite all of that, I would recommend Arch Linux to beginners.</p>
<p>Arch has just recently made a <a href="https://linuxreviews.org/The_Latest_Arch_Linux_ISO_Has_A_Fresh_New_Guided_Installer">guided installer</a>.
The installer makes this process extremely easy and less tedious.</p>
<p>First and foremost, connect your device to the internet.</p>
<p>Then you may need to initalize your pacman keys.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>pacman-key --init
</span></span></code></pre></div><p>Afterward, you can run through the guided installer.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>python -m archinstall guided
</span></span></code></pre></div><p>Recently I tried to install Fedora on my laptop.
I heard a lot of good things about it.
Packages are up to date and stable.
But it sucked.
The package manager was sooo slow.
Updates took forever.
I had constant issues with the wifi on my laptop.
It led to me manually having to request ip addresses from my router using <code>sudo dhclient -v</code>
One problem would lead to the next.
Constant issues and configuration.
Then I gave up.
I wasted a whole week.
I spent many hours trying to get things to &ldquo;just work.&rdquo;</p>
<h2 id="my-mistakes">My Mistakes</h2>
<p>I didn&rsquo;t use the normal <a href="https://getfedora.org/">Fedora workstation</a> install.
Instead, I used <a href="https://alt.fedoraproject.org/en/">Fedora Everything</a>.</p>
<p>I tried the Fedora workstation install initially.
But I hated it.
I didn&rsquo;t like <a href="https://www.gnome.org/">Gnome</a>.
The system ran slow, and wasn&rsquo;t as snappy as I was hoping.
It had over 2000 packages installed by default.
In comparison my Arch install on my desktop has 1805 packages.
I have many packages I don&rsquo;t use, tons of apps installed, and steam games.
And yet it is less bloated than a vanilla Fedora install.</p>
<p>This led to me using Fedora Everything.
It&rsquo;s just the essentials.
It boots to the terminal just like Arch.
Nothing additional installed.
<a href="https://github.com/HelamanWarrior/Fedora-Installer">I created a script</a> to automatically install everything I needed.
It had my window manager (<a href="https://github.com/baskerville/bspwm">BSPWM</a>), terminal (<a href="https://st.suckless.org/">st</a>), <a href="https://polybar.github.io/">polybar</a>, <a href="https://github.com/HelamanWarrior/dotfiles">dot files</a> and all of that fun stuff.</p>
<p>According to my virtual machine the script worked great.
It should be great to install quickly on multiple machines.
Nope, it wasn&rsquo;t.
It sucked.
Constant issues with Fedora working with my laptop hardware.
It was an endless rabbithole of maintainance and fixing things.
I had an <a href="https://wiki.archlinux.org/title/NVIDIA_Optimus">Nvidia Optimus</a> based laptop.
That was the biggest problem for my custom Fedora install.
It led to many workarounds and dumb hacks.
This sucked, because I wanted to run this install on many laptops.
These workarounds wouldn&rsquo;t work on other devices with different hardware.
This would lead to me constantly maintaining all of the devices using Fedora Everything.
I then stopped using Fedora.</p>
<h2 id="the-switch-to-arch">The Switch to Arch</h2>
<p>Initially I didn&rsquo;t want to use Arch on the laptop.
Mostly because most people on the internet says &ldquo;it&rsquo;s unstable.&rdquo;
If I&rsquo;m doing a laptop install, it needs to &ldquo;just work.&rdquo;
I&rsquo;m not gonna have the time to mess around trying to get things working.</p>
<p>But I thought about it more.
I reconsidered.
I have ran my Arch install for almost a year on my desktop.
Guess what?
No problems!
I probably had one or two things that broke.
But at the end of the day it was my fault that they broke in the first place.</p>
<h2 id="the-archening-begins">The Archening begins</h2>
<p>Installing Arch was very straightforward.
I downloaded the latest <a href="https://archlinux.org/download/">Arch ISO</a>.
And I had it livebooted in no time.
Running the Arch guided installer was very straightforward and I had all the customization I needed.
It allowed you to install most desktop environments and some window managers.
As well as installing your own packages if you so choose.
It even gave me the option to install my Nvidia drivers.</p>
<p>Instead of going my typical window manager route, I went with <a href="https://kde.org/plasma-desktop/">KDE Plasma</a>.
I&rsquo;m so glad I did.
Everything seems to work right out of the box.
Which is exactly what I needed.
When it booted into Plasma there was very few apps installed.
Last time I installed Plasma I had a ton of KDE apps I didn&rsquo;t use.
It bloated up the system, and trying to delete them was a pain in the butt.
I&rsquo;m really glad to see that it&rsquo;s very minimal and I still have a lot of room to customize my install.
It also seems to use up way less resources than Gnome.
Plasma was super snappy and I&rsquo;m really impressed how well it ran.
Can we talk about the number of packages.
I know packages aren&rsquo;t everything, but holy cow!
When I was done with installing all of my apps and Plasma I had 700 packages!
By comparison, my Fedora Everything install had that many before I even started installing stuff.</p>
<p>My fresh Plasma install had almost no problems.
As always you get display issues on Nvidia Optimus laptops.
But it was an extremely simple fix.
<a href="https://wiki.archlinux.org/title/NVIDIA_Optimus#No_screens_found_on_a_laptop/NVIDIA_Optimus">You can fix it</a> with changing your display manager configuration or your xorg conf.
You are also gonna have to switch from Wayland to Xorg in order for this to work.
You gotta love Nvidia, making things harder for everyone.
But after that fix, everything has been great!
I&rsquo;ve been running it for over a week now.
No problems!</p>
<h2 id="arch-is-for-beginners">Arch is for Beginners</h2>
<p>In my opinion I believe Arch is one of the best distros for beginners.
Now let me clear this up.
By beginners I mean anyone with some good computer experience that&rsquo;s new to Linux.
The average Joe is always gonna have a harder time on Linux.
Especially if they are running into problems just using Windows.</p>
<p>You could say the terminal pushes away the beginners, your gonna have to touch the terminal in the installation.
But if you&rsquo;re gonna use Linux you&rsquo;re eventually gonna have to use the terminal.
The guided Arch installer opens the door to more people.
If you haven&rsquo;t used Arch yet, I recommend you try it in a Virtual Machine and see how you like it.
Just go through the guided installer and see what you like.</p>
<p>Fedora could have been just fine.
My main issue came from not using the official workstation release.
Fedora workstation really wasn&rsquo;t my thing.
Finding packages is quite a bit of work with Fedora.
It&rsquo;s a smaller distro so many guides simply wouldn&rsquo;t tell you what the Fedora equivalent packages are.
This leads to it taking more time hunting down packages.</p>
<p>With Arch, even if the application I want isn&rsquo;t in the repo, I can just go to the <a href="https://aur.archlinux.org/">AUR (Arch User Repository)</a>.
Almost any app that runs on linux will probably be in there.
Rarely are you ever gonna have to install dependencies or compile things yourself.
Which is even easier for beginners.</p>
]]></content:encoded></item><item><title>Generating Slideshows Easily with Shotcut</title><link>https://plug-world.com/posts/generating-slideshows-easily-with-shotcut/</link><pubDate>Wed, 15 Jun 2022 14:24:37 -0600</pubDate><guid>https://plug-world.com/posts/generating-slideshows-easily-with-shotcut/</guid><description>&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://shotcut.org/"&gt;Shotcut&lt;/a&gt; is an open source video editor.&lt;/p&gt;
&lt;p&gt;From their &lt;a href="https://forum.shotcut.org/t/slideshow-generator/19162"&gt;forum&lt;/a&gt; I found out you can create slide shows with it. In the past I tried to create an &lt;a href="https://ffmpeg.org/"&gt;ffmpeg&lt;/a&gt; script to do this for me, but I was unsuccessful. This does exactly what I was hoping to achieve with those scripts.&lt;/p&gt;
&lt;h2 id="tutorial"&gt;Tutorial&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Import all&lt;/strong&gt; of your pictures into the playlist panel on the left hand side.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Select all&lt;/strong&gt; of the pictures that you want in the slideshow.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
&lt;p class="md__image"&gt;
&lt;img src="https://plug-world.com/images/posts/shotcut-slideshow-generator/highlight-photos-playlist.webp" alt="Shotcut Picture Selection" /&gt;
&lt;/p&gt;</description><content:encoded><![CDATA[<h2 id="context">Context</h2>
<p><a href="https://shotcut.org/">Shotcut</a> is an open source video editor.</p>
<p>From their <a href="https://forum.shotcut.org/t/slideshow-generator/19162">forum</a> I found out you can create slide shows with it. In the past I tried to create an <a href="https://ffmpeg.org/">ffmpeg</a> script to do this for me, but I was unsuccessful. This does exactly what I was hoping to achieve with those scripts.</p>
<h2 id="tutorial">Tutorial</h2>
<ol>
<li><strong>Import all</strong> of your pictures into the playlist panel on the left hand side.</li>
<li><strong>Select all</strong> of the pictures that you want in the slideshow.</li>
</ol>
<p>



<p class="md__image">
  <img src="/https/plug-world.com/images/posts/shotcut-slideshow-generator/highlight-photos-playlist.webp" alt="Shotcut Picture Selection"  />
</p>

</p>
<ol start="3">
<li>Open the <strong>playlist menu</strong></li>
</ol>
<p>



<p class="md__image">
  <img src="/https/plug-world.com/images/posts/shotcut-slideshow-generator/slideshow-playlist.webp" alt="Playlist menu"  />
</p>

</p>
<ol start="4">
<li>Click <strong>Add selected to Slideshow</strong></li>
<li>Find what settings works best for your needs</li>
</ol>
<p>



<p class="md__image">
  <img src="/https/plug-world.com/images/posts/shotcut-slideshow-generator/slideshow-properties.webp" alt="Slideshow properties"  />
</p>

</p>
<h2 id="fixing-the-lag">Fixing the Lag</h2>
<p>You may have noticed the editor lagging as you watch the slideshow in the timeline. This seems like a very common issue with these open source video editors, but I have found a few settings that may speed it up for you.</p>
<p>Go to settings then&hellip;</p>
<ol>
<li>Disable Scrub Audio</li>
<li>Disable Realtime (frame dropping)</li>
<li>Set preview scaling to 360p</li>
<li>Go to proxy
<ul>
<li>Enable Use Proxy</li>
<li>Enable Use Hardware Encoder</li>
<li>Click Configure Hardware Encoder and double check that your using the correct GPU or APU.</li>
</ul>
</li>
<li>Change Interpolation to Nearest Neighbor</li>
</ol>
<p>You probably don&rsquo;t need to go as extreme as I have for the example above. Feel free to play around with each of those settings.</p>
<h2 id="conclusion">Conclusion</h2>
<p>And boom, you got a slideshow!</p>
<p>It may not be perfect, but it gets the job done quickly with quite a bit of customization.</p>
]]></content:encoded></item><item><title>The Steam Deck Is Huge for Indie Gamedevs</title><link>https://plug-world.com/posts/the-steam-deck-is-huge-for-indie-gamedevs/</link><pubDate>Wed, 08 Jun 2022 15:40:00 -0600</pubDate><guid>https://plug-world.com/posts/the-steam-deck-is-huge-for-indie-gamedevs/</guid><description>&lt;p&gt;
&lt;p class="md__image"&gt;
&lt;img src="https://plug-world.com/images/posts/steam-deck-is-huge-for-gamedevs/steam-deck-closeup.webp" alt="Steam Deck" /&gt;
&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://www.steamdeck.com/en/"&gt;Steam Deck&lt;/a&gt; is gonna lead to the biggest shift in the pc gaming industry.&lt;/p&gt;
&lt;h2 id="a-hitch-hikers-guide-to-the-steam-deck"&gt;A hitch hikers guide to the Steam Deck&lt;/h2&gt;
&lt;p&gt;The Steam Deck is a handheld x86 based computer. It runs a custom AMD APU running Zen 2 and RDNA 2. The Steam Deck runs &lt;a href="https://archlinux.org/"&gt;Arch Linux&lt;/a&gt; as it&amp;rsquo;s kernel in it&amp;rsquo;s custom operating system called Steam OS 3.0.&lt;/p&gt;
&lt;h3 id="steam-os-beginnings"&gt;Steam OS Beginnings&lt;/h3&gt;
&lt;p&gt;
&lt;p class="md__image"&gt;
&lt;img src="https://plug-world.com/images/posts/steam-deck-is-huge-for-gamedevs/big-picture.webp" alt="Steam OS" /&gt;
&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/SteamOS"&gt;Steam OS has been around ever since the end of 2013&lt;/a&gt;. Gabe Newell had a very clear vision for Steam OS. At LinuxCon he stated &lt;a href="https://arstechnica.com/gaming/2013/09/gabe-newell-linux-is-the-future-of-gaming-new-hardware-coming-soon/"&gt;&amp;ldquo;Linux and open source are the future of gaming.&amp;rdquo;&lt;/a&gt; The idea of running Windows games on Linux is not a new idea to Valve. They have been working on their compatibility layer called &lt;a href="https://github.com/ValveSoftware/Proton"&gt;Proton&lt;/a&gt; for a long time. Proton is a fork of &lt;a href="https://www.winehq.org/"&gt;Wine&lt;/a&gt;, which is a tool to run Windows executables on Linux. Valve first used Steam OS on their &lt;a href="https://en.wikipedia.org/wiki/Steam_Machine_(computer)"&gt;Steam Machines&lt;/a&gt; in 2015. Basically Steam Machines were just to bring a console like experience to a personal computer. This led to the &lt;a href="https://store.steampowered.com/app/353370/Steam_Controller/"&gt;Steam Controllers&lt;/a&gt; and &lt;a href="https://store.steampowered.com/bigpicture"&gt;Steam Big Picture&lt;/a&gt;.&lt;/p&gt;</description><content:encoded><![CDATA[<p>



<p class="md__image">
  <img src="/https/plug-world.com/images/posts/steam-deck-is-huge-for-gamedevs/steam-deck-closeup.webp" alt="Steam Deck"  />
</p>

</p>
<p>The <a href="https://www.steamdeck.com/en/">Steam Deck</a> is gonna lead to the biggest shift in the pc gaming industry.</p>
<h2 id="a-hitch-hikers-guide-to-the-steam-deck">A hitch hikers guide to the Steam Deck</h2>
<p>The Steam Deck is a handheld x86 based computer. It runs a custom AMD APU running Zen 2 and RDNA 2. The Steam Deck runs <a href="https://archlinux.org/">Arch Linux</a> as it&rsquo;s kernel in it&rsquo;s custom operating system called Steam OS 3.0.</p>
<h3 id="steam-os-beginnings">Steam OS Beginnings</h3>
<p>



<p class="md__image">
  <img src="/https/plug-world.com/images/posts/steam-deck-is-huge-for-gamedevs/big-picture.webp" alt="Steam OS"  />
</p>

</p>
<p><a href="https://en.wikipedia.org/wiki/SteamOS">Steam OS has been around ever since the end of 2013</a>. Gabe Newell had a very clear vision for Steam OS. At LinuxCon he stated <a href="https://arstechnica.com/gaming/2013/09/gabe-newell-linux-is-the-future-of-gaming-new-hardware-coming-soon/">&ldquo;Linux and open source are the future of gaming.&rdquo;</a> The idea of running Windows games on Linux is not a new idea to Valve. They have been working on their compatibility layer called <a href="https://github.com/ValveSoftware/Proton">Proton</a> for a long time. Proton is a fork of <a href="https://www.winehq.org/">Wine</a>, which is a tool to run Windows executables on Linux. Valve first used Steam OS on their <a href="https://en.wikipedia.org/wiki/Steam_Machine_(computer)">Steam Machines</a> in 2015. Basically Steam Machines were just to bring a console like experience to a personal computer. This led to the <a href="https://store.steampowered.com/app/353370/Steam_Controller/">Steam Controllers</a> and <a href="https://store.steampowered.com/bigpicture">Steam Big Picture</a>.</p>
<h3 id="steam-machines-failed">Steam Machines Failed</h3>
<p>



<p class="md__image">
  <img src="/https/plug-world.com/images/posts/steam-deck-is-huge-for-gamedevs/steam-machine.webp" alt="Steam Machine"  />
</p>

</p>
<p>At the time, Steam OS was a very cool concept, but lacked in terms of hardware and game support. Which led to the <a href="https://steamcommunity.com/app/221410/discussions/0/1696043806550421224/">Steam Machines being discontinued in 2018</a>. Valve stated that they still have a vision for Steam OS and will continue to improve it, even after discontinuing the Steam Machines.</p>
<h3 id="steam-deck-announcement">Steam Deck Announcement</h3>
<p>Towards the end of 2021 the <a href="https://www.youtube.com/watch?v=AlWgZhMtlWo">Steam Deck was announced</a>. The Steam Deck was made possible by the software that Valve has continued to improve over the course of about 9 years. It was also only possible by the contributions and the dedication of the free and open source community. The Steam Deck introduced a new way to play PC games. Often it&rsquo;s compared to the Nintendo Switch in terms of form factor, but the two systems are dramatically different and created for very different audiences.</p>
<h2 id="other-handheld-pcs">Other handheld PCs</h2>
<p>The idea of a handheld computer has been around for a very long time. But the hardware never caught up to the current generation. Until now. If you have been paying any attention to the handheld computer space in the past 2 years, you would know that the market is beginning to become mainstream.</p>
<p>I owned a <a href="https://www.gpd.hk/gdpwin2">GPD Win 2</a> before my Steam Deck. It doesn&rsquo;t really have a lot of processing power, but basically every 2D indie game would run perfectly on it. It was interesting to tinker with it, often you could boost performance and battery life by playing with the TDP and under volting the machine. This opens up the possibilities of playing a few AAA pc games.</p>
<p>There&rsquo;s definitely an expanding market here. One that I believe game developers should design games with this usecase in mind.</p>
<h2 id="indie-games-benefit-most-from-handheld-systems">Indie games benefit most from handheld systems</h2>
<p>Whenever you have portable hardware, the games that are played the most are usually casual. I mean some people play Call of Duty Mobile on their phones, but most people play simple and addictive time killer games.</p>
<p>Take the Nintendo Switch as an example. Basically all of the Nintendo Switch library is backed by indie games. Aside from the Nintendo AAA games, people mostly play indie games on the system. Nintendo knows this, they have been promoting indies for a while now using <a href="https://twitter.com/indieworldna">indie world</a>.</p>
<p>In my experience playing on the Steam Deck, I would often lean towards the more casual indie games.</p>
<ul>
<li>They are much easier to jump straight into, especially if I just have a few minutes to spare.</li>
<li>They use up very little battery. Some games can go up to 7 hours before the unit dies.</li>
</ul>
<p>Most of the time, I just found them more enjoyable. Now that&rsquo;s obviously just my opinion. Plenty of people are enjoying modern AAA games on their Steam Decks right now. But by the stats of the previous systems in a similar form factor, I can confidently say that the Steam Deck is gonna sell more indie game developers games that support the platform.</p>
<h2 id="great-on-deck">Great on Deck</h2>
<p>Since the Steam Deck is running Steam OS and is Linux based. Not all games work flawlessly on it. Proton does an amazing job getting most games running on the system. But there are a few that will continue to have issues until devs support it.</p>
<p><a href="https://store.steampowered.com/greatondeck">Great on Deck</a> was created to help customers make sure they are buying games that run well on the system. As an indie game dev, the goal should be to get your game supported. Games that are supported overall get a lot more game sales compared to games that aren&rsquo;t supported on Steam Deck. I would start by integrating the <a href="https://partner.steamgames.com/doc/sdk/api">SteamWorks api</a> into your game. Adding achievements, cloud saves, and steam input can go a long way for your game.</p>
<h2 id="conclusion">Conclusion</h2>
<p>Just some of my quick thoughts on the current handheld gaming market and how indie game developers can benefit from it. I would totally recommend if you are a current game developer to look into the Steam Deck and other gaming handhelds. It&rsquo;s an interesting market right now, and it&rsquo;s just starting to become more mainstream.</p>
]]></content:encoded></item><item><title>Building a NAS</title><link>https://plug-world.com/posts/building-a-nas/</link><pubDate>Wed, 08 Jun 2022 11:11:01 -0600</pubDate><guid>https://plug-world.com/posts/building-a-nas/</guid><description>&lt;p&gt;
&lt;p class="md__image"&gt;
&lt;img src="https://plug-world.com/images/posts/diy-nas/diy-nas-full-setup.webp" alt="Diy Nas" /&gt;
&lt;/p&gt;
&lt;/p&gt;
&lt;h2 id="computer-"&gt;Computer 🖥️&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Ryzen 2200G&lt;/strong&gt;, &lt;strong&gt;16gb&lt;/strong&gt; of RAM, bronze PSU, &lt;strong&gt;4 - 8TB&lt;/strong&gt; &lt;a href="https://www.amazon.com/Seagate-BarraCuda-Internal-Drive-3-5-Inch/dp/B07H289S7C"&gt;Barracuda Compute Seagate HDD&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The file system is configured for &lt;strong&gt;ZFS RAIDZ-1&lt;/strong&gt;. RAIDZ-1 is a lot like RAID-5.&lt;/p&gt;
&lt;h2 id="setting-up-zfs-"&gt;Setting up ZFS 💾&lt;/h2&gt;
&lt;p&gt;This guide is geared towards ZFS RAIDZ-1. This requires &lt;strong&gt;at least 3 drives.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For your ZFS installation you have two choices.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://openzfs.github.io/openzfs-docs/Getting%20Started/Debian/index.html"&gt;Guide for installing OpenZFS&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;This is an open source alternative to Oracle&amp;rsquo;s ZFS project. Very similar to Oracle&amp;rsquo;s ZFS.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.debian.org/ZFS"&gt;Guide for installing ZFS&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;This is Oracle&amp;rsquo;s proprietary ZFS. Extremely similar to OpenZFS.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;According to &lt;a href="https://www.jeffgeerling.com/blog/2021/htgwa-create-zfs-raidz1-zpool-on-raspberry-pi"&gt;Jeff Geerling&lt;/a&gt; to prepare the drives to be formated for ZFS you have to do this&amp;hellip; &lt;strong&gt;This will erase everything on the drives.&lt;/strong&gt;&lt;/p&gt;</description><content:encoded><![CDATA[<p>



<p class="md__image">
  <img src="/https/plug-world.com/images/posts/diy-nas/diy-nas-full-setup.webp" alt="Diy Nas"  />
</p>

</p>
<h2 id="computer-">Computer 🖥️</h2>
<p><strong>Ryzen 2200G</strong>, <strong>16gb</strong> of RAM, bronze PSU, <strong>4 - 8TB</strong> <a href="https://www.amazon.com/Seagate-BarraCuda-Internal-Drive-3-5-Inch/dp/B07H289S7C">Barracuda Compute Seagate HDD</a>.</p>
<p>The file system is configured for <strong>ZFS RAIDZ-1</strong>. RAIDZ-1 is a lot like RAID-5.</p>
<h2 id="setting-up-zfs-">Setting up ZFS 💾</h2>
<p>This guide is geared towards ZFS RAIDZ-1. This requires <strong>at least 3 drives.</strong></p>
<p>For your ZFS installation you have two choices.</p>
<ul>
<li><a href="https://openzfs.github.io/openzfs-docs/Getting%20Started/Debian/index.html">Guide for installing OpenZFS</a>
<ul>
<li>This is an open source alternative to Oracle&rsquo;s ZFS project. Very similar to Oracle&rsquo;s ZFS.</li>
</ul>
</li>
<li><a href="https://wiki.debian.org/ZFS">Guide for installing ZFS</a>
<ul>
<li>This is Oracle&rsquo;s proprietary ZFS. Extremely similar to OpenZFS.</li>
</ul>
</li>
</ul>
<p>According to <a href="https://www.jeffgeerling.com/blog/2021/htgwa-create-zfs-raidz1-zpool-on-raspberry-pi">Jeff Geerling</a> to prepare the drives to be formated for ZFS you have to do this&hellip; <strong>This will erase everything on the drives.</strong></p>
<div class="highlight"><pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo umount /dev/sda?; sudo wipefs --all --force /dev/sda?; sudo wipefs --all --force /dev/sda
</span></span><span style="display:flex;"><span>sudo umount /dev/sdb?; sudo wipefs --all --force /dev/sdb?; sudo wipefs --all --force /dev/sdb
</span></span><span style="display:flex;"><span>sudo umount /dev/sdc?; sudo wipefs --all --force /dev/sdc?; sudo wipefs --all --force /dev/sdc
</span></span></code></pre></div><p>Run the above commands for each drive that you want in the pool. You can find these drives by using the command lsblk.</p>
<p>Run the command below to create a pool. Make sure to include every drive you want in the pool.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo zpool create zfspool raidz1 sda sdb sdc -f
</span></span></code></pre></div><p>After some research I found that you should almost always turn on ZFS compression.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo zfs <span style="color:#658b00">set</span> <span style="color:#00688b">compression</span>=on zfspool
</span></span></code></pre></div><p>Now your pool should be configured. You can review the status of the pool by using&hellip;</p>
<div class="highlight"><pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>zpool status
</span></span></code></pre></div><p>If I would setup it up again, I would probably use OpenZFS which is an open source implementation of Oracle&rsquo;s propritary ZFS system. But at the time, I didn&rsquo;t know I was using Oracle&rsquo;s propritary ZFS system, so I ended up with that.</p>
<h2 id="apps">Apps</h2>
<h3 id="docker">Docker</h3>
<p>After using docker for a while I quickly realized the limitations of the tool. Every time you want to make a change or update the container you have to recreate the application from the ground up. All of the configuration you do inside the application all gets removed and you start fresh every time. Oh, and if you want to actually update it, you have to manually remove the container and rerun your docker command.</p>
<p>The solution to all of these is quite simple. <strong>Don&rsquo;t use DOCKER.</strong> <em>Instead use docker-compose.</em></p>
<p><a href="https://docs.docker.com/compose/">Docker compose</a> essentially automates the whole process for the user. All you have to do is save a docker-compose.yml file which configures the application. At any time you can pull the latest updates and have your docker back up and running. <em>But wait, what about the application&rsquo;s config?</em> Yeah, by default it will be wiped every time. The solution is to mount the configuration of the file in a <strong>volume</strong>.</p>
<p><strong>Volumes</strong> <em>are way of passing files from your local file system back into your application</em>. The app has no access to any files outside the container by default. The solution is to now mount the configuration of the application back into your file system outside your container. Then the application will write to that mounted directory it&rsquo;s configuration files and the files will no longer be dependent on the application. You can modify them outside of the application, you can remove the application and recreate it and if you still have the config files mounted then the application will continue to maintain persistence when you make changes to it.</p>
<p><a href="https://www.linuxserver.io/">Linux Server</a> <strong>I can&rsquo;t recommend using their dockers enough</strong>. They essentially take a lot of self hosted applications that people use and make them easier. Configuration is often done with one config folder, just mount it once and boom you are done. Using and configuring their apps are a lot more intuitive than others. <em>But what about the updates?</em> Yeah I mean you can only assume if you use someone else&rsquo;s packages you are at the mercy of them maintaining it. But you don&rsquo;t have to worry about it with <strong>Linux Server</strong>. They have some sort of bot/script that seems to generate these packages whenever updates go through on the apps. Which means you get the latest applications, and don&rsquo;t have to worry about missing features or vulnerabilities.</p>
<h3 id="apps-i-currently-use">Apps I currently use:</h3>
<table>
  <thead>
      <tr>
          <th>Apps</th>
          <th>Docker-Compose examples</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><a href="https://docs.linuxserver.io/images/docker-swag#linuxserver-swag">Swag / Nginx (Web Server / Reverse Proxy)</a></td>
          <td><a href="/https/plug-world.com/docker-compose-files/swag">Docker-Compose</a></td>
      </tr>
      <tr>
          <td><a href="https://docs.linuxserver.io/images/docker-jellyfin">Jellyfin (Open Source Media Server)</a></td>
          <td><a href="/https/plug-world.com/docker-compose-files/jellyfin">Docker-Compose</a></td>
      </tr>
      <tr>
          <td><a href="https://docs.linuxserver.io/images/docker-plex">Plex (Propietary Media Server)</a></td>
          <td><a href="/https/plug-world.com/docker-compose-files/plex">Docker-Compose</a></td>
      </tr>
      <tr>
          <td><a href="https://docs.linuxserver.io/images/docker-nextcloud">Nextcloud (Like Google Drive)</a></td>
          <td><a href="/https/plug-world.com/docker-compose-files/nextcloud">Docker-Compose</a></td>
      </tr>
      <tr>
          <td><a href="https://github.com/syncthing/syncthing">Syncthing (File sync across devices)</a></td>
          <td><a href="/https/plug-world.com/docker-compose-files/syncthing">Docker-Compose</a></td>
      </tr>
      <tr>
          <td><a href="https://github.com/searxng/searxng">SearXNG (Metadata search engine)</a></td>
          <td><a href="/https/plug-world.com/docker-compose-files/searxng">Docker-Compose</a></td>
      </tr>
      <tr>
          <td><a href="https://github.com/matrix-org/synapse">Matrix Synapse (Encrypted Chat Server)</a></td>
          <td><a href="/https/plug-world.com/docker-compose-files/synapse">Docker-Compose</a></td>
      </tr>
      <tr>
          <td><a href="https://photoview.github.io/">Photoview</a></td>
          <td><a href="/https/plug-world.com/docker-compose-files/photoview">Docker-compose</a></td>
      </tr>
  </tbody>
</table>
<h3 id="swag">SWAG</h3>
<p>This application is built ontop of <a href="https://nginx.org/en/">nginx</a>.
Nginx is a <strong>web server</strong> and a <strong>reverse proxy</strong>. <a href="https://github.com/linuxserver/docker-swag">Swag</a> is just amazing. It just makes your life easier. It has <a href="https://github.com/linuxserver/reverse-proxy-confs">reverse proxy templates</a> for most applications that you would want to run. You simply just have to change the file name to enable them. Anyways, it&rsquo;s really nice so you can have you domain point to multiple apps easily. It also containers certbot which essentially is able to give your website HTTPS encryption all you have to do is configure your domain, add your email to the environment variable, and boom you got an HTTPS website. It comes with other stuff to like cloudflare integration, and many other useful things that just save you so much time.</p>
<p>In order to enable reverse proxy on your apps, locate your swag config folder then go to nginx/proxy-confs. You will see a huge list of all the apps, locate the app you want to reverse proxy.</p>
<p>When you reverse proxy, you will usually have two options&hellip;</p>
<ul>
<li><strong>subfolder</strong>
<ul>
<li>example.com/myapp</li>
<li>requires no extra ssl certificates to sign</li>
<li>no dns configuration required</li>
</ul>
</li>
<li><strong>subdomain</strong>
<ul>
<li>myapp.example.com</li>
<li>every subdomain needs a signed ssl certificate</li>
<li>requires subdomain to be added to the &ldquo;SUBDOMAINS&rdquo; environment variable in docker compose</li>
<li>requires cname record to to be added to dns</li>
</ul>
</li>
</ul>
<p>I perfer to reverse proxy subfolders, they are a lot less work than subdomains, <em>but certain apps will require a subdomain reverse proxy.</em></p>
<p>To enable the reverse proxy for your app, just copy the myapp.subdomain/subfolder.conf.sample to myapp.subdomain/subfolder.conf. Essentially just remove the .sample portion of the file name, that will activate it to be used by the reverse proxy. <strong>Please note that if you don&rsquo;t rename your containers correctly this will not work.</strong> In the proxy configs it uses the container name to get the ip address of the container through the docker network. If you use the ip address of the container in the reverse proxy instead of the name you will have problems because the ip addresses get changed everytime you initialize your containers. So it&rsquo;s best to use the name in the reverse proxy.</p>
<p>After configuring the reverse proxy you need to restart the swag service using&hellip;</p>
<div class="highlight"><pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo docker-compose restart swag
</span></span></code></pre></div><h3 id="docker-tips">Docker Tips</h3>
<p>Once you have created your docker compose file with all your apps, make sure you keep it updated. Outdated apps can potentially have vulnerabilities that would allow attackers to exploit your server.</p>
<p>To update your containers use this&hellip;</p>
<div class="highlight"><pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo docker-compose pull
</span></span></code></pre></div><p>Followed by&hellip;</p>
<div class="highlight"><pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo docker-compose up -d
</span></span></code></pre></div><p>The above command recreates the updated containers. Whenever you change the docker-compose file you want to run the above command to recreate the new containers.</p>
<p>Docker images never get deleted when you update your containers. Previous images stay on the disk, which can build up over time and consume a lot of storage space. In order to delete the old unused images use this command.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo docker image prune
</span></span></code></pre></div><h2 id="conclusion">Conclusion</h2>
<p>Just getting started with self hosting applications is a difficult task. Especially if you don&rsquo;t have any prior Linux experience.</p>
<p>It&rsquo;s dangerous to go alone, take this <a href="https://docs.linuxserver.io/">Linux Server docs</a>. Everything over there is very beginner friendly and extremely useful when getting started on your self hosting journey.</p>
]]></content:encoded></item><item><title>Pismo California Trip</title><link>https://plug-world.com/microblog/pismo-california-trip/</link><pubDate>Thu, 02 Jun 2022 22:28:18 -0600</pubDate><guid>https://plug-world.com/microblog/pismo-california-trip/</guid><description>&lt;div style="width: 100%"&gt;
&lt;div style="position: relative; padding-bottom: 56.15%; height: 0; overflow: hidden; margin-bottom: 20px;"&gt;
&lt;iframe
style="position: absolute; top: 0; left:0; width: 100%; height: 100%; border: 0;"
loading="lazy";
srcdoc="&lt;style&gt;
* {
padding: 0;
margin: 0;
overflow: hidden;
}
body, html {
height: 100%;
}
img, svg {
position: absolute;
width: 100%;
top: 0;
bottom: 0;
margin: auto;
}
svg {
filter: drop-shadow(1px 1px 10px hsl(206.5, 70.7%, 8%));
transition: all 250ms ease-in-out;
}
body:hover svg {
filter: drop-shadow(1px 1px 10px hsl(206.5, 0%, 10%));
transform: scale(1.2);
}
&lt;/style&gt;
&lt;a href='https://www.youtube.com/embed/6xDMt2JNEi0?autoplay=1'&gt;
&lt;img src='https://img.youtube.com/vi/6xDMt2JNEi0/hqdefault.jpg'&gt;
&lt;svg xmlns='http://www.w3.org/2000/svg' width='64' height='64' viewBox='0 0 24 24' fill='none' stroke='#ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-play-circle'&gt;&lt;circle cx='12' cy='12' r='10'&gt;&lt;/circle&gt;&lt;polygon points='10 8 16 12 10 16 10 8'&gt;&lt;/polygon&gt;&lt;/svg&gt;
&lt;/a&gt;
"
src="https://www.youtube.com/embed/6xDMt2JNEi0"
title=""
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen&gt;
&lt;/iframe&gt;
&lt;/div&gt;
&lt;/div&gt;</description><content:encoded><![CDATA[

<div style="width: 100%">
<div style="position: relative; padding-bottom: 56.15%; height: 0; overflow: hidden; margin-bottom: 20px;">
  <iframe 
    style="position: absolute; top: 0; left:0; width: 100%; height: 100%; border: 0;"
    loading="lazy";
    srcdoc="<style>
      * {
      padding: 0;
      margin: 0;
      overflow: hidden;
      }
      body, html {
        height: 100%;
      }
      img, svg {
        position: absolute;
        width: 100%;
        top: 0;
        bottom: 0;
        margin: auto;
      }
      svg {
        filter: drop-shadow(1px 1px 10px hsl(206.5, 70.7%, 8%));
        transition: all 250ms ease-in-out;
      }
      body:hover svg {
        filter: drop-shadow(1px 1px 10px hsl(206.5, 0%, 10%));
        transform: scale(1.2);
      }
    </style>
    <a href='https://www.youtube.com/embed/6xDMt2JNEi0?autoplay=1'>
      <img src='https://img.youtube.com/vi/6xDMt2JNEi0/hqdefault.jpg'>
      <svg xmlns='http://www.w3.org/2000/svg' width='64' height='64' viewBox='0 0 24 24' fill='none' stroke='#ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-play-circle'><circle cx='12' cy='12' r='10'></circle><polygon points='10 8 16 12 10 16 10 8'></polygon></svg>
    </a>
    "
    src="https://www.youtube.com/embed/6xDMt2JNEi0" 
    title=""
    frameborder="0"
    allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" 
    allowfullscreen>
  </iframe>
</div>
</div>


]]></content:encoded></item><item><title>Setting Up a Bluray Plex Server</title><link>https://plug-world.com/posts/setting-up-a-bluray-plex-server/</link><pubDate>Wed, 27 Apr 2022 16:49:45 -0600</pubDate><guid>https://plug-world.com/posts/setting-up-a-bluray-plex-server/</guid><description>&lt;p&gt;Update: This isn&amp;rsquo;t really a guide.
I kinda just wrote this for myself.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s a quick rundown that this post covers&amp;hellip;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#the-rippining"&gt;HandBrake encoding settings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#makemkv-on-linux-small-guide"&gt;Fixing MakeMKV on Linux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#issues-ripping-new-movies"&gt;Fixing new releases not ripping&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#libredrive"&gt;Ripping 4k movies&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;If you are looking for a step by step guide, please look elsewhere.&lt;/em&gt;
This was just me throwing down my thoughts.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="the-plexining"&gt;The Plexining&lt;/h2&gt;
&lt;p&gt;Ever since we got our NAS we had Plex on it. But we didn&amp;rsquo;t have much on it. &lt;a href="https://www.plex.tv/"&gt;Plex&lt;/a&gt; is just a media server that hosts all your files and media in one easy to access streamable way. Anyways, I figured it&amp;rsquo;s about time to start utilizing this NAS a lot more. I needed to migrate our entire library of movies from Vudu, Amazon, and Google Play Movies to the NAS. Since I don&amp;rsquo;t wanna be a pirate I&amp;rsquo;m gonna do things the hard way.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Update: This isn&rsquo;t really a guide.
I kinda just wrote this for myself.</p>
<p>Here&rsquo;s a quick rundown that this post covers&hellip;</p>
<ul>
<li><a href="#the-rippining">HandBrake encoding settings</a></li>
<li><a href="#makemkv-on-linux-small-guide">Fixing MakeMKV on Linux</a></li>
<li><a href="#issues-ripping-new-movies">Fixing new releases not ripping</a></li>
<li><a href="#libredrive">Ripping 4k movies</a></li>
</ul>
<p><em>If you are looking for a step by step guide, please look elsewhere.</em>
This was just me throwing down my thoughts.</p>
<hr>
<h2 id="the-plexining">The Plexining</h2>
<p>Ever since we got our NAS we had Plex on it. But we didn&rsquo;t have much on it. <a href="https://www.plex.tv/">Plex</a> is just a media server that hosts all your files and media in one easy to access streamable way. Anyways, I figured it&rsquo;s about time to start utilizing this NAS a lot more. I needed to migrate our entire library of movies from Vudu, Amazon, and Google Play Movies to the NAS. Since I don&rsquo;t wanna be a pirate I&rsquo;m gonna do things the hard way.</p>
<p>I also use Jellyfin on my media server as a backup if my NAS can&rsquo;t reach Plex&rsquo;s servers. Which is kinda dumb to selfhost Plex and than still be dependent on their own servers to be online. But whatever, still own my own media so if Plex doesn&rsquo;t work I can easily move to the next platform.</p>
<p>I decided to mainly use Plex because&hellip;</p>
<ul>
<li>My dad already owned Plex Pass. (Basically allows for transcoding and DVR functionality)</li>
<li>The app works natively on our smart tv. But it&rsquo;s extremely slow and terrible, but better than nothing.</li>
<li>It supports automatically deleting commericials on live tv.</li>
<li>HDR to SDR tonemapping support actually works. (Jellyfin doesn&rsquo;t natively support it but you can use an external media player that does)</li>
</ul>
<h2 id="the-rippining">The Rippining</h2>
<p>We owned like 3 movies on BluRay, and already had a drive that I can rip from. So it was time to get to work. The process suprisingly wasn&rsquo;t too difficult. MakeMKV does most of the heavylifting for you. All MakeMKV does is bypass the DRM on the disc and decrypt it leading you with an h.264 video that gets containerized into a mkv file. Most of the movies on BluRays range from 20gb to 100gb. If that&rsquo;s too much for you, you can always compress them down in smaller sizes using handbrake.</p>
<p>My recommended <a href="https://handbrake.fr/">HandBrake</a> settings for compressing BluRays&hellip;</p>
<ul>
<li>Format: Matroska</li>
<li>Encoder: H.265 10 bit</li>
<li>FrameRate: Same as Video</li>
<li>FrameRate: Constant</li>
<li>Quality: 20</li>
<li>Audio make sure to include 5.7 surround sound or 7.1 based on your setup.</li>
<li>You can also compress the audio down to 640kbps if you so choose.</li>
</ul>
<p>The reason I use h265 is for the high amount of detail that remains once you compress. But it has a few major drawbacks.</p>
<p>These drawbacks include&hellip;</p>
<ul>
<li>A lot of resources to compress video footage.</li>
<li>The codec has tons of licensing issues, so playback may not be native on your device.</li>
<li>Due to the licensing issues not all devices support h265</li>
</ul>
<p>If you are reading this article in the future, you may want to consider compressing videos in AV1. I hear that&rsquo;s gonna be the next big thing. AV1 at its core is essentially just like h265 whereas it perserves a lot of details at a highly compressed size. But the codec is open source and doesn&rsquo;t have any licensing issues. It&rsquo;s also quite a bit more efficent than h265, so you will be expirencing better quality at the same file size. The only issue is at the time of writing this article, nobody really supports it much. So as that changes it may be a good thing to look into if you are concerned about storage space.</p>
<h2 id="makemkv-on-linux-small-guide">MakeMKV on Linux: Small Guide</h2>
<p>I installed MakeMKV on Arch Linux, so this won&rsquo;t apply to Debian users (sorry).</p>
<p>If you are on debian you can look <a href="https://forum.makemkv.com/forum/viewtopic.php?f=3&amp;t=224">here</a>. I had issues doing the official downloads and compilation on my end. But I&rsquo;m sure that was my fault in the first place.</p>
<p>But I was able to get my own build of MakeMKV on the <a href="https://aur.archlinux.org/packages/makemkv/">AUR (Arch User Repository)</a> and that seemed to be working just fine for me. Also auto updates are way cool. You also want to make sure you get the <a href="https://aur.archlinux.org/packages/makemkv-libaacs/">aacs libraries</a> for Linux.</p>
<p>Optical drives on Arch Linux is kind of a pain to get working. If you get the error that MakeMKV can&rsquo;t find any Optical Drives in Arch Linux, it&rsquo;s not MakeMKV&rsquo;s fault. I found the solution to this problem in this <a href="https://www.reddit.com/r/makemkv/comments/r3jijh/arch_linux_this_program_cant_find_any_usable/">Reddit post</a>. According to the post the solution is to: &ldquo;Create a file on /etc/modules-load.d/ with the content sg then reboot. Mine is named sg.conf but the name is totally arbitrary.&rdquo;</p>
<p>And that should be everything, that&rsquo;s everything I needed to do to get this to work.</p>
<h2 id="issues-ripping-new-movies">Issues Ripping New Movies?</h2>
<p>MakeMKV is able to decrypt movies by using of Volume Unique Keys (VUKS) from a database. If you have a recent movie that won&rsquo;t rip, then on MakeMKV go download the latest keys from <a href="http://fvonline-db.bplaced.net/">FindVUK Online Database.</a> Then place the keydb.cfg file in the folder that MakeMKV is installed in. It should automatically recognize it and use the local database in combination with their own online database. If you are still having issues, there are tools to manually get the VUK key but it will require <a href="https://www.dvdfab.cn/">DVDfab</a> and another tool called <a href="https://forum.doom9.org/showthread.php?t=172472">FindVUK</a> to extract the VUK from memory on DVDfab.</p>
<h2 id="drives-matter">Drives Matter</h2>
<p>The Blu-Ray drive you use for ripping can make all of the difference. When ripping movies you need to get a perfect copy off of the drive, if there&rsquo;s any piece of data or information that can&rsquo;t be read on the drive it will be unable to rip. Certain Blu-Ray drives are much more affective when reading scratched disks. With my old Blu-Ray player I would have what seems to be a perfect copy of the movie, no scratches noticable, and yet it would run into read errors. They can also have faster read speeds which will speed up the process of ripping each disk.</p>
<h2 id="libredrive">Libredrive</h2>
<p>Libedrive is very cool because, many blu-ray players &ldquo;don&rsquo;t support 4k (UHD).&rdquo; Yet they are fully capable of playing them back. There&rsquo;s just this little police in the firmware that tells it to not play back the 4k disk. With Libredrive we are effectively overwriting the firmware on the disk to force it to play back any sort of disk in the system.</p>
<p>If you are planning on getting a Blu-Ray player I definitely recommend getting one that Libredrive supports. It only supports very specific drives, but you can find what drive to get on the <a href="https://forum.makemkv.com/forum/viewtopic.php?t=19634">MakeMKV forums</a></p>
<h2 id="conclusion">Conclusion</h2>
<p>Owning my media is important to me. Unfortunately with movies you can&rsquo;t really own your movies &ldquo;legally.&rdquo; The simple act of breaking the encryption on the disk is illegal. Yet creating personal backups of media is totally legal. So kind of in the gray area, but since I am buying copies of physical media from the official retailers I feel like it&rsquo;s ethical to do this. If you typically stream your media and don&rsquo;t watch very many Blu-Rays you are gonna see a huge jump in quality. The bitrate makes all of the difference, resolutions are overrated, you can be watching a highly compressed 4k stream on Netflix and a 1080p Blu-Ray will almost always look better than that compressed stream. To a typical person this isn&rsquo;t easy and they would opt for just watching all their movies on streaming services. And I can agree, it&rsquo;s not user friendly and your going to have to maintain your own server. But I enjoy it, so that&rsquo;s how I&rsquo;m gonna watch my media.</p>
]]></content:encoded></item><item><title>Valley of Fire Trip</title><link>https://plug-world.com/microblog/valley-of-fire-trip/</link><pubDate>Fri, 24 Dec 2021 22:28:18 -0600</pubDate><guid>https://plug-world.com/microblog/valley-of-fire-trip/</guid><description>&lt;div style="width: 100%"&gt;
&lt;div style="position: relative; padding-bottom: 56.15%; height: 0; overflow: hidden; margin-bottom: 20px;"&gt;
&lt;iframe
style="position: absolute; top: 0; left:0; width: 100%; height: 100%; border: 0;"
loading="lazy";
srcdoc="&lt;style&gt;
* {
padding: 0;
margin: 0;
overflow: hidden;
}
body, html {
height: 100%;
}
img, svg {
position: absolute;
width: 100%;
top: 0;
bottom: 0;
margin: auto;
}
svg {
filter: drop-shadow(1px 1px 10px hsl(206.5, 70.7%, 8%));
transition: all 250ms ease-in-out;
}
body:hover svg {
filter: drop-shadow(1px 1px 10px hsl(206.5, 0%, 10%));
transform: scale(1.2);
}
&lt;/style&gt;
&lt;a href='https://www.youtube.com/embed/6l9KsPN2uuM?autoplay=1'&gt;
&lt;img src='https://img.youtube.com/vi/6l9KsPN2uuM/hqdefault.jpg'&gt;
&lt;svg xmlns='http://www.w3.org/2000/svg' width='64' height='64' viewBox='0 0 24 24' fill='none' stroke='#ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-play-circle'&gt;&lt;circle cx='12' cy='12' r='10'&gt;&lt;/circle&gt;&lt;polygon points='10 8 16 12 10 16 10 8'&gt;&lt;/polygon&gt;&lt;/svg&gt;
&lt;/a&gt;
"
src="https://www.youtube.com/embed/6l9KsPN2uuM"
title=""
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen&gt;
&lt;/iframe&gt;
&lt;/div&gt;
&lt;/div&gt;</description><content:encoded><![CDATA[

<div style="width: 100%">
<div style="position: relative; padding-bottom: 56.15%; height: 0; overflow: hidden; margin-bottom: 20px;">
  <iframe 
    style="position: absolute; top: 0; left:0; width: 100%; height: 100%; border: 0;"
    loading="lazy";
    srcdoc="<style>
      * {
      padding: 0;
      margin: 0;
      overflow: hidden;
      }
      body, html {
        height: 100%;
      }
      img, svg {
        position: absolute;
        width: 100%;
        top: 0;
        bottom: 0;
        margin: auto;
      }
      svg {
        filter: drop-shadow(1px 1px 10px hsl(206.5, 70.7%, 8%));
        transition: all 250ms ease-in-out;
      }
      body:hover svg {
        filter: drop-shadow(1px 1px 10px hsl(206.5, 0%, 10%));
        transform: scale(1.2);
      }
    </style>
    <a href='https://www.youtube.com/embed/6l9KsPN2uuM?autoplay=1'>
      <img src='https://img.youtube.com/vi/6l9KsPN2uuM/hqdefault.jpg'>
      <svg xmlns='http://www.w3.org/2000/svg' width='64' height='64' viewBox='0 0 24 24' fill='none' stroke='#ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-play-circle'><circle cx='12' cy='12' r='10'></circle><polygon points='10 8 16 12 10 16 10 8'></polygon></svg>
    </a>
    "
    src="https://www.youtube.com/embed/6l9KsPN2uuM" 
    title=""
    frameborder="0"
    allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" 
    allowfullscreen>
  </iframe>
</div>
</div>


]]></content:encoded></item><item><title>Lava Hotsprings Trip</title><link>https://plug-world.com/microblog/lava-hotsprings-trip/</link><pubDate>Sun, 26 Sep 2021 22:28:18 -0600</pubDate><guid>https://plug-world.com/microblog/lava-hotsprings-trip/</guid><description>&lt;div style="width: 100%"&gt;
&lt;div style="position: relative; padding-bottom: 56.15%; height: 0; overflow: hidden; margin-bottom: 20px;"&gt;
&lt;iframe
style="position: absolute; top: 0; left:0; width: 100%; height: 100%; border: 0;"
loading="lazy";
srcdoc="&lt;style&gt;
* {
padding: 0;
margin: 0;
overflow: hidden;
}
body, html {
height: 100%;
}
img, svg {
position: absolute;
width: 100%;
top: 0;
bottom: 0;
margin: auto;
}
svg {
filter: drop-shadow(1px 1px 10px hsl(206.5, 70.7%, 8%));
transition: all 250ms ease-in-out;
}
body:hover svg {
filter: drop-shadow(1px 1px 10px hsl(206.5, 0%, 10%));
transform: scale(1.2);
}
&lt;/style&gt;
&lt;a href='https://www.youtube.com/embed/6G9vScDTnyQ?autoplay=1'&gt;
&lt;img src='https://img.youtube.com/vi/6G9vScDTnyQ/hqdefault.jpg'&gt;
&lt;svg xmlns='http://www.w3.org/2000/svg' width='64' height='64' viewBox='0 0 24 24' fill='none' stroke='#ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-play-circle'&gt;&lt;circle cx='12' cy='12' r='10'&gt;&lt;/circle&gt;&lt;polygon points='10 8 16 12 10 16 10 8'&gt;&lt;/polygon&gt;&lt;/svg&gt;
&lt;/a&gt;
"
src="https://www.youtube.com/embed/6G9vScDTnyQ"
title=""
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen&gt;
&lt;/iframe&gt;
&lt;/div&gt;
&lt;/div&gt;</description><content:encoded><![CDATA[

<div style="width: 100%">
<div style="position: relative; padding-bottom: 56.15%; height: 0; overflow: hidden; margin-bottom: 20px;">
  <iframe 
    style="position: absolute; top: 0; left:0; width: 100%; height: 100%; border: 0;"
    loading="lazy";
    srcdoc="<style>
      * {
      padding: 0;
      margin: 0;
      overflow: hidden;
      }
      body, html {
        height: 100%;
      }
      img, svg {
        position: absolute;
        width: 100%;
        top: 0;
        bottom: 0;
        margin: auto;
      }
      svg {
        filter: drop-shadow(1px 1px 10px hsl(206.5, 70.7%, 8%));
        transition: all 250ms ease-in-out;
      }
      body:hover svg {
        filter: drop-shadow(1px 1px 10px hsl(206.5, 0%, 10%));
        transform: scale(1.2);
      }
    </style>
    <a href='https://www.youtube.com/embed/6G9vScDTnyQ?autoplay=1'>
      <img src='https://img.youtube.com/vi/6G9vScDTnyQ/hqdefault.jpg'>
      <svg xmlns='http://www.w3.org/2000/svg' width='64' height='64' viewBox='0 0 24 24' fill='none' stroke='#ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-play-circle'><circle cx='12' cy='12' r='10'></circle><polygon points='10 8 16 12 10 16 10 8'></polygon></svg>
    </a>
    "
    src="https://www.youtube.com/embed/6G9vScDTnyQ" 
    title=""
    frameborder="0"
    allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" 
    allowfullscreen>
  </iframe>
</div>
</div>


]]></content:encoded></item><item><title>Arizona Trip</title><link>https://plug-world.com/microblog/arizona-trip/</link><pubDate>Sun, 22 Aug 2021 22:28:18 -0600</pubDate><guid>https://plug-world.com/microblog/arizona-trip/</guid><description>&lt;div style="width: 100%"&gt;
&lt;div style="position: relative; padding-bottom: 56.15%; height: 0; overflow: hidden; margin-bottom: 20px;"&gt;
&lt;iframe
style="position: absolute; top: 0; left:0; width: 100%; height: 100%; border: 0;"
loading="lazy";
srcdoc="&lt;style&gt;
* {
padding: 0;
margin: 0;
overflow: hidden;
}
body, html {
height: 100%;
}
img, svg {
position: absolute;
width: 100%;
top: 0;
bottom: 0;
margin: auto;
}
svg {
filter: drop-shadow(1px 1px 10px hsl(206.5, 70.7%, 8%));
transition: all 250ms ease-in-out;
}
body:hover svg {
filter: drop-shadow(1px 1px 10px hsl(206.5, 0%, 10%));
transform: scale(1.2);
}
&lt;/style&gt;
&lt;a href='https://www.youtube.com/embed/V-d2gbO5u3k?autoplay=1'&gt;
&lt;img src='https://img.youtube.com/vi/V-d2gbO5u3k/hqdefault.jpg'&gt;
&lt;svg xmlns='http://www.w3.org/2000/svg' width='64' height='64' viewBox='0 0 24 24' fill='none' stroke='#ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-play-circle'&gt;&lt;circle cx='12' cy='12' r='10'&gt;&lt;/circle&gt;&lt;polygon points='10 8 16 12 10 16 10 8'&gt;&lt;/polygon&gt;&lt;/svg&gt;
&lt;/a&gt;
"
src="https://www.youtube.com/embed/V-d2gbO5u3k"
title=""
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen&gt;
&lt;/iframe&gt;
&lt;/div&gt;
&lt;/div&gt;</description><content:encoded><![CDATA[

<div style="width: 100%">
<div style="position: relative; padding-bottom: 56.15%; height: 0; overflow: hidden; margin-bottom: 20px;">
  <iframe 
    style="position: absolute; top: 0; left:0; width: 100%; height: 100%; border: 0;"
    loading="lazy";
    srcdoc="<style>
      * {
      padding: 0;
      margin: 0;
      overflow: hidden;
      }
      body, html {
        height: 100%;
      }
      img, svg {
        position: absolute;
        width: 100%;
        top: 0;
        bottom: 0;
        margin: auto;
      }
      svg {
        filter: drop-shadow(1px 1px 10px hsl(206.5, 70.7%, 8%));
        transition: all 250ms ease-in-out;
      }
      body:hover svg {
        filter: drop-shadow(1px 1px 10px hsl(206.5, 0%, 10%));
        transform: scale(1.2);
      }
    </style>
    <a href='https://www.youtube.com/embed/V-d2gbO5u3k?autoplay=1'>
      <img src='https://img.youtube.com/vi/V-d2gbO5u3k/hqdefault.jpg'>
      <svg xmlns='http://www.w3.org/2000/svg' width='64' height='64' viewBox='0 0 24 24' fill='none' stroke='#ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-play-circle'><circle cx='12' cy='12' r='10'></circle><polygon points='10 8 16 12 10 16 10 8'></polygon></svg>
    </a>
    "
    src="https://www.youtube.com/embed/V-d2gbO5u3k" 
    title=""
    frameborder="0"
    allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" 
    allowfullscreen>
  </iframe>
</div>
</div>


]]></content:encoded></item><item><title>Family Reunion 2021</title><link>https://plug-world.com/microblog/family-reunion-2021/</link><pubDate>Sat, 17 Jul 2021 22:28:18 -0600</pubDate><guid>https://plug-world.com/microblog/family-reunion-2021/</guid><description>&lt;div style="width: 100%"&gt;
&lt;div style="position: relative; padding-bottom: 56.15%; height: 0; overflow: hidden; margin-bottom: 20px;"&gt;
&lt;iframe
style="position: absolute; top: 0; left:0; width: 100%; height: 100%; border: 0;"
loading="lazy";
srcdoc="&lt;style&gt;
* {
padding: 0;
margin: 0;
overflow: hidden;
}
body, html {
height: 100%;
}
img, svg {
position: absolute;
width: 100%;
top: 0;
bottom: 0;
margin: auto;
}
svg {
filter: drop-shadow(1px 1px 10px hsl(206.5, 70.7%, 8%));
transition: all 250ms ease-in-out;
}
body:hover svg {
filter: drop-shadow(1px 1px 10px hsl(206.5, 0%, 10%));
transform: scale(1.2);
}
&lt;/style&gt;
&lt;a href='https://www.youtube.com/embed/Q4pbM94QMVc?autoplay=1'&gt;
&lt;img src='https://img.youtube.com/vi/Q4pbM94QMVc/hqdefault.jpg'&gt;
&lt;svg xmlns='http://www.w3.org/2000/svg' width='64' height='64' viewBox='0 0 24 24' fill='none' stroke='#ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-play-circle'&gt;&lt;circle cx='12' cy='12' r='10'&gt;&lt;/circle&gt;&lt;polygon points='10 8 16 12 10 16 10 8'&gt;&lt;/polygon&gt;&lt;/svg&gt;
&lt;/a&gt;
"
src="https://www.youtube.com/embed/Q4pbM94QMVc"
title=""
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen&gt;
&lt;/iframe&gt;
&lt;/div&gt;
&lt;/div&gt;</description><content:encoded><![CDATA[

<div style="width: 100%">
<div style="position: relative; padding-bottom: 56.15%; height: 0; overflow: hidden; margin-bottom: 20px;">
  <iframe 
    style="position: absolute; top: 0; left:0; width: 100%; height: 100%; border: 0;"
    loading="lazy";
    srcdoc="<style>
      * {
      padding: 0;
      margin: 0;
      overflow: hidden;
      }
      body, html {
        height: 100%;
      }
      img, svg {
        position: absolute;
        width: 100%;
        top: 0;
        bottom: 0;
        margin: auto;
      }
      svg {
        filter: drop-shadow(1px 1px 10px hsl(206.5, 70.7%, 8%));
        transition: all 250ms ease-in-out;
      }
      body:hover svg {
        filter: drop-shadow(1px 1px 10px hsl(206.5, 0%, 10%));
        transform: scale(1.2);
      }
    </style>
    <a href='https://www.youtube.com/embed/Q4pbM94QMVc?autoplay=1'>
      <img src='https://img.youtube.com/vi/Q4pbM94QMVc/hqdefault.jpg'>
      <svg xmlns='http://www.w3.org/2000/svg' width='64' height='64' viewBox='0 0 24 24' fill='none' stroke='#ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-play-circle'><circle cx='12' cy='12' r='10'></circle><polygon points='10 8 16 12 10 16 10 8'></polygon></svg>
    </a>
    "
    src="https://www.youtube.com/embed/Q4pbM94QMVc" 
    title=""
    frameborder="0"
    allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" 
    allowfullscreen>
  </iframe>
</div>
</div>


]]></content:encoded></item><item><title/><link>https://plug-world.com/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://plug-world.com/about/</guid><description>&lt;p&gt;Thanks for visiting my website! Please feel free to reach out to me!&lt;/p&gt;
&lt;p&gt;
&lt;p class="md__image"&gt;
&lt;img src="https://plug-world.com/images/icons/email.gif" alt="" /&gt;
&lt;/p&gt;
&lt;/p&gt;</description><content:encoded><![CDATA[<p>Thanks for visiting my website! Please feel free to reach out to me!</p>
<p>



<p class="md__image">
  <img src="/https/plug-world.com/images/icons/email.gif" alt=""  />
</p>

</p>
]]></content:encoded></item><item><title>BeReal 📷</title><link>https://plug-world.com/bereal/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://plug-world.com/bereal/</guid><description>&lt;style&gt;
main {
max-width: 70rem !important;
text-align: center;
}
#bereal-container {
display: flex;
flex-wrap: wrap;
gap: 1rem;
justify-content: center;
width: 100%;
}
figure {
display: inline-block;
padding: 0.7rem;
box-shadow: rgba(0, 0, 0, 0.3) 0px 8px 24px;
}
figure img {
max-width: 20rem !important;
}
&lt;/style&gt;
&lt;div id="bereal-container"&gt;
&lt;figure&gt;
&lt;img class="bereal-thumbnail" src="https://plug-world.com/images/bereal/bereal-2023-07-19-0900.jpg" /&gt;
&lt;figcaption&gt;Wednesday, Jul 19, 2023&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img class="bereal-thumbnail" src="https://plug-world.com/images/bereal/bereal-2023-07-09-0805.jpg" /&gt;
&lt;figcaption&gt;Sunday, Jul 9, 2023&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img class="bereal-thumbnail" src="https://plug-world.com/images/bereal/bereal-2023-07-04-0930.jpg" /&gt;
&lt;figcaption&gt;Tuesday, Jul 4, 2023&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img class="bereal-thumbnail" src="https://plug-world.com/images/bereal/bereal-2023-07-02-1018.jpg" /&gt;
&lt;figcaption&gt;Sunday, Jul 2, 2023&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img class="bereal-thumbnail" src="https://plug-world.com/images/bereal/bereal-2023-06-29-1200.jpg" /&gt;
&lt;figcaption&gt;Thursday, Jun 29, 2023&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img class="bereal-thumbnail" src="https://plug-world.com/images/bereal/bereal-2023-06-24-1200.jpg" /&gt;
&lt;figcaption&gt;Saturday, Jun 24, 2023&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img class="bereal-thumbnail" src="https://plug-world.com/images/bereal/bereal-2023-06-23-1200.jpg" /&gt;
&lt;figcaption&gt;Friday, Jun 23, 2023&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img class="bereal-thumbnail" src="https://plug-world.com/images/bereal/bereal-2023-06-21-1200.jpg" /&gt;
&lt;figcaption&gt;Wednesday, Jun 21, 2023&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img class="bereal-thumbnail" src="https://plug-world.com/images/bereal/bereal-2023-06-10-1200.jpg" /&gt;
&lt;figcaption&gt;Saturday, Jun 10, 2023&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img class="bereal-thumbnail" src="https://plug-world.com/images/bereal/bereal-2023-06-04-1200.jpg" /&gt;
&lt;figcaption&gt;Sunday, Jun 4, 2023&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img class="bereal-thumbnail" src="https://plug-world.com/images/bereal/bereal-2023-06-02-1200.jpg" /&gt;
&lt;figcaption&gt;Friday, Jun 2, 2023&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img class="bereal-thumbnail" src="https://plug-world.com/images/bereal/bereal-2023-05-30-1200.jpg" /&gt;
&lt;figcaption&gt;Tuesday, May 30, 2023&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img class="bereal-thumbnail" src="https://plug-world.com/images/bereal/bereal-2023-05-29-1200.jpg" /&gt;
&lt;figcaption&gt;Monday, May 29, 2023&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img class="bereal-thumbnail" src="https://plug-world.com/images/bereal/bereal-2023-05-29-1100.jpg" /&gt;
&lt;figcaption&gt;Monday, May 29, 2023&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img class="bereal-thumbnail" src="https://plug-world.com/images/bereal/bereal-2023-05-28-1200.jpg" /&gt;
&lt;figcaption&gt;Sunday, May 28, 2023&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img class="bereal-thumbnail" src="https://plug-world.com/images/bereal/bereal-2023-05-27-1200.jpg" /&gt;
&lt;figcaption&gt;Saturday, May 27, 2023&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img class="bereal-thumbnail" src="https://plug-world.com/images/bereal/bereal-2023-05-25-1200.jpg" /&gt;
&lt;figcaption&gt;Thursday, May 25, 2023&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img class="bereal-thumbnail" src="https://plug-world.com/images/bereal/bereal-2023-05-24-1200.jpg" /&gt;
&lt;figcaption&gt;Wednesday, May 24, 2023&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img class="bereal-thumbnail" src="https://plug-world.com/images/bereal/bereal-2023-05-14-1200.jpg" /&gt;
&lt;figcaption&gt;Sunday, May 14, 2023&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img class="bereal-thumbnail" src="https://plug-world.com/images/bereal/bereal-2023-05-13-1200.jpg" /&gt;
&lt;figcaption&gt;Saturday, May 13, 2023&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img class="bereal-thumbnail" src="https://plug-world.com/images/bereal/bereal-2023-05-05-1200.jpg" /&gt;
&lt;figcaption&gt;Friday, May 5, 2023&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img class="bereal-thumbnail" src="https://plug-world.com/images/bereal/bereal-2023-04-25-1200.jpg" /&gt;
&lt;figcaption&gt;Tuesday, Apr 25, 2023&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img class="bereal-thumbnail" src="https://plug-world.com/images/bereal/bereal-2023-04-24-1200.jpg" /&gt;
&lt;figcaption&gt;Monday, Apr 24, 2023&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img class="bereal-thumbnail" src="https://plug-world.com/images/bereal/bereal-2023-04-22-1200.jpg" /&gt;
&lt;figcaption&gt;Saturday, Apr 22, 2023&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img class="bereal-thumbnail" src="https://plug-world.com/images/bereal/bereal-2023-04-18-1200%20%281%29.jpg" /&gt;
&lt;figcaption&gt;Tuesday, Apr 18, 2023&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img class="bereal-thumbnail" src="https://plug-world.com/images/bereal/bereal-2023-04-09-1200.jpg" /&gt;
&lt;figcaption&gt;Sunday, Apr 9, 2023&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img class="bereal-thumbnail" src="https://plug-world.com/images/bereal/bereal-2023-04-04-1200.jpg" /&gt;
&lt;figcaption&gt;Tuesday, Apr 4, 2023&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img class="bereal-thumbnail" src="https://plug-world.com/images/bereal/bereal-2023-04-03-1200%20%281%29.jpg" /&gt;
&lt;figcaption&gt;Monday, Apr 3, 2023&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img class="bereal-thumbnail" src="https://plug-world.com/images/bereal/bereal-2023-03-29-1200.jpg" /&gt;
&lt;figcaption&gt;Wednesday, Mar 29, 2023&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img class="bereal-thumbnail" src="https://plug-world.com/images/bereal/bereal-2023-03-21-1200.jpg" /&gt;
&lt;figcaption&gt;Tuesday, Mar 21, 2023&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img class="bereal-thumbnail" src="https://plug-world.com/images/bereal/bereal-2023-02-25-1200.jpg" /&gt;
&lt;figcaption&gt;Saturday, Feb 25, 2023&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img class="bereal-thumbnail" src="https://plug-world.com/images/bereal/bereal-2023-01-30-1200.jpg" /&gt;
&lt;figcaption&gt;Monday, Jan 30, 2023&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img class="bereal-thumbnail" src="https://plug-world.com/images/bereal/bereal-2023-01-17-1200.jpg" /&gt;
&lt;figcaption&gt;Tuesday, Jan 17, 2023&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img class="bereal-thumbnail" src="https://plug-world.com/images/bereal/bereal-2023-01-16-1200.jpg" /&gt;
&lt;figcaption&gt;Monday, Jan 16, 2023&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img class="bereal-thumbnail" src="https://plug-world.com/images/bereal/bereal-2022-12-09-1200.jpg" /&gt;
&lt;figcaption&gt;Friday, Dec 9, 2022&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img class="bereal-thumbnail" src="https://plug-world.com/images/bereal/bereal-2022-11-15-1200.jpg" /&gt;
&lt;figcaption&gt;Tuesday, Nov 15, 2022&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img class="bereal-thumbnail" src="https://plug-world.com/images/bereal/bereal-2022-10-30-1200.jpg" /&gt;
&lt;figcaption&gt;Sunday, Oct 30, 2022&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img class="bereal-thumbnail" src="https://plug-world.com/images/bereal/bereal-2022-10-13-1200.jpg" /&gt;
&lt;figcaption&gt;Thursday, Oct 13, 2022&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img class="bereal-thumbnail" src="https://plug-world.com/images/bereal/bereal-2022-10-02-1200.jpg" /&gt;
&lt;figcaption&gt;Sunday, Oct 2, 2022&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img class="bereal-thumbnail" src="https://plug-world.com/images/bereal/bereal-2022-09-30-1200.jpg" /&gt;
&lt;figcaption&gt;Friday, Sep 30, 2022&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img class="bereal-thumbnail" src="https://plug-world.com/images/bereal/bereal-2022-09-14-1200.jpg" /&gt;
&lt;figcaption&gt;Wednesday, Sep 14, 2022&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img class="bereal-thumbnail" src="https://plug-world.com/images/bereal/bereal-2022-09-11-1200.jpg" /&gt;
&lt;figcaption&gt;Sunday, Sep 11, 2022&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img class="bereal-thumbnail" src="https://plug-world.com/images/bereal/bereal-2022-09-04-1200.jpg" /&gt;
&lt;figcaption&gt;Sunday, Sep 4, 2022&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;</description><content:encoded><![CDATA[<style>
  main {
    max-width: 70rem !important;
    text-align: center;
  }
  #bereal-container {
    display: flex;
    flex-wrap: wrap;
    gap: 1rem;
    justify-content: center;

    width: 100%;
  }
  figure {
    display: inline-block;
    padding: 0.7rem;
    box-shadow: rgba(0, 0, 0, 0.3) 0px 8px 24px;
  }
  figure img {
    max-width: 20rem !important;
  }
</style>

<div id="bereal-container">








<figure>
<img class="bereal-thumbnail" src="/https/plug-world.com/images/bereal/bereal-2023-07-19-0900.jpg" />
<figcaption>Wednesday, Jul 19, 2023</figcaption>
</figure>







<figure>
<img class="bereal-thumbnail" src="/https/plug-world.com/images/bereal/bereal-2023-07-09-0805.jpg" />
<figcaption>Sunday, Jul 9, 2023</figcaption>
</figure>







<figure>
<img class="bereal-thumbnail" src="/https/plug-world.com/images/bereal/bereal-2023-07-04-0930.jpg" />
<figcaption>Tuesday, Jul 4, 2023</figcaption>
</figure>







<figure>
<img class="bereal-thumbnail" src="/https/plug-world.com/images/bereal/bereal-2023-07-02-1018.jpg" />
<figcaption>Sunday, Jul 2, 2023</figcaption>
</figure>







<figure>
<img class="bereal-thumbnail" src="/https/plug-world.com/images/bereal/bereal-2023-06-29-1200.jpg" />
<figcaption>Thursday, Jun 29, 2023</figcaption>
</figure>







<figure>
<img class="bereal-thumbnail" src="/https/plug-world.com/images/bereal/bereal-2023-06-24-1200.jpg" />
<figcaption>Saturday, Jun 24, 2023</figcaption>
</figure>







<figure>
<img class="bereal-thumbnail" src="/https/plug-world.com/images/bereal/bereal-2023-06-23-1200.jpg" />
<figcaption>Friday, Jun 23, 2023</figcaption>
</figure>







<figure>
<img class="bereal-thumbnail" src="/https/plug-world.com/images/bereal/bereal-2023-06-21-1200.jpg" />
<figcaption>Wednesday, Jun 21, 2023</figcaption>
</figure>







<figure>
<img class="bereal-thumbnail" src="/https/plug-world.com/images/bereal/bereal-2023-06-10-1200.jpg" />
<figcaption>Saturday, Jun 10, 2023</figcaption>
</figure>







<figure>
<img class="bereal-thumbnail" src="/https/plug-world.com/images/bereal/bereal-2023-06-04-1200.jpg" />
<figcaption>Sunday, Jun 4, 2023</figcaption>
</figure>







<figure>
<img class="bereal-thumbnail" src="/https/plug-world.com/images/bereal/bereal-2023-06-02-1200.jpg" />
<figcaption>Friday, Jun 2, 2023</figcaption>
</figure>







<figure>
<img class="bereal-thumbnail" src="/https/plug-world.com/images/bereal/bereal-2023-05-30-1200.jpg" />
<figcaption>Tuesday, May 30, 2023</figcaption>
</figure>







<figure>
<img class="bereal-thumbnail" src="/https/plug-world.com/images/bereal/bereal-2023-05-29-1200.jpg" />
<figcaption>Monday, May 29, 2023</figcaption>
</figure>







<figure>
<img class="bereal-thumbnail" src="/https/plug-world.com/images/bereal/bereal-2023-05-29-1100.jpg" />
<figcaption>Monday, May 29, 2023</figcaption>
</figure>







<figure>
<img class="bereal-thumbnail" src="/https/plug-world.com/images/bereal/bereal-2023-05-28-1200.jpg" />
<figcaption>Sunday, May 28, 2023</figcaption>
</figure>







<figure>
<img class="bereal-thumbnail" src="/https/plug-world.com/images/bereal/bereal-2023-05-27-1200.jpg" />
<figcaption>Saturday, May 27, 2023</figcaption>
</figure>







<figure>
<img class="bereal-thumbnail" src="/https/plug-world.com/images/bereal/bereal-2023-05-25-1200.jpg" />
<figcaption>Thursday, May 25, 2023</figcaption>
</figure>







<figure>
<img class="bereal-thumbnail" src="/https/plug-world.com/images/bereal/bereal-2023-05-24-1200.jpg" />
<figcaption>Wednesday, May 24, 2023</figcaption>
</figure>







<figure>
<img class="bereal-thumbnail" src="/https/plug-world.com/images/bereal/bereal-2023-05-14-1200.jpg" />
<figcaption>Sunday, May 14, 2023</figcaption>
</figure>







<figure>
<img class="bereal-thumbnail" src="/https/plug-world.com/images/bereal/bereal-2023-05-13-1200.jpg" />
<figcaption>Saturday, May 13, 2023</figcaption>
</figure>







<figure>
<img class="bereal-thumbnail" src="/https/plug-world.com/images/bereal/bereal-2023-05-05-1200.jpg" />
<figcaption>Friday, May 5, 2023</figcaption>
</figure>







<figure>
<img class="bereal-thumbnail" src="/https/plug-world.com/images/bereal/bereal-2023-04-25-1200.jpg" />
<figcaption>Tuesday, Apr 25, 2023</figcaption>
</figure>







<figure>
<img class="bereal-thumbnail" src="/https/plug-world.com/images/bereal/bereal-2023-04-24-1200.jpg" />
<figcaption>Monday, Apr 24, 2023</figcaption>
</figure>







<figure>
<img class="bereal-thumbnail" src="/https/plug-world.com/images/bereal/bereal-2023-04-22-1200.jpg" />
<figcaption>Saturday, Apr 22, 2023</figcaption>
</figure>







<figure>
<img class="bereal-thumbnail" src="/https/plug-world.com/images/bereal/bereal-2023-04-18-1200%20%281%29.jpg" />
<figcaption>Tuesday, Apr 18, 2023</figcaption>
</figure>







<figure>
<img class="bereal-thumbnail" src="/https/plug-world.com/images/bereal/bereal-2023-04-09-1200.jpg" />
<figcaption>Sunday, Apr 9, 2023</figcaption>
</figure>







<figure>
<img class="bereal-thumbnail" src="/https/plug-world.com/images/bereal/bereal-2023-04-04-1200.jpg" />
<figcaption>Tuesday, Apr 4, 2023</figcaption>
</figure>







<figure>
<img class="bereal-thumbnail" src="/https/plug-world.com/images/bereal/bereal-2023-04-03-1200%20%281%29.jpg" />
<figcaption>Monday, Apr 3, 2023</figcaption>
</figure>







<figure>
<img class="bereal-thumbnail" src="/https/plug-world.com/images/bereal/bereal-2023-03-29-1200.jpg" />
<figcaption>Wednesday, Mar 29, 2023</figcaption>
</figure>







<figure>
<img class="bereal-thumbnail" src="/https/plug-world.com/images/bereal/bereal-2023-03-21-1200.jpg" />
<figcaption>Tuesday, Mar 21, 2023</figcaption>
</figure>







<figure>
<img class="bereal-thumbnail" src="/https/plug-world.com/images/bereal/bereal-2023-02-25-1200.jpg" />
<figcaption>Saturday, Feb 25, 2023</figcaption>
</figure>







<figure>
<img class="bereal-thumbnail" src="/https/plug-world.com/images/bereal/bereal-2023-01-30-1200.jpg" />
<figcaption>Monday, Jan 30, 2023</figcaption>
</figure>







<figure>
<img class="bereal-thumbnail" src="/https/plug-world.com/images/bereal/bereal-2023-01-17-1200.jpg" />
<figcaption>Tuesday, Jan 17, 2023</figcaption>
</figure>







<figure>
<img class="bereal-thumbnail" src="/https/plug-world.com/images/bereal/bereal-2023-01-16-1200.jpg" />
<figcaption>Monday, Jan 16, 2023</figcaption>
</figure>







<figure>
<img class="bereal-thumbnail" src="/https/plug-world.com/images/bereal/bereal-2022-12-09-1200.jpg" />
<figcaption>Friday, Dec 9, 2022</figcaption>
</figure>







<figure>
<img class="bereal-thumbnail" src="/https/plug-world.com/images/bereal/bereal-2022-11-15-1200.jpg" />
<figcaption>Tuesday, Nov 15, 2022</figcaption>
</figure>







<figure>
<img class="bereal-thumbnail" src="/https/plug-world.com/images/bereal/bereal-2022-10-30-1200.jpg" />
<figcaption>Sunday, Oct 30, 2022</figcaption>
</figure>







<figure>
<img class="bereal-thumbnail" src="/https/plug-world.com/images/bereal/bereal-2022-10-13-1200.jpg" />
<figcaption>Thursday, Oct 13, 2022</figcaption>
</figure>







<figure>
<img class="bereal-thumbnail" src="/https/plug-world.com/images/bereal/bereal-2022-10-02-1200.jpg" />
<figcaption>Sunday, Oct 2, 2022</figcaption>
</figure>







<figure>
<img class="bereal-thumbnail" src="/https/plug-world.com/images/bereal/bereal-2022-09-30-1200.jpg" />
<figcaption>Friday, Sep 30, 2022</figcaption>
</figure>







<figure>
<img class="bereal-thumbnail" src="/https/plug-world.com/images/bereal/bereal-2022-09-14-1200.jpg" />
<figcaption>Wednesday, Sep 14, 2022</figcaption>
</figure>







<figure>
<img class="bereal-thumbnail" src="/https/plug-world.com/images/bereal/bereal-2022-09-11-1200.jpg" />
<figcaption>Sunday, Sep 11, 2022</figcaption>
</figure>







<figure>
<img class="bereal-thumbnail" src="/https/plug-world.com/images/bereal/bereal-2022-09-04-1200.jpg" />
<figcaption>Sunday, Sep 4, 2022</figcaption>
</figure>















</div>

]]></content:encoded></item><item><title>Recommendations</title><link>https://plug-world.com/recommendations/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://plug-world.com/recommendations/</guid><description>&lt;p&gt;
&lt;p class="md__image"&gt;
&lt;img src="https://plug-world.com/images/recommendations/fred-smith-recommendation.webp" alt="fred-smith-recommendation" /&gt;
&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;p class="md__image"&gt;
&lt;img src="https://plug-world.com/images/recommendations/fred-smith-silverwolf-of-the-month.webp" alt="fred-smith-silverwolf-of-the-month" /&gt;
&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;p class="md__image"&gt;
&lt;img src="https://plug-world.com/images/recommendations/lance-rhodes-silverwolf-of-the-month.webp" alt="lance-rhodes-silverwolf-of-the-month" /&gt;
&lt;/p&gt;
&lt;/p&gt;</description><content:encoded><![CDATA[<p>



<p class="md__image">
  <img src="/https/plug-world.com/images/recommendations/fred-smith-recommendation.webp" alt="fred-smith-recommendation"  />
</p>

</p>
<p>



<p class="md__image">
  <img src="/https/plug-world.com/images/recommendations/fred-smith-silverwolf-of-the-month.webp" alt="fred-smith-silverwolf-of-the-month"  />
</p>

</p>
<p>



<p class="md__image">
  <img src="/https/plug-world.com/images/recommendations/lance-rhodes-silverwolf-of-the-month.webp" alt="lance-rhodes-silverwolf-of-the-month"  />
</p>

</p>
]]></content:encoded></item><item><title>Uses</title><link>https://plug-world.com/uses/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://plug-world.com/uses/</guid><description>&lt;p&gt;So this is all the things I use.&lt;/p&gt;
&lt;h2 id="software"&gt;Software&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Linux Mint (both desktop &amp;amp; laptops)&lt;/li&gt;
&lt;li&gt;Debian (for homeserver)&lt;/li&gt;
&lt;li&gt;Firefox w/ custom &lt;a href="https://plug-world.com/firefox/prefs.js"&gt;prefs.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Hugo SSG (built this site)&lt;/li&gt;
&lt;li&gt;SearXNG search engine&lt;/li&gt;
&lt;li&gt;Linkding (bookmark manager)&lt;/li&gt;
&lt;li&gt;Davinci Resolve Studio
&lt;ul&gt;
&lt;li&gt;yes, I bought Studio for the better Linux support&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SyncThing (backups, syncing common files between devices)&lt;/li&gt;
&lt;li&gt;Godot game engine&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="hardware"&gt;Hardware&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Google Pixel 6 Pro w/ Graphene OS&lt;/li&gt;
&lt;li&gt;Lenovo IdeaPad 5 14ITL05 (intel i5-1135G7)
&lt;ul&gt;
&lt;li&gt;Love the thin portable form factor.&lt;/li&gt;
&lt;li&gt;It&amp;rsquo;s smooth and has good performance.&lt;/li&gt;
&lt;li&gt;Keyboard isn&amp;rsquo;t my favorite, but also not bad.&lt;/li&gt;
&lt;li&gt;Really great battery life&lt;/li&gt;
&lt;li&gt;Very solid, inexpensive laptop&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="useful-stuff"&gt;Useful stuff&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Notebook and Pilot G2-07 pen&lt;/li&gt;
&lt;li&gt;Insta360 X3 camera&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="services"&gt;Services&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Redbox
&lt;ul&gt;
&lt;li&gt;Rentals are cheapest you can get&lt;/li&gt;
&lt;li&gt;$5 to purchase movie, heck yeah man!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description><content:encoded><![CDATA[<p>So this is all the things I use.</p>
<h2 id="software">Software</h2>
<ul>
<li>Linux Mint (both desktop &amp; laptops)</li>
<li>Debian (for homeserver)</li>
<li>Firefox w/ custom <a href="/https/plug-world.com/firefox/prefs.js">prefs.js</a></li>
<li>Hugo SSG (built this site)</li>
<li>SearXNG search engine</li>
<li>Linkding (bookmark manager)</li>
<li>Davinci Resolve Studio
<ul>
<li>yes, I bought Studio for the better Linux support</li>
</ul>
</li>
<li>SyncThing (backups, syncing common files between devices)</li>
<li>Godot game engine</li>
</ul>
<h2 id="hardware">Hardware</h2>
<ul>
<li>Google Pixel 6 Pro w/ Graphene OS</li>
<li>Lenovo IdeaPad 5 14ITL05 (intel i5-1135G7)
<ul>
<li>Love the thin portable form factor.</li>
<li>It&rsquo;s smooth and has good performance.</li>
<li>Keyboard isn&rsquo;t my favorite, but also not bad.</li>
<li>Really great battery life</li>
<li>Very solid, inexpensive laptop</li>
</ul>
</li>
</ul>
<h2 id="useful-stuff">Useful stuff</h2>
<ul>
<li>Notebook and Pilot G2-07 pen</li>
<li>Insta360 X3 camera</li>
</ul>
<h2 id="services">Services</h2>
<ul>
<li>Redbox
<ul>
<li>Rentals are cheapest you can get</li>
<li>$5 to purchase movie, heck yeah man!</li>
</ul>
</li>
</ul>
]]></content:encoded></item></channel></rss>