<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Nick Gerace Hacks</title><description>Recent content on Nick Gerace Hacks</description><link>https://nickgerace.dev/</link><item><title>Personal Rig Update</title><link>https://nickgerace.dev/posts/personal-rig-update-2026/</link><guid isPermaLink="true">https://nickgerace.dev/posts/personal-rig-update-2026/</guid><pubDate>Mon, 19 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I&apos;ve made some updates to my personal rig over the last couple years that were focused on simplifying the build as well as making it easier to work on and transport.
The net result is a resounding success!&lt;/p&gt;
&lt;p&gt;This is it: the updated build in the &lt;a href=&quot;https://www.fractal-design.com/products/cases/meshify/meshify-3/black-tg-light-tint/&quot;&gt;Fractal Design Meshify 3&lt;/a&gt; (non-RGB).
The build retains the Nvidia RTX 4090 GPU (acquired April 2023) and AMD Ryzen 7 7700X CPU (acquired November 2022) featured in my &lt;a href=&quot;/posts/finishing-desktop-upgrade-18-months&quot;&gt;last update&lt;/a&gt;.
It&apos;s been in service since June 2025, but enough time has passed to talk about my experience with it.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/2026/pc.jpg&quot; alt=&quot;Nick&apos;s PC as of January 2026&quot;&gt;&lt;/p&gt;
&lt;p&gt;There was little wrong with the existing build.
It performed extremely well and the Lian Li O11D EVO XL case was well built, sturdy and easy to work in.
However, the sheer weight and size for transporation, upgrades and maintenance was overkill for what I needed.
I not only wanted to downsize for ease of use, but I also wanted to fit my desktop computer back onto my desk and off of the floor.&lt;/p&gt;
&lt;p&gt;I started experimenting with smaller cases and reducing the total number of fans.
The goal was to downsize while achieving a similar noise profile with similar temps.&lt;/p&gt;
&lt;p&gt;Lian Li and Dan Cases collaborated on an excellent mATX case that caught my eye: the A3-mATX.
I picked up the wood panel version in early 2025 due to the front panel featuring openings in between the wood pieces.
In contast, the base version features a solid front panel.
This allowed me to face the PSU fan outwards to separate its airflow from the interior.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/2026/pc-experiment.jpg&quot; alt=&quot;Nick&apos;s PC experiment in the A3-mATX&quot;&gt;&lt;/p&gt;
&lt;p&gt;The problem with this build was how noisy it was.
That was true for both the builds using the &lt;a href=&quot;/posts/finishing-desktop-upgrade-18-months&quot;&gt;360mm AIO I brought over&lt;/a&gt; and the Noctua U12A air cooler that I eventually switched to.
I was getting used to having my desktop on my desk again with fans spinning near my ears and the all-mesh enclosure didn&apos;t help.
&lt;a href=&quot;https://getfancontrol.com/&quot;&gt;Fan Control&lt;/a&gt; was an excellent utility to help dial everything in for both noise reducation and performance, but I decided that this form factor might not have been for me at that time.
I had always been interested in both SFF and mATX form factors, but had never taken the jump because the uncompromising nature of custom desktop computers had always been a key selling point to me.&lt;/p&gt;
&lt;p&gt;That being said, I&apos;m very happy I tried the A3-mATX.
I&apos;d happily revisit this form factor with a bottom-up approach to cooling (i.e. buying all the parts with a build in mind) or with lower power parts.
There are exciting cases in both the SFF and mATX spaces, like the Ncase M3 and Fractal Design Terra, that could make for great builds.&lt;/p&gt;
&lt;p&gt;Fortunately, soon after this experiment, Fractal Design released the Meshify 3 series of cases.
I had been eyeing the &amp;quot;wind tunnel&amp;quot; sector of PC cases for the past couple of years in particular.
Dual chamber cases like the Lian Li 011D series and Phanteks NV series are awesome, but the front-to-back airflow cases lend themselves well to simple builds featuring a small number of fans with air-cooled components.&lt;/p&gt;
&lt;p&gt;There were a lot of great cases featured at trade shows, including Computex and CES.
Some standouts were the HAVN BF 360, the Antec Flux Pro, the Lian Li Lancool 217 and the Fractal Design North (and North XL).
However, the release of the Fractal Design Meshify 3 caught my eye in particular.
I used their Meshify C case in a 2019 build and loved it, so checking out the next iteration in the tried-and-true, plain black box, &amp;quot;wind tunnel&amp;quot; series was a natural step to take.&lt;/p&gt;
&lt;p&gt;The build plan turned out to be much simpler than &lt;a href=&quot;/posts/finishing-desktop-upgrade-18-months&quot;&gt;my last build plan&lt;/a&gt;.
In fact, I used no additional fans than what came with the case and CPU cooler.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/2026/pc-plan.jpg&quot; alt=&quot;A diagram of the case and fan configuration design&quot;&gt;&lt;/p&gt;
&lt;p&gt;The air guide was a welcome addition to the newest iteration of the Meshify case.
It gives the bottom 140mm fan a reason to exist rather than just shooting air into a squared off PSU shroud.&lt;/p&gt;
&lt;p&gt;As far as the fan configuration goes, from both my own (questionable) testing and extensive research online, adding a rear exhaust fans and/or two top fans would have had an insignificant performance impact.
I didn&apos;t replace the stock fans like I normally would either.
I decided to try them and just... haven&apos;t swapped them out because they work well.
Sure, if one of them ends up having an issue with a ball-bearing or begins to not work well, I&apos;ll probably swap it out with a Noctua, Phanteks or Arctic fan.
For now though, I&apos;ve been impressed with Fractal Design&apos;s Momentum 14 fans.&lt;/p&gt;
&lt;p&gt;Overall, if you mix &amp;quot;low-hassle&amp;quot;, &amp;quot;low-number-of-fans&amp;quot;, &amp;quot;low-complexity&amp;quot; and &amp;quot;highly-performant&amp;quot; into a blender, you&apos;ll get my most of... that... build ever!
I&apos;m very happy with it!
The case is a particular standout.
That&apos;s unsurprising given that it won &lt;a href=&quot;https://gamersnexus.net/cases/best-pc-cases-2025-75-200-airflow-thermals-cable-management-budget#best-overall-case&quot;&gt;GamersNexus&apos; &amp;quot;Best Overall Case&amp;quot; for 2025&lt;/a&gt;, but it&apos;s still worth mentioning.&lt;/p&gt;
&lt;p&gt;The build has been in use since around June 2025 and I do not have any plans to change it in the near future.
So, what about the &amp;quot;not-near&amp;quot; future?
Ironically, I&apos;ve been eyeing up &lt;a href=&quot;https://reddit.com/r/watercooling&quot;&gt;custom loop&lt;/a&gt; builds... the exact opposite of most things I put into that blender.
Even more ironically, those are the kinds of builds that work well with the O11D EVO XL given its mechanical design and space for big radiators!&lt;/p&gt;
&lt;p&gt;With the great performance and reliability of both of air coolers and AIO liquid coolers these days, why build a custom loop build?
I&apos;ve been asking myself that for years, which is why I haven&apos;t done it, but I&apos;ve come to the conclusion custom loop builds are mainly for the artwork, craftsmanship and &lt;em&gt;hands-on fun&lt;/em&gt;.
The last bit is particularly interesting.&lt;/p&gt;
&lt;p&gt;I was listening to &lt;a href=&quot;https://fallthrough.transistor.fm/53&quot;&gt;Fallthrough episode 53&lt;/a&gt; and the hosts, &lt;a href=&quot;https://matthewsanabria.dev/&quot;&gt;Matthew&lt;/a&gt; and &lt;a href=&quot;https://github.com/skriptble&quot;&gt;Kris&lt;/a&gt;, discussed physical projects they had going on in their lives as well as the cross-functional nature of some of the projects (i.e. things you can tie back to software).
I work on software all day, so not only is a physical project a breath of fresh air, but it can also give more exposure to other subjects, sciences, hobbies and communities.
I may not end up ever building a custom loop, but its on the radar, perhaps with a component upgrade.&lt;/p&gt;
&lt;p&gt;Speaking of &amp;quot;component upgrade&amp;quot;, I doubt I&apos;ll upgrade my CPU without upgrading my GPU.
Sure, I may see a benefit by switching to the Ryzen 7 9800X3D (or its rumored refresh SKU), but I&apos;d rather atomically upgrade both parts and experience a bigger uplift.
I haven&apos;t upgraded to Nvidia Blackwell (RTX 50 series), AMD Radeon RDNA 4 (RX 9000 series) or Intel Arc Battlemage (BXXX series) for the same reason.
Rubin (RTX 60 series) is rumored to be a &lt;a href=&quot;https://videocardz.com/newz/geforce-rtx-60-reportedly-uses-gr20x-rubin-series-gpus&quot;&gt;long way out&lt;/a&gt; and there likely won&apos;t be a GPU refresh from Nvidia before then.
The ongoing RAM shortage certainly isn&apos;t helping.
That being said, there&apos;s a lot of time between now and &amp;quot;2027H2&amp;quot;, so we&apos;ll see.&lt;/p&gt;
&lt;p&gt;What I do know is that this current build is bliss!
It&apos;s been a blast settling back into a simple, front-to-back &amp;quot;wind tunnel&amp;quot; ATX build.&lt;/p&gt;
</content:encoded><category>Hardware</category><category>Personal Rig</category></item><item><title>System Initiative Becomes Generally Available</title><link>https://nickgerace.dev/posts/system-initiative-becomes-generally-available/</link><guid isPermaLink="true">https://nickgerace.dev/posts/system-initiative-becomes-generally-available/</guid><pubDate>Wed, 25 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Today, after more than five years of dedication, the future of DevOps automation is here.
&lt;a href=&quot;https://systeminit.com&quot;&gt;System Initiative&lt;/a&gt; is now generally available for everyone to use.&lt;/p&gt;
&lt;h2&gt;Three Years to Three Clicks&lt;/h2&gt;
&lt;p&gt;About three years ago, &lt;a href=&quot;https://x.com/adamhjk&quot;&gt;Adam&lt;/a&gt; took me through a live demo of the System Initiative (&amp;quot;SI&amp;quot;).
I wrote about how transformative that experience was &lt;a href=&quot;/posts/system-initiative-the-second-wave-of-devops&quot;&gt;when we launched the company publicly&lt;/a&gt;, but here&apos;s the short version: I dropped everything in the weeks following that demo in order to join as the second engineer and fifth employee of the company.&lt;/p&gt;
&lt;p&gt;The following three years have been some of the most rewarding in my career.
Our world class team, and steadily growing and passionate community, have been vital to not only reaching this milestone, but also to my own career.
I cannot thank them enough.&lt;/p&gt;
&lt;p&gt;You may or may not have heard of us over the last year or so, but in any case, let&apos;s talk about what&apos;s different now.&lt;/p&gt;
&lt;p&gt;Last year, we &lt;a href=&quot;https://systeminit.com/blog-second-wave-devops&quot;&gt;launched the company publicly&lt;/a&gt;, &lt;a href=&quot;https://github.com/systeminit/si&quot;&gt;open sourced the System Initiative software&lt;/a&gt; and steadily built an excellent community of people looking for the future of DevOps in &lt;a href=&quot;https://discord.com/invite/system-init&quot;&gt;our Discord server&lt;/a&gt;.
However, all of these steps were taken towards reaching our most ambitious destination yet.&lt;/p&gt;
&lt;p&gt;It&apos;s incredible to finally say that you, the reader, can now use System Initiative in its generally available, fully-featured form.&lt;/p&gt;
&lt;h2&gt;Replacing Infrastructure as Code&lt;/h2&gt;
&lt;p&gt;We&apos;ve talked about System Initiative many times before, but this time is different: we&apos;re now talking about System Initiative in the form that you deserve; over five years in the making.&lt;/p&gt;
&lt;p&gt;System Initiative is &lt;a href=&quot;https://systeminit.com/open-source&quot;&gt;100% Open Source&lt;/a&gt;, fully multiplayer, and replaces infrastructure as code.
It provides a living architecture diagram to manage all of your infrastructure, no matter where it lives.
It offers full programmability and customization, and you can get started with over 100 rich models that are 1:1 with upstream APIs, like &lt;a href=&quot;https://aws.amazon.com/ec2/&quot;&gt;AWS EC2&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I wrote about the capabilities of &lt;a href=&quot;/posts/system-initiative-the-second-wave-of-devops&quot;&gt;the System Initiative software in the past&lt;/a&gt;, but a lot has improved and changed since then.
Let&apos;s talk about it in two parts: features and performance.&lt;/p&gt;
&lt;h2&gt;Feature Forward Initiative&lt;/h2&gt;
&lt;p&gt;We provide over 100 assets that richly model upstream APIs 1:1, but what if you want to write your own?
What if you want to contribute your own?
Maybe you have a small edit to make to an existing asset, just for you.
Maybe you want to share your assets with your colleagues.
What if you want to change the inputs for functions that your assets use?
Maybe you want to add an additional socket to your asset?
You can do all of this and more in System Initiative.&lt;/p&gt;
&lt;p&gt;Configuration and modeling were first class features in early versions of System Initiative.
However, we know that System Initiative thrives when it is customized with maximum programmability.
Over the past year, authoring has not only become a first class feature of SI, but it has become a cornerstone of what makes SI transformative and truly special.&lt;/p&gt;
&lt;p&gt;Many low-code tools suffer once the honeymoon is over and you need to customize your experience to your needs.
System Initiative embraces the power user and provides &lt;em&gt;more&lt;/em&gt; flexibility than infrastructure as code has ever done before.
Authoring assets and functions allows you to interact with upstream APIs directly without having to deal with abstractions.&lt;/p&gt;
&lt;p&gt;Need to model a virtual machine from a cloud provider?
You can model their API 1:1 by using the asset builder and authoring interface.
Need to provide metadata from the virtual machine to another component on the diagram?
You can add an output socket to your new asset and source the value from another prop within the asset.
Need to transform the data on the way out into a different shape?
You can write a custom attribute function to transform the data for other components to use.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Don&apos;t worry, if this terminology is new or confusing, we have tutorials and docs ready for you &lt;em&gt;today&lt;/em&gt; at &lt;a href=&quot;https://docs.systeminit.com/&quot;&gt;docs.systeminit.com&lt;/a&gt;!
You can also reach out to us and fellow community members anytime in &lt;a href=&quot;https://discord.com/invite/system-init&quot;&gt;our Discord server&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Configuration works better and faster than ever too.
You can compose secrets throughout the system and have secrets that depend on secrets to be used in other components.
You can create complex, nested frames to mass connect sockets without having to draw individual edges.
You can see and learn more from the diagram without having to navigate between different screens and views, more than ever before.&lt;/p&gt;
&lt;p&gt;Whether you make small edits to a couple properties on a single component or create a hundred &lt;a href=&quot;https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html&quot;&gt;AWS EC2 key pairs&lt;/a&gt; at once (totally not a performance smoke test of mine), you will be able to compose, configure and manage your infrastructure on one screen to rule them all.
The best part?
You can do this with your friends and colleagues in real-time.&lt;/p&gt;
&lt;p&gt;Say goodbye to pull request ping pong and waiting for long CI/CD queues!
Your configurations can be validated and qualified automatically through customizable functions.
Not only is deployment native and abstraction-less, but the collaboration we&apos;ve all been craving is now there.&lt;/p&gt;
&lt;p&gt;This is all powered by a living architecture diagram that reflects both the real world through imperative changes and your model through declarative changes.&lt;/p&gt;
&lt;p&gt;Infrastructure is a living, breathing thing.
It changes, drifts, crashes, reboots, upgrades, and shifts.
Declarative infrastructure is great, but giving you the choice is essential.
We deserve to have the choice.&lt;/p&gt;
&lt;h2&gt;Performance Enhanced System&lt;/h2&gt;
&lt;p&gt;Since the open source launch, performance has dramatically improved through a variety of means; one of which is through our homegrown &lt;a href=&quot;https://github.com/systeminit/si/tree/36ddff246938df2976830df419f2ab718f0221d6/lib/naxum&quot;&gt;naxum&lt;/a&gt; library.
It&apos;s an &lt;a href=&quot;https://github.com/tokio-rs/axum&quot;&gt;axum&lt;/a&gt;-like server that handles core &lt;a href=&quot;https://nats.io&quot;&gt;NATS&lt;/a&gt; and &lt;a href=&quot;https://docs.nats.io/nats-concepts/jetstream&quot;&gt;NATS JetStream&lt;/a&gt; messages at lightning fast speeds.&lt;/p&gt;
&lt;p&gt;All of our services communicate via core NATS for fan-out and &lt;a href=&quot;https://en.wikipedia.org/wiki/User_Datagram_Protocol&quot;&gt;UDP&lt;/a&gt;-style messaging, and NATS JetStream for workqueue and durability-sensitive messaging.
Creating naxum was a labor of love by &lt;a href=&quot;https://github.com/fnichol&quot;&gt;Fletcher Nichol&lt;/a&gt; and many others at SI, and it&apos;s been incredible for building an intensely complex distributed system.&lt;/p&gt;
&lt;p&gt;From late July 2023 to March 2024, we worked on a new engine for System Initiative.
Powered by &lt;a href=&quot;https://docs.rs/petgraph/latest/petgraph/&quot;&gt;petgraph&lt;/a&gt;, the new engine switches from a hypergraph of functions powered by &lt;a href=&quot;https://postgresql.org/&quot;&gt;PostgreSQL&lt;/a&gt; tables and complex queries to an in-memory, directed acyclic graph backed by a multi-layered, distributed database.
Complex operations moved out of PostgreSQL moved into our own services, providing substantial speed increases.
Questions about lineage for updating existing assets with new versions upstream and providing a fully-featured multiplayer experience became infinitely easier to answer.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Originally, we embarked on the new engine journey to tackle the lifecycle of modules.
There was no talk of a &amp;quot;new engine&amp;quot; at the time.
We needed to handle the lineage of modules and assets in workspaces and change sets.
However, it quickly grew into a journey about performance, features and ultimately, a paradigm shift at the engine-layer of the System Initiative software.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Since May 15th of this year, we&apos;ve been fine tuning and hardening the new engine since &lt;a href=&quot;https://github.com/systeminit/si/pull/3802&quot;&gt;reaching feature parity with the old engine&lt;/a&gt;.
In fact, we&apos;ve since made our graphs simpler, dropped their reliance on &lt;a href=&quot;https://en.wikipedia.org/wiki/Vector_clock&quot;&gt;vector clocks&lt;/a&gt;, and have switched to an operational-transform model for eliminating needless conflicts across the board.&lt;/p&gt;
&lt;p&gt;The storage layer is powered by our handcrafted &lt;a href=&quot;https://github.com/systeminit/si/tree/36ddff246938df2976830df419f2ab718f0221d6/lib/si-layer-cache&quot;&gt;layer caching service&lt;/a&gt;.
The layers include both memory caching and disk caching, and all writes are eventually written to PostgreSQL.&lt;/p&gt;
&lt;p&gt;All of these performance optimizations are for naught without horizontal scaling capabilities and effective multi-core utilization.
All SI backend services can be horizontally scaled with 1:N instances.
They feature both graceful shutdown procedures and are protected against unexpected shutdown scenarios.
This is accomplished through a variety of means, but using NATS JetStream for durable messaging, and our layer caching service for fast reads and writes, helps ensure that our distributed system is both fast and correct.&lt;/p&gt;
&lt;h2&gt;Go try it!&lt;/h2&gt;
&lt;p&gt;Over five years of handcrafting the future of DevOps automation has been an incredibly tall task, but we are more than excited to give you what our industry needs now, more than ever.&lt;/p&gt;
&lt;p&gt;If you made it this far, you owe it to yourself to go to &lt;a href=&quot;https://systeminit.com&quot;&gt;our website&lt;/a&gt; and try it.
No need for me to keep yappin&apos; here.&lt;/p&gt;
&lt;p&gt;Thank you, once again, to my team and our community for everything you&apos;ve done.
As always, I&apos;ll see you on &lt;a href=&quot;https://discord.com/invite/system-init&quot;&gt;our Discord server&lt;/a&gt;!&lt;/p&gt;
</content:encoded><category>System Initiative</category></item><item><title>Finishing My Desktop Upgrade After 18 Months</title><link>https://nickgerace.dev/posts/finishing-desktop-upgrade-18-months/</link><guid isPermaLink="true">https://nickgerace.dev/posts/finishing-desktop-upgrade-18-months/</guid><pubDate>Sun, 25 Feb 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I finally and recently finished my personal desktop upgrade that began in July 2022.
Let&apos;s talk about it!&lt;/p&gt;
&lt;p&gt;This is it: an Nvidia RTX 4090 GPU and an AMD Ryzen 7 7700X CPU inside of a Lian Li O11D EVO XL case.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/2024/pc.webp&quot; alt=&quot;Nick&apos;s PC as of February 2024&quot;&gt;&lt;/p&gt;
&lt;p&gt;Knowing that new CPUs and GPUs were around the corner, I decided to upgrade my desktop PC with a full refresh in July 2022.
I started with some fan upgrades and a case swap, but the first major upgrade focused on the CPU.
I upgraded to an AMD Ryzen 7 7700X CPU in November 2022.
I was considering the Intel Core i7 13700K/13700KF or waiting for a potential Zen 4 X3D model down the line, but I ultimately decided on the 7700X.&lt;/p&gt;
&lt;p&gt;What led to that decision?
A few things.
I had been experiencing performance bottlenecks with my old CPU.
There was an active &lt;a href=&quot;https://microcenter.com&quot;&gt;Micro Center&lt;/a&gt; deal at the time for AM5 CPUs.
The lower power draw of the 7700X was a nice bonus in comparison to the 13700K/13700KF.
Finally, I believed (and still do) that while AM5 may not live as long as AM4 did, I&apos;d likely be able to drop a future generation &lt;a href=&quot;https://amd.com/en/technologies/3d-v-cache&quot;&gt;3D V-Cache (&amp;quot;X3D&amp;quot;)&lt;/a&gt; CPU.&lt;/p&gt;
&lt;p&gt;Now, onto the GPU.
Given the subpar launches of the Nvidia RTX 40 series (&amp;quot;Ada&amp;quot;) and the AMD Radeon RDNA 3 series GPUs, I temporarily stuck it out with the CPU upgrade alone.
I was bracing for impact given inflation and the 2020-2022 GPU craze, but I did not expect bad prices &lt;em&gt;and&lt;/em&gt; questionable product placement from both product lines.&lt;/p&gt;
&lt;p&gt;That being said, I eventually YOLO&apos;d for the RTX 4090 FE (Founder&apos;s Edition) in May 2023.
The non-FE models were not enticing and were generally more expensive.
Moreover, the RTX 4080&apos;s pricing was egregious relative to its performance.
If the RTX 4080 FE had the RTX 4080 Super FE&apos;s MSRP at launch, I probably would have went with the RTX 4080 FE instead of the RTX 4090 FE.
Alas, Nvidia got me in the end, &lt;a href=&quot;https://cnbc.com/2024/02/21/nvidia-nvda-earnings-report-q4-2024.html&quot;&gt;like they had for so many others&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;With both primary components in hand, I began to evaluate how I could effectively cool them for gaming, graphics, code compilation and AI-based workloads.
My focus shifted to the cooling and stayed there for many months to come.&lt;/p&gt;
&lt;p&gt;I bounced between a few cases and CPU coolers from July 2022 and January 2024.
Due to the increasing size of GPUs and increasing thermal requirements of CPUs over the past half decade or so, few of the existing cases and coolers were appealing to me.
Sure, undervolting and power limiting can be effective, but I wanted to build something with headroom for future upgrades that could all-core workloads.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ironically, I considered a small form factor build at many points in the process.
Many cases performed well thermally and were beautiful.
Not only that, but the &lt;a href=&quot;https://discord.com/invite/sffgurus&quot;&gt;SFF Gurus Discord server&lt;/a&gt; and &lt;a href=&quot;https://reddit.com/r/sffpc&quot;&gt;r/sffpc&lt;/a&gt; were (and still are) some of the most active and exciting PC communities.&lt;/p&gt;
&lt;p&gt;I was very tempted to go with the &lt;a href=&quot;https://dan-cases.com/c4sfx.php&quot;&gt;Dan C4-SFX&lt;/a&gt; v1... well, at least I was &lt;a href=&quot;https://reddit.com/r/sffpc/comments/148koy2/c4sfx_v1_is_sold_out_v2_expected_in_early_2024/&quot;&gt;if I had a chance to get one&lt;/a&gt;.
The &lt;a href=&quot;https://fractal-design.com/products/cases/terra/&quot;&gt;Fractal Design Terra&lt;/a&gt; looked great too, but I was worried about thermal constraints. I could have went with an external radiator, like the &lt;a href=&quot;https://shop.watercool.de/MO-RA3-420-LT-black_1&quot;&gt;MO-RA3&lt;/a&gt;, I didn&apos;t want to.
The &lt;a href=&quot;https://ncased.com/collections/t1&quot;&gt;T1 v2&lt;/a&gt; was the frontrunner, but I eventually concluded that noise, thermals, radiator compatibility and big case features (e.g. removable fan and motherboard trays) were more important to me than I had realized.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;After months of research, including announcements from Computex 2023 and CES 2024, I decided to make a move.
At the start of 2024, I decided to appease my teenage self, and just go for a big case with maximum cooling.
Moreover, I wanted a case that I could keep for a long time and potentially build a &lt;a href=&quot;https://reddit.com/r/watercooling&quot;&gt;custom loop&lt;/a&gt; in.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Why didn&apos;t I build a custom loop then?
While budget custom loops were possible, I preferred to put some money aside for a proper loop in the future.
I also loved (and still love) the &lt;a href=&quot;https://youtube.com/watch?v=5tz4bYa3vkE&quot;&gt;Founder&apos;s Edition cooler&lt;/a&gt; design and did not want to put the GPU on a waterblock.
Present day CPU AIO coolers for CPUs and GPU air coolers are better than ever too.
That all being said, I probably will do try building a custom loop someday, but decided to punt for this build.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;With the overall direction in place, I began the case selection and fan configuration design process.&lt;/p&gt;
&lt;p&gt;First, I decided on the case.
Few mass production cases have the quality of the &lt;a href=&quot;https://lian-li.com/&quot;&gt;Lian Li&lt;/a&gt; O11 series.
Yes, the cases are common and many consider them to be long in the tooth.
However, as far as mass production ATX cases go, I cannot find another case that is nearly as flexible and well built as those in the O11 series.
Not only that, but Lian Li cases come with many helpful accessories and tools, such as screw separators and GPU anti-sag mounts.&lt;/p&gt;
&lt;p&gt;Second, I decided on the CPU cooler.
I wanted to maximize CPU performance and radiator space, so I did not look at air coolers and looked exclusively at 360mm and 420mm AIOs.
I decided to go with the &lt;a href=&quot;https://ekwb.com/shop/ek-nucleus-aio-cr360-dark&quot;&gt;EK-Nucleus AIO CR360 Dark&lt;/a&gt;.
It was a 360mm option, but I chose it because I had two 120mm &lt;a href=&quot;https://noctua.at/en/nf-a12x25-pwm-chromax-black-swap&quot;&gt;NF-A12x25 chromax.black.swap&lt;/a&gt; fans sitting around, they did not offer a 420mm model, and the AIO performed extremely well compared to existing 360mm and 420mm AIOs on the market.
I bought a matching fan, though I would have also considered &lt;a href=&quot;https://phanteks.com/PH-F120T30.html&quot;&gt;Phanteks T30&lt;/a&gt; fans if I did not already have the other ones.
It&apos;s hard to go wrong either way.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If I had known about the incoming &lt;a href=&quot;https://techpowerup.com/319303/arctic-releases-liquid-freezer-iii-aio-cpu-coolers&quot;&gt;420mm Arctic Liquid Freezer III&lt;/a&gt;, I would have waited for reviews and compared both AIOs.
Alas, such is the way of PC hardware industry: there&apos;s always something better on the way.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Third, I decided on the case fans and overall fan configuration.
&lt;a href=&quot;https://youtube.com/watch?v=SqozuPWzUII&quot;&gt;Christopher Flaningan&apos;s video&lt;/a&gt; was a great place to start and I decided to go with six 140mm intake fans and no rear exhaust fan.
Normally, I go with Noctua fans whenever I can, but I prefer the Arctic P14&apos;s noise profile over the Noctua NF-A14&apos;s noise profile.
They are also considerably less expensive than the NF-A14s and can be daisy-chained (i.e. they do not require a Y-splitter or fan hub).
That being said, I&apos;m looking forward to reviews of &lt;a href=&quot;https://youtube.com/watch?v=Cng_J4sBaNs&quot;&gt;Noctua&apos;s next generation 140mm fan&lt;/a&gt;.
Most of these points are minor, so if you go with Noctua or Arcitc, you are in good hands.&lt;/p&gt;
&lt;p&gt;I put it all together into a design diagram to double check...&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/2024/plan.webp&quot; alt=&quot;A diagram of the case and fan configuration design&quot;&gt;&lt;/p&gt;
&lt;p&gt;...and everything looked good!
Time to build.&lt;/p&gt;
&lt;p&gt;I went to Micro Center to pick up the O11D EVO XL with my fiancée and we could barely fit the box in the car.
Of course, the case wasn&apos;t as big as Lian Li&apos;s monstrous &lt;a href=&quot;https://lian-li.com/product/v3000-plus/&quot;&gt;V3000 Plus&lt;/a&gt;, but it still couldn&apos;t fit into the mouth of the trunk.
So... we strapped the case into the passenger seat and she sat in the back.
It would be an understatement to say that I was thankful for her that day.&lt;/p&gt;
&lt;p&gt;A few weeks went by, working on the build here and there as well as ordering fans, cables, etc. that I needed.
After some tests with different power supplies, performing all-core CPU benchmarks, performing GPU-based realtime Path Tracing benchmarks, laying the PC on its side to move air bubbles in the AIO and fixing a noisy rear exhaust FE fan (which had been fine in the previous case), the build went to its home on a wooden plank.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;One thing you might have noticed in the build picture is that I stuck with the included PSU cables from SeaSonic&apos;s &lt;a href=&quot;https://seasonic.com/vertex-gx&quot;&gt;Vertex GX-1000&lt;/a&gt; power supply.
While I knew I would have been fine using aftermarket cables, the &lt;a href=&quot;https://youtube.com/watch?v=EIKjZ1djp8c&quot;&gt;12VHPWR connector drama&lt;/a&gt; and &lt;a href=&quot;https://cablemod.com/adapterrecall/&quot;&gt;revisions to popular adapters&lt;/a&gt; made me hesitate.
It helped that I liked the cables provided too, so I didn&apos;t replace what wasn&apos;t broken.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I could not be happier with the result.
Since July 2022, I had been slowing chipping away at this build.
Sure, it only started in full in November 2022 and was &amp;quot;feature complete&amp;quot; in May 2023, but PC builds are a bit of an artform to me.
You mostly buy pre-existing parts, but there are subtleties in how it looks to you and feels to use that make it &amp;quot;yours&amp;quot; in the end.&lt;/p&gt;
&lt;p&gt;It&apos;s safe to say that my desktop upgrade is done.
Now and forever.
Well... at least until AMD Zen 5, Nvidia RTX 50 series, Intel Arrow Lake, Intel Battlemage, and AMD Radeon RDNA 4 release later this year.&lt;/p&gt;
</content:encoded><category>Hardware</category><category>Personal Rig</category></item><item><title>Path Tracing, Ray Reconstruction and Super Resolution Bring on the Future</title><link>https://nickgerace.dev/posts/path-tracing-ray-reconstruction-super-resolution-bring-on-the-future/</link><guid isPermaLink="true">https://nickgerace.dev/posts/path-tracing-ray-reconstruction-super-resolution-bring-on-the-future/</guid><pubDate>Tue, 02 Jan 2024 00:00:01 GMT</pubDate><content:encoded>&lt;p&gt;Today, we talk about the incredible work the teams at &lt;a href=&quot;https://cdprojektred.com&quot;&gt;CD Projekt Red&lt;/a&gt; and &lt;a href=&quot;https://nvidia.com&quot;&gt;Nvidia&lt;/a&gt; have done to give us a glimpse of the future of 3D graphics.&lt;/p&gt;
&lt;p&gt;In September 2023, CD Projekt Red released their sole expansion for their 2020 game, &lt;a href=&quot;https://www.cyberpunk.net/&quot;&gt;Cyberpunk 2077&lt;/a&gt;.
The expansion, &amp;quot;Phantom Liberty&amp;quot;, takes the player to a new area of Night City (the game&apos;s fictional city placed between San Francisco and Los Angeles).&lt;/p&gt;
&lt;p&gt;While the expansion was excellent in its own right, &lt;a href=&quot;https://cyberpunk.net/en/news/49060/update-2-0&quot;&gt;Update 2.0&lt;/a&gt; stood center stage, side by side with it.
The free update not only contained a massive rework of in-game systems, but it also contained Nvidia&apos;s new &amp;quot;Ray Reconstruction&amp;quot; technology, which &amp;quot;recognizes lighting patterns from training data, such as that of global illumination or ambient occlusion, and recreates it in-game as you play&amp;quot;[^1].
In short, Ray Reconstruction is a feature within the &lt;a href=&quot;https://nvidia.com/en-us/geforce/technologies/dlss/&quot;&gt;DLSS&lt;/a&gt; software suite that uses AI-powered &amp;quot;denoisers&amp;quot; and lighting technology to render more accurate ray-traced rays and diffuse lighting.&lt;/p&gt;
&lt;p&gt;The introduction of Ray Reconstruction comes off the heels of the &lt;a href=&quot;https://www.nvidia.com/en-us/geforce/news/cyberpunk-2077-ray-tracing-overdrive-update-launches-april-11/&quot;&gt;&amp;quot;Path Tracing&amp;quot; update for Cyberpunk 2077&lt;/a&gt; in April.
&lt;a href=&quot;https://blogs.nvidia.com/blog/what-is-path-tracing/&quot;&gt;Path Tracing&lt;/a&gt;, or &amp;quot;Full Ray Tracing&amp;quot;, takes single bounce (i.e. light &amp;quot;bouncing&amp;quot; off an object in a 3D rendered scene) ray tracing techniques to the next level by rendering ray-traced rays with &lt;em&gt;multiple&lt;/em&gt; bounces.
Its name is derived from &amp;quot;the rendering equation solved along the path of a ray&amp;quot;[^2].
In other words, the game&apos;s ray tracing implementation a step further by &amp;quot;accurately represent(ing) the way light scatters throughout a scene&amp;quot;[^2].&lt;/p&gt;
&lt;p&gt;Combine these two features with the honed &lt;a href=&quot;https://nvidia.com/en-us/geforce/technologies/dlss/&quot;&gt;DLSS Super Resolution&lt;/a&gt; feature, which performs AI-powered upscaling and anti-aliasing for better performance (and sometimes better presentation with &amp;quot;&lt;a href=&quot;https://en.wikipedia.org/wiki/Deep_learning_anti-aliasing&quot;&gt;DLAA&lt;/a&gt;&amp;quot; and &amp;quot;Quality&amp;quot; settings at higher resolutions), and Cyberpunk 2077 became one of the most impressive technology showcases of 2023.&lt;/p&gt;
&lt;p&gt;I was so impressed with the art and technology that I took &lt;em&gt;many&lt;/em&gt; screenshots with the in-game photo mode.
After sifting through them for a long time, I&apos;ve selected my favorite twenty screenshots.
All screenshots were captured between 25 September 2023 and 15 October 2023.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you couldn&apos;t tell, I&apos;m a little late to publishing this blog post.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;These screenshots were taken from the &lt;a href=&quot;https://cyberpunk.net/en/news/49060/update-2-0&quot;&gt;2.0&lt;/a&gt; and &lt;a href=&quot;https://cyberpunk.net/en/news/49231/patch-2-01&quot;&gt;2.01&lt;/a&gt; versions of the game, and take place throughout the main game and the new expansion.&lt;/p&gt;
&lt;p&gt;All screenshots are &amp;quot;4K&amp;quot; (3840x2160p) images that were originally uncompressed PNG files.
They have been converted to slightly lossy WebP images for size reduction.
The game was running in &lt;a href=&quot;wiki/High-dynamic-range_television&quot;&gt;HDR10 PQ&lt;/a&gt;, but images taken with the in-game photo mode are (I believe?) tone mapped to &lt;a href=&quot;https://www.rtings.com/tv/learn/hdr-vs-sdr&quot;&gt;SDR&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The game&apos;s settings were maxed out with Path Tracing, or &amp;quot;Full Ray Tracing&amp;quot;, enabled.
Ray Reconstruction and Super Resolution were also enabled.
I believe Super Resolution was set to &amp;quot;Auto&amp;quot; during the playthough, so I suspect the screenshots were taken at &amp;quot;DLAA&amp;quot; (no upscaling, solely AI-powered anti-aliasing) or &amp;quot;Quality&amp;quot; (highest quality upscaling) levels.&lt;/p&gt;
&lt;p&gt;I&apos;ll stop talking and let the screenshots speak for themselves.
To say that I was impressed with the teams at CD Projekt Red and Nvidia would have been an understatement.
If this is a sign of what is to come, bring it on!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/2023/cyberpunk2077-phantomliberty-1.webp&quot; alt=&quot;Phantom Liberty screenshot 1 of 20&quot;&gt;
&lt;img src=&quot;/img/2023/cyberpunk2077-phantomliberty-2.webp&quot; alt=&quot;Phantom Liberty screenshot 2 of 20&quot;&gt;
&lt;img src=&quot;/img/2023/cyberpunk2077-phantomliberty-3.webp&quot; alt=&quot;Phantom Liberty screenshot 3 of 20&quot;&gt;
&lt;img src=&quot;/img/2023/cyberpunk2077-phantomliberty-4.webp&quot; alt=&quot;Phantom Liberty screenshot 4 of 20&quot;&gt;
&lt;img src=&quot;/img/2023/cyberpunk2077-phantomliberty-5.webp&quot; alt=&quot;Phantom Liberty screenshot 5 of 20&quot;&gt;
&lt;img src=&quot;/img/2023/cyberpunk2077-phantomliberty-6.webp&quot; alt=&quot;Phantom Liberty screenshot 6 of 20&quot;&gt;
&lt;img src=&quot;/img/2023/cyberpunk2077-phantomliberty-7.webp&quot; alt=&quot;Phantom Liberty screenshot 7 of 20&quot;&gt;
&lt;img src=&quot;/img/2023/cyberpunk2077-phantomliberty-8.webp&quot; alt=&quot;Phantom Liberty screenshot 8 of 20&quot;&gt;
&lt;img src=&quot;/img/2023/cyberpunk2077-phantomliberty-9.webp&quot; alt=&quot;Phantom Liberty screenshot 9 of 20&quot;&gt;
&lt;img src=&quot;/img/2023/cyberpunk2077-phantomliberty-10.webp&quot; alt=&quot;Phantom Liberty screenshot 10 of 20&quot;&gt;
&lt;img src=&quot;/img/2023/cyberpunk2077-phantomliberty-11.webp&quot; alt=&quot;Phantom Liberty screenshot 11 of 20&quot;&gt;
&lt;img src=&quot;/img/2023/cyberpunk2077-phantomliberty-12.webp&quot; alt=&quot;Phantom Liberty screenshot 12 of 20&quot;&gt;
&lt;img src=&quot;/img/2023/cyberpunk2077-phantomliberty-13.webp&quot; alt=&quot;Phantom Liberty screenshot 13 of 20&quot;&gt;
&lt;img src=&quot;/img/2023/cyberpunk2077-phantomliberty-14.webp&quot; alt=&quot;Phantom Liberty screenshot 14 of 20&quot;&gt;
&lt;img src=&quot;/img/2023/cyberpunk2077-phantomliberty-15.webp&quot; alt=&quot;Phantom Liberty screenshot 15 of 20&quot;&gt;
&lt;img src=&quot;/img/2023/cyberpunk2077-phantomliberty-16.webp&quot; alt=&quot;Phantom Liberty screenshot 16 of 20&quot;&gt;
&lt;img src=&quot;/img/2023/cyberpunk2077-phantomliberty-17.webp&quot; alt=&quot;Phantom Liberty screenshot 17 of 20&quot;&gt;
&lt;img src=&quot;/img/2023/cyberpunk2077-phantomliberty-18.webp&quot; alt=&quot;Phantom Liberty screenshot 18 of 20&quot;&gt;
&lt;img src=&quot;/img/2023/cyberpunk2077-phantomliberty-19.webp&quot; alt=&quot;Phantom Liberty screenshot 19 of 20&quot;&gt;
&lt;img src=&quot;/img/2023/cyberpunk2077-phantomliberty-20.webp&quot; alt=&quot;Phantom Liberty screenshot 20 of 20&quot;&gt;&lt;/p&gt;
&lt;p&gt;[^1]: &lt;a href=&quot;https://nvidia.com/en-us/geforce/news/nvidia-dlss-3-5-ray-reconstruction&quot;&gt;NVIDIA DLSS 3.5: Enhancing Ray Tracing With AI; Coming This Fall To Alan Wake 2, Cyberpunk 2077: Phantom Liberty, Portal with RTX &amp;amp; More&lt;/a&gt;
[^2]: &lt;a href=&quot;https://blogs.nvidia.com/blog/what-is-path-tracing/&quot;&gt;What Is Path Tracing?&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Hardware</category></item><item><title>Creativity</title><link>https://nickgerace.dev/posts/creativity/</link><guid isPermaLink="true">https://nickgerace.dev/posts/creativity/</guid><pubDate>Tue, 02 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&amp;quot;Creativity is a fundamental aspect of being human.
It&apos;s our birthright.
And it&apos;s for all of us&amp;quot;&lt;/p&gt;
&lt;p&gt;-- Rick Rubin, &lt;a href=&quot;https://penguinrandomhouse.com/books/717356/the-creative-act-by-rick-rubin/&quot;&gt;The Creative Act: A Way of Being&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If my university had an audio engineering degree, you probably wouldn&apos;t be reading this blog post.
In college, I was a DJ, audio engineer, amateur producer, and a (not good) mixing engineer.
I spent a lot of time doing all those things and did so with some grounding to reality.&lt;/p&gt;
&lt;p&gt;&amp;quot;Can I make a career out of this?&amp;quot;
Surprisingly, the answer was &amp;quot;yes&amp;quot;, but it would have required a near-erasure of the line between freeform creativity and required output.
In other words, I might have killed my musical hobbies and passions in the process.
In fact, I almost did.&lt;/p&gt;
&lt;p&gt;In my beginning years of DJing, I practiced a ton.
I was pretty busy in high school, but as the years went on, I began taking more and more time to practice.
Like something from out of a movie, in my third year heading into my fourth year in particular, I&apos;d run to my bedroom, take my laptop out of my backpack, throw down the backpack, connect the laptop to the budget, magazine controller and get to work.
Well... &amp;quot;get to work&amp;quot; meant &amp;quot;flailing and seeing if something sticks&amp;quot;.&lt;/p&gt;
&lt;p&gt;There was something very pure with those moments.
Something I believe I lost in 2023... or, at least thought I did.
We&apos;ll get back to that later.&lt;/p&gt;
&lt;p&gt;Fast forward to the end of my time DJing: I was getting gigs left and right, but my studies in computer science were ramping up.
Not only that, but I led a team that founded the university&apos;s first ever hackathon series.
Something had to change.
I chose to wind down my practice and preparation for DJing gigs.
Although, I&apos;m not sure what happened first: the gigs beginning to feel more like routine work than fun spontaneity or dwindling amounts of practice and preparation causing the sets to feel stale.
Combine both with weeknight gigs that end at 2am and... you can guess what eventually came to pass.&lt;/p&gt;
&lt;p&gt;I performed my last gig in May of my third year in university.
It felt good to end on a high note as I had multiple back-to-back gigs to celebrate the occasion.
Many of my early clients and partners reached out to either work with me one last time or to share kind thoughts on the years working together.
All in all, it was a packed calendar of gigs to the end the semester.&lt;/p&gt;
&lt;p&gt;I thank my past self often for stopping at this point rather than destroying a passion for music and making creative efforts feel like chores.
In fact, that decision is more relevant than ever before.&lt;/p&gt;
&lt;p&gt;2023 was a great, but confusing, year for me.
From a career perspective, it was the first year where I felt that I was exactly where I wanted and needed to be.
Well, that&apos;s not entirely true as I joined &lt;a href=&quot;https://systeminit.com&quot;&gt;System Initiative&lt;/a&gt; (SI) in December 2021 and have felt that way since joining.
However, I believe it took time for me to realize what was happening to my creative energy.&lt;/p&gt;
&lt;p&gt;I usually have side project ideas, blog post drafts, and little creative works going on.
In 2023, those things took much more of a side seat than I was expecting.
While I do believe the decline of Twitter/X negatively impacted my creative energy for infrastructure software, I do not believe it was the primary contributing factor.
I was living life, being more social than ever before, and worked hard in my favorite job yet.
What was the problem? That sounds good, right?&lt;/p&gt;
&lt;p&gt;The problem was that my creativity was more difficult to &lt;em&gt;trace&lt;/em&gt; than ever before.
Originally, I had thought my ability to be creative had waned.
I was wrong and SI&apos;s co-founder, &lt;a href=&quot;https://x.com/adamhjk&quot;&gt;Adam&lt;/a&gt;, showed me why.&lt;/p&gt;
&lt;p&gt;Where I had thought my creative energy had been sapped, it had merely been diverted.
Rick Rubin&apos;s &lt;a href=&quot;https://penguinrandomhouse.com/books/717356/the-creative-act-by-rick-rubin/&quot;&gt;The Creative Act: A Way of Being&lt;/a&gt; was central to our discussion in uncovering this.
If you are human, you are automatically an artist.
Simply put, deep down, the art I wanted to create in 2023 was System Initiative.
That&apos;s where my primary, creative energy went.&lt;/p&gt;
&lt;p&gt;I&apos;ve had little to blog about in the industry because I believe in what we are doing more than anything else.
I&apos;ve had little desire to create side projects for the same reason.
I&apos;ve been laser focused on co-designing and co-authoring a new engine for SI since July 2023 too.
Finally, in the background, I had my busiest year outside of work yet, so I did not fully process how (and if) I was tapping into my creative spirit.&lt;/p&gt;
&lt;p&gt;To be clear, none of that is bad.
In fact, it&apos;s all great!
That&apos;s the point.
The company had an incredible year, which included exiting stealth, nurturing a growing community on &lt;a href=&quot;https://discord.com/invite/system-init&quot;&gt;our Discord server&lt;/a&gt;, and &lt;a href=&quot;https://github.com/systeminit/si&quot;&gt;open sourcing&lt;/a&gt; the System Initiative software.
Again, what&apos;s the problem?&lt;/p&gt;
&lt;p&gt;Well, again, the problem was that my creativity was more difficult to &lt;em&gt;trace&lt;/em&gt; than ever before.
It took me reflecting on my years DJing to realize this, but my creative energy became exclusively tied to professional endeavors.&lt;/p&gt;
&lt;p&gt;Again, that&apos;s not a bad thing, especially since I joined as the fifth person at System Initiative!
In a startup, you need passion and creativity to be ever present.
I reflected on where my creativity naturally flew, and it made complete sense: my creative energy naturally flew into SI.&lt;/p&gt;
&lt;p&gt;What now then?
Well, the primary art I want to create in 2024 is the same as 2023: System Initiative.
However, I&apos;d like to do things a little differently.
I have a desire to reconnect with my creative side outside of SI.
Ironically, if you&apos;re reading this around the time of publishing, you likely only know about this blog &lt;em&gt;because&lt;/em&gt; of my creative output in the past.
This post is a long way of saying that I&apos;d like to create more art... or &amp;quot;art&amp;quot;, depending on your interpretation.&lt;/p&gt;
&lt;p&gt;I&apos;m unsure what I&apos;m going to do exactly.
With DJing, I naturally let my creative energy take me places.
Did I know I wanted to become a DJ?
I mean, maybe, but I only really know once I was... well... DJing.
Adam put it to me best: &amp;quot;how did you become a DJ? Well, you DJed! Now you&apos;re a DJ.&amp;quot;.
Learn something.
Write something.
Build something.
All creative endeavors are like this.&lt;/p&gt;
&lt;p&gt;That being said, I have a good idea on where to start.
I wrote a new blog post alongside this one: &lt;a href=&quot;/posts/path-tracing-ray-reconstruction-super-resolution-showcases-the-future&quot;&gt;&amp;quot;Path Tracing, Ray Reconstruction and Super Resolution Bring on the Future&amp;quot;&lt;/a&gt;.
I used to hold back on posts like this because they didn&apos;t stick with the core themes of the blog, which hover around infrastructure software and software development.
To some extent, that&apos;s not the worst stance to take.
When content creators on YouTube create diverging content and user metrics indicate that something has to give, they may create a second channel.
However, I&apos;m passionate about PC and workstation hardware.
I feel naturally flowing, creative energy going towards it, so why not create some art... or &amp;quot;art&amp;quot;?&lt;/p&gt;
&lt;p&gt;For 2024, I&apos;m going to remembering the teenager rushing into the bedroom to learn how to DJ, flailing and all.
Learn something.
Write something.
Build something.
Even if the art I solely work on this year is System Initiative, I&apos;ll do so having been re-attuned to my creative spirit.
Here&apos;s to creativity in 2024!&lt;/p&gt;
</content:encoded></item><item><title>System Initiative: The Second Wave of DevOps</title><link>https://nickgerace.dev/posts/system-initiative-the-second-wave-of-devops/</link><guid isPermaLink="true">https://nickgerace.dev/posts/system-initiative-the-second-wave-of-devops/</guid><pubDate>Wed, 21 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;It&apos;s finally time to talk about System Initiative.
Since early December 2021, I&apos;ve had the privilege and honor of working alongside one of the best software teams on the planet to handcraft foundational technology for ushering in the second wave of DevOps.&lt;/p&gt;
&lt;p&gt;Today, we are talking about System Initiative publicly for the first time, and in the coming months, we will be open sourcing the System Initiative software.
Let&apos;s get into it.&lt;/p&gt;
&lt;h2&gt;Stuck in the Mud&lt;/h2&gt;
&lt;p&gt;What we&apos;ve built has not only been an endeavor of passion for all of us at System Initiative, but, for me, it&apos;s the direct answer to everything that I&apos;ve seen in my career thus far.&lt;/p&gt;
&lt;p&gt;Before I had written my first line of non-trivial code in university, I was introduced to the world of software via Linux.
Tinkering with desktop computer hardware and tweaking desktop environments in Linux VMs in my teenage years set the stage for what was to come.
Everything from my first stint in academic research working with Docker containers to writing infrastructure software for Kubernetes in my prior professional endeavors has led to this.&lt;/p&gt;
&lt;p&gt;Yet, despite repeated successes witnessed both firsthand and within the industry, the excellent tools we had individually built never met their aspirations in the aggregate.
Customers, hobbyists, academics, and developers loved what had been built in vacuums, but rarely carried over those sentiments when the pieces interlocked.
The interlocking and frustrations have only increased since I entered the industry.
From my first boot of a Linux VM to now, I&apos;ve been embroiled in the first wave of DevOps.&lt;/p&gt;
&lt;p&gt;In the fall of 2021, &lt;a href=&quot;https://twitter.com/adamhjk&quot;&gt;Adam&lt;/a&gt; and I discussed what I wanted to do next in my career.
We talked about everything, including becoming a founder, woes in the DevOps space, and, of course, System Initiative.
When Adam showed me a prototype of System Initiative, everything halted and our conversations converged on it.
It was exactly what our industry needed then and what our industry needs now, more than ever.
Even if I was hellbent on becoming a founder then, I knew that I would &lt;em&gt;need&lt;/em&gt; to build the same thing.
Thus, I joined in December 2021 as the fifth person in the company and have not looked back.&lt;/p&gt;
&lt;h2&gt;Tip of The Spear&lt;/h2&gt;
&lt;p&gt;Enter System Initiative.
It&apos;s a real-time, multiplayer, multi-modal reinvention of DevOps tooling.
It&apos;s a power tool that re-imagines the user experience by delivering a near real-time, visual modeling system that uses digital twins to give users the power and control they need.&lt;/p&gt;
&lt;p&gt;You can collaborate with colleagues across the world at the same time and with immediate feedback.
Every change is validated and qualified immediately, so you can ensure your configuration is viable.
You can reconcile individually or in batches and decide what you want to do with your model.
Collaboration for software-defined infrastructure is back.&lt;/p&gt;
&lt;p&gt;Speaking of reconciliation choices, the days of &amp;quot;declarative-only&amp;quot; infrastructure are over.
No more individual infrastructure as code files sprawling into several repositories.
System Initiative provides bi-directional reconciliation of the simulation with the real system to give you the choices you need to manage your infrastructure.&lt;/p&gt;
&lt;p&gt;It&apos;s not oversimplified either.
Configuration can be inferred through the relationships between models.
Changing a value at the source cascades throughout all the dependent models, making complex configurations easy to express.
The system will automatically generate code as needed.
System Initiative is explicitly a power tool that removes papercuts experienced throughout the first wave of DevOps.
You can leverage the intelligence system to tackle your most complex infrastructure stacks.&lt;/p&gt;
&lt;p&gt;The best part?
It&apos;s all customizable.
You can publish modules to our open source module index to enable other users to use full-fidelity models in their systems.
You can create your own functions and edit existing ones.
You can change how code is generated.
You&apos;re liberated to craft the infrastructure you need.&lt;/p&gt;
&lt;p&gt;We&apos;re only scratching the surface of what System Initiative can do, and I can&apos;t wait for you to try it.
Before that, let&apos;s talk about what&apos;s under the hood.&lt;/p&gt;
&lt;h2&gt;Under the Hood&lt;/h2&gt;
&lt;p&gt;System Initiative isn&apos;t an addition to an existing stack or platform, it&apos;s a bespoke design powered by breaking the rules and learning from DevOps builders.
It&apos;s powered by Rust, TypeScript, &lt;a href=&quot;https://vuejs.org/&quot;&gt;Vue 3&lt;/a&gt;, &lt;a href=&quot;https://www.postgresql.org/&quot;&gt;PostgreSQL&lt;/a&gt; and many other state-of-the-art technologies that you&apos;ll be able to get your hands on soon.&lt;/p&gt;
&lt;p&gt;The majority of the System Initiative software is powered by Rust.
We make extensive use of the &lt;a href=&quot;https://tokio.rs/&quot;&gt;tokio&lt;/a&gt; ecosystem, communicate over &lt;a href=&quot;https://nats.io/&quot;&gt;NATS&lt;/a&gt; and heavily use PostgreSQL for a robust backend stack.
Vue 3 and TypeScript lead the way for the user interface, which is snappy and responsive to your monitor&apos;s native refresh rate.
The software is built with &lt;a href=&quot;https://github.com/facebook/buck2&quot;&gt;Buck2&lt;/a&gt;, a cutting-edge build system, with our own, custom prelude.&lt;/p&gt;
&lt;p&gt;Our developers use the best tools for the job and measuring &amp;quot;best&amp;quot; does not just include implementation details, but also maintainability and joy.
That philosophy is baked into System Initiative.
It&apos;s not only a joy to develop, it&apos;s a joy to use!&lt;/p&gt;
&lt;p&gt;Not only will you be able to try out the System Initiative software soon, but you can join us in getting there now.&lt;/p&gt;
&lt;h2&gt;What&apos;s Next?&lt;/h2&gt;
&lt;p&gt;The System Initiative software will be &lt;a href=&quot;https://systeminit.com/news&quot;&gt;open sourced&lt;/a&gt; in the coming months.
Between now and then, we&apos;ll give you peeks into what we are up to and the road there.
More importantly, you&apos;ll be able to join us on this journey in a few places:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In &lt;a href=&quot;https://discord.com/invite/system-init&quot;&gt;our Discord server&lt;/a&gt;, the community for all DevOps builders ready for the second wave. We&apos;ll be providing weekly updates, gathering feedback, giving you all sneak peeks on what&apos;s to come and just plain ole hanging out!&lt;/li&gt;
&lt;li&gt;On &lt;a href=&quot;https://systeminit.com&quot;&gt;systeminit.com&lt;/a&gt; as there will be press release(s), podcasts, articles and many other forms of content to let you know what we are up to. We&apos;re going in guns blazing.&lt;/li&gt;
&lt;li&gt;On social media, where &lt;a href=&quot;https://twitter.com/adamhjk&quot;&gt;Adam&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/nickgeracehacks&quot;&gt;myself&lt;/a&gt;, the &lt;a href=&quot;https://twitter.com/thesysteminit&quot;&gt;company&lt;/a&gt; and the team will be talking to about System Initiative with open arms.&lt;/li&gt;
&lt;li&gt;On YouTube, by watching and sharing the &lt;a href=&quot;https://www.youtube.com/watch?v=zyEOYl23pd8&quot;&gt;demo on YouTube&lt;/a&gt; and catch the first ever, public look at System Initiative. Be sure to subscribe as more videos are coming!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Welcome to the second wave of DevOps.
I can&apos;t wait for you all to take a look at and try out the System Initiative software soon.
See you in the &lt;a href=&quot;https://discord.com/invite/system-init&quot;&gt;Discord server&lt;/a&gt;!&lt;/p&gt;
</content:encoded><category>System Initiative</category></item><item><title>Converting Rust Cloud Native</title><link>https://nickgerace.dev/posts/converting-rust-cloud-native/</link><guid isPermaLink="true">https://nickgerace.dev/posts/converting-rust-cloud-native/</guid><pubDate>Mon, 25 Jul 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Nearly one year ago, a flagpole was planted to &lt;a href=&quot;/posts/launching-rust-cloud-native&quot;&gt;launch Rust Cloud Native&lt;/a&gt;.
We have had great successes since then, including great meetups, great conversations, folks working on and sharing differing projects, and more.&lt;/p&gt;
&lt;p&gt;However, after speaking with other folks in the organization, we have decided to convert Rust Cloud Native to &lt;a href=&quot;https://github.com/awesome-rust-cloud-native&quot;&gt;Awesome Rust Cloud Native&lt;/a&gt;.
Since Rust Cloud Native never had any formal communications platforms, I sent a message to the primary channel of the Discord server this morning and we plan on updating the core repository&apos;s README as soon as possible.
Here are the contents of that message (slightly modified in order to make more sense outside of Discord):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hi friends @here!&lt;/p&gt;
&lt;p&gt;First and foremost, I want to thank you all for being here and hanging out with the meetups we’ve had, the conversations we’ve had, and everything we’ve done together.
You are all delights!&lt;/p&gt;
&lt;p&gt;The maintainers and I spoke this morning and decided that Rust Cloud Native should not live on as a structured organization at this time.
I’ll explain the “what’s happening” before the “why” so folks know.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This server will close sometime on Wednesday, July 28th
&lt;ul&gt;
&lt;li&gt;Given some feedback, this may be subject to change or there may be plans to have a more conversational/casual server in its place (regardless, it is recommended to prepare for server closure)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The GitHub org will be renamed from “Rust Cloud Native” to “Awesome Rust Cloud Native”&lt;/li&gt;
&lt;li&gt;The core repository will be converted to “awesome” list: https://github.com/sindresorhus/awesome
&lt;ul&gt;
&lt;li&gt;It may also convert from a GitHub Page to just a README, but that one is still in flux (regardless, we will update the README there with more details)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Short version: Rust Cloud Native will be scaled back to solely maintain the “awesome” page that we already mostly have going.
Now, this doesn’t mean that things like “beginner resources” and such cannot be added later.
However, it does mean that the core repository will be refactored to scale it down for now.&lt;/p&gt;
&lt;p&gt;Since this org does not have a blog or Twitter account, I presume we will let folks who have starred the repository know by adding a message at the top of the README and/or website for now.&lt;/p&gt;
&lt;p&gt;Now, onto the reasoning: running a structured organization requires time and willingness.
I will speak for myself here: I created the organization in a very different world for me personally, and after no longer working on cloud native software and experiencing burnout in 2021, I reeled back many non-essential things to deal with things in my personal life.
While it was originally started as a &amp;quot;let&apos;s plant a flag pole and get folks to gather&amp;quot; effort, it is evident that it required more curation than I had the volunteer time to give it.
I cannot speak for others, and I appreciate your respect to their privacy.&lt;/p&gt;
&lt;p&gt;We would hand off the organization to willing parties, but truthfully, there is not much of an organization to hand off.
On GitHub, the organization has really only existed to main the core website, which is already like an “awesome” list.
At this time, we are interested keeping what we have: the core repository.&lt;/p&gt;
&lt;p&gt;Thus, we will be freeing the “Rust Cloud Native” name up for folks who will want to use it.
Fortunately, given the successes of kube-rs, youki, krustlet, krunvm and many more projects, as fans of the languages, we think things will be just fine.&lt;/p&gt;
&lt;p&gt;I want to apologize that this did not work out as intended.
There were definitely successful moments, including the core repository itself, our nice conversation and meetups when they did happen, and a recognition of interest in Cloud Native Rust overall.
Thank you for helping us to try to make this work.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Thank you all for reading this post as well.
The future of Rust in the Cloud Native space is brighter than ever before, and I am excited to see it continue to shine 🦀.&lt;/p&gt;
</content:encoded></item><item><title>Announcing gfold 4</title><link>https://nickgerace.dev/posts/announcing-gfold4/</link><guid isPermaLink="true">https://nickgerace.dev/posts/announcing-gfold4/</guid><pubDate>Tue, 10 May 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Today marks the release of &lt;strong&gt;&lt;a href=&quot;https://github.com/nickgerace/gfold&quot;&gt;gfold 4&lt;/a&gt;&lt;/strong&gt; 🎉!&lt;/p&gt;
&lt;p&gt;Before we talk about what&apos;s been changed, let&apos;s talk about how far the project has come.
Here are some present day statistics of note:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;📦 &lt;a href=&quot;https://crates.io/crates/gfold&quot;&gt;~2,650 downloads from crates.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;📚 &lt;a href=&quot;https://lib.rs/command-line-utilities&quot;&gt;rank #7 on lib.rs for command-line-utilities&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;⭐️ &lt;a href=&quot;https://github.com/nickgerace/gfold&quot;&gt;137 stars on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As some of you might recognize, these metrics are the same as those introduced in the &lt;strong&gt;&lt;a href=&quot;/posts/announcing-gfold3&quot;&gt;gfold 3 announcement&lt;/a&gt;&lt;/strong&gt;.
Here are the statistics from that post:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;📦 &lt;a href=&quot;https://crates.io/crates/gfold&quot;&gt;~1,600 downloads from crates.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;📚 &lt;a href=&quot;https://lib.rs/command-line-utilities&quot;&gt;rank #21 on lib.rs for command-line-utilities&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;⭐️ &lt;a href=&quot;https://github.com/nickgerace/gfold&quot;&gt;90 stars on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Those are big leaps!
I&apos;m excited for all new and existing users to try out &lt;strong&gt;gfold 4&lt;/strong&gt;, which I think is the best release yet.&lt;/p&gt;
&lt;p&gt;There&apos;s two technical reasons that fuel a significant portion of my excitement.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I hope this release will contain the last major &lt;a href=&quot;https://semver.org/&quot;&gt;semver&lt;/a&gt; bump that will be needed for a long time (i.e. no more user-facing breaking changes for a long time).
It&apos;s a polishing iteration on the &lt;a href=&quot;https://en.wikipedia.org/wiki/Domain-driven_design&quot;&gt;domain-driven&lt;/a&gt; refactor of &lt;strong&gt;gfold 3&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;There will likely be significant performance improvements for most users.
In recent tests mimicking real world use, I&apos;ve seen up to &lt;em&gt;5.1x&lt;/em&gt; speed increases when loosely benchmarking the most recent release candidate on macOS 12.3.1.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;Average: 686.645865ms - /Users/nick - 4.0.0-rc.4
Average: 810.047984ms - /Users/nick - 3.0.0
Average: 6.156336ms - /Users/nick/src - 4.0.0-rc.4
Average: 31.491704ms - /Users/nick/src - 3.0.0
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;Please note: I use the term &amp;quot;loose benchmarking&amp;quot; to mean measuring average runtime duration with realistically-shaped dummy data and execution scenarios reflecting real world use.
The latter translates to direct invocations of the &lt;strong&gt;gfold&lt;/strong&gt; binary on mobile hardware.&lt;/p&gt;
&lt;p&gt;True benchmarking is difficult, especially when using consumer-grade mobile processors that can produce highly variable results based on temperature and battery.
However, &lt;strong&gt;gfold&lt;/strong&gt; users will likely be using consumer-grade mobile hardware (i.e. laptops) on battery power, so I&apos;ve been mostly happy with &amp;quot;loosely&amp;quot; benchmarking real world usage scenarios on similar hardware.&lt;/p&gt;
&lt;p&gt;TLDR: these benchmarks aren&apos;t precise, but they have been useful in making changes that can help result in perceptible performance enhancements for most &lt;strong&gt;gfold&lt;/strong&gt; users.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If &lt;strong&gt;gfold 3&lt;/strong&gt; was the domain-driven refactor that helped revitalize the project, &lt;strong&gt;gfold 4&lt;/strong&gt; is the follow-up that takes lessons learned from the initial design and makes breaking changes based on them whilst retaining the skeleton of the previous release.
In fact, &lt;strong&gt;gfold 4&lt;/strong&gt; was originally slated to release as &lt;strong&gt;gfold 3.1&lt;/strong&gt; due to its core execution loop remaining the same, but I am generally not a fan of deviating from semver rules and since there were user-breaking changes, I bumped the major semver field.&lt;/p&gt;
&lt;p&gt;So... what are these major breaking changes that prompted the major semver field bump?
Let&apos;s go over them.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/rust-lang/git2-rs&quot;&gt;git2-rs&lt;/a&gt; returns and has replaced calling &lt;code&gt;git&lt;/code&gt; subcommands
&lt;ul&gt;
&lt;li&gt;In previous versions of &lt;strong&gt;gfold&lt;/strong&gt;, &lt;code&gt;git&lt;/code&gt; subcommands replaced git2-rs in order to decrease binary size and allow for customization (i.e. &amp;quot;bring your own &lt;code&gt;git&lt;/code&gt;&amp;quot;)&lt;/li&gt;
&lt;li&gt;Since &amp;quot;speed&amp;quot; was a key driver of &lt;strong&gt;gfold 4&lt;/strong&gt;&apos;s design, substantial speed increases could not have been achieved without git2-rs, even if that meant increasing binary size&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;--git-path&lt;/code&gt; flag has been removed since &lt;code&gt;git&lt;/code&gt; subcommands are no longer used&lt;/li&gt;
&lt;li&gt;Config file type has changed from JSON to TOML
&lt;ul&gt;
&lt;li&gt;JSON is difficult for users to write and edit and since &lt;strong&gt;gfold&lt;/strong&gt; configuration options are pretty &amp;quot;flat&amp;quot;&lt;/li&gt;
&lt;li&gt;TOML felt best for the task&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Config file location has been moved from &lt;code&gt;&amp;lt;prefix&amp;gt;/.config/gfold/gfold.json&lt;/code&gt; to &lt;code&gt;&amp;lt;prefix&amp;gt;/.config/gfold.toml&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;The nested directory structure is unnecessary&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;-d/--debug&lt;/code&gt; flag has been removed in favor of using &lt;code&gt;RUST_LOG&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;This allows for more customization and removes unnecessary code (i.e. the flag set &lt;code&gt;RUST_LOG=debug&lt;/code&gt; anyway, which &lt;a href=&quot;https://crates.io/crates/env_logger&quot;&gt;env_logger&lt;/a&gt; can handle)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Remove &lt;code&gt;-c/--classic&lt;/code&gt; flag in favor of &lt;code&gt;-d/--display&lt;/code&gt; flag&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Despite these big changes, &lt;strong&gt;gfold&lt;/strong&gt; still follows the same execution pattern as before: no subcommands and operates on the current working directory (or config file setting) if a positional argument is not provided.
Migrating exciting scripts, config files, aliases, etc. should be relatively painless since user-facing changes were limited to configuration and not to execution patterns.&lt;/p&gt;
&lt;p&gt;That leads us into the best part: what are the improvements, features, and enhancements in this release?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Significant performance gains (observed up to 5.1x speed increases in loose benchmarks of real world usage scenarios on macOS 12.3.1)
&lt;ul&gt;
&lt;li&gt;No longer reliant on &lt;code&gt;git&lt;/code&gt; subcommand calls&lt;/li&gt;
&lt;li&gt;More consistent behavior since git2-rs is directly tested at a locked version&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Color mode option with the following choices: &amp;quot;always&amp;quot;, &amp;quot;compatibility&amp;quot; and &amp;quot;never&amp;quot;
&lt;ul&gt;
&lt;li&gt;&amp;quot;always&amp;quot;: display with rich colors (default)&lt;/li&gt;
&lt;li&gt;&amp;quot;compatibility&amp;quot;: display with portable colors&lt;/li&gt;
&lt;li&gt;&amp;quot;never&amp;quot;: display with no color&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Display flag with the following choices: &amp;quot;standard&amp;quot; (or &amp;quot;default&amp;quot;), &amp;quot;json&amp;quot; and &amp;quot;classic&amp;quot;
&lt;ul&gt;
&lt;li&gt;&amp;quot;standard&amp;quot; (or &amp;quot;default&amp;quot;) and &amp;quot;classic&amp;quot; output options return from &lt;strong&gt;gfold 3&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&amp;quot;json&amp;quot; output is a new option that displays all results in valid JSON, which is useful for third party applications, plugins, parsers, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Overhauled &amp;quot;help&amp;quot; (&lt;code&gt;-h/--help&lt;/code&gt;) output with titled sections
&lt;ul&gt;
&lt;li&gt;includes a troubleshooting section that explains when to use &lt;code&gt;RUST_LOG&lt;/code&gt; and &lt;code&gt;RUST_BACKTRACE&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;includes a config file usage section that was originally included in &lt;strong&gt;gfold 3&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There have also been significant non-user-facing changes both internally and externally to the application that have helped ensure this release is stable.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A large integration test has been added that creates dummy repositories in the crate&apos;s &lt;code&gt;target&lt;/code&gt; directory
&lt;ul&gt;
&lt;li&gt;Past and present GitHub issues have been used to create test scenarios covered by the integration test&lt;/li&gt;
&lt;li&gt;This test has significantly helped in &lt;strong&gt;gfold 4&lt;/strong&gt; development&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bors.tech/&quot;&gt;Bors&lt;/a&gt; has been added to avoid merge / skew conflicts&lt;/li&gt;
&lt;li&gt;Documentation comments have been added nearly everywhere for &lt;code&gt;cargo doc&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;The module layout has been refactored to ensure subdomains exist as submodules when applicable
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;display&lt;/code&gt; now contains its child, &lt;code&gt;color&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;report&lt;/code&gt; now contains its child, &lt;code&gt;target&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;color&lt;/code&gt; now uses a harness rather than individual functions for speed and domain separation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Finally, a major shoutout to a community member, &lt;a href=&quot;https://github.com/AckslD/&quot;&gt;AcksID&lt;/a&gt;!
&lt;a href=&quot;https://github.com/AckslD/&quot;&gt;AcksID&lt;/a&gt; has released the excellent Neovim plugin for &lt;strong&gt;gfold&lt;/strong&gt;, &lt;strong&gt;&lt;a href=&quot;https://github.com/AckslD/nvim-gfold.lua&quot;&gt;nvim-gfold.lua&lt;/a&gt;&lt;/strong&gt;.
Please show &lt;a href=&quot;https://github.com/AckslD/&quot;&gt;AcksID&lt;/a&gt; some love.
The plugin is great and has a bright future ahead of it.
I highly recommend Neovim users to try it out!&lt;/p&gt;
&lt;p&gt;All in all, this is my favorite release of &lt;strong&gt;gfold&lt;/strong&gt; yet.
I&apos;m excited for you to try it out and I hope you enjoy using it.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;For more information, access the &lt;a href=&quot;https://github.com/nickgerace/gfold/blob/4.0.0/CHANGELOG.md&quot;&gt;4.0.0 changelog&lt;/a&gt; or the &lt;a href=&quot;https://github.com/nickgerace/gfold/blob/main/CHANGELOG.md&quot;&gt;rolling changelog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>gfold</category><category>Rust</category></item><item><title>How To Manage Rust Tools and Applications</title><link>https://nickgerace.dev/posts/how-to-manage-rust-tools-and-applications/</link><guid isPermaLink="true">https://nickgerace.dev/posts/how-to-manage-rust-tools-and-applications/</guid><pubDate>Tue, 05 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;While Rust tools and applications can be managed by package managers like &lt;a href=&quot;https://brew.sh/&quot;&gt;Homebrew&lt;/a&gt;,
most can be installed with &lt;a href=&quot;https://doc.rust-lang.org/stable/cargo/&quot;&gt;Cargo&lt;/a&gt;.
However, we must then ask: how can we manage to keep track of those tools and applications and update them accordingly?
Let&apos;s talk about it.&lt;/p&gt;
&lt;h2&gt;Disclaimer&lt;/h2&gt;
&lt;p&gt;The original title of this post used the word &amp;quot;binaries&amp;quot; instead of &amp;quot;tools and applications&amp;quot;, but
since this post is meant to be a starting guide, I decided to use the latter.&lt;/p&gt;
&lt;p&gt;After all, if you are reading this, you are likely used to using &lt;a href=&quot;https://doc.rust-lang.org/cargo/commands/cargo-install.html&quot;&gt;&lt;code&gt;cargo install&lt;/code&gt;&lt;/a&gt; to install tools like &lt;a href=&quot;https://github.com/nickgerace/gfold&quot;&gt;&lt;code&gt;gfold&lt;/code&gt;&lt;/a&gt; &lt;em&gt;(shameless plug)&lt;/em&gt;. I suspect many users would refer to most of what they have installed via Cargo to be &amp;quot;tools and applications&amp;quot;.
Thus, we&apos;ll be referring to what we are managing as &amp;quot;tools and applications&amp;quot;.&lt;/p&gt;
&lt;p&gt;One more thing before we continue: folks reading this may prefer using their system&apos;s package manager or something all-encompassing, like &lt;a href=&quot;https://github.com/r-darwish/topgrade&quot;&gt;topgrade&lt;/a&gt;.
This guide is aimed at those using Cargo and meant to be flexible with multiple workflows.
There is no one way to manage Rust tools and applications.
Feel free to pick and choose what you like from this guide.&lt;/p&gt;
&lt;h2&gt;Choosing to Use the Locked Flag&lt;/h2&gt;
&lt;p&gt;Let&apos;s start by installing &lt;code&gt;gfold&lt;/code&gt; with &lt;code&gt;cargo install&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;cargo install gfold
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is great and works well.
It does especially so for multi-platform use!
However, we can modify it a bit by using the &lt;code&gt;--locked&lt;/code&gt; flag.
What does the &lt;code&gt;--locked&lt;/code&gt; flag do?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&amp;quot;By default, the &lt;code&gt;Cargo.lock&lt;/code&gt; file that is included with the package will be ignored.&lt;/em&gt;
&lt;em&gt;This means that Cargo will recompute which versions of dependencies to use, possibly using newer versions that have been released since the package was published.&lt;/em&gt;
&lt;em&gt;The &lt;code&gt;--locked&lt;/code&gt; flag can be used to force Cargo to use the packaged &lt;code&gt;Cargo.lock&lt;/code&gt; file if it is available.&amp;quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;- &lt;a href=&quot;https://doc.rust-lang.org/cargo/commands/cargo-install.html&quot;&gt;The Cargo Book&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Alright, so whether or not we use the flag is preferential.
There are benefits and detriments to each approach, so let&apos;s see what the docs have to say.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&amp;quot;This may be useful for ensuring reproducible builds, to use the exact same set of dependencies that were available when the package was published.&lt;/em&gt;
&lt;em&gt;It may also be useful if a newer version of a dependency is published that no longer builds on your system, or has other problems.&lt;/em&gt;
&lt;em&gt;The downside to using &lt;code&gt;--locked&lt;/code&gt; is that you will not receive any fixes or updates to any dependency.&amp;quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;- &lt;a href=&quot;https://doc.rust-lang.org/cargo/commands/cargo-install.html&quot;&gt;The Cargo Book&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Essentially, the &lt;code&gt;--locked&lt;/code&gt; flag ensures reproducible-ish builds by using the dependencies specified in &lt;code&gt;Cargo.lock&lt;/code&gt; (if found).&lt;/p&gt;
&lt;p&gt;I prefer to use to &lt;code&gt;--locked&lt;/code&gt; flag despite missing out on potential bug fixes, performance improvements and security updates to dependencies.
This preference stems from my desire to have my experience using the tool or application to match that of the upstream developer&apos;s experience and intentions, which translates to using the dependencies they tested with and included in hosted binaries (e.g. binaries on GitHub Release pages).&lt;/p&gt;
&lt;p&gt;For the remainder of this post, I&apos;ll use the &lt;code&gt;--locked&lt;/code&gt; flag, but as you are following along, please feel free to drop the flag wherever you&apos;d like.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;cargo install --locked gfold
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;One thing to keep in mind: we can mix and match which binaries we want installed with the flag.
It does not have to be all or nothing!
We&apos;ll touch on how to do that later.&lt;/p&gt;
&lt;h2&gt;Ensuring Tools and Applications are Up to Date&lt;/h2&gt;
&lt;p&gt;Now, you have &lt;code&gt;gfold&lt;/code&gt; installed, but we have a new problem: how do we make sure it is up to date?
We will use the excellent &lt;a href=&quot;https://crates.io/crates/cargo-update&quot;&gt;cargo-update&lt;/a&gt; to do so.
Let&apos;s install it.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;cargo install --locked cargo-update
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This tool checks if an installed binary (via &lt;code&gt;cargo install&lt;/code&gt;) has a newer version available and will update it accordingly.
It also has the ability to update &lt;em&gt;all&lt;/em&gt; installed binaries (via &lt;code&gt;cargo install&lt;/code&gt;) by using the &lt;code&gt;-a/--all&lt;/code&gt; as well as force install (i.e. re-install) selected binaries by using the &lt;code&gt;-f/--force&lt;/code&gt; flag.&lt;/p&gt;
&lt;p&gt;We&apos;ll want the former behavior in order to accomplish our overall goal.
Therefore, though we have only installed &lt;code&gt;gfold&lt;/code&gt; thus far, let&apos;s update all potential tools and binaries installed.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;cargo install-update -a
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Before we continue to the next section, let&apos;s say you want to ensure some dependencies are updated with respect to &lt;code&gt;Cargo.lock&lt;/code&gt; and others are not.
We can use another Cargo subcommand that comes with &lt;code&gt;cargo-update&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;cargo install-update-config --enforce-lock &amp;lt;PACKAGE&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With the above command, we can toggle settings for how individual tools and applications are updated.
There are more tweaks you can perform and I recommend passing in the &lt;code&gt;--help&lt;/code&gt; flag to see what matches your preferences.&lt;/p&gt;
&lt;h2&gt;Creating a List of Installed Tools and Applications&lt;/h2&gt;
&lt;p&gt;Some people like to maintain state of what their package managers have installed via files.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For example, you can use &lt;a href=&quot;https://github.com/Homebrew/homebrew-bundle&quot;&gt;Brewfiles&lt;/a&gt;, which are leveraged by &lt;code&gt;homebrew-bundle&lt;/code&gt; to bundle non-Ruby dependencies for use with the Homebrew package manager.&lt;/li&gt;
&lt;li&gt;Another example: you can execute &lt;code&gt;dnf repoquery --userinstalled --queryformat &amp;quot;%{NAME}&amp;quot; &amp;gt; packages.txt&lt;/code&gt; on &lt;a href=&quot;https://getfedora.org/&quot;&gt;Fedora&lt;/a&gt; to display a list of user installed packages with the &lt;a href=&quot;https://github.com/rpm-software-management/dnf&quot;&gt;dnf&lt;/a&gt; package manager and redirect the output to a text file.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Similarly to the &lt;code&gt;dnf&lt;/code&gt; example, we will manage a &lt;code&gt;crates.txt&lt;/code&gt; file that contains out installed tools and applications.
When doing so, let&apos;s use the multi-platform &lt;a href=&quot;https://github.com/BurntSushi/ripgrep&quot;&gt;ripgrep&lt;/a&gt; instead of &lt;code&gt;grep&lt;/code&gt; for our Windows friends.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;cargo install --locked ripgrep
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Side note:&lt;/strong&gt; For Windows and &lt;a href=&quot;https://docs.microsoft.com/en-us/powershell/&quot;&gt;PowerShell&lt;/a&gt; users, I have been using &lt;code&gt;pwsh&lt;/code&gt; on macOS in addition to &lt;code&gt;zsh&lt;/code&gt; throughout this post.
I&apos;ve tried to ensure multi-platform snippets and PowerShell-specific snippets work on your system, but I apologize for any inefficiencies or missed edge cases you may encounter.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Now, we can parse through the output of &lt;code&gt;cargo install --list&lt;/code&gt; in order to create a clean list of every installed tool and application by name.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;cargo install --list | rg -o &amp;quot;^\S*\S&amp;quot; &amp;gt; crates.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Look below for the contents of my &lt;code&gt;crates.txt&lt;/code&gt; on the machine I&apos;m writing this post on.
Yours will likely look different!&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bat
bottom
cargo-audit
cargo-bloat
cargo-expand
cargo-fuzz
cargo-msrv
cargo-nextest
cargo-udeps
cargo-update
cargo-watch
cargo-whatfeatures
cross
exa
fd-find
ferris-fetch
gfold
git-cliff
kubie
nu
onefetch
procs
ripgrep
starship
tokei
tokio-console
toml2json
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We can put this file somewhere safe, like a public or private GitHub repository, in order to share it across systems.
Homelab users may consider using &lt;a href=&quot;https://en.wikipedia.org/wiki/Rsync&quot;&gt;rsync&lt;/a&gt; or a similar tool to manage file sharing and data backup themselves.
The possibilities are endless!&lt;/p&gt;
&lt;p&gt;Let&apos;s say we have a new system and want to install our Rust tools and applications from &lt;code&gt;crates.txt&lt;/code&gt;.
On macOS, Linux and similar systems, we can use &lt;a href=&quot;https://en.wikipedia.org/wiki/Xargs&quot;&gt;xargs&lt;/a&gt; to install everything.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-zsh&quot;&gt;xargs cargo install --locked &amp;lt; crates.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On Windows and systems using PowerShell, we can do something roughly equivalent, though not quite the same.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;$crates = Get-Content -Raw -Path .\crates.txt | Out-String
foreach($crate in $crates.split(&amp;quot;`n&amp;quot;)) { if ( $crate -ne &amp;quot;&amp;quot; ) { cargo install --locked $crate } }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We are also able to continually update our list by using the command we used to originally create the file.
With that and the other snippets and tips laid out in this section, we can create, update, back up, install from scratch, and manage what we have installed on our system.&lt;/p&gt;
&lt;h2&gt;Automating Updates&lt;/h2&gt;
&lt;p&gt;Finally, we can tie this all together with automation.
There are a bunch of commands to remember, so adding shell functions or scripts could be a good idea to make our experience better.&lt;/p&gt;
&lt;p&gt;For the following example, we are using a &lt;code&gt;zsh&lt;/code&gt; function, but transposing similar logic into your shell of choice should work on most popular platforms.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-zsh&quot;&gt;function update {
    if [ &amp;quot;$(command -v rustup)&amp;quot; ]; then
        rustup update
    fi

    if [ &amp;quot;$(command -v cargo)&amp;quot; ]; then
        if [ ! -f $HOME/.cargo/bin/cargo-install-update ]; then
            cargo install --locked cargo-update
        fi
        cargo install-update -a
        cargo install --list | rg -o &amp;quot;^\S*\S&amp;quot; &amp;gt; $SOME_ABSOLUTE_PATH/crates.txt
    fi
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The above function checks if &lt;a href=&quot;https://rustup.rs/&quot;&gt;rustup&lt;/a&gt; is installed and updates your Rust toolchains, including Cargo, accordingly.
Then, it checks if Cargo is installed, installs &lt;code&gt;cargo-update&lt;/code&gt; if it has not been installed, updates all tools and applications installed with &lt;code&gt;cargo install&lt;/code&gt;, and then dumps the list of those same tools and applications into a &lt;code&gt;crates.txt&lt;/code&gt; file.
Whew.&lt;/p&gt;
&lt;p&gt;There are a lot of possibilities here for advanced management here.
Perhaps, we could explore an opportunity to force updates with for &lt;em&gt;all&lt;/em&gt; installed binaries (i.e. &lt;code&gt;cargo install-update -a --force&lt;/code&gt;) if the stable toolchain has been updated via &lt;code&gt;rustup update&lt;/code&gt;.
I say, get creative!&lt;/p&gt;
&lt;h2&gt;Update Away&lt;/h2&gt;
&lt;p&gt;With this guide, tips and snippets, we are ready to manage our Rust tools and applications!&lt;/p&gt;
&lt;p&gt;There are likely areas for improvement and optimizations that we could make here and there, but this guide is meant to get you started as well as to find and inspire methods that work best for you.
Go forth and update away!&lt;/p&gt;
</content:encoded><category>Guides</category><category>Rust</category></item><item><title>Will your PC be able to run Starfield?</title><link>https://nickgerace.dev/posts/will-your-pc-run-starfield/</link><guid isPermaLink="true">https://nickgerace.dev/posts/will-your-pc-run-starfield/</guid><pubDate>Wed, 16 Mar 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Video games are a little off topic for this blog, but what started as a Reddit post draft to help others felt like it would be better served as a blog post to help even more people.&lt;/p&gt;
&lt;p&gt;I&apos;ve seen quite a few posts on &lt;a href=&quot;https://reddit.com/r/starfield&quot;&gt;r/Starfield&lt;/a&gt; and other places online with folks asking the following: &amp;quot;will my PC be able to run &lt;a href=&quot;https://bethesda.net/en/game/starfield&quot;&gt;Starfield&lt;/a&gt;?&amp;quot;.
With today&apos;s new &lt;a href=&quot;https://youtu.be/X8_JG48it7s&quot;&gt;Into the Starfield entry&lt;/a&gt; likely bringing in more folks worried about being able to play the game on release, I wrote this collection of speculative answers to help those who have the aforementioned, well-intentioned question.&lt;/p&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;Let&apos;s start with my estimate at what kind of system will be required to play the game and then dive into the reasoning later.&lt;/p&gt;
&lt;p&gt;I suspect that your system will likely be fine for at least native 1080p 30fps play at Low-to-Medium settings if it has &amp;quot;near-equivalent-or-better&amp;quot; components to the Xbox Series S.
The Xbox Series S is the entry level console that Starfield will be released on, so we should try to match or exceed its relative performance.
If we want to do that, but also cover easier-to-upgrade components in the macroeconomic climate, like RAM and storage, our system might look at a bit like the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GPU:&lt;/strong&gt; Various
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Slightly Less Optimistic:&lt;/strong&gt; Nvidia GTX 1060, AMD RX 580&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Slightly More Optimistic:&lt;/strong&gt; Nvidia GTX 1070 Ti, Nvidia GTX 1660 Ti, AMD RX 6600 XT, Nvidia RTX 3050&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CPU:&lt;/strong&gt; Intel Core i5-9400F, AMD Ryzen 5 3600&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RAM:&lt;/strong&gt; Mid-range 16 GB DDR4&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SSD:&lt;/strong&gt; Mid-range PCIe Gen 3 SATA SSD&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I suspect that your system will likely be fine for at least native 1080p 30fps play at low to medium settings if it has &amp;quot;near-equivalent-or-better&amp;quot; components.
Even then, for components like the CPU, you could likely use older components than what I&apos;ve listed.
The variability is just too wide without any concrete data on how Creation Engine 2 works or how Starfield performs, so I&apos;m playing it a bit safe with this estimation.&lt;/p&gt;
&lt;p&gt;Want to know how this estimate came to fruition?
Read on!&lt;/p&gt;
&lt;h2&gt;Context&lt;/h2&gt;
&lt;p&gt;The quick answer to &amp;quot;will my PC be able to run this unreleased game?&amp;quot;: &lt;em&gt;we have no idea&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;We may not even have the full idea when BGS (&lt;a href=&quot;https://bethesdagamestudios.com/&quot;&gt;Bethesda Game Studios&lt;/a&gt;) announces minimum and recommended specs because the depth of those lists can vary between developers.
Until independent reviewers, specifically performance-focused ones like &lt;a href=&quot;https://www.youtube.com/user/digitalfoundry&quot;&gt;Digital Foundry&lt;/a&gt;, meaningfully benchmark the game, we will not have substantive answers to that question.&lt;/p&gt;
&lt;p&gt;On the other hand, many folks are new to PC gaming, not interested in the more technical aspects of the hobby, and/or have other situations where they are just looking for help to ensure that they can play the game when it comes out.
This post aims to help those folks and possibly others.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Short disclaimer:&lt;/strong&gt; I&apos;ve been playing PC games with a discrete GPU for over a decade, but I am not a game developer.&lt;/p&gt;
&lt;p&gt;I&apos;m a software engineer who has mainly worked on cloud infrastructure software.
Sure, I&apos;ve dabbled in graphics APIs here and there, have made tiny, unreleased mods for &lt;a href=&quot;https://elderscrolls.bethesda.net/en/Skyrim&quot;&gt;Skyrim&lt;/a&gt; and &lt;a href=&quot;https://fallout.bethesda.net/en/games/fallout-4&quot;&gt;Fallout 4&lt;/a&gt;, and try to keep up with the technical aspects of game development at a high level.
However, I do not consider myself qualified to give answers on how games exactly work or what to fully expect out of Starfield&apos;s performance on your PC.&lt;/p&gt;
&lt;p&gt;I share my background to be transparent: I am writing this post from the propsective of a fan and player, not a game developer (though that could be fun at some point).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;With those bits of context out of the way, please take the following thoughts with a &lt;em&gt;huge&lt;/em&gt; grain of salt as they are merely meant to help folks between today and the day we will begin to see actual benchmarks before the game&apos;s release.&lt;/p&gt;
&lt;h2&gt;Compare to BGS&apos; Latest Title, Fallout 76&lt;/h2&gt;
&lt;p&gt;You can look at how your system performs with &lt;a href=&quot;https://fallout.bethesda.net/en/games/fallout-76&quot;&gt;Fallout 76&lt;/a&gt; as a start, but since that game is an online, AAA game using &lt;a href=&quot;https://youtu.be/gi8PTAJ2Hjs?t=311&quot;&gt;a modified version the first Creation Engine&lt;/a&gt;, it might play &amp;quot;differently&amp;quot; to BGS&apos; offline singleplayer titles.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Example of playing &amp;quot;differently&amp;quot;:&lt;/strong&gt; using VATS in Fallout 76 PvP might not necessarily indicate that Starfield will behave similarly due to networking and major gameplay differences
&lt;ul&gt;
&lt;li&gt;I would ask myself, &amp;quot;could this similar type of system taxing behavior happen often (or at all) in Starfield?&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Example where the games may perform similarly:&lt;/strong&gt; private Fallout 76 worlds where you are exploring areas of the game where you get &amp;quot;average&amp;quot; framerate
&lt;ul&gt;
&lt;li&gt;Removing &amp;quot;best case&amp;quot; and &amp;quot;worst case&amp;quot; performance areas from your benchmarks may help since since we do not know the performance demands of Starfield and its use of &lt;a href=&quot;https://en.wikipedia.org/wiki/Creation_Engine#Creation_Engine_2&quot;&gt;Creation Engine 2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Compare to the Entry Level Console, the Xbox Series S, Across Several Titles&lt;/h2&gt;
&lt;p&gt;I would expect for the worst and hope for the best when comparing relative performance between your system and the Xbox Series S in modern, AAA offline-or-mostly-offline titles.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Short note on &amp;quot;equivalent&amp;quot; hardware:&lt;/strong&gt; you are going to see me put the word &amp;quot;equivalent&amp;quot; in double quotes everywhere.
I do this because it is difficult to discern which discrete GPU produces &amp;quot;equivalent&amp;quot; performance to the Xbox Series S in one game, let alone several games.
The Xbox Series S may architecturally look like a PC more than the vast majority of consoles preceding it, but it still differs in key areas that we will touch on later.
It is helpful to keep this in mind since console and &amp;quot;equivalent&amp;quot; PC performance can vary depending on a &lt;em&gt;lot&lt;/em&gt; of factors.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;The Xbox Series S &lt;a href=&quot;https://en.wikipedia.org/wiki/Rasterisation&quot;&gt;rasterization&lt;/a&gt; performance (&amp;quot;how many frames can I pump out without doing anything fancy, like ray-tracing&amp;quot;) is difficult to declare &amp;quot;equivalent&amp;quot; to one from a discrete GPU, but let&apos;s say it lands somewhere between a &lt;a href=&quot;https://www.nvidia.com/en-in/geforce/products/10series/geforce-gtx-1060/&quot;&gt;GTX 1060&lt;/a&gt; and &lt;a href=&quot;https://www.nvidia.com/en-in/geforce/products/10series/geforce-gtx-1070/&quot;&gt;GTX 1070 Ti&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;This estimate is based on anecdotal knowledge from several titles, videos, articles, etc. and is purely meant to provide a baseline for the rest of the article&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The Xbox Series S shares memory between the CPU and GPU, meaning recommended RAM quantity is difficult to calculate (i.e. unlike the Xbox Series S, a discrete GPU in your PC, like the GTX 1060, has its own RAM called VRAM)
&lt;ul&gt;
&lt;li&gt;It may be best to see how the Xbox Series S performs in other cross-platform titles&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The Xbox Series S has a fast SSD that works in tandem with the &lt;a href=&quot;https://devblogs.microsoft.com/directx/directstorage-api-available-on-pc/&quot;&gt;DirectStorage API&lt;/a&gt;, meaning that it may be able to take advantage of loading objects, areas, NPCs, etc. compared to an average gaming PC
&lt;ul&gt;
&lt;li&gt;This is coming to Windows 11, but we don&apos;t know the full extent to how and if this will work with the PC version of Starfield (and even PC games in general)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The Xbox Series S will likely get special tuning and treatment for Starfield, meaning that an &amp;quot;equivalent-ish&amp;quot; PC may experience slightly worse performance
&lt;ul&gt;
&lt;li&gt;This point is &lt;em&gt;very&lt;/em&gt; speculative, but I want to highlight that it may be a good idea to ensure that your rig overshoots anticipated Xbox Series S performance for &amp;quot;equivalent&amp;quot; hardware (if you can swing it!)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The Xbox Series S may have dynamic resolution scaling, &lt;a href=&quot;https://en.wikipedia.org/wiki/Checkerboard_rendering&quot;&gt;checkerboarding&lt;/a&gt; and similar methods that the PC version may not have
&lt;ul&gt;
&lt;li&gt;Essentially, these strategies aim to run the game (or objects in your game) at a resolution lower than your monitor&apos;s native resolution and upscale to your native resolution while trying to do so in ways that aren&apos;t easily perceptible to the everyday player&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The Xbox Series S version may feature lightly implemented, well-tuned ray-tracing and/or real time lighting/shadow effects in Starfield that &amp;quot;equivalent&amp;quot; discrete GPUs might not be able to do
&lt;ul&gt;
&lt;li&gt;Remember, the GTX 1060 and GTX 1070 Ti do not feature ray-tracing&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;In general, &amp;quot;equivalent&amp;quot; discrete GPUs might not be able to take advantage of the exact same graphics &amp;quot;settings&amp;quot; as the console version&lt;/li&gt;
&lt;li&gt;The Xbox Series S might have better frametime consistency than &amp;quot;equivalent&amp;quot; hardware due to tuning and optimization
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;On frametime consistency:&lt;/em&gt; a lack of frametime consistency is when frames aren&apos;t delivered at smooth intervals, so even if you get an average 60fps in your game, if an average set of frames is delivered &amp;quot;choppily&amp;quot; and each frame is not spaced out &amp;quot;evenly&amp;quot;, then the experience will feel worse than another system with good frametime consistency at 60fps (this explanation is a tad reductive, but a high level understanding of this phenomenon can be helpful for the greater context)&lt;/li&gt;
&lt;li&gt;From my experience, less-than-ideal console ports to PC can have worse frametime consistency, but since BGS has solid history with PC releases, I bring this up purely for anticipating &amp;quot;worst case&amp;quot; scenarios&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Anticipate playing at 1080p if you are slightly above, around, or below the &amp;quot;equivalent&amp;quot; Xbox Series X spec
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;My guess:&lt;/em&gt; the Xbox Series S will likely play at dynamic 1440p 30fps using resolution scaling methods&lt;/li&gt;
&lt;li&gt;Anticipating playing at native 1080p 30fps with near &amp;quot;equivalent&amp;quot; systems may set some good expectations&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;All of the above points reflect the following fact: the &lt;a href=&quot;https://www.ign.com/wikis/xbox-series-x/Xbox_Series_S_-_Tech_Specs,_Features,_and_Comparisons&quot;&gt;RDNA 2 and Zen 2 based&lt;/a&gt; &lt;em&gt;Xbox Series S hardware is newer than the GTX 1060 and GTX 1070 Ti, despite boasting similar performance&lt;/em&gt;
&lt;ul&gt;
&lt;li&gt;There might be a feature or optimization here and there that makes the console perform better or more consistently than PCs using the aforementioned GPUs&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Potential PC Advantage, Even With Older Hardware&lt;/h2&gt;
&lt;p&gt;While I&apos;ve been assuming &lt;strong&gt;native&lt;/strong&gt; resolution for a lot of these thoughts, we have no idea if Creation Engine 2 has &lt;a href=&quot;https://www.nvidia.com/en-us/geforce/technologies/dlss/&quot;&gt;DLSS&lt;/a&gt;, &lt;a href=&quot;https://www.amd.com/en/technologies/radeon-software-fidelityfx-super-resolution&quot;&gt;FSR&lt;/a&gt;, &lt;a href=&quot;https://docs.unity3d.com/Manual/DynamicResolution.html&quot;&gt;dynamic resolution scaling&lt;/a&gt;, checkerboarding, and/or other similar features.
If any those features are included in the PC version, the answer to our big question may be &lt;em&gt;dramatically&lt;/em&gt; different.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The second that you can run Starfield at an internal resolution of ~720p at 30 FPS with &lt;a href=&quot;https://videocardz.com/newz/amd-fsr-2-0-next-level-temporal-upscaling-officially-launches-q2-2022-rsr-launches-march-17th&quot;&gt;FSR 2.0&lt;/a&gt;, the second a &lt;em&gt;lot&lt;/em&gt; more players will likely be able to enjoy the game&lt;/li&gt;
&lt;li&gt;Easy to upgrade parts (in the current macroeconomic climate) that may impact gameplay: RAM and SSD&lt;/li&gt;
&lt;li&gt;For RAM, I recommend having at least 16 GB
&lt;ul&gt;
&lt;li&gt;Despite its performance issues, Elden Ring comes to mind, &lt;a href=&quot;https://www.pcgamer.com/elden-ring-system-requirements/&quot;&gt;which &amp;quot;requires&amp;quot; 12 GB of RAM&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;For SSDs, I recommend most mid-range-or-above SATA SSDs
&lt;ul&gt;
&lt;li&gt;I would not plan on using a mechanical hard drive to play the game&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;While the unknown nature Windows 11 and the DirectStorage API from before is something to keep in mind here, the performance of mid-range PCIe Gen 3 SATA SSDs (&amp;quot;average&amp;quot; SSD of the 2010s) have been enough for games in recent years and will likely be enough for Starfield
&lt;ul&gt;
&lt;li&gt;That being said, keep an eye on this space...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Looking at Similar, Previously Released Games&lt;/h2&gt;
&lt;p&gt;Look at Skyrim and Fallout 4: barring certain areas of these games, like parts of downtown Boston in the latter title, these games ran well relative to their hardware at the time, including lower-to-middle-range systems.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fallout 76 is worth considering too, as previously mentioned
&lt;ul&gt;
&lt;li&gt;Searching for performance-focused reviews might not tell the whole story since, at present, performance is likely a different story from launch &lt;em&gt;(ensure your sources are based on newer builds of the game)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;If you have the game, it might be a good idea to boot it up with an FPS counter &lt;em&gt;(while I recommend &lt;a href=&quot;https://www.nvidia.com/en-us/geforce/geforce-experience/shadowplay/&quot;&gt;Shadowplay&lt;/a&gt; for Nvidia GPU owners, the &lt;a href=&quot;https://www.pcmag.com/how-to/how-to-see-your-frames-per-second-fps-in-games&quot;&gt;Steam FPS counter shoud work for everyone&lt;/a&gt;)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Look at the newest, biggest open world, mostly-offline-or-offline, AAA games
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.xbox.com/en-US/games/forza-horizon-5&quot;&gt;Forza Horizon 5&lt;/a&gt; and the &lt;a href=&quot;https://www.xbox.com/en-US/games/halo-infinite&quot;&gt;Halo Infinite&lt;/a&gt; campaign are other titles potentially worth using for comparison&lt;/li&gt;
&lt;li&gt;Elden Ring and some other AAA, cross-platform titles on PC have had a host of performance-related issues on launch, so if you plan to play any massive AAA game on day one, you should prepare for a non-&lt;em&gt;ideal&lt;/em&gt; experience, but hope for a great one!&lt;/li&gt;
&lt;li&gt;I say the above understanding the difficulty of game development and have immense respect for game development teams&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Many Intel Core i5 and AMD Ryzen 5 CPUs will likely be more than enough for 30 to 60 FPS gameplay
&lt;ul&gt;
&lt;li&gt;Perhaps, there will be CPU-bound areas and scenarios, but based on prior BGS releases, we can hope that this is the exception rather than the rule&lt;/li&gt;
&lt;li&gt;Remember, the goal is to answer whether the game will run Starfield, and not whether it&apos;ll run well in all areas of the game&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The GPU will likely be the bottleneck, as it is for most PC titles
&lt;ul&gt;
&lt;li&gt;This part is a bit annoying as the current GPU market is dramatically improving but is still... a bit annoying&lt;/li&gt;
&lt;li&gt;BGS games have often been relatively easy to run and scale relatively well with the available GPUs of each games&apos; time&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Concluding Thoughts&lt;/h2&gt;
&lt;p&gt;I hope my speculative answers and thoughts help folks that are preparing to play Starfield on PC when it releases!&lt;/p&gt;
&lt;p&gt;As a reminder though, these are just thoughts from a software engineer way out of his lane in hopes of helping others.
Take everything with a grain salt and thank you for reading.&lt;/p&gt;
</content:encoded><category>Hardware</category></item><item><title>Announcing gfold 3</title><link>https://nickgerace.dev/posts/announcing-gfold3/</link><guid isPermaLink="true">https://nickgerace.dev/posts/announcing-gfold3/</guid><pubDate>Tue, 04 Jan 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Today marks the release of &lt;strong&gt;&lt;a href=&quot;https://github.com/nickgerace/gfold&quot;&gt;gfold 3&lt;/a&gt;&lt;/strong&gt; 🎉!&lt;/p&gt;
&lt;p&gt;It&apos;s a bit surreal, given that this project started in a private repository from my early days of learning Rust.&lt;/p&gt;
&lt;p&gt;I began to learn Rust in the middle of 2019, for many of the reasons popular among newcomers: safe concurrency, compile-time reliability, great community, etc.
Leading into 2020, my Rust code steadily improved, I started iterating on public projects (as well as many more private projects), and &lt;strong&gt;gfold&lt;/strong&gt;&apos;s codebase aged quickly.&lt;/p&gt;
&lt;p&gt;All of my other Rust projects were better designed, better written, and more interesting in a technical sense than &lt;strong&gt;gfold&lt;/strong&gt;.
Yet, I continued to use it more than any of those projects.
Despite the state of the codebase, my favorite part about &lt;strong&gt;gfold&lt;/strong&gt; was that I was using it daily, and multiple times throughout the day.
Thus, I decided to open source what I had in early April 2020.&lt;/p&gt;
&lt;p&gt;Many of you decided to try it out since then!
At least, it seems as such because, as of version &lt;strong&gt;3.0.0-rc.4&lt;/strong&gt;, the project has seen the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;📦 &lt;a href=&quot;https://crates.io/crates/gfold&quot;&gt;~1,600 downloads from crates.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;📚 &lt;a href=&quot;https://lib.rs/command-line-utilities&quot;&gt;rank #21 on lib.rs for command-line-utilities&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;⭐️ &lt;a href=&quot;https://github.com/nickgerace/gfold&quot;&gt;90 stars on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For a project that was not originally intended to live past my earliest days of learning Rust, that&apos;s pretty great!
I&apos;m thankful for all users of &lt;strong&gt;gfold&lt;/strong&gt;, and I am excited for you to try out version &lt;strong&gt;3.0.0&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;Design&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;gfold 3.0.0&lt;/strong&gt; is centered around a &lt;a href=&quot;https://en.wikipedia.org/wiki/Domain-driven_design&quot;&gt;domain-driven&lt;/a&gt; refactor.
Its focus areas include the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Targets&lt;/em&gt;: focus on generating targets with a given config&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Reports&lt;/em&gt;: generate reports given generated targets&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Displays&lt;/em&gt;: display results for generated reports&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These focus areas contain separate entities that try to be self-contained.
However, &lt;strong&gt;gfold&lt;/strong&gt; is a small, &amp;quot;single-execution&amp;quot; binary, so these focus areas may intersect with one another in practice.
For example, it might be optimal to combine and parallelize everything:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    ┌──────────────────────────┐
    │ perform a directory walk │
┌───► with each &amp;quot;dive&amp;quot; opened  │
│   │ as a (green) thread      │
│   └─────────────┬────────────┘
│                 │
│   ┌─────────────▼─────────────────┐
│   │    determine if the           │
│   │    child path is a target     │
│   └────────┬───────────────────┬──┘
│            │                   │
│          false               true
│            │                   │
│            │  ┌────────────────▼──┐
│            │  │ generate a report │
│            │  │ with that path    │
│            │  └────────────────┬──┘
│            │                   │
│   ┌────────▼───────────────┐   │
│   │ create another (green) │   │
└───┤ thread with that path  │   │
    └────────────────────────┘   │
                                 │
               ┌─────────────────▼─────┐
               │ display that report   │
               │ immediately to STDOUT │
               └───────────────────────┘
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That could result in incredibly fast execution, but you would run into a number of other problems:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Do we have to worry about a maximum number of threads?&lt;/li&gt;
&lt;li&gt;What if certain display settings need to be context-aware and pad with whitespaces according to other reports?&lt;/li&gt;
&lt;li&gt;Should we parallelize report generation, and keep directory walking sequential, if the latter is much less expensive than executing several &lt;code&gt;libgit2&lt;/code&gt; or &lt;code&gt;git&lt;/code&gt; subcommand calls?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All of these questions were similar to those that arose during &lt;strong&gt;gfold 3.0.0&lt;/strong&gt; development.&lt;/p&gt;
&lt;p&gt;The final architecture diagram contained more discrete parts; making each focus area a little more extendable.
While they might not be co-joined, trading minor performance hits for extensibility was well worth it in the final design.
Overall, the goal was to strike a balance between being a fast, glorified script runner and being a slower, complex application.&lt;/p&gt;
&lt;h2&gt;New Features&lt;/h2&gt;
&lt;p&gt;Aside from the design philosophy change and overall refactor, there are a number of new features.
They include, but are not limited to, the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ability to store options in an optional config file
&lt;ul&gt;
&lt;li&gt;Ability to ignore the config file and only use CLI options&lt;/li&gt;
&lt;li&gt;Ability to merge CLI options with config file options (default behavior if config file exists)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Brand new display mode
&lt;ul&gt;
&lt;li&gt;This is the new default display mode&lt;/li&gt;
&lt;li&gt;The old display mode is available via a flag and can be used by default if set in the config file&lt;/li&gt;
&lt;li&gt;Primary motivation for the display mode change was to minimize line length (classic display mode can result in very long lines)&lt;/li&gt;
&lt;li&gt;Repositories are not grouped by parent directory, unlike the classic display mode&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Ability to print merged config options (CLI options + config file options)
&lt;ul&gt;
&lt;li&gt;Since the config is printed as valid JSON, you can direct the output in your config file (e.g. &lt;code&gt;gfold --classic ~/src --print &amp;gt; gfold.json&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Ability to specify path to &lt;code&gt;git&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;By default, &lt;code&gt;gfold&lt;/code&gt; tries to find &lt;code&gt;git&lt;/code&gt; in your &lt;code&gt;PATH&lt;/code&gt;, but you provide another &lt;code&gt;git&lt;/code&gt; binary by its path&lt;/li&gt;
&lt;li&gt;Since version &lt;code&gt;2.0.0&lt;/code&gt;, &lt;code&gt;libgit2&lt;/code&gt; is not used in order to reduce binary size, minimize divergent behavior, reduce attack surface, and remove a redundant dependency (i.e. you likely have &lt;code&gt;git&lt;/code&gt; installed if you are using &lt;code&gt;gfold&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Ability to store default path target in config file
&lt;ul&gt;
&lt;li&gt;By default, the the target is (and has been) the current working directory&lt;/li&gt;
&lt;li&gt;If you&apos;d like to target the same directory from anywhere, you can provide it in the config file&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There have been numerous performance improvements, a new CLI parsing structure, and other smaller changes, but the above features encompass the end user goals for this release.&lt;/p&gt;
&lt;h2&gt;Closing&lt;/h2&gt;
&lt;p&gt;Thank you for reading and enjoy &lt;strong&gt;gfold 3&lt;/strong&gt;!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;A special thank you to those who have helped along the way:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/jrcichra&quot;&gt;@jrcichra&lt;/a&gt; for adding multi-OS support to the very early CI pipeline&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/orhun&quot;&gt;@orhun&lt;/a&gt; for adding &lt;strong&gt;gfold&lt;/strong&gt; to the AUR, which caused a significant increase in users&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/wezm&quot;&gt;@wezm&lt;/a&gt; for including &lt;strong&gt;gfold&lt;/strong&gt; in the &amp;quot;&lt;a href=&quot;https://www.wezm.net/v2/posts/2020/100-rust-binaries/page2/&quot;&gt;One Hundred Rust Binaries&lt;/a&gt;&amp;quot; series, which caused a significant increase in users&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/yaahc&quot;&gt;@yaahc&lt;/a&gt; for helping with a very early refactor through &lt;a href=&quot;https://rustbeginners.github.io/awesome-rust-mentors/&quot;&gt;Awesome Rust Mentors&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>gfold</category><category>Rust</category></item><item><title>Launching Rust Cloud Native</title><link>https://nickgerace.dev/posts/launching-rust-cloud-native/</link><guid isPermaLink="true">https://nickgerace.dev/posts/launching-rust-cloud-native/</guid><pubDate>Tue, 03 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;Update (25 Jul 2022): &lt;a href=&quot;/posts/converting-rust-cloud-native&quot;&gt;Converting Rust Cloud Native&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Today, we launch a new GitHub organization, &lt;a href=&quot;https://github.com/rust-cloud-native&quot;&gt;Rust Cloud Native&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This organization exists to enable the usage of Rust in the &amp;quot;cloud&amp;quot;, which focuses on infrastructure software and related components.&lt;/p&gt;
&lt;p&gt;You may be familiar with &amp;quot;cloud&amp;quot; technologies, such as &lt;a href=&quot;https://www.docker.com/&quot;&gt;Docker&lt;/a&gt; and &lt;a href=&quot;https://kubernetes.io/&quot;&gt;Kubernetes&lt;/a&gt;.
Our organization exists to promote projects that exist within the same technology sector.&lt;/p&gt;
&lt;p&gt;Admittedly, the frequent usage of &amp;quot;cloud&amp;quot; and &amp;quot;cloud native&amp;quot; at large can induce eyerolls.
However, we felt that the &lt;em&gt;actual&lt;/em&gt; definition of cloud native computing defined our organization&apos;s focus area nicely:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;Cloud native technologies empower organizations to build and run scalable applications in modern, dynamic environments such as public, private, and hybrid clouds. Containers, service meshes, microservices, immutable infrastructure, and declarative APIs exemplify this approach.&amp;quot;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/cncf/toc/blob/main/DEFINITION.md&quot;&gt;CNCF Cloud Native Definition v1.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Taking inspiration from &lt;a href=&quot;https://github.com/rust-embedded&quot;&gt;Rust Embedded&lt;/a&gt; and the definition above, we decided on the name: &lt;strong&gt;Rust Cloud Native&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;An Update to this Post&lt;/h2&gt;
&lt;p&gt;Based on discussions throughout various tech communities, I wanted to clarify my intent with this post: this announcement is largely symbolic.
The substance is minimal because this is a &amp;quot;call to arms&amp;quot; more than anything.
Since there is currently not a central location for cloud native Rust &lt;em&gt;anything&lt;/em&gt;, I mainly just wanted to start &lt;em&gt;something&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;With that being said, there has been some great feedback thus far that I want to address:&lt;/p&gt;
&lt;h4&gt;Who are the members?&lt;/h4&gt;
&lt;p&gt;I can see how the exchange of &amp;quot;I&amp;quot; and &amp;quot;we&amp;quot; throughout this post can be confusing.
I talked to several folks about how to start this, including the organization members, so I did not want to claim sole ownership of ideas.
However, the bootstrapping of the repositories was done by me.&lt;/p&gt;
&lt;h4&gt;Why the minimal scope?&lt;/h4&gt;
&lt;p&gt;This organization was created entirely with volunteer time, and would ideally not have its course determined from a &lt;a href=&quot;https://en.wikipedia.org/wiki/Benevolent_dictator_for_life&quot;&gt;BDFL&lt;/a&gt; (me, in this case).
If people want a Discord server, Zoom meetups, events hosted, etc., we will do that.
I do not want to burn out by creating a bunch of low quality community locations prematurely.&lt;/p&gt;
&lt;h4&gt;Why create the GitHub organization first?&lt;/h4&gt;
&lt;p&gt;The reason why the GitHub organization was created/announced &lt;em&gt;before&lt;/em&gt; anything else was because of a tweet.
I originally tweeted that I created the organization, and wanted to see if people were interested in using it (regardless of ownership).
It unexpectedly blew up, and with encouragement from replies/DMs, I decided to add least plant a flag to brute force the &lt;a href=&quot;https://en.wikipedia.org/wiki/Chicken_or_the_egg&quot;&gt;&amp;quot;chicken or the egg&amp;quot;&lt;/a&gt; problem.&lt;/p&gt;
&lt;p&gt;This might not have been the ideal approach, but with few volunteer hours, my objective was to at least start the conversation with some ground rules and goal(s).&lt;/p&gt;
&lt;h4&gt;Next Steps&lt;/h4&gt;
&lt;p&gt;These intentions could have be articulated more clearly in the first publication, so I&apos;ve added this section to do so now.
I&apos;ll reiterate: thank you all for the great feedback.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(original post continues below)&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Mission&lt;/h2&gt;
&lt;p&gt;We are focused on strictly one goal: &lt;em&gt;enabling the usage of Rust in the &amp;quot;cloud&amp;quot;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;In the future, our organization may formalize a secondary goal to create an official &lt;a href=&quot;https://www.rust-lang.org/governance&quot;&gt;Rust working group&lt;/a&gt;.
For now, we are focused on our aforementioned goal with the intent to provide a home for folks interested in cloud native Rust.&lt;/p&gt;
&lt;h2&gt;History&lt;/h2&gt;
&lt;p&gt;You might have seen the GitHub organization pushing commits, creating issues, and polishing things up since late spring, but the idea began as a natural evolution of events prior.
I began writing Rust in mid-2019, as a break from Go at work and a return to lower-level language fun from university.
Between then and now, I have seen projects and initiatives related to cloud native Rust greatly expand:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/bottlerocket-os/bottlerocket&quot;&gt;Bottlerocket OS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://events.linuxfoundation.org/cloud-native-rust-day/&quot;&gt;Cloud Native Rust Day&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://firecracker-microvm.github.io/&quot;&gt;Firecracker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/kube-rs/kube-rs&quot;&gt;kube-rs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.kubewarden.io/&quot;&gt;Kubewarden&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://krustlet.dev/&quot;&gt;Krustlet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://foundation.rust-lang.org/&quot;&gt;Rust Foundation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tikv.org/&quot;&gt;TiKV&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Concurrent to these events, back channel conversations, threads on forums, threads on social media, and community content were also propelling many folks to the idea.
Those back channel conversations always ended with &lt;em&gt;&amp;quot;no, someone should actually do this.&amp;quot;&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Approach&lt;/h2&gt;
&lt;p&gt;It&apos;s taken a relatively long time to launch, and it&apos;s important to discuss why.
Technical obstacles and content generation were not the reasons.
The primary reason was the &lt;em&gt;approach&lt;/em&gt;: we needed a GitHub organization that is safe and welcoming while leaving direction and organic growth entirely up to the community.&lt;/p&gt;
&lt;p&gt;First and foremost, any and all spaces related to Rust Cloud Native will enforce the Rust Programming Language&apos;s &lt;a href=&quot;https://www.rust-lang.org/policies/code-of-conduct&quot;&gt;Code of Conduct&lt;/a&gt;.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Violations of the Code can (eventually or instantly) result in a block from the organization&apos;s public repositories.&lt;/li&gt;
&lt;li&gt;If Code violations occur &amp;quot;off-site&amp;quot;, stemming from our GitHub organization&apos;s spaces, Rust Cloud Native members will inform adjacent community leaders of misconduct and refer to the above point for action.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;As far as leadership goes, our organization contains very few members at this point.
While we are still ideating on processes related to membership, such as the Rust Embedded WG&apos;s &lt;a href=&quot;https://github.com/rust-embedded/wg/blob/master/rfcs/0136-teams.md#adding-new-members&quot;&gt;RFC 0136&lt;/a&gt;, we do not plan to significantly extend membership at this time.&lt;/p&gt;
&lt;p&gt;At the moment, our scope is relatively small: maintain existing repositories and listen to the community&apos;s desires and new ideas.
Thus, we do not want to misuse volunteer time by prematurely and rapidly expanding organizational membership.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I do see a future where frequent contributors eventually become organizational members.
Regardless, we must consider the following: will the organization exist to maintain the same repositories, or will the organization begin to host projects and events?
The answer to that that question dictates our membership goals.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I will admit that the initial members are folks whom I have worked with or met online.
I am personally weary about accidentally creating a clique, so if we ever need to rapidly expand membership, we will focus on doing it the &lt;em&gt;right&lt;/em&gt; way.&lt;/p&gt;
&lt;p&gt;This section is arguably the most important, but since you are likely here to not read my rambles and tangents (&lt;a href=&quot;./theres-nothing-like-local-development&quot;&gt;or are you?&lt;/a&gt;), I&apos;ll be clear in our intent: given our small scope and structure, it&apos;s our hope that we will cultivate a safe and welcoming community that ultimately dictates the course of this organization.&lt;/p&gt;
&lt;h2&gt;Launch&lt;/h2&gt;
&lt;p&gt;Our &amp;quot;launch&amp;quot; refers to our readiness to promote the organization and its contents, and is mostly symbolic.
All of our repositories were publicly available before this was written.
With that being said, we are &amp;quot;launching&amp;quot; with one repository and may expand in the future.
The repository, &lt;strong&gt;&lt;a href=&quot;https://github.com/rust-cloud-native/rust-cloud-native.github.io&quot;&gt;rust-cloud-native.github.io&lt;/a&gt;&lt;/strong&gt; contains the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://rust-cloud-native.github.io&quot;&gt;website&lt;/a&gt;&lt;/strong&gt;: the website showcasing projects and resources about cloud native Rust as well as information on the organization itself&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;core/meta&lt;/strong&gt;: charters, goals, processes, &amp;quot;meta&amp;quot; considerations, etc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;logo&lt;/strong&gt;: the logo and its related files&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You may notice that there isn&apos;t an &amp;quot;&lt;a href=&quot;https://github.com/sindresorhus/awesome&quot;&gt;awesome&lt;/a&gt;&amp;quot; repository or a hosted technical project, such as &lt;a href=&quot;https://github.com/rust-embedded/cross&quot;&gt;rust-embedded/cross&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I do not frequently reference Rust Embedded by accident.
We are proud to model a significant percentage of our organizational makeup off of their&apos;s.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Since our organization is run entirely by volunteers in their spare time, it&apos;s designed to act as launchpad into the greater cloud native Rust community.
You can think of this organization as maintainers of a single website, a logo, and itself... at least, at the time of writing.&lt;/p&gt;
&lt;h2&gt;End&lt;/h2&gt;
&lt;p&gt;As mentioned above, this organization is the launchpad and not the destination.
I can see our organization enabling the creation of a working group, partnering with companies and organizations, hosting events, etc.
I can also see our organization continuing to maintain our current repository for a happy, close-knit community.&lt;/p&gt;
&lt;p&gt;We want to do what &lt;strong&gt;you&lt;/strong&gt; want to do.
We hope to see &lt;strong&gt;your&lt;/strong&gt; creative projects, books, podcasts, livestreams, talks, shows, events, repositories, art, games, and more.
This is the start to &lt;strong&gt;your&lt;/strong&gt; community, and we cannot wait to take feedback on making it a safe, fun, and informative place for navigating the world of cloud native Rust.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;As always, please do not hesitate to &lt;a href=&quot;https://twitter.com/nickgeracehacks&quot;&gt;reach out&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</content:encoded></item><item><title>Do Not Rewrite Your Bash Script In Another Programming Language</title><link>https://nickgerace.dev/posts/do-not-rewrite-your-bash-script/</link><guid isPermaLink="true">https://nickgerace.dev/posts/do-not-rewrite-your-bash-script/</guid><pubDate>Mon, 05 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Alright.
We&apos;re starting off with a fiery blog post title.
Let&apos;s do this.&lt;/p&gt;
&lt;p&gt;One of my biggest pieces of technical advice to new software engineers is to not write something in another language that could be written in Bash.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;By &amp;quot;Bash&amp;quot;, I mean &lt;a href=&quot;https://www.gnu.org/software/bash/&quot;&gt;Bash&lt;/a&gt;, &lt;a href=&quot;https://www.zsh.org/&quot;&gt;Zsh&lt;/a&gt;, &lt;a href=&quot;https://docs.microsoft.com/en-us/powershell/&quot;&gt;PowerShell&lt;/a&gt;, &lt;a href=&quot;https://fishshell.com/&quot;&gt;Fish&lt;/a&gt;, &lt;a href=&quot;https://www.nushell.sh/&quot;&gt;Nushell&lt;/a&gt;,  etc.
Saying &amp;quot;shell&amp;quot; might not immediately register with some folks, and might even be an incorrect generalization since, colloquially, &amp;quot;shell&amp;quot; widely differs in definition.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;There are two exceptions to this piece of advice:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Multi-platform support:&lt;/strong&gt; even if you require external command execution, choosing one programming language can still be preferred for multi-platform usage and maintenance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No external commands:&lt;/strong&gt; even if your program is written in a Bash-script-like format, having advanced error handling, great runtime performance, and no &lt;code&gt;PATH&lt;/code&gt; dependencies can advantageous.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;My most popular GitHub repository, &lt;a href=&quot;https://github.com/nickgerace/gfold&quot;&gt;gfold&lt;/a&gt;, was intended to be a small application to help me learn Rust.
It does many of the same things that the &lt;code&gt;git&lt;/code&gt; CLI can do, but I still attempted to ensure that it satisfied the above two exceptions.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Fun fact: &lt;code&gt;gfold&lt;/code&gt; started in a private repository in the second half of 2019.
It was never intended to be maintained, but here we are!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;With that being said, I&apos;m writing this post because I &lt;em&gt;still&lt;/em&gt; run into the Bash-rewrite trap.&lt;/p&gt;
&lt;p&gt;Let&apos;s go back in time a bit.
I was &lt;em&gt;(read: probably still am)&lt;/em&gt; a huge Linux fanboy in high school and college.
Surfing my favorite subreddits, I was enamored with the beautiful terminals, desktop environments, and TUIs that people created and curated on Linux.&lt;/p&gt;
&lt;p&gt;I wanted to help these communities in some fashion, but I did not have any unique, helpful ideas for new software at the time.
Thus, I defaulted to wrapping my favorite CLI applications from Reddit with Python and Go code.
Most of these programs were related to networking and system monitoring, and my programs did not fundamentally bring &amp;quot;new tech&amp;quot; to the user.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I&apos;m telling you this to save yourself: do not be me, unless you are doing it for fun, or for programming exercise.
Documentation changes, unique blog posts, community involvement, etc. are much more important than writing the type of software that I did.
Arguably, even writing nonsensical software that does not execute external commands would still have been more useful (though, that&apos;s arguable).
Yet... I had fun writing some &amp;quot;useless&amp;quot; software.
Programming is fun!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;After an internship, higher-level undergraduate courses, and some industry experience, I began to write software that I believed was fundamentally &amp;quot;my own&amp;quot;.
I&apos;m not claiming that my early projects provided useful code to the world, but I believe that they were a step in the right direction.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fast forward to this past weekend:&lt;/strong&gt; I was writing a new Rust CLI application for personal use when working with &lt;a href=&quot;https://kubernetes.io/&quot;&gt;Kubernetes&lt;/a&gt; clusters, and realized that I needed the &lt;a href=&quot;https://helm.sh/&quot;&gt;Helm&lt;/a&gt; API.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Before we continue, I understand that this would have been easier to write in Go (though I adore &lt;a href=&quot;https://github.com/clux/kube-rs&quot;&gt;kube-rs&lt;/a&gt;).
My personal projects do not always make sense and often exist as programming exercises.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I &lt;em&gt;could&lt;/em&gt; generate a &lt;code&gt;helm&lt;/code&gt; crate with its &lt;code&gt;proto&lt;/code&gt; files, similar to &lt;a href=&quot;https://crates.io/crates/helm-api&quot;&gt;the crate already available&lt;/a&gt;, but this felt a little extreme for such a small CLI program.
Thus, I wrote a concise &lt;code&gt;helm&lt;/code&gt; external command library that handled various failure scenarios and wrapped the subcommands I needed.&lt;/p&gt;
&lt;p&gt;The allure of downloading files with asynchronous code and programmatically handling edge cases was immense, but it was so immense that I did not realize that I was misusing my time.
It was only after that I had the program working that the realization kicked in.
If had not be using any external commands, then it may have never kicked in.
Regardless, the following questions began to flow in:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What was this CLI application solving that my Bash scripts with &lt;code&gt;set -ex&lt;/code&gt; couldn&apos;t already do?&lt;/li&gt;
&lt;li&gt;Would my &lt;code&gt;kube-rs&lt;/code&gt; + &lt;a href=&quot;https://github.com/seanmonstar/reqwest&quot;&gt;reqwest&lt;/a&gt; implementation truly surpass what &lt;code&gt;kubectl create -f&lt;/code&gt; could do when I was going to be using other external commands anyway?&lt;/li&gt;
&lt;li&gt;Even if I did not need to execute any external commands, was this software fundamentally worth writing?&lt;/li&gt;
&lt;li&gt;Were the speed and reliability increases substantial enough to warrant writing a new program?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The answers to these questions were what you might expect:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No, but it did some things a &lt;em&gt;little&lt;/em&gt; bit better.&lt;/li&gt;
&lt;li&gt;Yes, but not in a substantial manner since I was already going to be calling &lt;code&gt;helm&lt;/code&gt; externally.&lt;/li&gt;
&lt;li&gt;Potentially, but that is a hypothetical question.&lt;/li&gt;
&lt;li&gt;If there were no external commands, then maybe?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I decided that writing a Bash script was a better use of my time.
However, I &lt;em&gt;still&lt;/em&gt; had some internal conflict over the matter.
As I said earlier, &amp;quot;I &lt;em&gt;still&lt;/em&gt; run into the Bash-rewrite trap&amp;quot;.&lt;/p&gt;
&lt;p&gt;This trap is so pervasive because it can be easily forgetten when paired with a strong desire to write performant, useful, and reliable software that has multi-platform support (when possible).
Bash scripts can be prone to human error and sometimes do not provide &lt;em&gt;any&lt;/em&gt; of the aforementioned benefits.
However, re-writing anything without provable, substantial advantages over the original implementation is usually a bad idea.&lt;/p&gt;
&lt;p&gt;Thus, I have stuck to the following mantra: do not write software that could be written in Bash unless you need multi-platform support, or you are not executing any external commands.
Obviously, the real world is messy and there&apos;s much more nuance to deciding the right tool for the job, but this mantra has generally helped me make better use of my time.&lt;/p&gt;
&lt;p&gt;Well... it has &amp;quot;generally&amp;quot; helped me.
We are here, writing this post, aren&apos;t we?&lt;/p&gt;
</content:encoded></item><item><title>There&apos;s Nothing Like Local Development</title><link>https://nickgerace.dev/posts/theres-nothing-like-local-development/</link><guid isPermaLink="true">https://nickgerace.dev/posts/theres-nothing-like-local-development/</guid><pubDate>Tue, 09 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I spent the last two months switching between hundreds of remote development environments so you don&apos;t have to.
Well... okay, maybe not &lt;em&gt;hundreds&lt;/em&gt;, but it sure felt like it.&lt;/p&gt;
&lt;p&gt;Days of long compilation times, seemingly-frequent battery drain, loud fan noise, and inconsistencies between local and production OSes led me to solve my problems with laptop-based development.
Some solutions took the form of a compromise: headless &lt;a href=&quot;https://nixos.org/&quot;&gt;NixOS&lt;/a&gt; VMs, full-GUI &lt;a href=&quot;https://getfedora.org/en/workstation/&quot;&gt;Fedora Workstation&lt;/a&gt; VMs, etc.
Other solutions were uncompromising: a physical remote workstation built with PC parts, a shared remote system with multiple laptops, etc.&lt;/p&gt;
&lt;p&gt;However, reflecting on these last two months, these &amp;quot;solutions&amp;quot; were a waste of time (kinda, sorta).
Washing away my worries with laptop-based development revealed large flaws with remote-based development that I did not take into account before my journey.
Without beating myself up too much, I &lt;em&gt;did&lt;/em&gt; try to anticipate pitfalls with my new development workflows.
In fact, I anticipated enough pitfalls that this blog post would have been titled &lt;strong&gt;&amp;quot;I&apos;m Done With Laptops&amp;quot;&lt;/strong&gt; a month ago.
It was &lt;em&gt;that&lt;/em&gt; close.&lt;/p&gt;
&lt;p&gt;So... why the sudden change?
That&apos;s a drastic transition from &lt;strong&gt;&amp;quot;#@$% Laptops&amp;quot;&lt;/strong&gt; to &lt;strong&gt;&amp;quot;There&apos;s Nothing Like Local Development&amp;quot;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Spoiler alert: It&apos;s complicated.&lt;/p&gt;
&lt;h2&gt;Remotely Similar Definitions&lt;/h2&gt;
&lt;p&gt;I&apos;d like to help us both get through this blog post, so let&apos;s modify some established definitions to make this journey as smooth as possible.
These definitions are only valid within this blog post.
You can think of them like pre-pending your Bash and Zsh variables with &lt;code&gt;local&lt;/code&gt;, or defining a variable within a scope, or... uh... just ignore me, actually.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;Remote&amp;quot; development refers to not only &lt;em&gt;actual&lt;/em&gt; remote development environments, such as physical servers and cloud-based VMs, but also to &lt;em&gt;internal&lt;/em&gt; development environments that reside on/above the host OS.
&lt;ul&gt;
&lt;li&gt;For instance, &lt;a href=&quot;https://docs.microsoft.com/en-us/windows/wsl/install-win10&quot;&gt;WSL2&lt;/a&gt; can feel like a native development environment, but the architecture leverages a minimal VM, and a lot of networking tricks, to make it feel like one (e.g. accessing a WSL2-based webserver via localhost in your Windows 10 browser without manual configuration).&lt;/li&gt;
&lt;li&gt;WSL2 would count as a &amp;quot;remote&amp;quot; development environment with this definition.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&amp;quot;Native&amp;quot; or &amp;quot;local&amp;quot; development refers to writing software directly on the host OS, or running a VM on something like &lt;a href=&quot;https://www.proxmox.com/&quot;&gt;Proxmox&lt;/a&gt; or &lt;a href=&quot;https://www.vmware.com/products/esxi-and-esx.html&quot;&gt;ESXi&lt;/a&gt;.
&lt;ul&gt;
&lt;li&gt;The reason why VMs on Proxmox, ESXi, etc. get a pass over WSL2 VMs is because they are the lowest level OS for feasible/realistic daily development. With WSL2, you have the &lt;em&gt;option&lt;/em&gt; to develop natively on Windows 10.&lt;/li&gt;
&lt;li&gt;Although, using a Proxmox or ESXi VM from another system counts as &amp;quot;remote development&amp;quot;. I never promised this would make sense.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I wanted to be internally consistent when evaluating remote versus local development environments, so these definitions helped me decide what makes me happiest and most productive.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TLDR&lt;/strong&gt;: if I can open a laptop lid (or boot a desktop with a monitor), open my editor/IDE and web browser, and get straight to work without any further configuration, it is probably a local development environment.
If I have to mount a filesystem, use SSH, change networking options, or download a remote extension for my editor/IDE, it is probably a remote development environment.&lt;/p&gt;
&lt;h2&gt;Virtual Machines: The &amp;quot;Remote&amp;quot; Software Approach&lt;/h2&gt;
&lt;p&gt;I use a variety of development environments for my personal workflow/setup, so we are going to focus solely on the professional side of things.
These environments needed to facilitate writing and building containerized services in Go, and deploying those services to a local Kubernetes cluster via &lt;a href=&quot;https://helm.sh/&quot;&gt;Helm&lt;/a&gt;.
That&apos;s a fairly low barrier to entry, especially since nearly all of my work is spent in userspace, Go programs are statically compiled, and that using &lt;a href=&quot;https://github.com/k3s-io/k3s&quot;&gt;k3s&lt;/a&gt; and &lt;a href=&quot;https://github.com/rancher/k3d&quot;&gt;k3d&lt;/a&gt; makes local cluster management easy.&lt;/p&gt;
&lt;p&gt;This journey started when I wanted to revisit dedicated, headless, development Linux VMs on macOS desktops.
That desire arose from the following thoughts...&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;Using Docker in a Linux VM would be better than using Docker Desktop.&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;I miss using Linux for daily work.&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;I will be able to use &lt;code&gt;systemd&lt;/code&gt; for deploying &lt;code&gt;k3s&lt;/code&gt;, use kernel-specific libraries and services, and work closer to where Rancher apps will actually live in production.&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Yes, these thoughts were only &lt;em&gt;tangentially&lt;/em&gt; related to my local development frustrations, but I thought using a Linux VM may indirectly solve at least &lt;em&gt;some&lt;/em&gt; problems.&lt;/p&gt;
&lt;p&gt;I had NixOS on my list of Linux distributions to try for nearly a year, and with &lt;a href=&quot;https://twitter.com/theprincessxena&quot;&gt;@theprincessxena&lt;/a&gt;&apos;s, &lt;a href=&quot;https://twitter.com/mitchellh&quot;&gt;@mitchellh&lt;/a&gt;&apos;s, and &lt;a href=&quot;https://twitter.com/dave_universetf&quot;&gt;@dave_universetf&lt;/a&gt;&apos;s recommendations, I began to use NixOS in my daily workflow.&lt;/p&gt;
&lt;p&gt;Actually, using a NixOS VM was arguably my most successful &amp;quot;remote&amp;quot; development environment.
The reproducible builds are very important when using NixOS Unstable for the latest packages, even though I never encountered a single breakage.
Other than &lt;a href=&quot;https://silverblue.fedoraproject.org&quot;&gt;Fedora Silverblue&lt;/a&gt;, I had never felt more confident in using a Linux distribution.
The stability and consistency are addicting.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What about Nix directly on macOS?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Before using NixOS, I tried Nix with &lt;a href=&quot;https://github.com/nix-community/home-manager&quot;&gt;home-manager&lt;/a&gt; on macOS.
This setup was very effective, and it rivaled using &lt;a href=&quot;https://brew.sh/&quot;&gt;homebrew&lt;/a&gt; with a manual &lt;a href=&quot;https://wiki.archlinux.org/index.php/Dotfiles&quot;&gt;dotfiles&lt;/a&gt; setup.
However, Nix creates a new &lt;a href=&quot;https://en.wikipedia.org/wiki/Apple_File_System&quot;&gt;APFS&lt;/a&gt; volume called &lt;code&gt;Nix Store&lt;/code&gt;, which can be undesirable if you only intend to use Nix in a limited capacity.
It would be incorrect to call Nix &amp;quot;invasive&amp;quot;, but it is definitely &amp;quot;involved&amp;quot; since it requires more setup than a traditional package manager.
Thus, I recommend trying Nix with &lt;code&gt;home-manager&lt;/code&gt; in a VM, Linux or macOS, before using Nix directly on your desktop.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sounds great, right?
Yes, but I never realized how integral &lt;a href=&quot;https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard&quot;&gt;FHS-compliance&lt;/a&gt; was to my daily workflow. Sure, there were issues when using the &lt;a href=&quot;https://code.visualstudio.com/docs/remote/remote-overview&quot;&gt;Visual Studio Code Remote Extension&lt;/a&gt;...&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;% strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX
strings: &apos;/usr/lib64/libstdc++.so.6&apos;: No such file
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;...but these can be remedied by mounting (&amp;quot;sharing&amp;quot;) the guest OS&apos;s filesystem with the host OS.&lt;/p&gt;
&lt;p&gt;The bigger problems arose when varying projects and applications relied on &lt;code&gt;PATH&lt;/code&gt; to function properly.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Please, let&apos;s discuss alternatives to the &lt;code&gt;PATH&lt;/code&gt; concept at a different time.
I can hear you &lt;s&gt;cheering&lt;/s&gt; screaming!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Bottom line&lt;/strong&gt;: I needed to be able to clone project repositories with minimal tweaking to get &lt;a href=&quot;https://www.gnu.org/software/make/&quot;&gt;make&lt;/a&gt; targets to work.
You might find this ironic, given the length of this post, but I decided that configuring symlinks, generating FHS-compliant configurations for NixOS, etc. would be too time-consuming for my daily development workflow.&lt;/p&gt;
&lt;p&gt;It&apos;s worth noting that I &lt;em&gt;adored&lt;/em&gt; NixOS for rapid teardown/setup environments and production deployments.
Definitely going to keep an eye on the NixOS community and project moving forward.&lt;/p&gt;
&lt;p&gt;After NixOS, I tried some old favorites again in a VM: &lt;a href=&quot;https://archlinux.org/&quot;&gt;Arch&lt;/a&gt;, &lt;a href=&quot;https://ubuntu.com/&quot;&gt;Ubuntu&lt;/a&gt;, &lt;a href=&quot;https://en.opensuse.org/Portal:Tumbleweed&quot;&gt;openSUSE Tumbleweed&lt;/a&gt; and, of course, &lt;a href=&quot;https://getfedora.org/&quot;&gt;Fedora&lt;/a&gt;.
From what I recall, Arch had the most usage due its fast package manager, rolling release model, and that &lt;a href=&quot;https://aur.archlinux.org/packages/gfold/&quot;&gt;one of my projects was (and still is) in the AUR&lt;/a&gt; (thanks &lt;a href=&quot;https://twitter.com/orhunp_&quot;&gt;@orhunp_&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Before we continue into distro madness, I&apos;ll remind myself that this post is not about Linux distributions.
It&apos;s about why &lt;strong&gt;&amp;quot;There&apos;s Nothing Like Local Development&amp;quot;&lt;/strong&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I am also &lt;em&gt;pretty tired&lt;/em&gt; of talking about Linux distros, and would much rather talk about other things.
Yeah... apologies, folks.
It&apos;s not you, and it&apos;s not me either.&lt;/p&gt;
&lt;p&gt;*glares in &lt;a href=&quot;https://reddit.com/r/unixporn&quot;&gt;r/unixporn&lt;/a&gt;*&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;However, NixOS was worth diving into because the reproducible builds are very unique in comparison to macOS and many other Linux distributions.
Yet, the uniqueness ends there.
My experiences with the headless NixOS VM shared many similarities to headless VMs running my &amp;quot;old favorites&amp;quot;.
The guest VM approach exacerbated battery drain, fan noise, and compile-time issues on the laptop, regardless of the distribution.
Running the virtual machine, alongside all the tooling and extensions required to interact with the guest VM from the host OS, was not an ideal solution to my problems.&lt;/p&gt;
&lt;p&gt;Moreover, revisiting the &amp;quot;old favorites&amp;quot; reminded me that non-headless VMs (e.g. full-GUI, even with only a window manager) were not preferable.
While full-GUI VMs solve some issues encountered with headless VMs, they exacerbate my frustrations with local laptop development on the laptop even further.
Not to mention, there were drawbacks &lt;em&gt;unique&lt;/em&gt; to this approach: hindered font rendering, using multiple web browsers (host and guest), and general resource wastefulness from running a full-GUI.&lt;/p&gt;
&lt;p&gt;At this point, I had realized that the benefits of using a Linux VM did not justify including it in my daily workflow.
There was no tangible benefit to having a &amp;quot;remote&amp;quot; Linux VM directly running on my host OS.
If I needed a real Linux kernel, I could use &amp;quot;hypervisors as a service&amp;quot;, like &lt;a href=&quot;https://www.vagrantup.com/&quot;&gt;Vagrant&lt;/a&gt;, &lt;a href=&quot;https://www.virtualbox.org/&quot;&gt;VirtualBox&lt;/a&gt;, &lt;a href=&quot;https://developer.apple.com/documentation/hypervisor&quot;&gt;Hypervisor&lt;/a&gt; frontends, etc. at a moment&apos;s notice.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In fact, using desktop Linux would even further defeat the purpose of a &amp;quot;pet&amp;quot; Linux VM for full-time development.
As a reminder, this Linux VM workflow experiment was conducted with a company-provided MacBook Pro.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Then it hit me: what if I could get the benefits of a dedicated, development, headless Linux environment while eliminating the detriments of using a laptop for development?
What if there was a &lt;em&gt;separate box&lt;/em&gt; that I could access via SSH, &lt;a href=&quot;https://en.wikipedia.org/wiki/Virtual_Network_Computing&quot;&gt;VNC&lt;/a&gt;, and &lt;a href=&quot;https://cockpit-project.org/&quot;&gt;Cockpit&lt;/a&gt;?
Folks, I might as well have discovered fire because it was time to build a remote development workstation.&lt;/p&gt;
&lt;h2&gt;Workstations: The &amp;quot;Remote&amp;quot; Hardware Approach&lt;/h2&gt;
&lt;p&gt;The parts arrived days later.
With a Noctua CPU cooler in hand, it was time to benchmark ridiculously fast compilation times while generating noise in an entirely different room of my apartment.
After weighing a few Linux distributions, I installed &lt;a href=&quot;https://getfedora.org/en/server&quot;&gt;Fedora Server&lt;/a&gt; on the newly built system and got moving.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Side Story on Ethernet Drivers&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;There was &lt;a href=&quot;https://ask.fedoraproject.org/t/realtek-ethernet-not-working-on-32/8143/7&quot;&gt;an issue with the 2.5G Realtek ethernet port&lt;/a&gt; on my Z490 motherboard.
This was patched in Linux 5.9, but the Fedora Server 33 ISO came with kernel 5.8.
Yes, there were many reasonable ways to fix this, but I used my Pixel 4&apos;s USB-C tethering to deliver an internet connection to the system because it made me laugh.
After a &lt;code&gt;dnf upgrade --refresh&lt;/code&gt; and &lt;code&gt;sudo reboot&lt;/code&gt;, the system successfully connected to the internet over ethernet with a 5.10 kernel.
Got to love Linux.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Much like the NixOS VM, this development approach seemed perfect at first.
I could use a VPN to access my home network, and access my remote workstation easily.
The compilation times were &lt;em&gt;that fast&lt;/em&gt;, and my laptop became &lt;em&gt;much quieter&lt;/em&gt; than ever before.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Why not use a cloud provider and let them handle the hardware?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Something like a DigitalOcean Droplet or an Amazon EC2 instance would be enticing, but the recurring cost of a moderately powerful VM would be too high for daily development.
I use VMs from cloud providers for persistent services, different platforms when I need them, and for ease of use during development.
Requesting and decommissioning cloud VMs, depending on project, time of day, and time of year is &lt;em&gt;much&lt;/em&gt; more cost-efficient than reserving a powerful VM persistently.
Moreover, reduced compilation times are an unnecessarily expensive goal in the cloud when you have a moderately powerful laptop.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;However, the issues began to reveal themselves over time.
Managing a remote system alongside your laptop increases your sysadmin workload by 100% (&lt;em&gt;which is also true for the aforementioned guest VM approach&lt;/em&gt;).
Yes, an &lt;code&gt;upgrade + reboot&lt;/code&gt; with your favorite package manager was all you usually need to do, but networking is where things got tricky.
Managing SSH keys was easy, but wrangling &lt;a href=&quot;https://firewalld.org/&quot;&gt;firewalld&lt;/a&gt; and setting up automation on my MacBook Pro proved to be doable -- albeit time-consuming.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;I just want to generate and look at these docs using localhost and &lt;a href=&quot;https://gohugo.io/&quot;&gt;Hugo&lt;/a&gt;&amp;quot;.&lt;/p&gt;
&lt;p&gt;&amp;quot;Oh no big deal.
Just use &lt;a href=&quot;https://ngrok.com/&quot;&gt;ngrok&lt;/a&gt;, change this &lt;a href=&quot;https://www.redhat.com/en/topics/linux/what-is-selinux&quot;&gt;SELinux&lt;/a&gt; policy, ensure that CSS is being forwarded from &lt;code&gt;localhost&lt;/code&gt;, and you are good to go!
Also, don&apos;t forget to stop your docs webserver or &lt;code&gt;ngrok&lt;/code&gt; service.
If you&apos;re not using &lt;code&gt;SELinux&lt;/code&gt;, you have even less work!
You now only have to worry about your system&apos;s firewall settings, latency between systems, and-&amp;quot;&lt;/p&gt;
&lt;p&gt;&amp;quot;Or... I could just execute &lt;code&gt;make run&lt;/code&gt; on my laptop...&amp;quot;&lt;/p&gt;
&lt;p&gt;&amp;quot;Yeah... or that.&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The issues with my remote workstation were never matters of ability, but matters of feasibility.
It was never the case that using &lt;code&gt;k3d&lt;/code&gt; via SSH was meaningfully different than using it on my laptop&apos;s host OS.
Networking edge cases when using the remote system became more apparent when actual &amp;quot;remote&amp;quot; hardware came into the mix, rather than just using a guest VM on the laptop.&lt;/p&gt;
&lt;p&gt;Speaking of which, &lt;a href=&quot;https://neovim.io/&quot;&gt;neovim&lt;/a&gt; and &lt;a href=&quot;https://github.com/tmux/tmux&quot;&gt;tmux&lt;/a&gt; only took me so far, and &lt;a href=&quot;https://www.jetbrains.com/go/&quot;&gt;GoLand&lt;/a&gt;&apos;s remote extension proved to be useful, but not as useful as using a local filesystem.
Thus, it was time to try &lt;a href=&quot;https://osxfuse.github.io/&quot;&gt;macFUSE&lt;/a&gt; with &lt;a href=&quot;https://github.com/libfuse/sshfs&quot;&gt;SSHFS&lt;/a&gt; to mount the remote filesystem for development.&lt;/p&gt;
&lt;p&gt;I stepped back and paused... this a lot of effort to work with a remote system.
I reminded myself: battery drain, long compilation times, and fan noise were my primary drivers for this journey.
I was still determined, but it was time to think about this physical server-like approach differently: what if I only used VNC, RDP, &lt;a href=&quot;https://github.com/neutrinolabs/xrdp&quot;&gt;XRDP&lt;/a&gt;, or &lt;a href=&quot;https://www.nomachine.com/&quot;&gt;NoMachine&lt;/a&gt; and avoided networking issues altogether?&lt;/p&gt;
&lt;p&gt;LOL... that didn&apos;t work either.
I not only tried some of my favorite Linux desktop distributions; I even tried Windows 10 Pro with WSL2 over RDP.
The problem is that while the laptop was quieter and ran smoother than ever, the visual degradation and network latency were severe with a remote desktop environment.
Native, local performance is unbeatable for GUI applications, full stop.
Over SSH, the threshold for manageable lag is &lt;em&gt;much&lt;/em&gt; higher than over protocols like VNC.
The latency would be passable in a pinch, but not for 40 hours per week.
Thus, pushing a full-desktop environment remotely quickly became unappealing.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Why not use the workstation locally?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is a reasonable question.
For some full-time, self-employed &amp;quot;open-sourcers&amp;quot;, this might be the right approach to daily development.
For me, I only wish to sign into company services and applications from the company-provided laptop.
I would rather take one laptop over one workstation in this context.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If these compounding issues were not enough, the environmental impact of this setup began to become more and more apparent.
Would I have to keep this system on 24/7 when traveling?
What if there was an outage?
Is this a waste of hardware given how infrequently I actually compile and run my code?
Of course, the power usage would be minimal with average US electricity prices, but I began to view this remote workstation as &amp;quot;wasteful&amp;quot;, nonetheless.&lt;/p&gt;
&lt;p&gt;Alright, well, what about going back to VMs?
Virtual machine platforms provide directory sharing with the host, port forwarding via NAT, and other solutions that make &amp;quot;remote&amp;quot; work easier.
However, I am still managing &lt;em&gt;another&lt;/em&gt; system in a full-time capacity with this approach.
Even though guest VMs strike a compromise between truly remote systems and native/local environments, setup and maintenance are still required for daily use -- even if the impact is minimal.&lt;/p&gt;
&lt;p&gt;It was at this point that I realized that, over &lt;em&gt;two months&lt;/em&gt;, I spent too much free time tweaking/trying these setups on weeknights and weekends.
The intention was to write code.
The intention was to clone and test open source projects.
The intention was to spend time on developer productivity and happiness.&lt;/p&gt;
&lt;p&gt;Well, I lost the plot.
I learned a lot, but admitted to myself that this experiment was a failure.
That&apos;s okay!
I was fine with that admission, yet... I &lt;em&gt;needed&lt;/em&gt; to figure out what happened.
Where did the original intentions slip?&lt;/p&gt;
&lt;h2&gt;Local Development Happiness&lt;/h2&gt;
&lt;p&gt;Let&apos;s step back and look at my primary issues with local development on a laptop:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Long compilation times&lt;/li&gt;
&lt;li&gt;Fan noise&lt;/li&gt;
&lt;li&gt;Battery drain&lt;/li&gt;
&lt;li&gt;Inconsistencies between host OS and production OS&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You might have noticed something throughout this post: I did not include the &lt;em&gt;frequency&lt;/em&gt; at which I hit these issues anywhere.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How often do I actually compile code?&lt;/li&gt;
&lt;li&gt;How often do the fans actually get loud? (without the snarky answers for specific applications)&lt;/li&gt;
&lt;li&gt;How often does battery drain actually matter at a desk or table with a power outlet nearby?&lt;/li&gt;
&lt;li&gt;How practical is it to match your local OS with the OS your services use in production, and how often am I using kernel-specific features?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My answers to these questions included the phrases: &amp;quot;not often&amp;quot;, &amp;quot;not practical&amp;quot;, and &amp;quot;not realistic&amp;quot;.
Granted, these &lt;em&gt;are&lt;/em&gt; absolutely valid complaints for local development on a laptop.
Every one of my solutions tried to answer at least one of these questions, if not all of them sometimes.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A note on matching local and production OSes&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When I say &amp;quot;inconsistencies between local and production OSes&amp;quot;, I do not explicitly mean writing Linux-specific software on a non-Linux desktop OS.
Runtime testing is important, but it is entirely valid to cross-compile when possible and create VMs on the fly, depending on the use case.&lt;/p&gt;
&lt;p&gt;I firmly believe that choosing a host OS should be based on productivity and happiness rather than architectural proximity to your production environment.
If your productivity and happiness are derived from using an Ubuntu Desktop for developing apps that are deployed on Ubuntu Server, that is entirely valid.
There is a measure benefit in matching both environments.
On the other hand, unless development is platform-locked, like iOS application development, choosing your desktop OS does not have to be driven by your production environment.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Things I took for granted with local development became apparent over the past two months.
My dotfiles, editor, IDE, browser, and command-line apps all live  on my laptop now -- just like before this experiment began.
I love having everything in one place.&lt;/p&gt;
&lt;p&gt;I took native desktop and CLI applications for granted.
Docker Desktop may demand a lot from my host system, but the ability to execute &lt;code&gt;docker run&lt;/code&gt; and &lt;code&gt;k3d cluster create&lt;/code&gt;, and to access everything I need to on &lt;code&gt;localhost&lt;/code&gt; without any additional configuration, is an experience that &amp;quot;remote&amp;quot; development cannot match for me.&lt;/p&gt;
&lt;p&gt;Of course, I still need create S3 buckets and EC2 instances in the cloud, but they are only &lt;em&gt;extensions&lt;/em&gt; of my daily development workflow.
These things are nothing that &lt;a href=&quot;https://github.com/rancher/rke&quot;&gt;rke&lt;/a&gt; or &lt;a href=&quot;https://www.terraform.io/&quot;&gt;terraform&lt;/a&gt; cannot solve.&lt;/p&gt;
&lt;p&gt;Regardless, I had to remind myself that the &lt;a href=&quot;https://insights.stackoverflow.com/survey/2020#technology-developers-primary-operating-systems&quot;&gt;majority of developers use Windows 10&lt;/a&gt; and, most likely, only have access to one device: a laptop.
I was hyper-optimizing a development workflow that is simply an impossibility for many folks in the world to access.
Even at 45W or 15W, a new Core i5/i7/i9, Ryzen 5/7/9, or M1 processor will absolutely excel for the vast majority of software development.
When you do need that heavy lifting, the local workstation or cloud provider service can suffice, but how often do &lt;em&gt;most&lt;/em&gt; developers need that muscle?&lt;/p&gt;
&lt;p&gt;The battery will drain, the fans will spin, and the compile times will be &amp;quot;long&amp;quot; (read: not really), but the ease of use and accessibility will be front and center for local development, which are essential to the software development experience.
At the end of the day, maximizing my time writing code, collaborating with co-workers, blogging, and researching new projects, and minimizing my time managing my system and &amp;quot;solving&amp;quot; lower priority issues are what make me happy and productive.&lt;/p&gt;
&lt;p&gt;For all of these reasons, I returned to local development with my company-provided MacBook Pro.
It&apos;s what I continue to use now, during the workday.
My local development preference remains the same, regardless of the OS.
If the company-provided laptop becomes a &lt;a href=&quot;https://system76.com/&quot;&gt;System76&lt;/a&gt; Lemur Pro or a Microsoft Surface Laptop 3, I&apos;ll still be focused on writing code directly on the host OS of the physical device.&lt;/p&gt;
&lt;p&gt;This post is a self-reflection in developer priority management and identifying pitfalls when optimizing my workflow.
However, I&apos;m also not going to dunk on myself: the motivations behind the experiment were clear and well-founded.
I want to do the best work I can, as efficiently as I can, and with as much developer happiness as possible.&lt;/p&gt;
&lt;p&gt;This was a learning experience, and it&apos;s one that I&apos;m happy with its conclusion.
I hope that my experiences, self-owns, and ramblings helped convey my message: &lt;strong&gt;&amp;quot;There&apos;s Nothing Like Local Development&amp;quot;&lt;/strong&gt;.&lt;/p&gt;
</content:encoded></item><item><title>How I Read &quot;The Rust Programming Language&quot;</title><link>https://nickgerace.dev/posts/how-i-read-the-rust-programming-language/</link><guid isPermaLink="true">https://nickgerace.dev/posts/how-i-read-the-rust-programming-language/</guid><pubDate>Wed, 19 Aug 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;With &lt;a href=&quot;https://rustconf.com/&quot;&gt;RustConf 2020&lt;/a&gt; coming tomorrow, I want to tell folks about how I have been &amp;quot;re-reading&amp;quot; &lt;a href=&quot;https://doc.rust-lang.org/book/&quot;&gt;&lt;em&gt;The Rust Programming Language&lt;/em&gt;&lt;/a&gt;.
Affectionately known as &amp;quot;The Book&amp;quot;, this resource is the ultimate guide on how to get started with the Rust programming language.
You can buy it at almost any storefront, or view it online for free.&lt;/p&gt;
&lt;p&gt;This post is aimed primarily at Rust beginners, and people who want to develop a deeper understanding of the language.
Much like studying for exams, there are efficient ways to use your time, and uh... inefficient ways (read: playing Destiny 2)... to use your time.&lt;/p&gt;
&lt;p&gt;Everyone has their own learning preferences and requirements, but I&apos;d like to share a method that worked for me.
It&apos;s my hope that it may work for other folks reading this as well.&lt;/p&gt;
&lt;p&gt;But first, let&apos;s talk about why I am bothering with this.
The resulting perspective may provide some insight into why I chose this method, and how you may relate to that experience.&lt;/p&gt;
&lt;h2&gt;Motivation&lt;/h2&gt;
&lt;p&gt;After an &amp;quot;okay-ish&amp;quot; first pass (nearly a year ago), I tried editing, compiling, and using different projects throughout the ecosystem.
My goal was to use trivial, Rust-based, software on a daily basis before I dove deeper.&lt;/p&gt;
&lt;p&gt;I eventually created a &lt;a href=&quot;https://github.com/nickgerace/gfold&quot;&gt;&lt;em&gt;gfold&lt;/em&gt;&lt;/a&gt;, a small, command-line application, as my first public foray into Rust.
I polished the pet project, and proceeded to check out, edit, and compile, several well-known projects afterwards.
Everything was rolling smoothly early on.&lt;/p&gt;
&lt;p&gt;Well, months later, I wanted to shift my focus towards larger, non-trivial projects.
I decided to double down and try (read: faceplant) to become an intermediate, or expert, user of the language.&lt;/p&gt;
&lt;p&gt;Even though I primarily work in userspace, the promise of a non-garbage collected language, without the pitfalls of traditional memory management, is &lt;em&gt;vital&lt;/em&gt; to my interests.
As cloud-native circles look into edge compute, and IoT, I believe that Rust is already beginning to play a major role in their ecosystems.&lt;/p&gt;
&lt;p&gt;The language&apos;s &lt;a href=&quot;https://www.rust-lang.org/community&quot;&gt;community&lt;/a&gt; is also incredible.
The amount of mentors, Discord groups, and people supporting each other is... yeah, incredible.
I hope that future tech circles use this community as a blueprint going forward.&lt;/p&gt;
&lt;p&gt;For all of those reasons and more, I decided to return to &amp;quot;The Book&amp;quot; to internalize the fundamentals of the language.&lt;/p&gt;
&lt;h2&gt;The Method&lt;/h2&gt;
&lt;p&gt;This strategy revolves around writing a crate (code that can be compiled into a binary, or library, in Rust) for every section of every chapter.
While this might seem as rudimentary as writing some Bash and Make code, I actually leverage &lt;a href=&quot;https://doc.rust-lang.org/cargo/&quot;&gt;Cargo&lt;/a&gt;, Rust&apos;s package manager, for the entire repository.&lt;/p&gt;
&lt;p&gt;The goal is to have as little friction as possible between writing down notes/code, and reading the book.
Even in a world of beautiful tablets and stylus/pencil devices, many opt for pencil and paper.
Whether its for muscle memory, force of habit, accessibility, or just to get eyes off the screen, there are undeniable benefits to pencil and paper that technology has not (and may never) be able to implement.&lt;/p&gt;
&lt;p&gt;To reduce friction as much as possible, I opted to write (type) down my chapter notes as comments &lt;em&gt;within&lt;/em&gt; the &amp;quot;section crates&amp;quot; themselves.
This system allows me to co-locate my notes with my Rust code, and learn a bit extra about Cargo along the way.
It also keeps me on the keyboard, either writing code or taking notes in the same files.&lt;/p&gt;
&lt;p&gt;That&apos;s enough theory-crafting though.
Time to get started!&lt;/p&gt;
&lt;h2&gt;1. Setting Up The Repository&lt;/h2&gt;
&lt;p&gt;You can use the version control system of your choice, but for those looking for guidance, I recommend using the following resources...&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.blog/2019-01-07-new-year-new-github&quot;&gt;GitHub Private Repositories&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://desktop.github.com/&quot;&gt;GitHub Desktop&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;GitHub offers unlimited, free, private repositories for individual users.
Since you most likely do not want to &amp;quot;learn out loud&amp;quot; with a public repository, toggling this feature is key.&lt;/p&gt;
&lt;p&gt;For those new to the Git CLI, GitHub Desktop is a nice GUI for smaller, solo projects, like ours.
While I recommend learning the CLI, I wanted to add an accessible option that folks have enjoyed using in the past.&lt;/p&gt;
&lt;p&gt;Finally, if we are using Git, we have to make sure that we do not commit unwanted files.
Create a file named &lt;code&gt;.gitignore&lt;/code&gt; at the base of your repository, and write the following to it...&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Generated by Cargo. These sub-directories will contain compiled files and executables.
**/debug/
**/target/

# More information on Cargo.lock: https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html
**/Cargo.lock

# These are backup files generated by rustfmt.
**/*.rs.bk
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You may notice that this is nearly identical to &lt;a href=&quot;https://github.com/github/gitignore/blob/master/Rust.gitignore&quot;&gt;GitHub&apos;s default Rust .gitignore file&lt;/a&gt;.
That &lt;code&gt;.gitignore&lt;/code&gt; file is great for a single crate repository.
However, our file contains a few modifications to work with our repository.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;**/debug/&lt;/code&gt; and &lt;code&gt;**/target/&lt;/code&gt; directories contain our executables and related artifacts, while the &lt;code&gt;Cargo.lock&lt;/code&gt; file contains the &lt;a href=&quot;https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html&quot;&gt;&lt;em&gt;exact&lt;/em&gt; information about our crate&apos;s dependencies&lt;/a&gt;.
Since we are building many sub-crates, we need to make sure that our generated artifacts do not get committed.
We solve this by prepending the double-asterisk string, and... we are done (so far).&lt;/p&gt;
&lt;h2&gt;2. Setting Up Your Editor&lt;/h2&gt;
&lt;p&gt;With that file created, and the repository set up, let&apos;s catch ourselves a break in advance, and set up our favorite editor for success.
I recommend setting up the following...&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/rust-analyzer/rust-analyzer&quot;&gt;Rust Analyzer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;A TOML file plug-in or extension&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Rust Analyzer is an incredibly good compiler frontend for the language.
It provides best-in-class support for writing Rust code in your preferred editor.
While I use it with &lt;a href=&quot;https://neovim.io/&quot;&gt;Neovim&lt;/a&gt;, you can use it with most popular editors, and IDEs.
For folks without a favorite, I recommend &lt;a href=&quot;https://code.visualstudio.com/&quot;&gt;VS Code&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Support for TOML does not come by default in all editors.
Since we use the format frequently with &lt;code&gt;Cargo.toml&lt;/code&gt;, I recommend installing a reputable plug-in, or extension, when working with Rust.
I prefer to use &lt;a href=&quot;https://vimawesome.com/plugin/vim-toml&quot;&gt;vim-toml&lt;/a&gt; (also, with Neovim).&lt;/p&gt;
&lt;h2&gt;3. The Virtual Manifest&lt;/h2&gt;
&lt;p&gt;This is where we begin to learn a little bit about Cargo before even reading &amp;quot;The Book&amp;quot;.
Let&apos;s take a look at the following excerpt from the Cargo documentation:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;Alternatively, a Cargo.toml file can be created with a [workspace] section but without a [package] section.
This is called a virtual manifest.
This is typically useful when there isn&apos;t a &amp;quot;primary&amp;quot; package, or you want to keep all the packages organized in separate directories.&amp;quot;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://doc.rust-lang.org/cargo/reference/workspaces.html&quot;&gt;Cargo documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;While &lt;code&gt;Cargo.toml&lt;/code&gt; files are typically used for simple dependency management in your single crate repositories, they can do &lt;em&gt;so&lt;/em&gt; much more.
For our use case, we need to have a &amp;quot;meta&amp;quot; &lt;code&gt;Cargo.toml&lt;/code&gt; file to manage our sub-crates in a workspace.
Specifically, we need a &amp;quot;virtual manifest&amp;quot;, as mentioned above.&lt;/p&gt;
&lt;p&gt;&amp;quot;What does this do for us?&amp;quot;
Glad you asked.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cargo fmt
cargo build --verbose
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Running the above commands in the base of this repository will format, and compile, the code of every sub-crate in one fell swoop.
For your first sub-crates, I recommend using Cargo (and rustc) as &amp;quot;The Book&amp;quot; intends, but after the early tutorials, you can switch to using the virtual manifest.&lt;/p&gt;
&lt;p&gt;Before we continue, we have to edit our &lt;code&gt;Cargo.toml&lt;/code&gt; to find all of our sub-crates in the repository.
Create the file, and write the following to it...&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[workspace]
members = [
    &amp;quot;ch*/*&amp;quot;
]
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;Non-beginners: do not accidentally include &amp;quot;package&amp;quot;, as we need this to be &lt;a href=&quot;https://doc.rust-lang.org/cargo/reference/workspaces.html&quot;&gt;virtual manifest&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&apos;ve already given away the naming pattern, but the key here is that we want to keep a consistent scheme.
We don&apos;t necessarily &lt;em&gt;need&lt;/em&gt; to, but we do this so that we do not have to edit this file again.&lt;/p&gt;
&lt;h2&gt;4. Creating Sub-Crates&lt;/h2&gt;
&lt;p&gt;This section is a little more straightforward.
Our naming scheme, hinted at in the virtual manifest, leads Cargo to look for all base directories beginning with &lt;code&gt;ch&lt;/code&gt;, and target all crates within those directories.
For this to work, we need to make sure that our sub-crates maintain the same scheme.&lt;/p&gt;
&lt;p&gt;Cargo offers a sub-command that scaffolds a crate for the user.
A crate can either be compiled to a binary (default), or a library, specified by the &lt;code&gt;--lib&lt;/code&gt; flag.
Ultimately, the choice will depend on the specific section&apos;s requirements, and code block examples.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir ch01-name
cd ch01-name
cargo new ch01-s01-section-one-name
cargo new --lib ch01-s02-section-two-name
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The above Bash commands can be translated to your preferred GUI workflow.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mkdir&lt;/code&gt; : creates a new directory (folder), which stores all sub-crates for a specific chapter.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cd&lt;/code&gt; : changes the current working directory (current folder) to make sure that we create our sub-crates in the right place.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, within every sub-crate, we can take notes within our new &lt;code&gt;.rs&lt;/code&gt; files, and our &lt;code&gt;Cargo.toml&lt;/code&gt; file.
It&apos;s all co-located, and compilable from one location.
Pretty cool!&lt;/p&gt;
&lt;h2&gt;5. Keeping a boilerplate.txt File&lt;/h2&gt;
&lt;p&gt;Nothing here is dangerous, but misusing a &lt;code&gt;boilerplate.txt&lt;/code&gt; file can lead to bad programming practices, and code hygiene.
I am going to be 100% clear: &lt;strong&gt;do not use the following macros without knowing what they do, and why they exist&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&amp;quot;Whoa, what&apos;s a macro? Why are you telling me all this?&amp;quot;
Do not worry!
&amp;quot;The Book&amp;quot; will teach you all about macros, give some examples, and recommend some best practices.
For now, I&apos;ll give some examples of macros to (not hastily) paste at the top of our &lt;code&gt;.rs&lt;/code&gt; files.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Here&apos;s the thing:&lt;/em&gt; many sections will often reuse variables, or not use those variables at all after showing them in the code block examples.
It can be annoying to have clogged STDOUT from compiler warnings when you are trying to follow these examples.
This is to no fault of the book authors (love you &lt;a href=&quot;https://twitter.com/carols10cents&quot;&gt;Carol&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/steveklabnik&quot;&gt;Steve&lt;/a&gt;, and all other contributors!).
We leverage it as housekeeping that comes along with using our learning methodology.
Essentially, our goal is to minimize compiler warning clutter when we purposefully want to ignore warnings.&lt;/p&gt;
&lt;p&gt;As I mentioned earlier in this post, the key to this method is minimize friction when taking notes and learning.
Therefore, I recommend keeping a &lt;code&gt;boilerplate.txt&lt;/code&gt; file handy, which should contain useful macros for de-cluttering your STDOUT.
Here are some examples...&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#![allow(dead_code)]
#![allow(unused_imports)]  
#![allow(unused_variables)]  
#![allow(unused_assignments)]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I &lt;em&gt;strongly&lt;/em&gt; recommend encountering frequent warning clutter &lt;em&gt;first&lt;/em&gt; before using these macros.
All of my warnings aside, I get a lot of use out of my pet &lt;code&gt;boilerplate.txt&lt;/code&gt; at the base of my repository.
It works well, and keeps me moving from section to section.&lt;/p&gt;
&lt;h2&gt;6. Continuous Integration (Bonus)&lt;/h2&gt;
&lt;p&gt;With our learning environment ready to go, you might have noticed that this project can be cleanly translated into your favorite CI system.
This step is optional, but for those familiar with GitHub Actions, Travis CI, CircleCI, etc., it might be worth implementing here.&lt;/p&gt;
&lt;p&gt;This code is not continuously deployed, nor is it (most likely) in use by anyone other than you.
I believe that you can forgo using a CI pipeline here, and save on the compute cost.
However, I still wanted to mention the option.&lt;/p&gt;
&lt;h2&gt;Read On!&lt;/h2&gt;
&lt;p&gt;I hope that this method works for (at least some) newcomers and aspiring intermediate/expert users alike.
Please let me know what you think, and how this method works out for you!&lt;/p&gt;
&lt;p&gt;I&apos;m looking forward to all the new friends joining the Rust community in the time following RustConf 2020.
Have fun reading &lt;em&gt;The Rust Programming Language&lt;/em&gt;, whether it&apos;s for the first or one hundredth time, and catch you at the conference!&lt;/p&gt;
</content:encoded><category>Guides</category><category>Rust</category></item><item><title>Why I Use Fedora</title><link>https://nickgerace.dev/posts/why-i-use-fedora/</link><guid isPermaLink="true">https://nickgerace.dev/posts/why-i-use-fedora/</guid><pubDate>Fri, 22 May 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Let&apos;s talk about why I use Fedora... among many other Linux distributions.&lt;/p&gt;
&lt;p&gt;Cue the dramatic music and dim lights: it&apos;s October 2018.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the 28th: &lt;a href=&quot;https://newsroom.ibm.com/2018-10-28-IBM-To-Acquire-Red-Hat-Completely-Changing-The-Cloud-Landscape-And-Becoming-Worlds-1-Hybrid-Cloud-Provider&quot;&gt;IBM to Acquire Red Hat&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;the 30th: &lt;a href=&quot;https://fedoramagazine.org/announcing-fedora-29/&quot;&gt;Announcing the Release of Fedora 29&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Busy week, huh?
Ironically, it was the week that I began to use Fedora Workstation for the first time (in earnest).
I chose Fedora that week just because it was the &amp;quot;next one on the list&amp;quot;... and because of a headline that I&apos;ll go over later.&lt;/p&gt;
&lt;p&gt;I&apos;ve &lt;a href=&quot;https://www.reddit.com/r/DistroHopping/&quot;&gt;&amp;quot;distro hopped&amp;quot;&lt;/a&gt; for years before that.
In fact, I still do.
Yet, there&apos;s just &lt;em&gt;something&lt;/em&gt; about Fedora that has kept it my rotation from Fedora 29 to Fedora 32, which recently released a few weeks ago.&lt;/p&gt;
&lt;p&gt;Fedora is a community-driven, Red Hat sponsored, Linux desktop-oriented distribution.
I&apos;ve been driving it on at least one bare metal machine or VM (Workstation and Server) since Fedora 29, which equates to about a bit over a year and half of daily usage.&lt;/p&gt;
&lt;p&gt;Honest feelings?
I&apos;ve generally loved my time with it.&lt;/p&gt;
&lt;p&gt;In my opinion, transparent biases make for a better review of a product, service, application, etc.
Knowing that a music reviewer prefers novelty over cultural influence, or that a laptop reviewer prefers keyboard quality to screen (panel) quality over thermal design, can provide a consistent and clear frame of reference to the reader or viewer.&lt;/p&gt;
&lt;p&gt;However, I&apos;m not formally reviewing my experience with Fedora 29, 30, 31, and (so far) 32.
This is more of a reflection of what Fedora does for me that other Linux distributions do not.&lt;/p&gt;
&lt;p&gt;For transparency&apos;s sake and quality assurance, I&apos;ll kick this off with the following: I value well-designed, high quality software before Free and Open Source Software (FOSS).&lt;/p&gt;
&lt;p&gt;Blasphemy!
Alright, fair.
Let me explain: a substantial portion of my &amp;quot;well-designed, high quality&amp;quot; software of choice is FOSS.
However, my aforementioned preference has been a primary driver in using a MacBook Pro throughout college, and running Windows 10 on my gaming PC.&lt;/p&gt;
&lt;p&gt;That&apos;s not to say that open source and open standard technologies are not important to me.
In fact, I believe that they will continue to displace proprietary solutions.&lt;/p&gt;
&lt;p&gt;Kubernetes is one prominent example.
The open standard ISA, &lt;a href=&quot;https://en.wikipedia.org/wiki/RISC-V&quot;&gt;RISC-V&lt;/a&gt;, and the open firmware platform, &lt;a href=&quot;https://www.coreboot.org/&quot;&gt;coreboot&lt;/a&gt; may be blueprints for the future.
Open source software is getting better, and growing, quickly.&lt;/p&gt;
&lt;p&gt;What&apos;s unique about Fedora to me compared to other Linux distributions is how it threads the needle while retaining a consistent vision and focus.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&amp;quot;Fedora Workstation is a polished, easy to use operating system for laptop and desktop computers, with a complete set of tools for developers and makers of all kinds.&amp;quot;&lt;/em&gt; -&lt;a href=&quot;https://getfedora.org/&quot;&gt;getfedora.org&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Under the leadership of &lt;a href=&quot;https://twitter.com/mattdm&quot;&gt;Matthew Miller&lt;/a&gt;, the awesome teams behind Fedora, and its great community, this distribution has streamlined itself in recent years.
Sure, the &lt;a href=&quot;https://getfedora.org/en/coreos&quot;&gt;Fedora CoreOS&lt;/a&gt; project and &lt;a href=&quot;https://silverblue.fedoraproject.org/&quot;&gt;Fedora Silverblue&lt;/a&gt; projects present unique opportunities, but they differentiate themselves by &lt;em&gt;use cases&lt;/em&gt;, not &lt;em&gt;desktop spins&lt;/em&gt;.
(Although, you can choose different, unofficial desktop spins if you would like.)&lt;/p&gt;
&lt;p&gt;I like my desktop to work out of the box.
A singular, consistent vision for desktop design is very important to me.
Of course, I&apos;ve loved my time with window managers like i3 and Sway, as well as desktop environments like KDE and XFCE, but consistency and focus in a distribution are important for &lt;em&gt;me&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Do my preferences dismiss distributions, like Arch Linux?
No, actually.
Arch&apos;s KISS design is prevalent and well-explained through its &lt;a href=&quot;https://wiki.archlinux.org/&quot;&gt;extensive wiki&lt;/a&gt;.
Customization is &lt;em&gt;part&lt;/em&gt; of its design.
Thus, I really like using that distribution when it makes sense for me.&lt;/p&gt;
&lt;p&gt;However, &lt;em&gt;when using a laptop&lt;/em&gt;, my preferences become much more picky.
I sway towards having extensive hardware support, enterprise presence in the upstream distribution (and/or packages), and a singular vision at the GUI-level.
This generally leaves me with distributions like Ubuntu, Pop!_OS, and, of course, Fedora.
I have great things to say about those distributions, but I have unique and specific reasons for using Fedora.&lt;/p&gt;
&lt;p&gt;Ubuntu&apos;s Dash to Dock integration is welcoming to users of all kinds.
Pop!_OS&apos; Pop Shell is a power user&apos;s dream.
I&apos;m actually writing this from a system running Pop!_OS 20.04.&lt;/p&gt;
&lt;p&gt;Yet... I admire the Fedora team&apos;s insistence on using vanilla GNOME.&lt;/p&gt;
&lt;p&gt;Fedora 29 was the first Linux distribution where I felt like I didn&apos;t have to install GNOME Tweaks (Tweak Tool) in order to be comfortable with GNOME.
I opened the settings, chose some preferences, and went to work.&lt;/p&gt;
&lt;p&gt;From the Fedora team&apos;s close working relationship with the GNOME team, I have confidence that new releases of the desktop environment will integrate nicely with the distribution underneath.
To be clear, I don&apos;t hold lesser confidence in other distributions in delivering quality releases, but the partnership between the Fedora team and the GNOME team gives me &lt;em&gt;that&lt;/em&gt; much more confidence in my OS.&lt;/p&gt;
&lt;p&gt;This vanilla nature extends to the rest of the operating system.
The &lt;a href=&quot;https://fedoraproject.org/wiki/Is_Fedora_For_Me&quot;&gt;&amp;quot;Is Fedora For Me?&amp;quot;&lt;/a&gt; page highlights commitments to keeping upstream pure, providing sustainable updates, and upholding advancements in FOSS.&lt;/p&gt;
&lt;p&gt;We will get to FOSS later, but let&apos;s talk about upstream and everyday usage.&lt;/p&gt;
&lt;p&gt;TLP can often be a necessity for &amp;quot;Linux on the laptop&amp;quot; users.
When the news broke that &lt;a href=&quot;https://www.omgubuntu.co.uk/2018/02/better-battery-life-on-fedora-linux&quot;&gt;TLP was no longer needed for Fedora users&lt;/a&gt;, the distribution immediately caught my attention.
Flicker-free boot shipped with Fedora 29.
Your hardware&apos;s OEM logo flashed on the screen, just like Ubuntu 20.04 LTS does now.&lt;/p&gt;
&lt;p&gt;I noticed the &amp;quot;quality of life&amp;quot; changes more and more as I used Fedora.
Over time, I began to see them appear in other distributions.
A lot of changes that eventually reach most distributions start with Fedora.
Even between 6 month releases, updates occur frequently.&lt;/p&gt;
&lt;p&gt;Well, wait...
What about stability?&lt;/p&gt;
&lt;p&gt;I&apos;ve mentioned the partnership between the GNOME team and Fedora team above, and I think that trend extends into many other components of the distribution.
Teamwork doesn&apos;t ensure quality, but it most definitely helps.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Red Hat sponsorship&lt;/li&gt;
&lt;li&gt;Kernel contributors following Linus Torvalds&apos; lead in using Fedora&lt;/li&gt;
&lt;li&gt;Rapid systemd updates&lt;/li&gt;
&lt;li&gt;Frequent kernel updates&lt;/li&gt;
&lt;li&gt;A good balance between a completely static 6 month release-model, and a rolling release-model&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A clear vision, good frameworks for teamwork, and a balanced release cycle are what make Fedora stand out amongst other distributions.&lt;/p&gt;
&lt;p&gt;As far as my personal beliefs go, Ubuntu and Pop!_OS actually align more closely to them than Fedora does.
If Nvidia&apos;s proprietary driver is well-designed and significantly better than the FOSS alternative, I&apos;ll use it.
Would I prefer the open source alternative, if it was nearly as performant and consistent?
Sure, but that is not always the case.&lt;/p&gt;
&lt;p&gt;May folks reading this may feel strongly about FOSS, and I &lt;em&gt;highly&lt;/em&gt; respect that.
Fortunately, Fedora does as well.
&lt;a href=&quot;https://fedoraproject.org/wiki/Is_Fedora_For_Me&quot;&gt;&amp;quot;Do you care about sustainable progress in software freedom and innovation?&amp;quot;&lt;/a&gt;
This distribution does not ship with non-proprietary software.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Note: I&apos;m unsure if there is an edge case, but AFAIK, it&apos;s FOSS-friendly for legal and idealistic reasons&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Personally, I use RPMFusion and install packages, like multimedia codecs, to get the &amp;quot;best&amp;quot; (subjective-ish) software I can.
While the Fedora project holds FOSS as fundamental value, their documentation helps users &lt;a href=&quot;https://docs.fedoraproject.org/en-US/quick-docs/setup_rpmfusion/&quot;&gt;interested in RPMFusion&lt;/a&gt;.
This process is entirely optional too.&lt;/p&gt;
&lt;p&gt;I&apos;m just happy that I can enjoy a Fedora release alongside 100% FOSS-driven users.&lt;/p&gt;
&lt;p&gt;I cannot cover everything, nor will I try to compare and contrast my experiences using Fedora to using other distributions.
Trying to draw lines between your motivations and the software you use is... actually more difficult than you would think.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;Why do you use &lt;code&gt;&amp;lt;tool&amp;gt;&lt;/code&gt;?&amp;quot;&lt;/p&gt;
&lt;p&gt;&amp;quot;I dunno. My professor thought it was dope.&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Maybe, I&apos;ll do a post on other distributions in the future.
It depends on how much time my significant other and I play Animal Crossing together.&lt;/p&gt;
&lt;p&gt;However, it&apos;s my hope that this post laid out why I use Fedora, and why you might as well.
I recommend trying out every distribution in this post, but when in doubt... give Fedora a try!&lt;/p&gt;
</content:encoded></item></channel></rss>