<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Abubakar's Blog]]></title><description><![CDATA[Associate Cloud Architect at Tkxel with 15+ years in IT & telecom. Azure Solutions Architect Expert, DevOps Engineer Expert, Microsoft Certified Trainer (MCT), and Terraform Associate — holding 25+ certifications across Azure, .NET, and DevOps.

I write about cloud architecture, CI/CD pipelines, Infrastructure as Code, and modern DevOps practices. Currently leading a team of 10 Azure cloud engineers, building IaC standards with Terraform & Bicep, and integrating observability with OpenTelemetry and Grafana.

Subscribe to my LinkedIn newsletter "Think you know DevOps?" for curated insights: https://www.linkedin.com/newsletters/7440660160471281665/

Portfolio: https://abubakarriaz.com.pk]]></description><link>https://blog.abubakarriaz.com.pk</link><generator>RSS for Node</generator><lastBuildDate>Mon, 20 Apr 2026 11:47:01 GMT</lastBuildDate><atom:link href="https://blog.abubakarriaz.com.pk/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[I Procrastinated My Website Redesign for Years, Claude Fixed It in 30 Minutes]]></title><description><![CDATA[I’d been putting off a redesign of my personal site for years. It worked—Jekyll + GitHub Pages, Markdown content—but visually it was flat. Every time I considered a UI refresh, I imagined hours of wre]]></description><link>https://blog.abubakarriaz.com.pk/claude-code-jekyll-ui-upgrade-30-minutes</link><guid isPermaLink="true">https://blog.abubakarriaz.com.pk/claude-code-jekyll-ui-upgrade-30-minutes</guid><category><![CDATA[claude-code]]></category><category><![CDATA[jekyll]]></category><category><![CDATA[GitHubPages]]></category><category><![CDATA[UI]]></category><category><![CDATA[AI]]></category><category><![CDATA[portfolio]]></category><dc:creator><![CDATA[Abubakar Riaz]]></dc:creator><pubDate>Thu, 12 Mar 2026 06:38:12 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/63d35865b157410d87d9a58b/b3c055a0-8dd7-4cea-aa44-52a889f708e2.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I’d been putting off a redesign of my personal site for years. It worked—Jekyll + GitHub Pages, Markdown content—but visually it was flat. Every time I considered a UI refresh, I imagined hours of wrestling with layouts and CSS.</p>
<p>Then I tried something different: I opened Claude Code. Thirty minutes later, my site had a proper UI/UX layout, new templates, and a cleaner structure—all built in a feature branch and deployed automatically.</p>
<p>Here’s exactly how it happened, what surprised me about AI usage limits, and why this workflow matters for any developer.</p>
<hr />
<h2>The Stack &amp; The Goal</h2>
<ul>
<li><p><strong>Jekyll</strong> + <strong>GitHub Pages</strong></p>
</li>
<li><p>Content in Markdown</p>
</li>
</ul>
<p>Great for simplicity and static hosting, but without deliberate design work you end up with a blog, not a polished site.<br />Goal: Transform the Markdown-driven site into a structured UI/UX layout <strong>without</strong> changing the underlying architecture.</p>
<hr />
<h2>The Workflow (Step by Step)</h2>
<h3>1. Initialize Claude in the Repo</h3>
<p>Inside my GitHub Pages repo, I initialized Claude Code. It generated a <code>claude.md</code> file—a context contract describing structure, guidelines, and boundaries.</p>
<img src="https://cdn.hashnode.com/uploads/covers/63d35865b157410d87d9a58b/c08ffaa4-e1da-4c2a-a6d7-37e0f5feef58.png" alt="" style="display:block;margin:0 auto" />

<h3>2. Create a Safe Workspace</h3>
<p>Before any edits, I switched to a feature branch:</p>
<pre><code class="language-bash">git checkout -b feature/ui-upgrade
</code></pre>
<p>Branch isolation is mandatory when an AI agent can modify many files.</p>
<img src="https://cdn.hashnode.com/uploads/covers/63d35865b157410d87d9a58b/ac9d21cb-c027-4608-bf8d-d1fed95ec8d3.png" alt="" style="display:block;margin:0 auto" />

<h3>3. The Prompt: “Upgrade the UI/UX”</h3>
<p>I kept it simple. No long design specs. Claude responded by generating new layout templates, improved navigation, and structured HTML—transforming the site from basic Markdown pages into a real layout.</p>
<p><em>before</em></p>
<img src="https://cdn.hashnode.com/uploads/covers/63d35865b157410d87d9a58b/2e63fe66-a484-4146-976a-6f8133649bba.gif" alt="" style="display:block;margin:0 auto" />

<p><em>after</em></p>
<img src="https://cdn.hashnode.com/uploads/covers/63d35865b157410d87d9a58b/f7bc5f39-2e9f-4728-9f62-2f43a997d680.gif" alt="" style="display:block;margin:0 auto" />

<h3>4. Test Locally (with AI‑Assisted Debugging)</h3>
<p>I asked Claude how to test locally. It gave the Jekyll commands. When my environment threw missing dependency errors, I fed them back to Claude—it diagnosed and provided the exact install steps.</p>
<img src="https://cdn.hashnode.com/uploads/covers/63d35865b157410d87d9a58b/0e549f56-4446-4789-8f7b-4dbad5ed3f2d.png" alt="" style="display:block;margin:0 auto" />

<p>Once dependencies were installed:</p>
<pre><code class="language-bash">bundle exec jekyll serve
</code></pre>
<p>The upgraded UI rendered perfectly.</p>
<h3>5. Expand the Changes</h3>
<p>With confidence high, I asked Claude to apply the new UI structure to other pages and update related templates. It modified multiple files in minutes—multi-file refactoring at AI speed.</p>
<img src="https://cdn.hashnode.com/uploads/covers/63d35865b157410d87d9a58b/b0aeb9ff-a1f0-4afa-b952-4948f6facbff.png" alt="" style="display:block;margin:0 auto" />

<h3>6. Create the Pull Request &amp; Deploy</h3>
<p>Claude prepared the PR from the feature branch to <code>main</code>. After a quick visual review, I merged it. GitHub Pages automatically rebuilt and deployed the site.</p>
<img src="https://cdn.hashnode.com/uploads/covers/63d35865b157410d87d9a58b/2ae9cf3c-2153-4539-8eea-2b175b0da001.png" alt="" style="display:block;margin:0 auto" />

<hr />
<h2>The Result</h2>
<p>In under 30 minutes, I finally had the UI-driven site I’d delayed for years.</p>
<p><strong>Live site:</strong> <a href="https://abubakarriaz.com.pk">abubakarriaz.com.pk</a><br /><strong>Repo:</strong> <a href="https://github.com/mabubakarriaz/mabubakarriaz.github.io">mabubakarriaz/mabubakarriaz.github.io</a></p>
<hr />
<h2>A Critical Observation: Token Consumption</h2>
<p>This entire workflow consumed <strong>92% of my daily Claude Pro usage</strong>—with only three prompts and one UI transformation. Why? Because each prompt involved massive context: reading files, generating code, updating multiple components.</p>
<p><strong>Takeaway:</strong> AI-assisted development isn’t about prompt count; it’s about context size. Be aware of token limits when doing large-scale refactoring.</p>
<img src="https://cdn.hashnode.com/uploads/covers/63d35865b157410d87d9a58b/224bf0c0-486a-442e-8ac3-1f8339db2f7f.png" alt="" style="display:block;margin:0 auto" />

<hr />
<h2>The Bigger Realization</h2>
<p>The bottleneck is no longer the code—it’s whether you’ve integrated AI into your workflow. Casual experimentation won’t move the needle. The real productivity shift happens when AI becomes part of your actual development process: repos, CI, documentation, refactoring.</p>
<p><strong>My advice:</strong> Pick one tool (Claude Code, Copilot, Cursor, etc.) and start using it on real work. The learning curve only happens inside your projects.</p>
<hr />
<h2>Final Thought</h2>
<p>What felt like a multi-hour task became a 30-minute workflow. That’s the shift we’re entering: software development moving from manual construction to AI-augmented engineering. Engineers who adapt will build faster and ship more. The rest will still be thinking about redesigning their website.</p>
<hr />
<p><em>Check out the live site and repo above—and if you have questions about the workflow, feel free to open an issue or reach out.</em></p>
<hr />
<p><strong>Enjoyed this post?</strong> Here's how to stay connected:</p>
<ul>
<li><p>Subscribe to my LinkedIn newsletter <a href="https://www.linkedin.com/newsletters/7440660160471281665/">Think you know DevOps?</a> for curated insights on cloud &amp; DevOps</p>
</li>
<li><p>Check out my full portfolio at <a href="https://abubakarriaz.com.pk">abubakarriaz.com.pk</a></p>
</li>
<li><p>Connect with me on <a href="https://www.linkedin.com/in/mabubakarriaz">LinkedIn</a> or <a href="https://github.com/mabubakarriaz">GitHub</a></p>
</li>
</ul>
<p><strong>Got questions or thoughts?</strong> Drop a comment below — I read and reply to every one.</p>
]]></content:encoded></item><item><title><![CDATA[Stop Hand-Crafting Test Data — Automate It With Bogus in C#]]></title><description><![CDATA[If you’ve ever spent more time writing fake users, orders, or sample records than building features — you’re not alone. Generating reliable, realistic dummy data manually is tedious, error-prone, and ]]></description><link>https://blog.abubakarriaz.com.pk/stop-hand-crafting-test-data-automate-it-with-bogus-in-c</link><guid isPermaLink="true">https://blog.abubakarriaz.com.pk/stop-hand-crafting-test-data-automate-it-with-bogus-in-c</guid><category><![CDATA[C#]]></category><category><![CDATA[dummy-data]]></category><category><![CDATA[.NET]]></category><category><![CDATA[Faker C#]]></category><category><![CDATA[seed-data]]></category><dc:creator><![CDATA[Abubakar Riaz]]></dc:creator><pubDate>Tue, 24 Feb 2026 11:13:45 GMT</pubDate><content:encoded><![CDATA[<p>If you’ve ever spent more time writing fake users, orders, or sample records than building features — you’re not alone. Generating reliable, realistic dummy data manually is tedious, error-prone, and gets in the way of shipping software. Enter <strong>Bogus</strong> — a .NET native fake data generator inspired by <em>faker.js</em> that lets you declaratively define data rules and spin up thousands of realistic records in seconds. (<a href="https://github.com/bchavez/Bogus?utm_source=chatgpt.com">GitHub</a>)</p>
<hr />
<h2>🧪 Why Bogus Is the Best Choice for Dummy Data in .NET</h2>
<p><strong>Bogus</strong> is one of the most popular dummy data libraries in the .NET ecosystem:<br />✔️ <strong>C#, F#, and</strong> <a href="http://VB.NET"><strong>VB.NET</strong></a> <strong>support</strong> — integrates seamlessly with .NET apps and test projects. (<a href="https://github.com/bchavez/Bogus?utm_source=chatgpt.com">GitHub</a>)<br />✔️ <strong>Fluent rule configuration</strong> — define per-property generation logic with expressive <code>RuleFor</code> calls. (<a href="https://github.com/bchavez/Bogus?utm_source=chatgpt.com">GitHub</a>)<br />✔️ <strong>Locale-aware realistic data</strong> — names, cities, addresses, emails, GUIDs and more in many locales. (<a href="https://github.com/bchavez/Bogus?utm_source=chatgpt.com">GitHub</a>)<br />✔️ <strong>Repeatability</strong> — deterministic seed support makes tests reliably reproducible. (<a href="https://github.com/bchavez/Bogus?utm_source=chatgpt.com">GitHub</a>)</p>
<p>Compared to hand-rolled randomization or basic loops, Bogus gives:</p>
<ul>
<li><p>Consistent, human-looking values (not just random characters),</p>
</li>
<li><p>Structured object graph generation,</p>
</li>
<li><p>Plug-and-play usage with EF Core seeders and test fixtures,</p>
</li>
<li><p>Support for constraints (e.g., emails tied to names, or enums randomly assigned).</p>
</li>
</ul>
<hr />
<h2>🚀 Core Concepts — Bogus in a Nutshell</h2>
<p>At its heart, Bogus uses a <strong>fluent API</strong> to define fake data rules per property on your POCO model. You then ask it to <strong>Generate</strong> instances — either singly or in bulk.</p>
<p>Basic components:</p>
<ul>
<li><p><code>Faker&lt;T&gt;</code> – core generator for model <code>T</code></p>
</li>
<li><p><code>RuleFor()</code> – define how each property should be populated</p>
</li>
<li><p>Optional global or local <code>Randomizer.Seed</code> to make outputs repeatable</p>
</li>
</ul>
<hr />
<h2>📌 Example: Fake Orders</h2>
<p>Here’s a simple example that creates fake <code>Order</code> objects:</p>
<pre><code class="language-csharp">public class Order {
    public int OrderId { get; set; }
    public string Item { get; set; }
    public int Quantity { get; set; }
}

Randomizer.Seed = new Random(8675309);

var fruit = new[] { "apple", "banana", "orange" };

var orderFaker = new Faker&lt;Order&gt;()
    .StrictMode(true)
    .RuleFor(o =&gt; o.OrderId, f =&gt; f.IndexFaker++)  
    .RuleFor(o =&gt; o.Item, f =&gt; f.PickRandom(fruit))
    .RuleFor(o =&gt; o.Quantity, f =&gt; f.Random.Number(1, 10));

var orders = orderFaker.Generate(5);
</code></pre>
<p>Output will look like real, structured data instead of gibberish — and all in a few lines. (<a href="https://github.com/bchavez/Bogus?utm_source=chatgpt.com">GitHub</a>)</p>
<hr />
<h2>🧑‍💻 Example: Fake Users With Relationships</h2>
<p>Bogus shines when fake object graphs matter — for example, users with nested orders:</p>
<pre><code class="language-csharp">public class User {
    public int Id { get; set; }
    public string Email { get; set; }
    public string FullName { get; set; }
    public List&lt;Order&gt; Orders { get; set; }
}

var userFaker = new Faker&lt;User&gt;()
    .RuleFor(u =&gt; u.Id, f =&gt; f.IndexFaker++)
    .RuleFor(u =&gt; u.FullName, f =&gt; f.Name.FullName())
    .RuleFor(u =&gt; u.Email, (f, u) =&gt; f.Internet.Email(u.FullName))
    .RuleFor(u =&gt; u.Orders, f =&gt; orderFaker.Generate(3).ToList());

var user = userFaker.Generate();

Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(user, Formatting.Indented));
</code></pre>
<p>This generates a user and <strong>three associated orders</strong>, all realistic and test-ready. (<a href="https://github.com/bchavez/Bogus?utm_source=chatgpt.com">GitHub</a>)</p>
<hr />
<h2>🏁 Best Practices</h2>
<ul>
<li><p><strong>Use strict mode</strong> (<code>.StrictMode(true)</code>) to ensure every property has a rule. (<a href="https://github.com/bchavez/Bogus?utm_source=chatgpt.com">GitHub</a>)</p>
</li>
<li><p><strong>Local seed per faker</strong> for deterministic outputs in unit tests. (<a href="https://github.com/bchavez/Bogus?utm_source=chatgpt.com">GitHub</a>)</p>
</li>
<li><p><strong>Nest faker rules for object graphs</strong> (lists, child objects). (<a href="https://github.com/bchavez/Bogus?utm_source=chatgpt.com">GitHub</a>)</p>
</li>
<li><p>Use extensions like <strong>AutoBogus</strong> if you want automatic rule inference without enumerating every property. (<a href="https://github.com/nickdodd79/AutoBogus?utm_source=chatgpt.com">GitHub</a>)</p>
</li>
</ul>
<hr />
<h2>📦 Get Started</h2>
<p>Add the package via NuGet:</p>
<pre><code class="language-powershell">Install-Package Bogus
</code></pre>
<p>Minimum .NET Standard 1.3 support means it works from .NET Framework 4.x up through modern .NET 8+ apps. (<a href="https://github.com/bchavez/Bogus?utm_source=chatgpt.com">GitHub</a>)</p>
<hr />
<h2>🧠 Conclusion</h2>
<p>For C# developers who need realistic dummy data — for UI mockups, integration tests, or database seeds — <strong>Bogus</strong> is your best choice. Its fluent API, rich dataset generators, locale support, and deterministic options make it far superior to ad-hoc random data or simple Faker implementations. Whether you’re a beginner writing your first API or a seasoned architect designing EF Core seeders or automated tests, Bogus will save time and produce better quality data — consistently.</p>
]]></content:encoded></item><item><title><![CDATA[Stop Re-Burning ISOs: The Multi-Boot USB Trick Every Admin Should Use]]></title><description><![CDATA[Bootable USB drives are indispensable for system administrators, DevOps engineers, and homelab enthusiasts. Whether you're provisioning bare-metal servers, rebuilding lab nodes, or maintaining a fleet of workstations, having a single USB stick capabl...]]></description><link>https://blog.abubakarriaz.com.pk/stop-re-burning-isos-the-multi-boot-usb-trick-every-admin-should-use</link><guid isPermaLink="true">https://blog.abubakarriaz.com.pk/stop-re-burning-isos-the-multi-boot-usb-trick-every-admin-should-use</guid><category><![CDATA[Homelab]]></category><category><![CDATA[Ventoy]]></category><category><![CDATA[Devops]]></category><dc:creator><![CDATA[Abubakar Riaz]]></dc:creator><pubDate>Sun, 07 Dec 2025 19:13:46 GMT</pubDate><content:encoded><![CDATA[<p>Bootable USB drives are indispensable for system administrators, DevOps engineers, and homelab enthusiasts. Whether you're provisioning bare-metal servers, rebuilding lab nodes, or maintaining a fleet of workstations, having a single USB stick capable of booting multiple operating systems significantly improves efficiency.</p>
<p>Ventoy is a modern, open-source bootloader that eliminates the traditional <em>“burn ISO → reformat → burn again”</em> workflow. With Ventoy, you install the bootloader <strong>once</strong>, then simply copy ISO files to the USB drive like regular files. When you boot from the USB stick, Ventoy automatically displays a menu of all available ISOs.</p>
<p>This guide explains how to set up Ventoy on a <strong>128 GB USB drive</strong> using a <strong>Windows ThinkPad</strong>, copy <strong>Ubuntu Server</strong> and <strong>CentOS Stream</strong> ISOs to it, and finally boot and install an operating system on a <strong>Dell machine</strong> using Ventoy’s multi-boot interface.</p>
<hr />
<h2 id="heading-1-prerequisites">1. Prerequisites</h2>
<p>Before you begin, ensure you have:</p>
<ul>
<li><p>A <strong>128 GB USB thumb drive</strong> (Ventoy will reformat it)</p>
</li>
<li><p>A <strong>Windows ThinkPad</strong> (for downloading Ventoy and OS images)</p>
</li>
<li><p>A <strong>Dell system</strong> (where the installations will take place)</p>
</li>
<li><p>Internet access for downloading Ventoy and the ISOs</p>
</li>
</ul>
<hr />
<h2 id="heading-2-downloading-ventoy-on-windows">2. Downloading Ventoy on Windows</h2>
<p>Ventoy provides a Windows GUI tool, making the setup process straightforward.</p>
<ol>
<li><p>Visit the official Ventoy download page: <a target="_blank" href="https://www.ventoy.net/en/download.html">https://www.ventoy.net/en/download.html</a></p>
</li>
<li><p>Download the latest <strong>Ventoy Windows ZIP package</strong>.</p>
</li>
<li><p>Extract the ZIP file to a folder of your choice.</p>
</li>
<li><p>In the extracted directory, right-click <code>Ventoy2Disk.exe</code> and select <strong>Run as Administrator</strong>.</p>
</li>
</ol>
<p>You should now see the Ventoy installation window with your available USB devices listed.</p>
<hr />
<h2 id="heading-3-installing-ventoy-on-the-128-gb-usb-drive">3. Installing Ventoy on the 128 GB USB Drive</h2>
<p>Once Ventoy is running:</p>
<ol>
<li><p>Insert your <strong>128 GB USB drive</strong> into the ThinkPad.</p>
</li>
<li><p>Ventoy should automatically detect the device.</p>
</li>
<li><p>Verify that the correct USB disk is selected.</p>
</li>
<li><p>Click <strong>Install</strong>.</p>
</li>
<li><p>Confirm the prompts—Ventoy will <strong>format the USB</strong> and install its bootloader.</p>
</li>
</ol>
<p>When finished, your USB drive will include Ventoy’s bootloader structure along with a large exFAT partition for storing ISOs.</p>
<p>You won’t need to reinstall Ventoy unless you choose to upgrade it later.</p>
<hr />
<h2 id="heading-4-downloading-os-iso-files-ubuntu-server-amp-centos-stream">4. Downloading OS ISO Files (Ubuntu Server &amp; CentOS Stream)</h2>
<p>Next, download the required operating system images.</p>
<h3 id="heading-ubuntu-server-iso">Ubuntu Server ISO</h3>
<p>Download from the official LTS release page: <a target="_blank" href="https://ubuntu.com/download/server">https://ubuntu.com/download/server</a></p>
<h3 id="heading-centos-stream-iso">CentOS Stream ISO</h3>
<p>Download from the CentOS mirror list: <a target="_blank" href="https://www.centos.org/download/">https://www.centos.org/download/</a></p>
<p>Save both <code>.iso</code> files to your system’s Downloads folder or another preferred directory.</p>
<hr />
<h2 id="heading-5-copying-iso-files-to-the-ventoy-usb">5. Copying ISO Files to the Ventoy USB</h2>
<p>Ventoy requires no ISO conversion or special preparation.</p>
<p>To copy your ISOs:</p>
<ol>
<li><p>Open <strong>File Explorer</strong>.</p>
</li>
<li><p>Navigate to the Ventoy USB drive.</p>
</li>
<li><p>Drag and drop the ISO files (e.g., <code>ubuntu-24.04-live-server-amd64.iso</code>, <code>CentOS-Stream-9-latest-dvd1.iso</code>) onto the USB.</p>
</li>
</ol>
<p>Ventoy can display and boot dozens of ISOs as long as storage space allows. There is no limit to how many operating systems you can add.</p>
<hr />
<h2 id="heading-6-booting-a-dell-system-using-ventoy">6. Booting a Dell System Using Ventoy</h2>
<p>With your USB ready, you can now use it on the target Dell machine.</p>
<ol>
<li><p>Insert the Ventoy USB drive into the Dell system.</p>
</li>
<li><p>Power on the system.</p>
</li>
<li><p>Press <strong>F12</strong> repeatedly to open the Dell boot menu.</p>
</li>
<li><p>Select your USB device (typically listed as <em>UEFI: Ventoy</em>).</p>
</li>
<li><p>Ventoy’s boot menu will appear with all available ISOs.</p>
</li>
<li><p>Use the arrow keys to select either:</p>
<ul>
<li><p><strong>Ubuntu Server</strong></p>
</li>
<li><p><strong>CentOS Stream</strong></p>
</li>
</ul>
</li>
<li><p>Press <strong>Enter</strong> to begin the installation process.</p>
</li>
</ol>
<p>Ventoy loads the ISO directly and hands off control to the OS installer.</p>
<hr />
<h2 id="heading-7-updating-ventoy-later-optional">7. Updating Ventoy Later (Optional)</h2>
<p>Ventoy receives frequent updates. To upgrade:</p>
<ol>
<li><p>Launch <strong>Ventoy2Disk.exe</strong> again on your ThinkPad.</p>
</li>
<li><p>Insert your USB drive.</p>
</li>
<li><p>Ventoy will detect if it’s running an older version.</p>
</li>
<li><p>Click <strong>Update</strong> — the process is non-destructive, and your ISOs remain intact.</p>
</li>
</ol>
<p>Keeping Ventoy updated ensures compatibility with new OS installers and boot methods.</p>
<hr />
<h2 id="heading-8-why-ventoy-is-ideal-for-homelab-environments">8. Why Ventoy Is Ideal for Homelab Environments</h2>
<p>Ventoy is especially useful in environments where systems are regularly reinstalled or tested, including:</p>
<ul>
<li><p>Kubernetes homelabs</p>
</li>
<li><p>Hypervisor installations (Proxmox, ESXi)</p>
</li>
<li><p>Bare-metal server provisioning</p>
</li>
<li><p>Windows/Linux multi-boot experimentation</p>
</li>
<li><p>Cloud-native hardware and firmware testing</p>
</li>
</ul>
<p>With Ventoy, there is no need for repeated reformatting or “reburning” USB sticks. Just copy ISOs and boot.</p>
<hr />
<h2 id="heading-final-thoughts">Final Thoughts</h2>
<p>Using Ventoy with a 128 GB USB drive provides a flexible, portable multi-boot solution ideal for DevOps workflows, homelab setups, and repeated OS deployments. With a quick setup on your Windows ThinkPad, you can easily boot and install Ubuntu Server, CentOS Stream, or virtually any other operating system on your Dell machines.</p>
<p>This setup becomes a valuable addition to any engineer’s toolkit, especially when working across diverse operating systems and hardware platforms.</p>
]]></content:encoded></item><item><title><![CDATA[Effortless Windows Package Management: Getting Started with WinGet]]></title><description><![CDATA[Introduction
The Windows Package Manager (winget) is a robust utility from Microsoft, designed as an equivalent to Linux's apt-get. This powerful tool enables users to automate software installations and upgrades directly through the command line int...]]></description><link>https://blog.abubakarriaz.com.pk/effortless-windows-package-management-getting-started-with-winget</link><guid isPermaLink="true">https://blog.abubakarriaz.com.pk/effortless-windows-package-management-getting-started-with-winget</guid><category><![CDATA[Windows]]></category><category><![CDATA[Devops]]></category><category><![CDATA[DevOps Journey]]></category><category><![CDATA[package manager]]></category><category><![CDATA[automation]]></category><dc:creator><![CDATA[Abubakar Riaz]]></dc:creator><pubDate>Fri, 29 Dec 2023 11:40:21 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1703701335850/c1d8d522-fbdb-4ed6-acbc-ca3e48ad5701.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3 id="heading-introduction">Introduction</h3>
<p>The Windows Package Manager (winget) is a robust utility from Microsoft, designed as an equivalent to Linux's apt-get. This powerful tool enables users to automate software installations and upgrades directly through the command line interface (CLI), streamlining the process of managing applications on Windows.</p>
<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text">The winget command line tool is exclusively supported on Windows 10, version 1709 or later. Please note, Windows Server users may not be compatible with this tool.</div>
</div>

<h3 id="heading-enhanced-installation-guide">Enhanced Installation Guide</h3>
<p>I've outlined five potential methods for installing this utility. After attempting each one, verify the installation by running <code>winget --version</code> to check if it's successfully installed.</p>
<ol>
<li><p><strong>Feeling Lucky?</strong> Begin your adventure by opening PowerShell. Verify the installed version with a quick spell:</p>
<pre><code class="lang-powershell"> winget <span class="hljs-literal">-v</span>
</code></pre>
</li>
<li><p><strong>Still Riding Your Luck?</strong> Let's get straight to business. Register the package with this magical incantation:</p>
<pre><code class="lang-powershell"> <span class="hljs-built_in">Add-AppxPackage</span> <span class="hljs-literal">-RegisterByFamilyName</span> <span class="hljs-literal">-MainPackage</span> Microsoft.DesktopAppInstaller_8wekyb3d8bbwe
</code></pre>
</li>
<li><p><strong>Full Gear Method</strong> Ready for a bit more of a challenge? Brace yourself and follow these commands to add all necessary dependencies and the <code>winget</code> itself.</p>
<pre><code class="lang-powershell"> <span class="hljs-variable">$progressPreference</span> = <span class="hljs-string">'silentlyContinue'</span>
 <span class="hljs-built_in">Write-Information</span> <span class="hljs-string">"Commencing download of WinGet and its mystical dependencies..."</span>
 <span class="hljs-built_in">Invoke-WebRequest</span> <span class="hljs-literal">-Uri</span> https://aka.ms/getwinget <span class="hljs-literal">-OutFile</span> Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle
 <span class="hljs-built_in">Invoke-WebRequest</span> <span class="hljs-literal">-Uri</span> https://aka.ms/Microsoft.VCLibs.x64.<span class="hljs-number">14.00</span>.Desktop.appx <span class="hljs-literal">-OutFile</span> Microsoft.VCLibs.x64.<span class="hljs-number">14.00</span>.Desktop.appx
 <span class="hljs-built_in">Invoke-WebRequest</span> <span class="hljs-literal">-Uri</span> https://github.com/microsoft/microsoft<span class="hljs-literal">-ui</span><span class="hljs-literal">-xaml</span>/releases/download/v2.<span class="hljs-number">7.3</span>/Microsoft.UI.Xaml.<span class="hljs-number">2.7</span>.x64.appx <span class="hljs-literal">-OutFile</span> Microsoft.UI.Xaml.<span class="hljs-number">2.7</span>.x64.appx
 <span class="hljs-built_in">Add-AppxPackage</span> Microsoft.VCLibs.x64.<span class="hljs-number">14.00</span>.Desktop.appx
 <span class="hljs-built_in">Add-AppxPackage</span> Microsoft.UI.Xaml.<span class="hljs-number">2.7</span>.x64.appx
 <span class="hljs-built_in">Add-AppxPackage</span> Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle
</code></pre>
</li>
<li><p><strong>Colleague's Envy:</strong> Noticed a colleague with a working version? Sneak a peek and grab it here: <a target="_blank" href="https://github.com/microsoft/winget-cli/releases">microsoft/winget-cli</a>.</p>
</li>
<li><p><strong>Plan C (The Last Resort):</strong> If all else fails, consider this your nudge towards a clean slate. Sometimes a fresh and latest copy of Windows is the way to go. In the meantime, Microsoft suggests a simpler step: head over to the MS Store and install the <code>App Installer</code> by Microsoft. Doing so should also install the winget CLI. Find your digital lifeline <a target="_blank" href="https://apps.microsoft.com/detail/9NBLGGH4NNS1">apps.microsoft.com</a>.</p>
</li>
</ol>
<h3 id="heading-basic-commands-overview">Basic commands overview</h3>
<p>WinGet operates through a command-line interface (CLI), allowing you to search, install, upgrade, and manage packages directly from your shell.</p>
<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text">Please confirm admin access to update, add, or remove items; a User Access Control popup will appear for security verification.</div>
</div>

<pre><code class="lang-powershell">winget find &lt;myName&gt; <span class="hljs-comment"># To find the package.</span>
winget add &lt;myName&gt; <span class="hljs-comment"># Once you've located the package you want to install.</span>
winget <span class="hljs-built_in">ls</span> <span class="hljs-comment"># To see what's already installed on your system.</span>
winget update &lt;myName&gt; <span class="hljs-comment"># To upgrade an installed package.</span>
winget remove &lt;myName&gt; <span class="hljs-comment"># To uninstall an installed package.</span>
</code></pre>
<h3 id="heading-basic-usage-of-winget">Basic Usage of WinGet</h3>
<ol>
<li><p><strong>Winget Find Command</strong>: Use this command to search for specific packages. It's the first step in identifying the software or tool you need.</p>
<p> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1703840150757/9997e9c3-2585-400c-ba54-9a037989dfc3.png" alt /></p>
</li>
<li><p><strong>Winget Add Command</strong>: Ready to install a package? This command allows you to add it to your system swiftly and efficiently.</p>
<p> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1703840164220/2db6dd82-22bc-4a5d-964d-53090a39671e.png" alt /></p>
</li>
<li><p><strong>Winget List Command</strong>: Curious about what's already installed on your system? Use this command to display a list of all installed packages, helping you manage your installations.</p>
<p> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1703840176445/4221830a-096c-476b-9d82-285037eb86ca.png" alt /></p>
</li>
<li><p><strong>Winget Update Command</strong>: Keep your software up-to-date with the update command. It's essential for security and accessing the latest features.</p>
<p> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1703840188882/003b05a0-d785-4f4e-a300-3c8257b50dae.png" alt /></p>
</li>
<li><p><strong>Winget Remove Command</strong>: Need to declutter or free up space? This command allows you to remove unwanted or obsolete packages from your system.</p>
<p> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1703840198797/f1a3a00f-75e4-424c-ba40-3e860ba43b31.png" alt /></p>
</li>
</ol>
<h3 id="heading-advanced-features">Advanced Features</h3>
<p>WinGet now facilitates not only the fundamental requirements of software management but also complex scenarios tailored to advanced users. These features include the ability to install specific versions of software, maintain consistent versions across updates, and streamline the setup of new machines by exporting and importing a list of software.</p>
<ol>
<li><p><strong>Version Locking</strong></p>
<ul>
<li><code>winget pin</code>: This command prevents unwanted updates by locking a package to its current version, ensuring stability and consistency in your software suite.</li>
</ul>
</li>
</ol>
<p>    <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1703840239605/5a440c69-fbbb-43f4-8386-619b54aad762.png" alt class="image--center mx-auto" /></p>
<ol>
<li><p><strong>Exporting and Importing Packages:</strong> Streamline the replication of your environment on another machine by exporting and importing a comprehensive list of your installed packages.</p>
<ul>
<li><p><strong>Export Packages:</strong> Seamlessly create a file listing all your installed packages, complete with version details. This file can then be used to duplicate your setup elsewhere.</p>
<pre><code class="lang-powershell">  winget export -<span class="hljs-literal">-include</span><span class="hljs-literal">-versions</span> <span class="hljs-literal">-o</span> win<span class="hljs-built_in">get-packages</span>.json
</code></pre>
</li>
<li><p>Sample <code>winget-packages.json</code></p>
<pre><code class="lang-json">  {
      <span class="hljs-attr">"$schema"</span> : <span class="hljs-string">"https://aka.ms/winget-packages.schema.2.0.json"</span>,
      <span class="hljs-attr">"CreationDate"</span> : <span class="hljs-string">"2023-12-28T13:36:42.574-00:00"</span>,
      <span class="hljs-attr">"Sources"</span> : 
      [
          {
              <span class="hljs-attr">"Packages"</span> : 
              [
                  {
                      <span class="hljs-attr">"PackageIdentifier"</span> : <span class="hljs-string">"Postman.Postman"</span>,
                      <span class="hljs-attr">"Version"</span> : <span class="hljs-string">"10.21.0"</span>
                  },
                  {
                      <span class="hljs-attr">"PackageIdentifier"</span> : <span class="hljs-string">"Spotify.Spotify"</span>,
                      <span class="hljs-attr">"Version"</span> : <span class="hljs-string">"1.2.14"</span>
                  },
                  {
                      <span class="hljs-attr">"PackageIdentifier"</span> : <span class="hljs-string">"RARLab.WinRAR"</span>,
                      <span class="hljs-attr">"Version"</span> : <span class="hljs-string">"6.22.0"</span>
                  }
              ],
              <span class="hljs-attr">"SourceDetails"</span> : 
              {
                  <span class="hljs-attr">"Argument"</span> : <span class="hljs-string">"https://cdn.winget.microsoft.com/cache"</span>,
                  <span class="hljs-attr">"Identifier"</span> : <span class="hljs-string">"Microsoft.Winget.Source_8wekyb3d8bbwe"</span>,
                  <span class="hljs-attr">"Name"</span> : <span class="hljs-string">"winget"</span>,
                  <span class="hljs-attr">"Type"</span> : <span class="hljs-string">"Microsoft.PreIndexed.Package"</span>
              }
          }
      ],
      <span class="hljs-attr">"WinGetVersion"</span> : <span class="hljs-string">"1.6.3482"</span>
  }
</code></pre>
</li>
<li><p><strong>Import Packages:</strong> Effortlessly set up a new machine or restore your setup by importing the package list you've exported.</p>
<pre><code class="lang-powershell">  winget import <span class="hljs-literal">-i</span> win<span class="hljs-built_in">get-packages</span>.json
</code></pre>
</li>
</ul>
</li>
</ol>
<hr />
<h3 id="heading-conclusion">Conclusion</h3>
<p>Windows Package Manager (winget) is a robust tool that significantly simplifies the process of managing software on Windows systems. By automating the mundane tasks of software management, it frees up time and reduces the complexities involved in maintaining your system. As you become more familiar with its commands and features, you'll find it an indispensable tool in your Windows environment, whether you're a DevOps Engineer, system administrator, or just a developer looking to streamline your setup.</p>
<p><strong>Next Steps:</strong></p>
<ul>
<li><p><a target="_blank" href="https://devblogs.microsoft.com/commandline/">Windows Command Line Blogs</a> Regularly visit 'commandline' section to remain informed about the latest updates, features, and community insights concerning the winget CLI.</p>
</li>
<li><p><a target="_blank" href="https://learn.microsoft.com/en-us/windows/package-manager/">Package Manager - Microsoft Learn</a> By diving into the available resources, you'll uncover a multitude of ways WinGet can streamline and enhance your software management practices. Start exploring now to unlock the full potential of WinGet in your development workflow!</p>
</li>
</ul>
]]></content:encoded></item></channel></rss>