# Scott Hanselman

Scott Hanselman's Thoughts on Programming, Technology, Fatherhood, and Life

This is one page of public article previews, not the complete archive. Follow Next page to continue. Summaries are not the original full articles.

## Debugging my new network, when 10 Gigabit Ethernet Runs at 300 Megabits

DevFeed: [Debugging my new network, when 10 Gigabit Ethernet Runs at 300 Megabits](<https://devfeed.tech/articles/debugging-my-new-network-when-10-gigabit-ethernet-runs-at-300-megabits-21852.md>)

Original publisher: [Read original article](<https://www.hanselman.com/blog/debugging-my-new-network-when-10-gigabit-ethernet-runs-at-300-megabits>)

Published: 2026-08-27T15:25:48Z

Content type: article

Language: en

Sources: [Scott Hanselman](<https://devfeed.tech/sources/scott-hanselman.md>)

Topics: [Homelab](<https://devfeed.tech/topics/homelab.md>), [debugging](<https://devfeed.tech/topics/debugging.md>), [UniFi UNAS Pro](<https://devfeed.tech/topics/unifi-unas-pro.md>), [intel](<https://devfeed.tech/topics/intel.md>), [Windows](<https://devfeed.tech/topics/windows.md>), [NVMe](<https://devfeed.tech/topics/nvme.md>)

Tags: [debugging](<https://devfeed.tech/tags/debugging.md>), [homelab](<https://devfeed.tech/tags/homelab.md>), [intel](<https://devfeed.tech/tags/intel.md>), [musings](<https://devfeed.tech/tags/musings.md>), [nvme](<https://devfeed.tech/tags/nvme.md>), [smb](<https://devfeed.tech/tags/smb.md>), [ssd](<https://devfeed.tech/tags/ssd.md>), [storage](<https://devfeed.tech/tags/storage.md>), [unifi-unas-pro](<https://devfeed.tech/tags/unifi-unas-pro.md>), [windows](<https://devfeed.tech/tags/windows.md>)

### AI overview

A Windows desktop connected to a 10GbE homelab network was limited to roughly 100-200 megabits per second despite 10-gigabit link indications. Direct testing traced the problem to the Windows/NIC path: increasing the Intel E610 driver's receive buffers eliminated discarded packets and improved receive throughput, while disabling IPv4 Large Send Offload V2 raised transmit throughput to 7.03 Gbit/sec.

### Source excerpt

I've been moving my home storage over to a UniFi UNAS Pro 8 as part of a larger homelab moderization. My main IRONHEART (the ultimate PC from a few years back) desktop now has an Intel E610-XT2 10GbE card, the NAS is on 10GbE, and there's a Minisforum MS-01 miniPC on the same network with a 10GbE SFP+ connection running Immich and Portainer and a few other things. Everything says 10 gigabit. Windows says 10 gigabit. UniFi says 10 gigabit. SMB copies are using the correct NIC but my file copies are running at around 100 to 200 megabits per second which is sad making. Naturally, I blamed the NAS, and the spinning rust within. The UNAS has six 16 TB spinning disks in RAID 6 and a pair of NVMe SSDs being used as cache. I'm also running Immich on the MS-01, with its photo library living on the UNAS, so there are lots of thumbnails, metadata reads, and little background writes happening. All seem like reasonable suspects. I switched the UNAS SSD cache from read-write to read-only. No meaningful difference. I stopped Immich completely. No difference. I looked at iostat; the disks weren't saturated. We looked at SMB signing and Windows Defender network scanning. Still slow. Then I stopped testing the NAS and ran iperf3 directly between the Windows desktop and the MS-01: iperf3 -c 192.168.1.222 -P 4 133 Mbit/sec Oops. The reverse test was better, but still wrong: iperf3 -c 192.168.1.222 -P 4 -R 1.33 Gbit/sec That's weird. Now the disks, SMB, Immich, RAID, and the NAS itself were completely out of the equation. This was a Windows/NIC problem and it's weirdly asymmetrical. Looking at the Intel adapter statistics shows me... Get-NetAdapterStatistics -Name "Ethernet - 10 Gig Intel" There were nearly a million ReceivedDiscardedPackets. During one ten-second iperf3 test, the counter increased by another 268. Why? The E610 driver had its receive buffers at the default 512, although it supported up to 4096. I increased them. I love an increased buffer. Set-NetAdapterAdvancedProperty

## Migrating a Synology NAS to a UniFi UNAS Pro 8 with Robocopy and SMB Multichannel

DevFeed: [Migrating a Synology NAS to a UniFi UNAS Pro 8 with Robocopy and SMB Multichannel](<https://devfeed.tech/articles/migrating-a-synology-nas-to-a-unifi-unas-pro-8-with-robocopy-smb-multichannel-and-surprising-performance-traps-21855.md>)

Original publisher: [Read original article](<https://www.hanselman.com/blog/migrating-a-synology-nas-to-a-unifi-unas-pro-8-with-robocopy-smb-multichannel-and-surprising-performance-traps>)

Published: 2026-08-23T19:23:42Z

Content type: tutorial

Language: en

Sources: [Scott Hanselman](<https://devfeed.tech/sources/scott-hanselman.md>)

Topics: [migration](<https://devfeed.tech/topics/migration.md>), [UniFi UNAS Pro](<https://devfeed.tech/topics/unifi-unas-pro.md>), [Synology](<https://devfeed.tech/topics/synology.md>), [Filesystems](<https://devfeed.tech/topics/filesystems.md>), [Windows](<https://devfeed.tech/topics/windows.md>), [Network](<https://devfeed.tech/topics/network.md>)

Tags: [files](<https://devfeed.tech/tags/files.md>), [filesystem](<https://devfeed.tech/tags/filesystem.md>), [migration](<https://devfeed.tech/tags/migration.md>), [multichannel](<https://devfeed.tech/tags/multichannel.md>), [musings](<https://devfeed.tech/tags/musings.md>), [nas](<https://devfeed.tech/tags/nas.md>), [network](<https://devfeed.tech/tags/network.md>), [performance](<https://devfeed.tech/tags/performance.md>), [smb](<https://devfeed.tech/tags/smb.md>), [synology](<https://devfeed.tech/tags/synology.md>), [synology-nas](<https://devfeed.tech/tags/synology-nas.md>), [unas](<https://devfeed.tech/tags/unas.md>), [unifi](<https://devfeed.tech/tags/unifi.md>), [unifi-unas](<https://devfeed.tech/tags/unifi-unas.md>), [unifi-unas-pro](<https://devfeed.tech/tags/unifi-unas-pro.md>), [windows](<https://devfeed.tech/tags/windows.md>)

### AI overview

A personal technical account of migrating files from a Synology NAS to a Ubiquiti UniFi UNAS Pro 8. It describes SMB-based copying with Windows and Robocopy, file-transfer errors, Windows error 665, and troubleshooting that isolates a filesystem limitation on the UNAS.

### Source excerpt

I've had a Synology NAS for a very long time, and recently I started moving its contents to a new Ubiquiti UniFi UNAS Pro 8. This seemed like it ought to be a fairly boring operation. Both devices speak SMB, I have a fast network (recently upgraded to 10 gigabit internally), and Windows has had tools for copying files reliably between machines for decades. Naturally, it turned into a whole evening of learning things I thought I already knew, which is why I started a blog lol. There was a nice bit of history here for me because back in 2007 (good lord!) I wrote a post called "XCopy considered harmful - Robocopy or XXCopy or SyncBack." My argument at the time was basically that once you are moving enough files, Explorer stops being the move and Robocopy starts looking pretty good. I even used /Z, Robocopy's restartable mode, because being able to resume a partially transferred file was useful on unreliable connections. Almost twenty years later, /Z turned out to be one of the most important things I needed to remove because it made everything hella slow. The migration The basic job was straightforward. I had shares on the Synology such as: \\server\music and matching shares on the UNAS: \\UNAS-Pro-8\music I initially used Explorer, mostly because it was there and because sometimes the easy thing really is the easy thing. That lasted until Explorer started producing errors on individual files: The requested operation could not be completed due to a file system limitation My first thought was filenames. NAS migrations are full of opportunities to discover that one filesystem is more permissive than another, and there were filenames with parentheses and other punctuation in them. Then this failed: \\server\music\Athlete\Tourist\05 Wires.m4p There is nothing especially exotic about 05 Wires.m4p, so I moved over to Robocopy to get a little more information. It consistently got to 92% and returned Windows error 665: 92% New File 4.3 m 05 Wires.m4p ERROR 665 (0x00000299) Cop

## AI-Augmented Development Does Not Eliminate the Craft of Software

DevFeed: [AI-Augmented Development Does Not Eliminate the Craft of Software](<https://devfeed.tech/articles/is-the-craft-dead-21854.md>)

Original publisher: [Read original article](<https://www.hanselman.com/blog/is-the-craft-dead>)

Author: Scott Hanselman

Published: 2026-02-09T05:50:59Z

Content type: opinion

Language: en

Sources: [Scott Hanselman](<https://devfeed.tech/sources/scott-hanselman.md>)

Topics: [coding](<https://devfeed.tech/topics/coding.md>), [Development](<https://devfeed.tech/topics/development.md>), [Software](<https://devfeed.tech/topics/software.md>), [Artificial Intelligence](<https://devfeed.tech/topics/ai.md>)

Tags: [ai](<https://devfeed.tech/tags/ai.md>), [coding](<https://devfeed.tech/tags/coding.md>), [development](<https://devfeed.tech/tags/development.md>), [musings](<https://devfeed.tech/tags/musings.md>), [software](<https://devfeed.tech/tags/software.md>), [syntax](<https://devfeed.tech/tags/syntax.md>)

### AI overview

The author argues that AI-augmented development may produce impressive results and change how developers work, but software remains difficult and still requires craftsmanship, good judgment, and the ability to build cohesive systems.

### Source excerpt

The Japanese are really good at woodworking. And I love watching the Yankee workshop, my dad makes Native American bows and arrows completely from scratch in his workshop with trees that he finds. This is all different from the stuff you get at IKEA, but I've been coding now for money for 35 years and systems are still complicated, computers still do dumb stuff, humans still do dumb stuff, this is just like the move from assembler to C, like the introduction of syntax highlighting, the introduction of intellisense, and the copy paste directly into production shift when stack overflow happened. There is value in good taste, there is value in craftsmanship, and there is value in human judgment. The furniture might be differently designed, but we're still interior designers and putting together a cohesive system is non-trivial. Don't let them gaslight you with one shot Minecraft clones and one shot C compilers. Software is still hard, it's just that you're no longer I/O bound with the speed of your fingertips. I think that there will be lots of work for us cleaning up after the slop, but if you know what you're doing AI augmented development is going to get you some amazing results and I am enjoying learning a ton during this momentous era shift - but the craft still exists. © 2025 Scott Hanselman. All rights reserved.

## The danger of glamourizing one shots

DevFeed: [The danger of glamourizing one shots](<https://devfeed.tech/articles/the-danger-of-glamourizing-one-shots-21857.md>)

Original publisher: [Read original article](<https://www.hanselman.com/blog/the-danger-of-glamourizing-one-shots>)

Author: Scott Hanselman

Published: 2026-02-04T05:53:00Z

Content type: opinion

Language: en

Sources: [Scott Hanselman](<https://devfeed.tech/sources/scott-hanselman.md>)

Topics: [Artificial Intelligence](<https://devfeed.tech/topics/ai.md>), [coding](<https://devfeed.tech/topics/coding.md>), [sdlc](<https://devfeed.tech/topics/sdlc.md>), [context](<https://devfeed.tech/topics/context.md>)

Tags: [ai](<https://devfeed.tech/tags/ai.md>), [coding](<https://devfeed.tech/tags/coding.md>), [context](<https://devfeed.tech/tags/context.md>), [musings](<https://devfeed.tech/tags/musings.md>), [programming](<https://devfeed.tech/tags/programming.md>), [sdlc](<https://devfeed.tech/tags/sdlc.md>)

### AI overview

This commentary argues that AI-augmented coding should not be judged by impressive one-shot demonstrations such as generating a game from a familiar name. Those prompts conceal substantial semantic guidance, while more specific goals, stable systems, software development practices, historical context, and sound judgment remain important.

### Source excerpt

People should not be judging AI-augmented coding by "1 shots." If someone told you that their model did a "one shot of Minecraft" and they're impressed by that, you need to consider how much semantic heavy lifting the word "Minecraft" is doing in that prompt. Ask them to one shot Minecraft without using the word Minecraft. It's not trivial to one shot something unique, because programming is the art of making the ambiguous incredibly specific through sculpting. AI sculpting is less about vibes and more about finding the specificity you want and keeping the system stable through changes. Good SDLC practices still matter, historical context still matters, and knowing how things work matters, shout out to Grady Booch. It's a cool party trick to one shot Mario Brothers or space invaders, but then you'll end up with the most mid version of both. Literally mid. You'll get the statistical fat part of the Bell curve version of these mythical games. You're telling the model to close its eyes and draw the face of these games from memory. As high-level programming cedes way to the prose compiler, making your goals and specs well understood to the ambiguity loop and showing good judgment is going to matter more than ever. Consider all of your words and make sure that certain words aren't carrying all the semantic load, hidden or otherwise. © 2025 Scott Hanselman. All rights reserved.

## Automatically Signing a Windows EXE with Azure Trusted Signing, dotnet sign, and GitHub Actions

DevFeed: [Automatically Signing a Windows EXE with Azure Trusted Signing, dotnet sign, and GitHub Actions](<https://devfeed.tech/articles/automatically-signing-a-windows-exe-with-azure-trusted-signing-dotnet-sign-and-github-actions-21851.md>)

Original publisher: [Read original article](<https://www.hanselman.com/blog/automatically-signing-a-windows-exe-with-azure-trusted-signing-dotnet-sign-and-github-actions>)

Author: Scott Hanselman

Published: 2025-11-28T19:31:25Z

Content type: tutorial

Language: en

Sources: [Scott Hanselman](<https://devfeed.tech/sources/scott-hanselman.md>)

Topics: [Azure](<https://devfeed.tech/topics/azure.md>), [GitHub Actions](<https://devfeed.tech/topics/github-actions.md>), [Windows](<https://devfeed.tech/topics/windows.md>)

Tags: [azure](<https://devfeed.tech/tags/azure.md>), [dotnet](<https://devfeed.tech/tags/dotnet.md>), [dotnetcore](<https://devfeed.tech/tags/dotnetcore.md>), [github-actions](<https://devfeed.tech/tags/github-actions.md>), [signing](<https://devfeed.tech/tags/signing.md>), [windows](<https://devfeed.tech/tags/windows.md>)

### AI overview

A tutorial on signing a Windows executable with Azure Trusted Signing, dotnet sign, and GitHub Actions. It describes cloud-based certificate management, CI/CD integration, prerequisites, and approximate pricing for small projects.

### Source excerpt

Mac Tahoe (in Beta as of the time of this writing) has this new feature called Edge Light that basically puts a bright picture of an Edge Light around your screen and basically uses the power of OLED to give you a virtual ring light. So I was like, why can't we also have nice things? I wrote (vibed, with GitHub Copilot and Claude Sonnet 4.5) a Windows Edge Light App (source code at https://github.com/shanselman/WindowsEdgeLight and you can get the latest release here https://github.com/shanselman/WindowsEdgeLight/releases or the app will check for new releases and autoupdate with Updatum). However, as is with all suss loose executables on the internet, when you run random stuff you'll often get the Window Defender 'new phone, who dis' warning which is scary. After several downloads and no viruses or complaints, my executable will eventually gain reputation with the Windows Defender Smart Screen service, but having a Code Signing Certificate is said to help with that. However, code signing certs are expensive and a hassle to manage and renew. Someone told me that Azure Trusted Signing was somewhat less of a hassle - it's less, but it's still non-trivial. I read this post from Rick (his blog is gold and has been for years) earlier in the year and some of it was super useful and other stuff has been made simpler over time. I wrote 80% of this blog post, but since I just spent an hour getting code signing to work and GitHub Copilot was going through and logging everything I did, I did use Claude 4.5 to help organize some of this. I have reviewed it all and re-written parts I didn't like, so any mistakes are mine. Azure Trusted Signing is Microsoft's cloud-based code signing service that: No hardware tokens - Everything happens in the cloud Automatic certificate management - Certificates are issued and renewed automatically GitHub Actions integration - Sign during your CI/CD pipeline. I used GH Actions. Kinda Affortable - About $10/month for small projects. I would like

## Webcam randomly pausing in OBS, Discord, and websites - LSVCam and TikTok Studio

DevFeed: [Webcam randomly pausing in OBS, Discord, and websites - LSVCam and TikTok Studio](<https://devfeed.tech/articles/webcam-randomly-pausing-in-obs-discord-and-websites-lsvcam-and-tiktok-studio-21860.md>)

Original publisher: [Read original article](<https://www.hanselman.com/blog/webcam-randomly-pausing-in-obs-discord-and-websites-lsvcam-and-tiktok-studio>)

Author: Scott Hanselman

Published: 2024-10-09T19:32:28Z

Content type: article

Language: en

Sources: [Scott Hanselman](<https://devfeed.tech/sources/scott-hanselman.md>)

Topics: [webcam](<https://devfeed.tech/topics/webcam.md>), [Windows](<https://devfeed.tech/topics/windows.md>), [browser](<https://devfeed.tech/topics/browser.md>), [PowerShell](<https://devfeed.tech/topics/powershell.md>), [Streaming](<https://devfeed.tech/topics/streaming.md>)

Tags: [browser](<https://devfeed.tech/tags/browser.md>), [bugs](<https://devfeed.tech/tags/bugs.md>), [powershell](<https://devfeed.tech/tags/powershell.md>), [streaming](<https://devfeed.tech/tags/streaming.md>), [webcam](<https://devfeed.tech/tags/webcam.md>), [windows](<https://devfeed.tech/tags/windows.md>)

### AI overview

A troubleshooting account of webcam streams pausing in OBS and browser-based applications. The article investigates virtual cameras on Windows, identifies LSVCam as a possible source of enumeration hangs, and describes a registry location where it appears.

### Source excerpt

I use my webcam constantly for streaming and I'm pretty familiar with all the internals and how the camera model on Windows works. I also use OBS extensively, so I regularly use the OBS virtual camera and flow everything through Open Broadcasting Studio. For my podcast, I use Zencastr which is a web-based app that talks to the webcam via the browser APIs. For YouTubes, I'll use Riverside or StreamYard, also webapps. I've done this reliably for the last several years without any trouble. Yesterday, I started seeing the most weird thing and it was absolutely perplexing and almost destroyed the day. I started seeing regular pauses in my webcam stream but only in two instances. The webcam would pause for 10-15 seconds every 90 or so seconds when access the Webcam in a browser I would see a long pause/hang in OBS when double clicking on my Video Source (Webcam) to view its properties Micah initially said USB but my usb bus and hubs have worked reliably for years. Thought something might have changed in my El Gato capture device, but that has also been rock solid for 1/2 a decade. Then I started exploring virtual cameras and looked in the windows camera dialog under settings for a list of all virtual cameras. Interestingly, virtual cameras don't get listed under Cameras in Settings in Windows: From what I can tell, there's no user interface to list out all of your cameras - virtual or otherwise - in windows. Here's a quick PowerShell script you can run to list out anything 'connected' that also includes the string "cam" in your local devices Get-CimInstance -Namespace root\cimv2 -ClassName Win32_PnPEntity | Where-Object { $_.Name -match 'Cam' } | Select-Object Name, Manufacturer, PNPDeviceID and my output Name Manufacturer PNPDeviceID ---- ------------ ----------- Cam Link 4K Microsoft USB\VID_0FD9&PID_0066&MI_00\7&3768531A&0&0000 Digital Audio Interface (2- Cam Link 4K) Microsoft SWD\MMDEVAPI\{0.0.1.00000000}.{AF1690B6-CA2A-4AD3-AAFD-8DDEBB83DD4A} Logitech StreamCam WinU

## Open Sourcing DOS 4

DevFeed: [Open Sourcing DOS 4](<https://devfeed.tech/articles/open-sourcing-dos-4-21856.md>)

Original publisher: [Read original article](<https://www.hanselman.com/blog/open-sourcing-dos-4>)

Author: Scott Hanselman

Published: 2024-04-25T16:46:13Z

Content type: release

Language: en

Sources: [Scott Hanselman](<https://devfeed.tech/sources/scott-hanselman.md>)

Topics: [Code](<https://devfeed.tech/topics/code.md>), [Microsoft](<https://devfeed.tech/topics/microsoft.md>), [Assembly](<https://devfeed.tech/topics/assembly.md>), [Open Source](<https://devfeed.tech/topics/open-source.md>), [Operating system](<https://devfeed.tech/topics/operating-system.md>), [ibm](<https://devfeed.tech/topics/ibm.md>), [Software](<https://devfeed.tech/topics/software.md>)

Tags: [assembly](<https://devfeed.tech/tags/assembly.md>), [blog-post](<https://devfeed.tech/tags/blog-post.md>), [code](<https://devfeed.tech/tags/code.md>), [ibm](<https://devfeed.tech/tags/ibm.md>), [microsoft](<https://devfeed.tech/tags/microsoft.md>), [open-source](<https://devfeed.tech/tags/open-source.md>), [os](<https://devfeed.tech/tags/os.md>), [release](<https://devfeed.tech/tags/release.md>), [software](<https://devfeed.tech/tags/software.md>), [source](<https://devfeed.tech/tags/source.md>), [technical](<https://devfeed.tech/tags/technical.md>)

### AI overview

Microsoft and IBM are releasing the source code for MS-DOS 4.00 under the MIT license, alongside unreleased beta binaries, documentation PDFs, and disk images. The article describes the software's history and the archival work behind the release.

### Source excerpt

See the canonical version of this blog post at the Microsoft Open Source Blog! Ten years ago, Microsoft released the source for MS-DOS 1.25 and 2.0 to the Computer History Museum, and then later republished them for reference purposes. This code holds an important place in history and is a fascinating read of an operating system that was written entirely in 8086 assembly code nearly 45 years ago. Today, in partnership with IBM and in the spirit of open innovation, we're releasing the source code to MS-DOS 4.00 under the MIT license. There's a somewhat complex and fascinating history behind the 4.0 versions of DOS, as Microsoft partnered with IBM for portions of the code but also created a branch of DOS called Multitasking DOS that did not see a wide release. https://github.com/microsoft/MS-DOS A young English researcher named Connor "Starfrost" Hyde recently corresponded with former Microsoft Chief Technical Officer Ray Ozzie about some of the software in his collection. Amongst the floppies, Ray found unreleased beta binaries of DOS 4.0 that he was sent while he was at Lotus. Starfrost reached out to the Microsoft Open Source Programs Office (OSPO) to explore releasing DOS 4 source, as he is working on documenting the relationship between DOS 4, MT-DOS, and what would eventually become OS/2. Some later versions of these Multitasking DOS binaries can be found around the internet, but these new Ozzie beta binaries appear to be much earlier, unreleased, and also include the ibmbio.com source. Scott Hanselman, with the help of internet archivist and enthusiast Jeff Sponaugle, has imaged these original disks and carefully scanned the original printed documents from this "Ozzie Drop". Microsoft, along with our friends at IBM, think this is a fascinating piece of operating system history worth sharing. Jeff Wilcox and OSPO went to the Microsoft Archives, and while they were unable to find the full source code for MT-DOS, they did find MS DOS 4.00, which we're releasing to

## Updating to .NET 8, updating to IHostBuilder, and running Playwright Tests within NUnit headless or headed on any OS

DevFeed: [Updating to .NET 8, updating to IHostBuilder, and running Playwright Tests within NUnit headless or headed on any OS](<https://devfeed.tech/articles/updating-to-net-8-updating-to-ihostbuilder-and-running-playwright-tests-within-nunit-headless-or-headed-on-any-os-21858.md>)

Original publisher: [Read original article](<https://www.hanselman.com/blog/updating-to-net-8-updating-to-ihostbuilder-and-running-playwright-tests-within-nunit-headless-or-headed-on-any-os>)

Author: Scott Hanselman

Published: 2024-03-07T01:12:13Z

Content type: tutorial

Language: en

Sources: [Scott Hanselman](<https://devfeed.tech/sources/scott-hanselman.md>)

Topics: [Playwright](<https://devfeed.tech/topics/playwright.md>), [.NET](<https://devfeed.tech/topics/net.md>), [Testing](<https://devfeed.tech/topics/testing.md>), [Browser Automation](<https://devfeed.tech/topics/browser-automation.md>), [Integration testing](<https://devfeed.tech/topics/integration-testing.md>), [ASP.NET](<https://devfeed.tech/topics/aspnet.md>), [Selenium](<https://devfeed.tech/topics/selenium.md>), [GitHub Actions](<https://devfeed.tech/topics/github-actions.md>)

Tags: [asp-net](<https://devfeed.tech/tags/asp-net.md>), [automation-testing](<https://devfeed.tech/tags/automation-testing.md>), [browser](<https://devfeed.tech/tags/browser.md>), [ci-cd](<https://devfeed.tech/tags/ci-cd.md>), [debug](<https://devfeed.tech/tags/debug.md>), [devops](<https://devfeed.tech/tags/devops.md>), [dotnetcore](<https://devfeed.tech/tags/dotnetcore.md>), [integration](<https://devfeed.tech/tags/integration.md>), [linux](<https://devfeed.tech/tags/linux.md>), [net](<https://devfeed.tech/tags/net.md>), [playwright](<https://devfeed.tech/tags/playwright.md>), [selenium](<https://devfeed.tech/tags/selenium.md>), [testing](<https://devfeed.tech/tags/testing.md>), [tests](<https://devfeed.tech/tags/tests.md>), [unit-testing](<https://devfeed.tech/tags/unit-testing.md>), [visual-studio](<https://devfeed.tech/tags/visual-studio.md>), [vs-code](<https://devfeed.tech/tags/vs-code.md>), [web](<https://devfeed.tech/tags/web.md>), [windows](<https://devfeed.tech/tags/windows.md>)

### AI overview

A tutorial on updating a .NET application to .NET 8 and running Playwright browser tests through NUnit. It explains the transition from IWebHostBuilder to IHostBuilder and describes cross-platform, headless or headed testing across local systems, containers, and CI environments.

### Source excerpt

I've been doing not just Unit Testing for my sites but full on Integration Testing and Browser Automation Testing as early as 2007 with Selenium. Lately, however, I've been using the faster and generally more compatible Playwright. It has one API and can test on Windows, Linux, Mac, locally, in a container (headless), in my CI/CD pipeline, on Azure DevOps, or in GitHub Actions. For me, it's that last moment of truth to make sure that the site runs completely from end to end. I can write those Playwright tests in something like TypeScript, and I could launch them with node, but I like running end unit tests and using that test runner and test harness as my jumping off point for my .NET applications. I'm used to right clicking and "run unit tests" or even better, right click and "debug unit tests" in Visual Studio or VS Code. This gets me the benefit of all of the assertions of a full unit testing framework, and all the benefits of using something like Playwright to automate my browser. In 2018 I was using WebApplicationFactory and some tricky hacks to basically spin up ASP.NET within .NET (at the time) Core 2.1 within the unit tests and then launching Selenium. This was kind of janky and would require to manually start a separate process and manage its life cycle. However, I kept on with this hack for a number of years basically trying to get the Kestrel Web Server to spin up inside of my unit tests. I've recently upgraded my main site and podcast site to .NET 8. Keep in mind that I've been moving my websites forward from early early versions of .NET to the most recent versions. The blog is happily running on Linux in a container on .NET 8, but its original code started in 2002 on .NET 1.1. Now that I'm on .NET 8, I scandalously discovered (as my unit tests stopped working) that the rest of the world had moved from IWebHostBuilder to IHostBuilder five version of .NET ago. Gulp. Say what you will, but the backward compatibility is impressive. As such my code for Progr

## Using WSL and Let's Encrypt to create Azure App Service SSL Wildcard Certificates

DevFeed: [Using WSL and Let's Encrypt to create Azure App Service SSL Wildcard Certificates](<https://devfeed.tech/articles/using-wsl-and-let-s-encrypt-to-create-azure-app-service-ssl-wildcard-certificates-21859.md>)

Original publisher: [Read original article](<https://www.hanselman.com/blog/using-wsl-and-lets-encrypt-to-create-azure-app-service-ssl-wildcard-certificates>)

Author: Scott Hanselman

Published: 2023-06-27T17:17:25Z

Content type: tutorial

Language: en

Sources: [Scott Hanselman](<https://devfeed.tech/sources/scott-hanselman.md>)

Topics: [Azure](<https://devfeed.tech/topics/azure.md>), [Windows Subsystem for Linux](<https://devfeed.tech/topics/wsl.md>), [SSL](<https://devfeed.tech/topics/ssl.md>), [openssl](<https://devfeed.tech/topics/openssl.md>), [apt](<https://devfeed.tech/topics/apt.md>), [pip](<https://devfeed.tech/topics/pip.md>)

Tags: [apt](<https://devfeed.tech/tags/apt.md>), [azure](<https://devfeed.tech/tags/azure.md>), [certificates](<https://devfeed.tech/tags/certificates.md>), [dns](<https://devfeed.tech/tags/dns.md>), [install](<https://devfeed.tech/tags/install.md>), [openssl](<https://devfeed.tech/tags/openssl.md>), [password](<https://devfeed.tech/tags/password.md>), [private-key](<https://devfeed.tech/tags/private-key.md>), [ssl](<https://devfeed.tech/tags/ssl.md>), [windows](<https://devfeed.tech/tags/windows.md>), [wsl](<https://devfeed.tech/tags/wsl.md>)

### AI overview

This tutorial explains how to use Certbot in Windows Subsystem for Linux with Let's Encrypt to create a wildcard certificate, convert it to a password-protected PFX containing the certificate chain, and upload it to Azure App Service. It also describes importing and exporting the certificate in Windows before updating the App Service binding.

### Source excerpt

There are many let's encrypt automatic tools for azure but I also wanted to see if I could use certbot in wsl to generate a wildcard certificate for the azure Friday website and then upload the resulting certificates to azure app service. Azure app service ultimately needs a specific format called dot PFX that includes the full certificate path and all intermediates. Per the docs, App Service private certificates must meet the following requirements: Exported as a password-protected PFX file, encrypted using triple DES. Contains private key at least 2048 bits long Contains all intermediate certificates and the root certificate in the certificate chain. If you have a PFX that doesn't meet all these requirements you can have Windows reencrypt the file. I use WSL and certbot to create the cert, then I import/export in Windows and upload the resulting PFX. Within WSL, install certbot: sudo apt update sudo apt install python3 python3-venv libaugeas0 sudo python3 -m venv /opt/certbot/ sudo /opt/certbot/bin/pip install --upgrade pip sudo /opt/certbot/bin/pip install certbot Then I generate the cert. You'll get a nice text UI from certbot and update your DNS as a verification challenge. Change this to make sure it's two lines, and your domains and subdomains are correct and your paths are correct. sudo certbot certonly --manual --preferred-challenges=dns --email YOUR@EMAIL.COM --server https://acme-v02.api.letsencrypt.org/directory --agree-tos --manual-public-ip-logging-ok -d "azurefriday.com" -d "*.azurefriday.com" sudo openssl pkcs12 -export -out AzureFriday2023.pfx -inkey /etc/letsencrypt/live/azurefriday.com/privkey.pem -in /etc/letsencrypt/live/azurefriday.com/fullchain.pem I then copy the resulting file to my desktop (check your desktop path) so it's now in the Windows world. sudo cp AzureFriday2023.pfx /mnt/c/Users/Scott/OneDrive/Desktop Now from Windows, import the PFX, note the thumbprint and export that cert. Import-PfxCertificate -FilePath "AzureFriday2023.pfx" -

## GitHub Copilot for CLI for PowerShell

DevFeed: [GitHub Copilot for CLI for PowerShell](<https://devfeed.tech/articles/github-copilot-for-cli-for-powershell-21853.md>)

Original publisher: [Read original article](<https://www.hanselman.com/blog/github-copilot-for-cli-for-powershell>)

Author: Scott Hanselman

Published: 2023-04-25T15:31:49Z

Content type: tutorial

Language: en

Sources: [Scott Hanselman](<https://devfeed.tech/sources/scott-hanselman.md>)

Topics: [GitHub Copilot CLI](<https://devfeed.tech/topics/github-copilot-cli.md>), [PowerShell](<https://devfeed.tech/topics/powershell.md>), [Command-line interface](<https://devfeed.tech/topics/cli.md>), [GitHub](<https://devfeed.tech/topics/github.md>)

Tags: [ai](<https://devfeed.tech/tags/ai.md>), [command-line](<https://devfeed.tech/tags/command-line.md>), [github](<https://devfeed.tech/tags/github.md>), [github-copilot-cli](<https://devfeed.tech/tags/github-copilot-cli.md>), [powershell](<https://devfeed.tech/tags/powershell.md>)

### AI overview

This article explains how GitHub Copilot CLI routes its shell commands through the github-copilot-cli executable and demonstrates PowerShell aliases that adapt those commands for PowerShell, including an option to run the generated command.

### Source excerpt

GitHub Next has this cool project that is basically Copilot for the CLI (command line interface). You can sign up for their waitlist at the Copilot for CLI site. Copilot for CLI provides three shell commands: ??, git? and gh? This is cool and all, but I use PowerShell. Turns out these ?? commands are just router commands to a larger EXE called github-copilot-cli. So if you go "?? something" you're really going "github-copilot-cli what-the-shell something." So this means I should be able to to do the same/similar aliases for my PowerShell prompt AND change the injected prompt (look at me I'm a prompt engineer) to add 'use powershell to.' Now it's not perfect, but hopefully it will make the point to the Copilot CLI team that PowerShell needs love also. Here are my aliases. Feel free to suggest if these suck. Note the addition of "user powershell to" for the ?? one. I may make a ?? and a p? where one does bash and one does PowerShell. I could also have it use wsl.exe and shell out to bash. Lots of possibilities. function ?? { $TmpFile = New-TemporaryFile github-copilot-cli what-the-shell ('use powershell to ' + $args) --shellout $TmpFile if ([System.IO.File]::Exists($TmpFile)) { $TmpFileContents = Get-Content $TmpFile if ($TmpFileContents -ne $nill) { Invoke-Expression $TmpFileContents Remove-Item $TmpFile } } } function git? { $TmpFile = New-TemporaryFile github-copilot-cli git-assist $args --shellout $TmpFile if ([System.IO.File]::Exists($TmpFile)) { $TmpFileContents = Get-Content $TmpFile if ($TmpFileContents -ne $nill) { Invoke-Expression $TmpFileContents Remove-Item $TmpFile } } } function gh? { $TmpFile = New-TemporaryFile github-copilot-cli gh-assist $args --shellout $TmpFile if ([System.IO.File]::Exists($TmpFile)) { $TmpFileContents = Get-Content $TmpFile if ($TmpFileContents -ne $nill) { Invoke-Expression $TmpFileContents Remove-Item $TmpFile } } } It also then offers to run the command. Very smooth. Hope you like it. Lots of fun stuff happening in this space.