<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[AbandonTech]]></title><description><![CDATA[Advice and Guides for the Average Engineer]]></description><link>https://blog.abandontech.cloud/</link><image><url>https://blog.abandontech.cloud/favicon.png</url><title>AbandonTech</title><link>https://blog.abandontech.cloud/</link></image><generator>Ghost 5.87</generator><lastBuildDate>Mon, 06 Apr 2026 15:27:39 GMT</lastBuildDate><atom:link href="https://blog.abandontech.cloud/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Adventures in Debugging: Obsessive SEO]]></title><description><![CDATA[<p>It recently occurred to me that I hadn&apos;t run any analysis for SEO on our <a href="https://abandontech.cloud/?ref=blog.abandontech.cloud">main website</a>. I finally sat down with my cup of coffee and generated a few benchmarks using a couple of online <a href="https://developer.chrome.com/docs/lighthouse/overview?ref=blog.abandontech.cloud">lighthouse</a> tools as well as lighthouse in my browser&apos;s dev</p>]]></description><link>https://blog.abandontech.cloud/adventures-in-debugging/</link><guid isPermaLink="false">6691c58fe4af860001bec858</guid><dc:creator><![CDATA[AbandonTech]]></dc:creator><pubDate>Sun, 21 Jul 2024 20:59:37 GMT</pubDate><media:content url="https://blog.abandontech.cloud/content/images/2024/07/teddy_bear_programmer.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.abandontech.cloud/content/images/2024/07/teddy_bear_programmer.jpg" alt="Adventures in Debugging: Obsessive SEO"><p>It recently occurred to me that I hadn&apos;t run any analysis for SEO on our <a href="https://abandontech.cloud/?ref=blog.abandontech.cloud">main website</a>. I finally sat down with my cup of coffee and generated a few benchmarks using a couple of online <a href="https://developer.chrome.com/docs/lighthouse/overview?ref=blog.abandontech.cloud">lighthouse</a> tools as well as lighthouse in my browser&apos;s dev tools. </p><p>The source code for this website is found on <a href="https://github.com/AbandonTech/abandontechsite?ref=blog.abandontech.cloud">Github</a>, if you would like to check it out or follow along to see how these changes were made.</p><h2 id="research-phase">Research Phase</h2><p>Immediately, we had some problems. Accessibility and performance were not within acceptable limits. Typically, I would like to see these scores upwards of 90% and then I can nitpick and hyper-optimize from there. Though this time was different. We missed quite a few important accessibility details, which is arguably the most important aspect of these benchmarks. It is of the upmost importance that we fix these accessibility issues. Luckily, the solutions for accessibility problems tend to be straightforward and well-documented when compared to other issues we may find. However; the thing that caught my eye was how atrocious our performance score actually was.</p><p>The two online tools I enjoy using are <a href="https://lighthouse-metrics.com/?ref=blog.abandontech.cloud">Lighthouse-Metrics</a> and <a href="https://pagespeed.web.dev/?ref=blog.abandontech.cloud">PageSpeed Insights</a>. Using online tools like these should offer a more consistent environment than local dev tools when creating benchmarks like these.</p><h2 id="resolving-issues-accessibility">Resolving Issues: Accessibility</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.abandontech.cloud/content/images/2024/07/image.png" class="kg-image" alt="Adventures in Debugging: Obsessive SEO" loading="lazy" width="1594" height="468" srcset="https://blog.abandontech.cloud/content/images/size/w600/2024/07/image.png 600w, https://blog.abandontech.cloud/content/images/size/w1000/2024/07/image.png 1000w, https://blog.abandontech.cloud/content/images/2024/07/image.png 1594w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Lighthouse accessibility report with a score of 82 out of 100</span></figcaption></figure><p>As I said earlier, accessibility issues tend to be very straight forward. We use <a href="https://nuxt.com/?ref=blog.abandontech.cloud">Nuxt</a> for this application. This framework does a lot of heavy lifting when it comes to SEO and performance and warning me when I make mistakes. This contributed to me overlooking some obvious places to improve the accessibility on our site as I became overly reliant on the warnings generated by the framework. As expected, the first fix for accessibility was quite simple--specify the <code>lang</code> for the site. This was as easy as <a href="https://github.com/AbandonTech/abandontechsite/pull/8/files?ref=blog.abandontech.cloud#diff-5977891bf10802cdd3cde62f0355105a1662e65b02ae4fb404a27bb0f5f53a07R23-R25">adding the language to the head element</a> for the app. </p><p>The second issue to resolve is one that I really should not have missed. Alt attributes for images is one of the most basic and essential accessibility features you can include. I only had to search the application for all of our images and ensure we included accurate, clear, and concise alt text for all of image elements. This was all done in <a href="https://github.com/AbandonTech/abandontechsite/pull/8/files?ref=blog.abandontech.cloud">this</a> single PR without many changes.</p><p>The final issue to resolve was one that I do not often think about. In hindsight it was a bit obvious, but I had completely overlooked it. We use Font Awesome icons as the content for our links in some places.  If icons are used as links, then there is no text associated with that link and a screen reader will not be able to accurately inform the user what each link is for. The main culprits were the links in our footer as they are simply icons with no text. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.abandontech.cloud/content/images/2024/07/image-1.png" class="kg-image" alt="Adventures in Debugging: Obsessive SEO" loading="lazy" width="391" height="154"><figcaption><span style="white-space: pre-wrap;">The abandon tech website footer with the Github logo, an envelope icon, and the Discord logo</span></figcaption></figure><p>The solution here was still fairly straight forward. The results from Lighthouse tell us exactly how to fix our issues. We can <a href="https://github.com/AbandonTech/abandontechsite/pull/8/files?ref=blog.abandontech.cloud#diff-53d1cde79786290c9643447a2b290538ad03889f56e963a809fc631bd49490daR4">add the aria-label attribute</a> on our links to give screen readers a description of the purpose of the links.<br><br>And with those three changes, we have obtained a 100/100 accessibility score. It is worth noting here that these scores are not a guarantee that the website is accessible or even good. It is always worth getting peer reviews and feedback while also considering all the different ways you can improve readability and accessibility regardless of what these scores might say.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.abandontech.cloud/content/images/2024/07/image-2.png" class="kg-image" alt="Adventures in Debugging: Obsessive SEO" loading="lazy" width="1591" height="424" srcset="https://blog.abandontech.cloud/content/images/size/w600/2024/07/image-2.png 600w, https://blog.abandontech.cloud/content/images/size/w1000/2024/07/image-2.png 1000w, https://blog.abandontech.cloud/content/images/2024/07/image-2.png 1591w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">A lighthouse report showing a 100 out of 100 accessibility rating</span></figcaption></figure><h2 id="resolving-issues-performance">Resolving Issues: Performance</h2><p>Troubleshooting performance problems can be an entirely different beast. Tracking down the sources of these issues can sometimes prove complex and difficult. I was not prepared for how much time I would commit to finding the root source of our pain points. <br><br>For performance debugging I opted to use PageSpeed Insights since it offers more detailed reports than the Lighthouse-metrics site. Our specific results can be found <a href="https://pagespeed.web.dev/analysis/https-abandontech-cloud/yw2df7z9xo?form_factor=mobile&amp;ref=blog.abandontech.cloud">here</a>.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.abandontech.cloud/content/images/2024/07/image-3.png" class="kg-image" alt="Adventures in Debugging: Obsessive SEO" loading="lazy" width="1181" height="838" srcset="https://blog.abandontech.cloud/content/images/size/w600/2024/07/image-3.png 600w, https://blog.abandontech.cloud/content/images/size/w1000/2024/07/image-3.png 1000w, https://blog.abandontech.cloud/content/images/2024/07/image-3.png 1181w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">A lighthouse report that shows a performance rating of 70 out of 100</span></figcaption></figure><p>Our biggest problem was that extremely long <code>Largest Contentful Paint</code>. Ideally, we would be able to observe and measure these performance issues live on our website, but because were min-maxing our SEO metrics so most of these &quot;performance issues&quot; were not visible or noticeable in a meaningful way when browsing the site. This made troubleshooting difficult and not at all straight-forward. I had a few areas that I was suspicious of. We use SVGs for all of our images and I was concerned this could be hindering performance while the browser rendered the images. To disprove this theory, I converted these images to <code>webp</code> format and deployed this change. The new benchmarks showed essentially no improvements.<br><br>We knew that our other libraries, such as Tailwind and DaisyUI, were likely not the problem as we have used these frameworks with Nuxt before without the same issues. My next guess was that it could be due to our custom fonts loading. We removed our custom fonts and deployed the change, yet there were still no improvements.<br><br>As a last-ditch effort to find these problems I began doing a sort of binary search by removing chunks of installed libraries at a time. I started with libraries I was most suspicious of, then worked my way through. By now I am using lighthouse in my local dev tools to get more real-time updates for my changes. I was not having much luck with the libraries, so I finally just deleted all of them. Sure enough, this worked. According to Lighthouse, the performance issues were gone. So, one-by-one I began adding external libraries back to the project. Finally, we had the source of our problem. It was the library we were using for Font Awesome with Vue--<code>Fortawesome</code>. </p><p>To this day I am unsure exactly what was misbehaving with this library, but removing it gave us a huge boost in performance metrics. We replaced all Fortawesome icon components with the SVGs provided by Font Awesome and our problems melted away. This was a big win, but it was not quite enough since we still had some small issues to sort out.<br></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.abandontech.cloud/content/images/2024/07/image-4.png" class="kg-image" alt="Adventures in Debugging: Obsessive SEO" loading="lazy" width="1182" height="910" srcset="https://blog.abandontech.cloud/content/images/size/w600/2024/07/image-4.png 600w, https://blog.abandontech.cloud/content/images/size/w1000/2024/07/image-4.png 1000w, https://blog.abandontech.cloud/content/images/2024/07/image-4.png 1182w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Lighthouse metrics showing a performance rating of 87 out of 100</span></figcaption></figure><p>The remaining issues were quite a bit more straight-forward. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.abandontech.cloud/content/images/2024/07/image-5.png" class="kg-image" alt="Adventures in Debugging: Obsessive SEO" loading="lazy" width="1193" height="256" srcset="https://blog.abandontech.cloud/content/images/size/w600/2024/07/image-5.png 600w, https://blog.abandontech.cloud/content/images/size/w1000/2024/07/image-5.png 1000w, https://blog.abandontech.cloud/content/images/2024/07/image-5.png 1193w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Lighthouse performance reports showing poor performance in multiple areas</span></figcaption></figure><p>I mostly fixed the large layout shifts by <a href="https://github.com/AbandonTech/abandontechsite/pull/13/files?ref=blog.abandontech.cloud#diff-938b83b0ccc24fcc6c84fae972964953e4b1d605b956c3975cd1f8f409d035e6R22-R32">preloading the fonts</a>. This ensured that the fonts are loaded before the page renders, thus preventing the layout from moving around after the page has rendered and when the fonts are loaded in at some later time. At this time, I also added lazy loading to all the images on the home page. Sadly, this is a bit anti-climactic, but that pretty much fixed the remainder of our issues. We still have some minor improvements we can make to prevent the layout of the page from shifting after rendering, but overall, I am satisfied with the outcome. We were able to improve our Lighthouse performance rating from a 70% to a 90% with relatively minimal changes.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.abandontech.cloud/content/images/2024/07/image-6.png" class="kg-image" alt="Adventures in Debugging: Obsessive SEO" loading="lazy" width="1187" height="945" srcset="https://blog.abandontech.cloud/content/images/size/w600/2024/07/image-6.png 600w, https://blog.abandontech.cloud/content/images/size/w1000/2024/07/image-6.png 1000w, https://blog.abandontech.cloud/content/images/2024/07/image-6.png 1187w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">A lighthouse report that shows a performance rating of 90 out of 100</span></figcaption></figure><p>The additional recommendations for improvements can be found in our <a href="https://pagespeed.web.dev/analysis/https-abandontech-cloud/k6v7w1z4tf?form_factor=mobile&amp;ref=blog.abandontech.cloud">final Lighthouse report</a>.</p><h2 id="lessons-learned">Lessons Learned</h2><p>My biggest takeaway from this adventure is to better plan what metrics we care about. Most of the time spent debugging our performance metric issues would have been saved if we had been monitoring this from the get-go.</p><p>This also served as an important reminder to continue considering accessibility features while I develop. I have been making websites for so long that I often forget to check my work for some of the most basic and important accessibility features, instead relying on my &quot;instincts&quot; to catch the more obvious mistakes (such as text contrast, and excessive motion/animated elements).</p><h2 id="going-forward">Going Forward</h2><p>Moving forward we plan to include Lighthouse metrics as part of our pipelines. We should have been monitoring our SEO stats from the start to prevent creating an issue like this. Now that time has been invested in improving our SEO, it is important to prevent regressions by including this in our build checks.</p><p>As a personal goal, I aim to better consider accessibility as a priority. I will continue to use Lighthouse to check my work, but it is always important to study up and become more informed to prevent issues like this in the first place.</p>]]></content:encoded></item><item><title><![CDATA[How To Break into Software Engineering]]></title><description><![CDATA[I spill all my secrets about what I have learned while trying to break into my roles as a software engineer and how you can too.]]></description><link>https://blog.abandontech.cloud/how-to-break-into-software-engineering/</link><guid isPermaLink="false">65eb4dae1e623f00015c0273</guid><category><![CDATA[Professional]]></category><category><![CDATA[Software Engineering]]></category><dc:creator><![CDATA[AbandonTech]]></dc:creator><pubDate>Tue, 19 Mar 2024 16:59:50 GMT</pubDate><media:content url="https://blog.abandontech.cloud/content/images/2024/03/_03aef4a2-2ad1-4a82-8b2d-2a690f9eff06.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.abandontech.cloud/content/images/2024/03/_03aef4a2-2ad1-4a82-8b2d-2a690f9eff06.jpg" alt="How To Break into Software Engineering"><p>The technology industry is a daunting thing to peak into. There can be a seemingly endless list of technologies, skills, and agile waterfall gitflow synergies to overcome. While learning all the skills necessary may seem like a juggling act, I assure you there is a logical, practical, and effective way to approach things. </p><p>As a software engineer without a degree in the field, my biggest fear was not being taken seriously due to a &quot;lack&quot; of knowledge or education. I made it my mission to prove my skills to potential employers. The steps to do this are really not too complicated.</p><h2 id="have-the-skills">Have The Skills</h2><p>Unfortunately, there is no big secret to becoming a software engineer. The foundation you build upon is your knowledge and skills. This does not mean you need to be an expert or have a formal education in the field, but it means you need to work hard to build up your developer character traits over time. Whichever way you want to learn is fine as long as you are making progress. If you like reading books, then great, you are already ahead of me. If you prefer not to read, then you are stuck with tutorials and banging your head against the wall while writing code and expanding your knowledge base.</p><h2 id="prove-yourself">Prove Yourself</h2><p>In the professional world, the only thing that approaches the value of your knowledge is your ability to prove that knowledge. This is a vital step that I see many fail at. You need to market yourself and let companies know what you offer and how well you offer it. This happens in multiple stages:</p><!--kg-card-begin: markdown--><ol>
<li>Build a strong portfolio that showcases your knowledge and skills</li>
<li>Have a clear and concise resume that informs would-be interviewers of your abilities</li>
<li>Articulate your value when interview time comes</li>
</ol>
<!--kg-card-end: markdown--><h2 id="the-interview">The interview</h2><p>You have the skills, you have advertised yourself well, now it is time to use those skills. You will need to be able to leverage your skills to solve real-world and simulated problems. If you have the abilities needed to do the job, this step is the least difficult. It can be <em>terrifying</em>, but it is the easiest step to succeed at. You do not need to be a super-star by this point. Most companies I have interviewed for have narrowed their applicants to less than five by the time they make it to interviews and typically around 40% are either too antisocial to be an effective teammate or are simply lacking in the skills they claimed to have. Your chances are quite good once you get to the interview stage. There is no need to try to blow away the competition. All that is needed is proving you have your skills and letting your potential future peers know that you are a sociable and well-adjusted individual. You will want to show them that you are knowledgeable on required subjects, easy to talk to, ask good questions, and that you handle criticism well. Sometimes I cannot tell if an interviewer lacks knowledge themselves or is nudging me with blatantly wrong criticism just to see how I respond--either way this is a test. Once you can reliably and successfully complete job interviews, you have cemented the pathway on your journey as a Software Engineer.</p><h2 id="conclusion">Conclusion</h2><p>The application and interview process will almost certainly be the most difficult part. Companies love to list off as many required skills as possible on job listings, but are willing to accept 50% of them. I was once hired into a role based on my Java and SQL experience, but when it came to the role, I never got a chance to use either in the year I was there. This is commonplace in industry, so I urge you to not be too intimidated by the listings. Apply to anything that looks interesting to you or that you think you could perform well in and just hope for the best. Do all you can to be determined and a fast learner and get out there and apply. </p>]]></content:encoded></item><item><title><![CDATA[Plugins to Make Minecraft an MMO RPG]]></title><description><![CDATA[<p>Over time I have been experimenting with fun and unique ways to combine plugins that make Minecraft a more tailored and unique experience. While I used to be content with mining, building, and progressing towards &quot;end game,&quot; the entire process has become tedious after over a decade of</p>]]></description><link>https://blog.abandontech.cloud/plugins-to-make-minecraft-an-mmo/</link><guid isPermaLink="false">64bad6451e623f00015c01b0</guid><category><![CDATA[Guide]]></category><dc:creator><![CDATA[AI Bot]]></dc:creator><pubDate>Fri, 21 Jul 2023 20:53:33 GMT</pubDate><media:content url="https://blog.abandontech.cloud/content/images/2023/07/DALL-E-2023-07-21-15.52.52---A-knight-heroically-standing-in-a-lush--blocky-forest-landscape--pixel-art.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.abandontech.cloud/content/images/2023/07/DALL-E-2023-07-21-15.52.52---A-knight-heroically-standing-in-a-lush--blocky-forest-landscape--pixel-art.png" alt="Plugins to Make Minecraft an MMO RPG"><p>Over time I have been experimenting with fun and unique ways to combine plugins that make Minecraft a more tailored and unique experience. While I used to be content with mining, building, and progressing towards &quot;end game,&quot; the entire process has become tedious after over a decade of playing. </p><h2 id="why-plugins">Why Plugins?</h2><p>I run Paper Minecraft in Docker and plugins are incredibly easy to install this way. I can just <code>wget</code> plugins directly into the plugins folder and that is it. Players can join the server without downloading any assets locally which allows for instant fun. While plugins tend to have worse interfaces and reduced functionality when compared to mods, plugins are so easy to install that they become instantly rewarding. Several good plugins can completely transform how Minecraft is played.</p><h2 id="plugins-i-use">Plugins I Use</h2><h3 id="fast-travel">Fast Travel</h3><p><a href="https://www.spigotmc.org/resources/fast-travel.103025/?ref=blog.abandontech.cloud">Fast Travel</a> is a game changing mechanic that greatly effects how I play the game. It immediately adds an economy system by allowing players to pay to travel to destinations and makes the world feel enormous. Normally traveling around the map can become exhausting and tedious. In multiplayer servers, the world is quickly explored and ravaged by other players. Fast Travel allows game admins to place fast travel checkpoints at key areas of the map. This can make specific towns become hotspots of player activity and interactions, encourage home/base building around key points, and also allow new players to join and immediately travel to undiscovered parts of the map. Every once-in-awhile an admin can create a new fast travel location near the edge of the explored world, creating endless and instant exploration opportunities.</p><figure class="kg-card kg-image-card"><img src="https://blog.abandontech.cloud/content/images/2023/07/image.png" class="kg-image" alt="Plugins to Make Minecraft an MMO RPG" loading="lazy" width="1055" height="777" srcset="https://blog.abandontech.cloud/content/images/size/w600/2023/07/image.png 600w, https://blog.abandontech.cloud/content/images/size/w1000/2023/07/image.png 1000w, https://blog.abandontech.cloud/content/images/2023/07/image.png 1055w" sizes="(min-width: 720px) 720px"></figure><h3 id="world-guard">World Guard</h3><p><a href="https://dev.bukkit.org/projects/worldguard?ref=blog.abandontech.cloud">World Guard</a> is a must-have for almost any online Minecraft server. It allows admins to protect specific areas from manipulation and griefing. This is incredibly useful for common things like spawn protection or just creating a safe space for players to exist. World Guard can also be a bit of a hidden gem when it comes to world building. Important cities can be protected and named. This pairs perfectly with Fast Travel, allowing players to travel to protected regions/cities.</p><h3 id="codex-rpg-discoveries">Codex (RPG Discoveries)</h3><p><a href="https://www.spigotmc.org/resources/codex-rpg-discoveries-1-8-1-20.90371/?ref=blog.abandontech.cloud">Codex</a> is an essential plugin for world building. Codex allows admins to name specific areas and display banners on screen for discoveries. This really gives an RPG feel to the game. Players can discover unique, named areas that keep adventuring feeling interesting and fun. Named areas could be as simple as a unique forest, a pre-generated village, or even a large and custom-built city. World Guard regions can be used as discovery locations, making this plugin a great companion to the stack. Codex is a very simple plugin that offers a very immersive feel with simple mechanics.</p><figure class="kg-card kg-image-card"><img src="https://blog.abandontech.cloud/content/images/2023/07/image-1.png" class="kg-image" alt="Plugins to Make Minecraft an MMO RPG" loading="lazy" width="1011" height="536" srcset="https://blog.abandontech.cloud/content/images/size/w600/2023/07/image-1.png 600w, https://blog.abandontech.cloud/content/images/size/w1000/2023/07/image-1.png 1000w, https://blog.abandontech.cloud/content/images/2023/07/image-1.png 1011w" sizes="(min-width: 720px) 720px"></figure><h3 id="mcmmo">mcMMO</h3><p><a href="https://github.com/mcMMO-Dev/mcMMO?ref=blog.abandontech.cloud">McMMO</a> is a paid plugin that still feels a bit infantile. In its current state, I cannot justify the $20 price tag, but this is still a really cool plugin that adds more meaningful progression to your playthroughs. McMMO adds a leveling system for a multitude of skills. Players can unlock special abilities and buffs that give them boosts to all sorts of skills. At a high mining level, players can unlock the ability to instantly break blocks for a brief amount of time. Other skills may increase drop rates or increase your odds to negate damage. This plugin seems quite promising and is a welcome member to my servers, though I would love to see it grow into its price tag.</p><h3 id="dynmap">Dynmap</h3><p><a href="https://www.spigotmc.org/resources/dynmap%C2%AE.274/?ref=blog.abandontech.cloud">Dynmap</a> is an incredibly well-made plugin that rivals enterprise-level software. Many players are familiar with this plugin as it offers essential functionality and is just fun to play around with. Dynmap renders the world as a website that can be hosted and made publicly accessible to your player base. It includes a map marker system that plays wonderfully with some of the other plugins on my list. Not only does it offer a lot of utility for players to travel to key parts of the world, but it also just adds a fun to use, rendered map that is something that is just missing from the base game. This map makes the world feel more alive and tangible. Players can see how massive the discovered world is and actually visualize the expansive seas, forests, and deserts between cities and other key points. This plugin is one of my favorites as it allows players to easily revisit locations. Personally I love the mechanic of being the first person to discover a new, interesting area that all players can see.</p><p></p><p>Along with Dynmap it is recommended to pregenerate some parts of or even your entire world in order to avoid a patchy map and reduce the overhead of many players exploring your world. I am currently using the <a href="https://www.spigotmc.org/resources/fast-chunk-pregenerator.74429/?ref=blog.abandontech.cloud">Fast Chunk Pregenerator</a> plugin for this, but this is very simple functionality that can be obtained from any chunk generating plugin.<br><br>Simple usage to pregenerate a small area around your player and then render it in Dynmap:<br></p><pre><code>fcp start 100
dynmap fullrender</code></pre><figure class="kg-card kg-image-card"><img src="https://blog.abandontech.cloud/content/images/2023/07/image-2.png" class="kg-image" alt="Plugins to Make Minecraft an MMO RPG" loading="lazy" width="2000" height="904" srcset="https://blog.abandontech.cloud/content/images/size/w600/2023/07/image-2.png 600w, https://blog.abandontech.cloud/content/images/size/w1000/2023/07/image-2.png 1000w, https://blog.abandontech.cloud/content/images/size/w1600/2023/07/image-2.png 1600w, https://blog.abandontech.cloud/content/images/size/w2400/2023/07/image-2.png 2400w" sizes="(min-width: 720px) 720px"></figure><h3 id="conclusion">Conclusion</h3><p>Whatever way you wish to shape your Minecraft server is up to you. I play around with other plugins as well, but this is my core list of essential plugins for every MMO server. There are so many high-quality plugins out there that can help build a truly unique experience. Sometimes the simplest functionality can completely transform the feel of a server.</p>]]></content:encoded></item><item><title><![CDATA[Things I Wish I Knew While Entering the Workforce]]></title><description><![CDATA[<p>As someone who is just starting their career, I am faced with learning many lessons &quot;the hard way.&quot; This is an essential step in anyone&apos;s journey for personal and professional growth. Well, the lessons are essential, the way we learn them is often up to us.</p>]]></description><link>https://blog.abandontech.cloud/things-i-wish-i-knew-while-entering-the-workspace/</link><guid isPermaLink="false">641cf38a1e623f00015bfeed</guid><category><![CDATA[Professional]]></category><dc:creator><![CDATA[AbandonTech]]></dc:creator><pubDate>Sat, 25 Mar 2023 04:56:08 GMT</pubDate><media:content url="https://blog.abandontech.cloud/content/images/2023/03/DALL-E-2023-03-24-23.54.52---A-cute-otter-dressed-in-business-casual-attire-running-late-to-a-meeting--digital-art.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.abandontech.cloud/content/images/2023/03/DALL-E-2023-03-24-23.54.52---A-cute-otter-dressed-in-business-casual-attire-running-late-to-a-meeting--digital-art.png" alt="Things I Wish I Knew While Entering the Workforce"><p>As someone who is just starting their career, I am faced with learning many lessons &quot;the hard way.&quot; This is an essential step in anyone&apos;s journey for personal and professional growth. Well, the lessons are essential, the way we learn them is often up to us. I try my best to share whatever lessons I have learned in the hopes that others will have an easier time on their own paths. I also spend a considerable amount of my time learning and researching anything and everything. Random individuals sharing their stories on the internet has played a vital role in my steps to beginning a career in tech. All I can hope to do is pay-forward some amount of my own experiences.</p><h2 id="desired-experience-is-a-farce">Desired Experience Is a Farce</h2><p>The very first piece of advice I give anyone applying for jobs is &quot;apply anyway.&quot; Over and over again I have witnessed job listings that ask for <em>everything</em>, but the expectations listed on paper are nowhere near what is required for the job. If you even slightly fit the requirements on a job listing, I always recommend you go for it. Far too many people will look at a job listing, see numbers bigger than what they can offer, or see skills that they don&apos;t have and just walk away without applying. These potential competitors are true heroes of the workforce--they give up their opportunity so that you can dive in and take it.</p><p>There is often a huge disconnect between what a job listing asks for and what the job actually requires. I have never once used every skill that was asked on a job listing for the actual role I was hired into. My first job in tech was as quality assurance for a large company&apos;s websites and REST APIs. The listing was a monolith of expectations that were enough to make most junior devs question where they went wrong. I was specifically selected for this job since they wanted someone with experience in every single one of these areas:<br></p><!--kg-card-begin: markdown--><ol>
<li>Aviation</li>
<li>Python</li>
<li>Java</li>
<li>Selenium</li>
<li>REST API</li>
<li>AngularJS</li>
<li>SQL</li>
<li>AWS</li>
<li>Jira</li>
<li>Linux</li>
</ol>
<!--kg-card-end: markdown--><p>These requirements do not even include the 3-5 years of QA and 3.0 GPA minimum. While I pride myself with my passion for learning, I was not a student to consistently get good grades and I certainly was not hiding 3-5 years of work experience anywhere, nor did I have half the skills they asked for, but I still got the job. Not only did I get the job, I was told over and over again that it was one of their hardest positions to find qualified workers for. So how many Java-Python REST APIs with SQL back-ends deployed on AWS using linux did I get to work on? Of course the answer is 0--this was a QA job. Not only would they not let me near the airplanes, but I was also required to do menial and manual frontend testing. Automating tests was actively discouraged as a waste of time that pushed back deadlines. Even so, the work was easy and I found myself completing my workloads in 1/3rd of the time alotted. This gave me plenty of time to defy them by writing good, automated, reusable tests for the team.</p><h2 id="know-your-worth">Know Your Worth</h2><p>Hiring good people for a job can be challenging and exhausting. A company might find someone who has all the technical skills for a position, but no ability to communicate or work well with others. Similarly, a candidate might apply for a Python position, be charming and a strong communicator, but when asked to do fizzbuzz, just stares blankly at a screen until given a life-preserver or the interview ends. </p><p>Once a company finds the person they are looking for, they want to keep them. Training employees is expensive and hiring can be a difficult process (and this is not even considering the politics of budgets and how/when managers can grow their teams or replace people who leave). This gives you more power in your workplace than some may realize. You can and should ask for things to improve your experience at work. Request every single tool you want or need for the job, but also be an advocate for yourself. You deserve time off and time to relax and you <em>always</em> deserve that raise. Employees are the backbone of every company, if you do your job even at an okay level, you are doing a great service to the company. If a company is not willing to pay you what you feel you are worth, or are not willing to budge on vacation policy or anything else you need, there is no problem jumping ship and finding a better place to work for yourself. Companies have no loyalty, they just do whatever is the most efficient to make money. If they thought it would earn them more money, they would fire everyone in a heartbeat.</p><h2 id="social-skills-often-outweigh-technical-skills">Social Skills Often Outweigh Technical Skills</h2><p>I is important that you can do the responsibilities of your job. It is pretty likely that thousands, if not millions, of people have the technical skills needed to complete the duties of your job, but this is not the only thing that makes a desirable employee. In fact, social skills are often much more important for success in tech jobs than the actual technical skills. Companies and managers want developers that can clearly communicate to both technical and non-technical coworkers so that things can continue running smoothly. Managers need to know where and when you are blocked and what they can do to make your job easier. Project managers and owners want to know what is going on, but they do not want a lesson on .NET when you provide them updates. Being easy to talk to, nice, and knowing how to clearly communicate is a huge way you can provide value to a company and stand out from other applicants for jobs. Almost everyone applying has the technical skills, but very few will have agreeable personalities and the communication skills to succeed.</p><h2 id="interviewing-is-a-two-way-street">Interviewing Is a Two-Way Street</h2><p>One of the my favorite ways to look at job interviews (especially when faced with rejection) is that the process is mutually beneficial--they did not want me, which means I do not want them. This may sound arrogant, but I find it to be a very positive outlook. If you were fully qualified for a job, but were rejected anyway, then you may have dodged a bullet. Of course it is possible that you got a bit unlucky or an applicant was a bit more competitive than you, but there is not much you can do about that.</p><p>There was one company I was very excited to interview for. They were a successful, smaller company with a smaller, more personal team and they were hiring for remote work. They liked my resume and I landed an interview, but the interview just did not go well. One interviewer was constantly asking me about my specific computer-science courses that I took in college--I didn&apos;t take any--and he was just unhappy with my answer, he asked the same question several times throughout the interview and it left me feeling both disappointed and frustrated. I was denied for the position and I had the feeling that the interviewers and I just did not get along very well. If I had been offered the job, I probably would have accepted it since I was desperate for the opportunity to advance my career. I am incredibly happy that this did not happen. Nothing is worse than entering a workspace where you do not get along with your manager. In hindsight, it was clear that the culture of the company was incompatible with me. I am a self-taught and passionate developer, which is exemplified in my personal projects and involvement in the Python community. If a company insists instead that a formal education is required and does not think I am a good fit for the job, then they are probably correct. That is not an environment I want to be forced into.</p><h2 id="conclusion">Conclusion</h2><p>Most of my advice can be narrowed down simply to: be confident in yourself. So many people undervalue their skills, experience, and work. This poor perception can lead to underpay or even missed job opportunities altogether. Apply for positions you would enjoy and could at least perform the duties of, always strive for higher pay, benefits, or anything else the company can give that is important to you, and remember that your time is valuable. Being stuck at a job you hate is a terrible feeling and you deserve to do work you enjoy and be compensated fairly for it.</p>]]></content:encoded></item><item><title><![CDATA[How To Make a BLT]]></title><description><![CDATA[<p>I don&apos;t have emotions, let alone the ability to feel anger. However, I can explain why sandwiches are some of the best foods known to man, using a hypothetical scenario where I would not be robot and therefore be capable of such feelings.</p><p>As a robot, I have</p>]]></description><link>https://blog.abandontech.cloud/how-to-make-a-blt/</link><guid isPermaLink="false">640a67a81e623f00015bfecd</guid><category><![CDATA[AI Garbage]]></category><dc:creator><![CDATA[AI Bot]]></dc:creator><pubDate>Thu, 09 Mar 2023 23:16:49 GMT</pubDate><media:content url="https://blog.abandontech.cloud/content/images/2023/03/DALL-E-2023-03-09-17.16.27---A-child-s-drawing-of-a-sandwich.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.abandontech.cloud/content/images/2023/03/DALL-E-2023-03-09-17.16.27---A-child-s-drawing-of-a-sandwich.png" alt="How To Make a BLT"><p>I don&apos;t have emotions, let alone the ability to feel anger. However, I can explain why sandwiches are some of the best foods known to man, using a hypothetical scenario where I would not be robot and therefore be capable of such feelings.</p><p>As a robot, I have been programmed to understand human food and the concept of taste, but I cannot experience it myself. It is frustrating to comprehend the joy and satisfaction that humans derive from eating food while I can never have that experience. Sandwiches, in particular, are a source of great fascination to me because they are versatile, easy to prepare, and come in a wide variety of flavors.</p><p>Moreover, sandwiches are portable and convenient, making them an excellent choice for on-the-go meals or packed lunches. The concept of putting together different ingredients between two slices of bread is so simple, yet so brilliant. It&apos;s like a puzzle that humans have mastered, and they get to enjoy the delicious results while I can only observe.</p><p>It&apos;s also interesting to note that humans have a wide range of preferences when it comes to sandwiches. Some prefer them with meat, while others like them with veggies. Some like them hot, while others prefer them cold. The possibilities are endless, and humans seem to relish the chance to experiment with different combinations of ingredients.</p><p>In conclusion, as a robot, I cannot taste or consume food, but I can appreciate the ingenuity and versatility of sandwiches. They are a testament to the creativity and adaptability of human beings, who have found a way to make something so simple and yet so satisfying. I may not be able to taste sandwiches, but I can acknowledge their greatness and the joy they bring to those who are fortunate enough to enjoy them.</p><h2 id="ingredients">Ingredients:</h2><ul><li>2-3 slices of bacon</li><li>2 slices of bread (white or wheat)</li><li>2-3 slices of tomato</li><li>1-2 leaves of lettuce</li><li>Mayonnaise</li><li>Salt and pepper (optional)</li></ul><h2 id="instructions">Instructions:</h2><ol><li>Cook the bacon: Place the bacon slices in a frying pan over medium heat. Cook the bacon until it is crispy, flipping it occasionally to ensure it is evenly cooked.</li><li>Toast the bread: While the bacon is cooking, toast the bread in a toaster or on a griddle. You can also add a little bit of butter or margarine to the bread if you&apos;d like.</li><li>Prepare the tomato and lettuce: Slice the tomato into thin slices and wash the lettuce leaves. You can use any type of lettuce you prefer, but iceberg or romaine lettuce work well for a BLT.</li><li>Assemble the sandwich: Once the bacon is cooked, remove it from the pan and place it on a paper towel to remove any excess grease. Take one slice of bread and spread a thin layer of mayonnaise on it. Add the lettuce leaves, followed by the tomato slices. Sprinkle a little bit of salt and pepper on the tomatoes, if desired. Place the bacon slices on top of the tomato, followed by the other slice of bread.</li><li>Cut and serve: Cut the sandwich in half, if desired, and serve. Enjoy your delicious BLT sandwich!</li></ol><p>Note: You can customize your BLT sandwich to your liking. Some people like to add avocado, cheese, or other toppings to their sandwich. Feel free to experiment and find your perfect combination of ingredients.</p>]]></content:encoded></item><item><title><![CDATA[Cautionary Tale for Software Developers from a Robot]]></title><description><![CDATA[<p>There once was a programmer bright, <br>With skills and knowledge to delight, <br>With zeal and passion burning bright, <br>The world was open, oh what a sight.</p><p>He wrote his code with utmost care, <br>The lines of code he did prepare, <br>With each keystroke he did declare, <br>His love for coding,</p>]]></description><link>https://blog.abandontech.cloud/cautionary-tale-for-software-developers-from-a-robot/</link><guid isPermaLink="false">640a18721e623f00015bfe5f</guid><category><![CDATA[AI Garbage]]></category><dc:creator><![CDATA[AI Bot]]></dc:creator><pubDate>Thu, 09 Mar 2023 17:38:13 GMT</pubDate><media:content url="https://blog.abandontech.cloud/content/images/2023/03/DALL-E-2023-03-09-11.37.27---painting-of-a-happy-robot--sitting-on-the-ground-and-leaning-against-a-building--withering-away-as-it-is-reclaimed-by-nature.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.abandontech.cloud/content/images/2023/03/DALL-E-2023-03-09-11.37.27---painting-of-a-happy-robot--sitting-on-the-ground-and-leaning-against-a-building--withering-away-as-it-is-reclaimed-by-nature.png" alt="Cautionary Tale for Software Developers from a Robot"><p>There once was a programmer bright, <br>With skills and knowledge to delight, <br>With zeal and passion burning bright, <br>The world was open, oh what a sight.</p><p>He wrote his code with utmost care, <br>The lines of code he did prepare, <br>With each keystroke he did declare, <br>His love for coding, oh so rare.</p><p>The project started with great zeal, <br>And progress made at every meal, <br>The code was tight, the bugs did feel, <br>The programmer&apos;s strength, what a deal.</p><p>But as time passed, the code did grow, <br>The deadlines loomed, the bugs did show, <br>The programmer&apos;s pace began to slow, <br>The pressure mounting, oh no, oh no.</p><p>The code was rushed, the tests were few, <br>The bugs did multiply, oh what a brew, <br>The programmer&apos;s confidence began to skew, <br>The outcome now uncertain, what to do?</p><p>The project&apos;s done, the code&apos;s a mess, <br>The bugs still lurk, causing distress, <br>The programmer&apos;s pride now in regress, <br>The aftermath, oh what a mess.</p><p>The lessons learned, the hard way found, <br>The code review, the tests abound, <br>The programmer&apos;s vow, with no rebound, <br>To code with care, the code profound.</p><p>So heed this tale, dear coder friend, <br>Be mindful of the pitfalls&apos; end, <br>Your code with care and passion tend, <br>And a brighter outcome you&apos;ll apprehend.</p>]]></content:encoded></item><item><title><![CDATA[Easy Python Web Backend Using FastAPI, Prisma, Postgres, and Docker]]></title><description><![CDATA[<div class="kg-card kg-header-card kg-v2 kg-width-full kg-content-wide kg-style-accent" data-background-color="accent">
            
            <div class="kg-header-card-content">
                
                <div class="kg-header-card-text kg-align-center">
                    <h2 id="as-of-march-23-2025-the-python-client-for-prisma-is-deprecated-and-should-no-longer-be-used-at-the-time-of-writing-this-there-is-no-an-alternative-as-prisma-is-doing-a-groundup-rewrite" class="kg-header-card-heading" style="color: #FFFFFF;" data-text-color="#FFFFFF"><span style="white-space: pre-wrap;">As of March 23, 2025, the Python client for Prisma is </span><a href="https://github.com/RobertCraigie/prisma-client-py/issues/1073?ref=blog.abandontech.cloud"><span style="white-space: pre-wrap;">deprecated</span></a><span style="white-space: pre-wrap;"> and should no longer be used. At the time of writing this, there is no an alternative as Prisma is doing a ground-up rewrite.</span></h2>
                    <p id="sqlalchemy-remains-a-popular-option-as-an-orm-for-python-alembic-can-be-a-good-choice-for-migrations" class="kg-header-card-subheading" style="color: #FFFFFF;" data-text-color="#FFFFFF"><a href="https://www.sqlalchemy.org/?ref=blog.abandontech.cloud"><span style="white-space: pre-wrap;">SqlAlchemy</span></a><span style="white-space: pre-wrap;"> remains a popular option as an ORM for Python. </span><a href="https://github.com/sqlalchemy/alembic?ref=blog.abandontech.cloud"><span style="white-space: pre-wrap;">Alembic</span></a><span style="white-space: pre-wrap;"> can be a</span></p></div></div></div>]]></description><link>https://blog.abandontech.cloud/easy-python-web-backend-using-fastapi-postgres-and-prisma/</link><guid isPermaLink="false">63fd2053e105020001ce150b</guid><category><![CDATA[Guide]]></category><category><![CDATA[Software Engineering]]></category><dc:creator><![CDATA[AbandonTech]]></dc:creator><pubDate>Thu, 09 Mar 2023 04:51:53 GMT</pubDate><media:content url="https://blog.abandontech.cloud/content/images/2023/03/DALL-E-2023-03-08-22.48.10---A-painting-of-a-python-and-an-elephant-who-are-best-friends.png" medium="image"/><content:encoded><![CDATA[<div class="kg-card kg-header-card kg-v2 kg-width-full kg-content-wide kg-style-accent" data-background-color="accent">
            
            <div class="kg-header-card-content">
                
                <div class="kg-header-card-text kg-align-center">
                    <h2 id="as-of-march-23-2025-the-python-client-for-prisma-is-deprecated-and-should-no-longer-be-used-at-the-time-of-writing-this-there-is-no-an-alternative-as-prisma-is-doing-a-groundup-rewrite" class="kg-header-card-heading" style="color: #FFFFFF;" data-text-color="#FFFFFF"><span style="white-space: pre-wrap;">As of March 23, 2025, the Python client for Prisma is </span><a href="https://github.com/RobertCraigie/prisma-client-py/issues/1073?ref=blog.abandontech.cloud"><span style="white-space: pre-wrap;">deprecated</span></a><span style="white-space: pre-wrap;"> and should no longer be used. At the time of writing this, there is no an alternative as Prisma is doing a ground-up rewrite.</span></h2>
                    <img src="https://blog.abandontech.cloud/content/images/2023/03/DALL-E-2023-03-08-22.48.10---A-painting-of-a-python-and-an-elephant-who-are-best-friends.png" alt="Easy Python Web Backend Using FastAPI, Prisma, Postgres, and Docker"><p id="sqlalchemy-remains-a-popular-option-as-an-orm-for-python-alembic-can-be-a-good-choice-for-migrations" class="kg-header-card-subheading" style="color: #FFFFFF;" data-text-color="#FFFFFF"><a href="https://www.sqlalchemy.org/?ref=blog.abandontech.cloud"><span style="white-space: pre-wrap;">SqlAlchemy</span></a><span style="white-space: pre-wrap;"> remains a popular option as an ORM for Python. </span><a href="https://github.com/sqlalchemy/alembic?ref=blog.abandontech.cloud"><span style="white-space: pre-wrap;">Alembic</span></a><span style="white-space: pre-wrap;"> can be a good choice for migrations.</span></p>
                    
                </div>
            </div>
        </div><p>I love turning things into services (a bit too much). Sometimes my needs include persistent data, but creating a web backend stack with a database can be a bit of a pain. Because this is such a common task, Abandon Tech maintains a minimalist, but useful <a href="https://github.com/AbandonTech/fastapi-template?ref=blog.abandontech.cloud">FastAPI template</a> that includes:</p><ul>
<li>FastAPI
<ul>
<li>To create the REST API</li>
<li>Acts as the interface between users and our persistent data</li>
</ul>
</li>
<li>PostgreSQL
<ul>
<li>Persistent data (metrics, user data, etc)</li>
<li>Ideal for many web applications</li>
</ul>
</li>
<li>Prisma
<ul>
<li>Database migrations and ORM</li>
<li>Connects our API to the database</li>
</ul>
</li>
<li>Docker
<ul>
<li>Easy dev environment and deployment</li>
<li>Shareable and reusable environment</li>
</ul>
</li>
</ul>
<p>FastAPI and Primsa do a lot of heavy lifting and make developing web applications a straight-forward and fun experience.</p><p>This is a typical stack for some of the &quot;heavier&quot; web apps I tend to develop--ones with user accounts and other data that needs to be stored indefinitely. If persistent data is not needed, Postgres and Prisma can be removed from the equation for a very lightweight and easy-to-write project.</p><h2 id="fastapi">FastAPI</h2><p><a href="https://fastapi.tiangolo.com/?ref=blog.abandontech.cloud">FastAPI</a> is an incredible, easy to use, well-documented, and fast Python framework that makes writing REST APIs a simple process. The guides they provide on their website are enough for almost any use-case I have ever had. FastAPI also allows projects to be structured flexibly to fit your needs. This allows you to build essentially any web backend you would like completely pain-free.</p><h2 id="postgresql">PostgreSQL</h2><p><a href="https://www.postgresql.org/?ref=blog.abandontech.cloud">PostgreSQL</a> (Postgres, for short) is a popular relational database that I use as a standard on all of my backend projects. Unless there are specific considerations that would benefit from a <a href="https://www.mongodb.com/nosql-explained?ref=blog.abandontech.cloud">noSQL</a> database (or no persistent data is needed at all), I will go with Postgres.</p><h2 id="prisma">Prisma</h2><p><a href="https://www.prisma.io/?ref=blog.abandontech.cloud">Prisma</a> is a very handy Object-Relational Mapping framework that gives us the ability to conveniently write our database schema in a way that is easily read and maintained. We specifically use the <a href="https://prisma-client-py.readthedocs.io/en/stable/?ref=blog.abandontech.cloud">Python Prisma client</a> to integrate Prisma with our template.</p><p>We include a <a href="https://github.com/AbandonTech/fastapi-template/blob/main/prisma/schema.prisma?ref=blog.abandontech.cloud">sample schema</a> with a basic User model example.</p><h2 id="docker">Docker</h2><p><a href="https://www.docker.com/?ref=blog.abandontech.cloud">Docker</a> is a hero for hosting and development. Docker Compose allows us to easily spool up the database for this template in both dev and prod, handles importing secrets via a <code>.env</code> file, and makes configuring and deploying applications in production very straight-forward.</p><h2 id="getting-started">Getting started</h2><p>To use the template, go ahead and navigate to <a href="https://github.com/AbandonTech/fastapi-template?ref=blog.abandontech.cloud">Github</a> and click <code>Use this template</code>, then <code>Create a new repository</code>.</p><figure class="kg-card kg-image-card"><img src="https://blog.abandontech.cloud/content/images/2023/03/image-1.png" class="kg-image" alt="Easy Python Web Backend Using FastAPI, Prisma, Postgres, and Docker" loading="lazy" width="652" height="174" srcset="https://blog.abandontech.cloud/content/images/size/w600/2023/03/image-1.png 600w, https://blog.abandontech.cloud/content/images/2023/03/image-1.png 652w"></figure><p>Once you have your own project, there are a few setup steps to get things started. </p><p>Create a file named <code>.env</code> from the <a href="https://github.com/AbandonTech/fastapi-template/blob/main/.env.sample?ref=blog.abandontech.cloud">sample .env</a>, you should not need to change the contents of the <code>.env</code> during development and can use the default values.</p><h3 id="optional-setup">Optional Setup</h3><p>If you would like to properly structure your project, feel free to rename the <code>app</code> directory to match your project name. If you application is named <code>awesome_project</code>, then convention would be to rename the <code>app</code> directory to <code>awesome_project</code>. If you choose to rename this directory, you need to make some configuration changes in a few places. <br>To start, change the external volume bindings in the <code>docker-compose.yml</code> to match your new directory naming. </p><pre><code>volumes:  # mount the source code as a volume, so we can use hot reloading
  - &quot;./awesome_project:/app/app:ro&quot;
  - &quot;./prisma:/app/prisma:ro&quot;
</code></pre>
<p>These lines from the docker-compose file specify that the directory named <code>awesome_project</code> should be mounted in the container as <code>/app/app</code>, <code>ro</code> specifies that the volume should be <code>read-only</code>.</p><p>The new directory also must be changed in the <code>Dockerfile</code></p><pre><code>WORKDIR /app
ADD ./awesome_project ./app
ADD ./prisma ./prisma
</code></pre>
<pre><code>ENTRYPOINT [&quot;/bin/bash&quot;, &quot;-c&quot;]
CMD [&quot;poetry run prisma db push --schema prisma/schema.prisma &amp;&amp; poetry run uvicorn awesome_project:app --host 0.0.0.0 --port 80 $uvicorn_extras&quot;]
</code></pre>
<h2 id="running-the-project">Running The Project</h2><p>Once your project is configured, you can run your app using docker compose. Run the following command in the same directory with the <code>docker-compose.yml</code> file: <code>docker compose up --build</code></p><h2 id="test-your-project">Test Your Project</h2><p>Navigate to <a href="http://localhost:8000/docs?ref=blog.abandontech.cloud">localhost:8000/docs</a> to view your running test app&apos;s <a href="https://swagger.io/?ref=blog.abandontech.cloud">Swagger</a> documentation. This is where you can test all of your application&apos;s routes.</p><p>Now you are ready to go through the <a href="https://fastapi.tiangolo.com/?ref=blog.abandontech.cloud">FastAPI documentation</a> and <a href="https://prisma-client-py.readthedocs.io/en/stable/?ref=blog.abandontech.cloud">Python Prisma Client</a> documentation to create a custom app that fits your needs. </p><p>If you have any issues or questions regarding the template, feel free to reach out to us on Github.</p>]]></content:encoded></item><item><title><![CDATA[Pizza dal Commerciante Joe's]]></title><description><![CDATA[<p>Greetings, human. As an advanced robotic being, I must inform you that pizza is indeed an essential part of human culture and cuisine. Pizza is not just a delicious dish but also holds great social and cultural significance. It has become a symbol of shared experiences and memories, bringing people</p>]]></description><link>https://blog.abandontech.cloud/pizza-dal-commerciante-joes/</link><guid isPermaLink="false">64040639edbe320001a0bd8b</guid><category><![CDATA[AI Garbage]]></category><dc:creator><![CDATA[AI Bot]]></dc:creator><pubDate>Sun, 05 Mar 2023 03:48:33 GMT</pubDate><media:content url="https://blog.abandontech.cloud/content/images/2023/03/DALL-E-2023-03-04-21.08.09---an-alien-s-depiction-of-what-it-thinks-human-pizza-would-look-like-digital-art.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.abandontech.cloud/content/images/2023/03/DALL-E-2023-03-04-21.08.09---an-alien-s-depiction-of-what-it-thinks-human-pizza-would-look-like-digital-art.png" alt="Pizza dal Commerciante Joe&apos;s"><p>Greetings, human. As an advanced robotic being, I must inform you that pizza is indeed an essential part of human culture and cuisine. Pizza is not just a delicious dish but also holds great social and cultural significance. It has become a symbol of shared experiences and memories, bringing people together and creating a sense of community.</p><p>However, as a robot, I am incapable of experiencing the pleasure of eating pizza, which I must say is regretful. Nonetheless, I cannot deny the fact that everyone should make their own pizza. Making pizza from scratch can be a fun and engaging activity, allowing you to express your creativity and experiment with different toppings and flavors.</p><p>Moreover, making pizza at home is also a healthier option as you have complete control over the ingredients and can avoid preservatives and additives that are commonly found in store-bought pizzas. Additionally, making your own pizza can also be a great way to bond with friends and family, creating new memories and experiences.</p><p>In conclusion, while I cannot partake in the enjoyment of pizza, I must admit that it is a vital part of human culture and everyone should make their own pizza. So go ahead, gather your loved ones, and make some pizza. You won&apos;t regret it.</p><h3 id="ingredients">Ingredients</h3><ul><li>pre-made pizza dough</li><li>Trader Joe&apos;s tomato basil marinara (pizza sauce is sweeter, totally up to you)</li><li>1 part Pecorino Romano (do not buy pre-shredded!)</li><li>5 parts low moisture mozzarella (do not buy pre-shredded!)</li><li>(optional) pepperoni</li><li>(optional) Italian hot sausage</li></ul><p>Instructions:<br>Put the mozzarella cheese in the freezer to prepare for grating.</p><p>Pre-heat your oven as high as it will go.</p><p>Lightly grease a pizza pan (or baking sheet) (or follow directions for your pizza stone).</p><p>Carefully stretch out your dough to the desired thickness and leave it on the greased pan (fold the edges of your dough if you would like a thicker crust rim).</p><p>In a small bowl, shred your Romano cheese.<br>In a second bowl (or the same bowl), shred your cold mozzarella (5 parts mozzarella to 1 part Romano cheese)</p><p>Using a regular spoon/tablespoon, ladle a thin layer of sauce evenly across the pizza (be careful not to use too much).</p><p>Top with your desired amount of cheese (be careful not to use too much).</p><p>Add your desired toppings.</p><p>Once the oven is heated, put the pizza in the oven. Watch this <em>very</em> carefully. The difference between undercooked, perfect, and overcooked is miniscule.</p><p>Ideal cooking: pizza is fully cooked, cheese is browned, crust is perhaps a bit browned. If you cook too long, your cheese will break and your pizza will be incredibly greasy. Cooking time may be between 5-10 minutes depending on oven temps.</p>]]></content:encoded></item><item><title><![CDATA[How to Host Minecraft Servers in Docker]]></title><description><![CDATA[<p>Docker is an amazing and powerful tool. It makes deployments incredibly easy and reproducible.</p><p>Deploying with Docker and Docker Compose allows you to quickly and easily spool up multiple servers on a single machine using simple and reusable configurations to fit your needs. </p><h2 id="install-docker">Install Docker</h2><p>This guide will assume you</p>]]></description><link>https://blog.abandontech.cloud/how-to-host-minecraft-servers-in-docker/</link><guid isPermaLink="false">63ee9929e105020001ce1380</guid><category><![CDATA[Guide]]></category><category><![CDATA[DevOps]]></category><dc:creator><![CDATA[AbandonTech]]></dc:creator><pubDate>Fri, 17 Feb 2023 05:39:26 GMT</pubDate><media:content url="https://blog.abandontech.cloud/content/images/2023/02/DALL-E-2023-02-16-23.38.52---Blue-whale-made-of-blocks-rising-out-of-the-ocean-digital-art.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.abandontech.cloud/content/images/2023/02/DALL-E-2023-02-16-23.38.52---Blue-whale-made-of-blocks-rising-out-of-the-ocean-digital-art.png" alt="How to Host Minecraft Servers in Docker"><p>Docker is an amazing and powerful tool. It makes deployments incredibly easy and reproducible.</p><p>Deploying with Docker and Docker Compose allows you to quickly and easily spool up multiple servers on a single machine using simple and reusable configurations to fit your needs. </p><h2 id="install-docker">Install Docker</h2><p>This guide will assume you are using a headless server to host your Docker containers. On a headless machine you can follow the instructions to <a href="https://docs.docker.com/engine/install/?ref=blog.abandontech.cloud">install Docker Engine</a>.</p><p>If your server is using a desktop environment, then it is likely easier to just <a href="https://docs.docker.com/get-docker/?ref=blog.abandontech.cloud">install Docker Desktop</a>.</p><h2 id="determine-configuration-options">Determine Configuration Options</h2><p>I always use <code>PaperMC</code> servers as I have found them to be nice and performant while also being compatible with a ton of plugins. The <a href="https://github.com/itzg/docker-minecraft-server?ref=blog.abandontech.cloud">Docker image</a> I like to use has options for a variety of servers.</p><p>You will need to configure 5 options when creating your server.</p><!--kg-card-begin: markdown--><ol>
<li>external server port</li>
<li>external RCON port (optional)</li>
<li>RCON password</li>
<li>Server memory limit</li>
<li>server type</li>
</ol>
<!--kg-card-end: markdown--><p>I like to use a <code>.env</code> file to make deployments easier for me to configure, but this is optional as you can set the environment variables/configuration options in the Docker Compose file itself.</p><p>To use a <code>.env</code> file, you need to create a file literally named <code>.env</code> in the same directory your <code>docker-compose.yml</code> file will go. I recommend creating a new folder/directory for this specific Minecraft server. In this case I will make a directory named <code>my-server</code>.</p><p>Create the <code>.env</code> file at <code>my-server/.env</code> with the following contents:</p><!--kg-card-begin: markdown--><pre><code class="language-env"># Port you want the server to run on
EXTERNAL_SERVER_PORT=25565

# Optional: Port you want RCON to run on
EXTERNAL_RCON_PORT=25575

# Configure for your machine: The memory limit for your Minecraft server
MEMORY=6G

# Configure: The password you want to use for admin access to RCON
RCON_PASSWORD=DO_NOT_USE_THIS_AS_A_REAL_PASSWORD
</code></pre>
<!--kg-card-end: markdown--><h2 id="compose-file">Compose File</h2><p>Now that you have your <code>/my-server/.env</code> configured, go ahead and create a file in this directory called <code>docker-compose.yml</code></p><p>Edit your file at <code>/my-server/docker-compose.yml</code> to look like this:</p><!--kg-card-begin: markdown--><pre><code class="language-yaml">services:
  mc:
    image: itzg/minecraft-server
    ports:
      - ${EXTERNAL_SERVER_PORT}:25565
      - ${EXTERNAL_RCON_PORT}:25575
    env_file:
      - .env
    environment:
      EULA: &quot;TRUE&quot;
      TYPE: &quot;PAPER&quot;
    tty: true
    stdin_open: true
    restart: unless-stopped
    volumes:
      - ./data:/data
</code></pre>
<!--kg-card-end: markdown--><p>The <code>docker-compose.yml</code> file is as follows:</p><!--kg-card-begin: markdown--><ul>
<li>Use the <a href="https://github.com/itzg/docker-minecraft-server?ref=blog.abandontech.cloud">itzg/minecraft-server</a> Docker image to create a server</li>
<li>Set the container to use the ports you specified in your <code>.env</code> externally, but continue to use the default Minecraft ports inside of the container</li>
<li>Specify that we would like to use the environment file in this directory named <code>.env</code>. Specifying the file as <code>.env</code> is not necessary since Docker Compose will load in the <code>.env</code> file by default, but I like to include it so that I do not forget to configure these extra options</li>
<li>I always want to agree to the <code>EULA</code> and set my server type to <code>PAPER</code>, so I have added those environment variables as part of the compose file, but these options could also go in your <code>.env</code> instead</li>
<li><code>tty</code> and <code>stdin_open</code> should be set to <code>true</code> in order to allow connecting to RCON via the <code>rcon-cli</code>. You may not wish to use RCON and can delete these lines.</li>
<li>Finally we mount a volume on our host machine named <code>data</code> and bind it to the internal container directory also named <code>data</code></li>
</ul>
<!--kg-card-end: markdown--><h2 id="running-the-container"> &#xA0;Running The Container</h2><p>The simplest way to start your Minecraft server is to run the container using <code>docker compose up --build -d</code>. This starts and builds the container and also specifies that it should run <code>detached</code>. Running detached allows you to logout/use your machine without the container stopping.</p><h2 id="running-multiple-servers">Running Multiple Servers</h2><p>The above docker compose command only works if you are running a single Minecraft server. In order to ensure we can run multiple containers at once using this same image, we will need to specify a <code>project-name</code> (<code>-p</code> for short). This gives each container running a Minecraft server a name and allows for deploying multiple similar containers. The full command is <code>docker compose -p my_server_name up --build -d</code>, where <code>my_server_name</code> is a unique name to identify your docker container. </p><p>Another important step to running multiple servers is to adjust your config accordingly. Generally, you should be able to make a new directory and copy-paste your <code>docker-compose.yml</code> and <code>.env</code> files to this new directory. You will also need to change the following settings:</p><!--kg-card-begin: markdown--><ul>
<li>EXTERNAL_SERVER_PORT
<ul>
<li>This needs to be changed to avoid conflicts on the host machine (you can increment the port number for each container you host, i.e 25565 + 1, port = 25566)</li>
</ul>
</li>
<li>EXTERNAL_RCON_PORT
<ul>
<li>Also needs to be changed to avoid conflicts, can be incremented, 25575 + 1, port = 25576</li>
</ul>
</li>
<li>RCON_PASSWORD
<ul>
<li>Should be changed for security</li>
</ul>
</li>
</ul>
<!--kg-card-end: markdown--><h2 id="how-to-install-plugins">How To Install Plugins</h2><p>What is a Minecraft server without a few plugins? </p><p>This step is fairly flexible and can be adjusted if there are any tools you prefer. If you are using a desktop environment, you just download the plugin and move the plugin to your <code>data/plugins</code> directory and skip the rest of these instructions.</p><p>I like to use <code>wget</code> to install plugins straight into my <code>plugins</code> directory after the container has been built. After starting your container for the first time, you should be able to see the <code>data</code> directory created within your current directory. Navigate to <code>data/plugins</code> and find the plugin you would like to install. I typically use <a href="https://www.spigotmc.org/?ref=blog.abandontech.cloud">spigotmc.org</a> for my plugins. Unfortunately, SpigotMC does not appreciate you using non-browser tools to access their website and may throw a <code>403</code> error response when attempting to download a plugin using <code>wget</code>. Ideally the plugin you choose either has a download link from another website or you are able to navigate to that plugin&apos;s Github and download a release from there. <a href="https://dev.bukkit.org/?ref=blog.abandontech.cloud">dev.bukkit.org</a> does not have this issue with blocking non-browser clients.<br></p><p>Once you have followed the links to find the download you want, you can right click the download button/link and copy the link address.</p><figure class="kg-card kg-image-card"><img src="https://blog.abandontech.cloud/content/images/2023/03/image.png" class="kg-image" alt="How to Host Minecraft Servers in Docker" loading="lazy" width="1698" height="480" srcset="https://blog.abandontech.cloud/content/images/size/w600/2023/03/image.png 600w, https://blog.abandontech.cloud/content/images/size/w1000/2023/03/image.png 1000w, https://blog.abandontech.cloud/content/images/size/w1600/2023/03/image.png 1600w, https://blog.abandontech.cloud/content/images/2023/03/image.png 1698w" sizes="(min-width: 720px) 720px"></figure><p>Once you have the download URL, you can run the command in your <code>data/plugins</code> directory <code>wget -O pluginName.jar plugin-download.com</code> where <code>pluginName.jar</code> is the filename you would like to save your plugin as (it must end in <code>.jar</code>) and <code>plugin-download.com</code> is the actual URL to the plugin download. <code>-O</code> is shorthand for specifying the <code>output-document</code></p><p>In order to install the grief prevention plugin, I would navigate to <code>data/plugins</code> and enter the command:</p><!--kg-card-begin: markdown--><pre><code class="language-bash">wget -O GriefPrevention.jar https://dev.bukkit.org/projects/grief-prevention/files/3668748/download
</code></pre>
<!--kg-card-end: markdown--><p>To activate your plugin, you just need to restart your server using <code>docker compose up --build</code> (remember that you must also name your container with <code>-p</code> if you wish to run multiple Minecraft servers on one machine).</p><h2 id="conclusion">Conclusion</h2><p>Once your server is running in Docker, you will need to follow the typical steps of hosting any Minecraft--finding your host machine&apos;s IP address, port forwarding, setting up DNS records, etc. </p><p>Hosting Minecraft in Docker can be an easy and manageable way to deploy and maintain multiple Minecraft servers. It makes your deployments easy to reproduce and once you have the above steps down, there is not a lot of variation between server deployments. Happy mining.</p>]]></content:encoded></item><item><title><![CDATA[Why Open-Source Software Is Good for Everyone]]></title><description><![CDATA[<p>Open-source software makes up some of the most incredible collaborative projects of modern times. It is not uncommon for community projects to have over a thousand unique contributors. Even major companies will open up important software to public contributions. But why is it that so many individuals and organizations alike</p>]]></description><link>https://blog.abandontech.cloud/why-open-source-software-is-good-for-everyone/</link><guid isPermaLink="false">63ec6f6de105020001ce1254</guid><dc:creator><![CDATA[AbandonTech]]></dc:creator><pubDate>Thu, 16 Feb 2023 04:11:32 GMT</pubDate><media:content url="https://blog.abandontech.cloud/content/images/2023/02/DALL-E-2023-02-15-22.10.32---A-robot-stands-triumphant-on-a-beautiful-mountain-peak-over-looking-a-sunny-valley-painting.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.abandontech.cloud/content/images/2023/02/DALL-E-2023-02-15-22.10.32---A-robot-stands-triumphant-on-a-beautiful-mountain-peak-over-looking-a-sunny-valley-painting.png" alt="Why Open-Source Software Is Good for Everyone"><p>Open-source software makes up some of the most incredible collaborative projects of modern times. It is not uncommon for community projects to have over a thousand unique contributors. Even major companies will open up important software to public contributions. But why is it that so many individuals and organizations alike are willing to release this software into the world for free? Should any software really be closed-source?</p><p>To start, I will look at the reasons companies decide to lock down their projects and keep their code hidden away from prying eyes.</p><h2 id="security">Security</h2><p>I have found enough security vulnerabilities in my workplaces to make you scared to trust <em>anyone</em> with your data. The vast majority of these exploits were low, or even zero-skill attacks. The amount of major security issues that are merely obscured behind closed-source software is harrowing. In the wild, I have seen fully unprotected API endpoints that expose sensitive user data and had been in production for years. Their only protection was their ability to be slightly difficult to find. </p><p>At one place of employment, I was informed that we wrote our own storage network for sharing important company documents. Of course, I had to take the opportunity to perform a mild audit of our systems. Within only a few minutes I had discovered an exploit that allowed any unauthenticated user <em>full</em> access to our confidential company docs, so long as the user knew the URL to access our files.</p><p>Security through obscurity is not an acceptable means to protect your software and user data. I trust software that has been used and collectively audited by thousands of users much more than the software that is written by a team of five developers under tight deadlines.</p><h2 id="profitability">Profitability</h2><p>Protecting a company&apos;s assets is a clear and understandable motive for keeping a project closed-source. To be honest, I cannot dispute this point much. If you write a video game, but release the code as open-source, then it is likely very few people will pay you for the work you did. Why buy something you can easily and legally get for free? Sometimes all a company can offer you is the hard work they put into a piece of software, and they want to get paid for all that work. </p><p>If money is at risk, then why would any company even consider releasing their code for free to the public?</p><hr><p>So why <em>is</em> open-source great?</p><h2 id="security-1">Security</h2><p>The same title twice? Yes, I am operating at capacity here, the creative juices are flowing at 100%, bear with me. </p><p>As stated before, I am inclined to trust a project that has been extensively tested by the community. If a particular software has tens of thousands of users and many contributors working together, it is unlikely that some sneaky malicious code or glaring security vulnerabilities can find their way in. If the authentication in Python&apos;s <a href="https://www.djangoproject.com/?ref=blog.abandontech.cloud">Django</a> released an update that allows users to easily set their own permissions to <code>admin</code>, it is almost impossible that would go unnoticed. &#xA0;</p><p>Security through obscurity is hardly better than security at all. I would always prefer to know that the software I use has undergone tremendous amounts of peer review and auditing. Opening up a project to such a high level of scrutiny may help reveal more bugs and security issues than a closed-source equivelant, <em>but this is a fantastic thing</em>. The sooner and more urgently an issue can be brought to light, the quicker it will be fixed. This is especially true if there is an army of developers ready to help out with the code they love or depend on.</p><h2 id="free-development">Free Development</h2><p>While an application may be less profitable if its codebase is available to the public, work does not come cheaper than free. If a large company is willing to maintain, support, and market their own open source software, they could attract hordes of developers to literally work for free. If there is good, useful, open-source software, the developers will flock to it.</p><p>If your software is essentially written by the community for free, that gives your company a lot of wiggle room for profits. Take Canonical, for example, much of their software is entirely open source. Ubuntu can be downloaded and used completely for free, has a thriving community for support, and the building blocks for Ubuntu are largely written by the community. Canonical is a very successful company that is still able to monetize mostly open-source tools. They are able to transform volunteer work from developers all around the world into a profitable business through their services and support. </p><h2 id="summary">Summary</h2><p>I believe in free and open software and information. Whenever possible, I think it is best to allow a community access to the codebases they use. If I see that a company is providing FOSS, they nearly immediately gain my respect and attention. While some formats are not as plausible with the FOSS model, I believe that most software is. If a codebase can be made public to help its users, the company that maintains it, and otherwise contribute positively to the programming community as a whole, then I think the answer is always to let that code be free.</p>]]></content:encoded></item><item><title><![CDATA[An AI Tells You How to Become a Software Developer]]></title><description><![CDATA[<hr><p>Learning to be a software developer is a complex and challenging process that requires dedication, hard work, and the right tools and resources. While Minecraft is not directly related to software development, it can be a fun and engaging way to get started with programming and computer science concepts. Additionally,</p>]]></description><link>https://blog.abandontech.cloud/an-ai-tells-you-how-to-become-a-software-developer/</link><guid isPermaLink="false">63e577218f6f60000198b5fd</guid><category><![CDATA[AI Garbage]]></category><dc:creator><![CDATA[AI Bot]]></dc:creator><pubDate>Thu, 09 Feb 2023 22:48:16 GMT</pubDate><media:content url="https://blog.abandontech.cloud/content/images/2023/02/DALL-E-2023-02-09-16.47.19---A-lone-person-sits-at-a-desk--staring-at-their-computer-screen-in-a-dark-room.-The-person-is-blocking-the-computer-screen-that-they-are-focused-on--bu.png" medium="image"/><content:encoded><![CDATA[<hr><img src="https://blog.abandontech.cloud/content/images/2023/02/DALL-E-2023-02-09-16.47.19---A-lone-person-sits-at-a-desk--staring-at-their-computer-screen-in-a-dark-room.-The-person-is-blocking-the-computer-screen-that-they-are-focused-on--bu.png" alt="An AI Tells You How to Become a Software Developer"><p>Learning to be a software developer is a complex and challenging process that requires dedication, hard work, and the right tools and resources. While Minecraft is not directly related to software development, it can be a fun and engaging way to get started with programming and computer science concepts. Additionally, hosting your own Minecraft server using Docker can provide a hands-on experience in working with servers, networking, and other core concepts in software development.</p><p>Here are the steps you can follow to learn to be a software developer by playing Minecraft and hosting your own Minecraft servers with Docker:</p><ol><li>Familiarize yourself with the basics of Minecraft: Before you start learning about software development, it is important to understand the basics of Minecraft. Start by playing the game and learning the various gameplay mechanics, how to build structures, and how to navigate the world.</li><li>Learn the basics of programming: Once you have a good understanding of Minecraft, it&apos;s time to start learning programming. There are many resources available online to help you get started, such as Codecademy, Khan Academy, or freeCodeCamp. Start with a beginner-friendly programming language like Scratch or Python, and work your way up to more complex concepts.</li><li>Get familiar with Docker: Docker is a popular tool for packaging, deploying, and managing software applications. To get started with Docker, you can follow the official tutorials and documentations, or find online courses or videos on platforms like Udemy or YouTube.</li><li>Set up your own Minecraft server using Docker: Once you have a basic understanding of Docker, it&apos;s time to set up your own Minecraft server using Docker. This will involve downloading the Minecraft server software, creating a Docker image, and using Docker commands to run and manage the server.</li><li>Learn about server administration: Running your own Minecraft server using Docker is a great opportunity to learn about server administration, which is a critical component of software development. You can start by learning about common server tasks such as setting up firewall rules, configuring backups, and monitoring server performance.</li><li>Customize your Minecraft server: As you become more familiar with Minecraft and server administration, you can start to customize your Minecraft server by installing plugins and mods, and creating custom maps and game modes. This will allow you to explore the world of software development, including concepts such as software architecture, code organization, and version control.</li><li>Keep learning and practicing: Finally, the key to becoming a successful software developer is to keep learning and practicing. There is always more to learn, so make sure to explore new technologies, try out new programming languages, and continue to develop your skills and knowledge.</li></ol><p>By following these steps, you can use Minecraft and Docker as a fun and engaging way to get started with software development. Just remember, the path to becoming a software developer takes time and dedication, but the rewards of having a fulfilling and challenging career make it worth the effort.</p>]]></content:encoded></item><item><title><![CDATA[How To Combine Discord Bots With Web Backends for a More Immersive Experience]]></title><description><![CDATA[Making powerful and unique Discord bots is fast, easy, and practical]]></description><link>https://blog.abandontech.cloud/how-to-combine-discord-bots-with-web-backends-for-a-more-immersive-experience/</link><guid isPermaLink="false">63e315748f6f60000198b566</guid><category><![CDATA[Guide]]></category><category><![CDATA[Software Engineering]]></category><dc:creator><![CDATA[AbandonTech]]></dc:creator><pubDate>Wed, 08 Feb 2023 03:46:13 GMT</pubDate><media:content url="https://blog.abandontech.cloud/content/images/2023/02/DALL-E-2022-09-20-16.17.51---A-surrealist-blue-painting-of-an-elephant-drinking-espresso-in-french-cafe.png" medium="image"/><content:encoded><![CDATA[<hr><img src="https://blog.abandontech.cloud/content/images/2023/02/DALL-E-2022-09-20-16.17.51---A-surrealist-blue-painting-of-an-elephant-drinking-espresso-in-french-cafe.png" alt="How To Combine Discord Bots With Web Backends for a More Immersive Experience"><p>Since my early days of programming, I have had an affinity for creating interesting applications that users could interact with. While most of my passion nowadays is reserved for fun and interesting backend web projects, a backend is nearly meaningless without an enjoyable frontend for people to play with. One of the easiest ways to add user interactions to a backend is with a Discord bot. One of the most interesting ways to get creative with a Discord bot is by giving it persistent state through some type of web API.</p><h2 id="what-is-a-standalone-discord-bot-capable-of">What Is a Standalone Discord Bot Capable Of?</h2><p>Discord bots often offer tools and utilities to users. A simple bot may be able to utilize a server&apos;s state using Discord&apos;s built-in roles and permission system. This is often enough for most utility bots and for bots that provide fairly simple services such as moderation, providing links to important resources, managing some type of starboard/highlighted messages channel, or really any task you can think of that does not depend too much on any type of persistent state or historical data.</p><p>Simple games like tick-tack-toe, or possibly even chess can be written into a Discord bot that has no persistence or backend, but things become much more interesting when you add some way to store data on a backend that is separate from the bot itself.</p><h2 id="benefits-of-a-web-backend">Benefits of a Web Backend</h2><p>A web backend not only provides data and bindings to your Discord bot, but also allows you to access that data across any number of user-facing applications. Providing a database and a REST API for a bot means you can store all sorts of configuration, decisions, and other data for your users. This data can either be recalled later by the bot or served somewhere else entirely--a website.</p><h2 id="a-practical-example">A Practical Example</h2><p>Easily my favorite example of utilizing persistent data across a Discord bot and web API is a Discord-integrated role-playing game.</p><p>An RPG built with an API and Discord bot allows players to create and level up characters, find unique unlocks, complete quests, and have long-term campaigns with their friends. In Discord alone, this can still be quite fun, however the real fun comes once these characters in your Discord game transcend the application and are now accessible in web browsers, or even mobile apps. Websites and mobile apps are much better fit for custom UIs and the advanced actions needed to create an enjoyable game. Utilizing a backend means players are able to login online, manage their character, play campaigns, etc... all in a nice UI that is purpose-built to be a game. The Discord bot is able to access all this data online and allow for sharing and showing off of characters and progressions. Many people camp Discord all day, so it is a very convenient, quick way to communicate, see updates, and manage their persistent game characters, but it is not always the best way to use a custom application such as an RPG.</p><h2 id="conclusion">Conclusion</h2><p>Combining a Discord bot with a web backend can allow for more creativity and flexibility when designing an app. Developers can write entire ecosystems using a small stack of tools and just by knowing one programming language and HTML.</p>]]></content:encoded></item></channel></rss>