Subscribe: Scott Hanselman's Computer Zen
Added By: Feedage Forager Feedage Grade A rated
Language: English
app  build  code  core  coverage  dotnet  file  net core  net  new  open  preview  run  server  site  test  version 
Rate this Feed
Rate this feedRate this feedRate this feedRate this feedRate this feed
Rate this feed 1 starRate this feed 2 starRate this feed 3 starRate this feed 4 starRate this feed 5 star

Comments (0)

Feed Details and Statistics Feed Statistics
Preview: Scott Hanselman's Computer Zen

Scott Hanselman's Blog

Scott Hanselman on Programming, User Experience, The Zen of Computers and Life in General


Automatic Unit Testing in .NET Core plus Code Coverage in Visual Studio Code

Thu, 22 Mar 2018 19:20:34 GMT

I was talking to Toni Edward Solarin on Skype yesterday about his open source spike (early days) of Code Coverage for .NET Core called "coverlet." There's a few options out there for cobbling together .NET Core Code Coverage but I wanted to see if I could use the lightest tools I could find and make a "complete" solution for Visual Studio Code that would work for .NET Core cross platform. I put my own living spike of a project up on GitHub. Now, keeping in mind that Toni's project is just getting started and (as of the time of this writing) currently supports line and method coverage, and branch coverage is in progress, this is still a VERY compelling developer experience. Using VS Code, Coverlet, xUnit, plus these Visual Studio Code extensions Coverage Gutters - Reads in the file (name matters) and highlights lines with color .NET Core Test Explorer - Discovers tests and gives you a nice explorer. Coverlet - The start of .NET Core Code Coverage Here's what we came up with. There's a lot going on here but take a moment and absorb the screenshot of VS Code above. Our test project is using xunit and the xunit runner that integrates with .NET Core as expected. That means we can just "dotnet test" and it'll build and run tests. Added coverlet, which integrates with MSBuild and automatically runs when you "dotnet test" if you "dotnet test /p:CollectCoverage=true" (I think this should command line switch should be more like --coverage" but there may be an MSBuild limitation here.) I'm interested in "The Developer's Inner Loop." . That means I want to have my tests open, my code open, and as I'm typing I want the solution to build, run tests, and update code coverage automatically the way Visual Studio proper does auto-testing, but in a more Rube Goldbergian way. We're close with this setup, although it's a little slow. Coverlet can produce opencover, lcov, or json files as a resulting output file. You can then generate detailed reports from this. There is a language agnostic VS Code Extension called Coverage Gutters that can read in lcov files and others and highlight line gutters with red, yellow, green to show test coverage. Those lcov files look like this, showing file names, file numbers, coverage, and number of exceptions.SF:C:\github\hanselminutes-core\hanselminutes.core\Constants.cs DA:3,0 end_of_record SF:C:\github\hanselminutes-core\hanselminutes.core\MarkdownTagHelper.cs DA:21,5 DA:23,5 DA:49,5 I should be able to pick the coverage file manually with the extension, but due to a small bug, it's easier to just tell Coverlet to generate a specific file name in a specific format.dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=lcov /p:CoverletOutput=./ .\my.tests The files then watched by the VSCode Coverage Gutters extension and updates as the file changes if you click watch in the VS Code Status Bar. You can take it even further if you add "dotnet watch test" which will compile and re-run tests if code changes:dotnet watch --project .\my.tests test /p:CollectCoverage=true /p:CoverletOutputFormat=lcov /p:CoverletOutput=./ I can run "WatchTests.cmd" in another terminal, or within the VS Code integrated terminal. NOTE: If you're doing code coverage you'll want to ensure your tests and tested assembly are NOT the same file. You might be able to get it to work but it's easier to keep things separate. Next, add in the totally under appreciated .NET Core Test Explorer extension (this should have hundreds of thousands of downloads - it's criminal) to get this nice Test Explorer pane: Even better, .NET Test Explorer lights up some "code lens" style interfaces over each test as well as a green checkmark for passing tests. Having "debug test" available for .NET Core is an absolute joy. Finally we make some specific improvements to the .vscode/tasks.json file that drives much of VS Code's experience with our app. The "BUILD" label is standard but note both the custom "test" and "testwithcoverage" labels, as well as the added group with kind: "test."[...]

Turn your Raspberry Pi into a portable Touchscreen Tablet with SunFounder's RasPad

Tue, 20 Mar 2018 20:55:02 GMT

I was very fortunate to get a preview version of the "RasPad" from SunFounder. Check it out at and at the time of these writing they have a Kickstarter I'm backing! I've written a lot about Raspberry Pis and the cool projects you can do with them. My now-10 and 12 year olds love making stuff with Raspberry Pis and we have at least a dozen of them around the house. A few are portable arcades (some quite tiny PiArcades), one runs PiMusicBox and is a streaming radio, and I have a few myself in a Kubernetes Cluster. I've built Raspberry Pi Cars with SunFounder parts, so they sent me an early evaluation version of their "RasPad." I was familiar with the general idea as I'd tried (and failed) to make something like it with their 10" Touchscreen LCD for Raspberry Pi. At its heart, the RasPad is quiet elegant and simple. It's a housing for your Raspberry Pi that includes a battery for portable use along with an integrated touchscreen LCD. However, it's the little details where it shines. It's not meant to be an iPad. It's not trying. It's thick on one end, and beveled to an angle. You put your RaspberryPi inside the back corner and it sits nicely on the plastic posts without screws. Power and HDMI and are inside with cables, then it's one button to turn it on. There's an included power supply as well as batteries to run the Pi and screen for a few hours while portable. I've found with my 10 year old that this neat, organized little tablet mode makes the Pi more accessible and interesting to him - as opposed to the usual mess of wires and bare circuit boards we usually have on my workbench. I could see a fleet of RasPads in a classroom environment being far more engaging than just "raw" Pis on a table. The back of the RasPad has a slot where a GPIO Ribbon cable can come out to a breakout  board: At this point you can do all the same cool hardware projects you can do with a Raspberry Pi, with all the wires, power, touchscreen, ports, and everything nice and sanitary. The inside hatch is flexible enough for other boards as well: I asked my 10 year old what he wanted to make with the RasPad/Raspberry Pi and he said he wanted to make a "burglar alarm" for his bedroom. Pretty sure he just wants to keep the 12 year old out of his room. We started with a Logitech 930e USB Webcam we had laying around. The Raspberry PI can use lots of off-the-shelf high-quality web cams without drivers, and the RasPad keeps all the USB ports exposed. Then we installed the "Motion" Project. It's on GitHub at with:sudo apt-get install motion Then edited /etc/motion/motion.conf with the nano editor (easier for kids then vim). You'll want to confirm the height and width. Smaller is easier on the Pi, but you can go big with 1280x720 if you like! We also set the target_dir to /tmp since motion's daemon doesn't have access to ~/. There's a number of events you can take action on, like "on_motion_detected." We just added a little Python script to let people know WE SEE YOU" It's also cool to set location_motion_style to "redbox" so you can see WHERE motion was detected in a frame, and be sure to set stream_localhost to "off" so you can hit http://yourraspberrypiname:8081 to see the stream remotely! When motion is detected, the 10 year old's little Python script launches: And as a bonus, here is the 10 year old trying to sneak into the room. Can you spot him? (The camera did) What would you build with a RaspberryPi Tablet? BTW, there's a Community Build of the .NET Core SDK for Raspberry Pi! Sponsor: Get the latest JetBrains Rider for debugging third-party .NET code, Smart Step Into, more debugger improvements, C# Interactive, new project wizard, and formatting code in columns.© 2018 Scott Hanselman. All rights reserved.       [...]

Cross-platform GUIs with open source .NET using Eto.Forms

Fri, 16 Mar 2018 00:53:10 GMT

This is one of those "Did you know you could do THAT?" Many folks have figured out that C#/F#/.NET is cross-platform and open0source and runs on basically any operating system. People are using it to create micro services, web sites, and webAPI's all over. Not to mention iPhone/Android apps with Xamarin and video games with Unity and MonoGame. But what about cross platform UIs? While not officially supported by Microsoft - you can do some awesome is how Open Source is supposed to work! Remember that there's a family of .NET Runtimes now, there's the .NET Framework on Windows, there's xplat .NET Core, and there's xplat Mono. Eto.Forms has been in development since 2012 and is a cross-platform framework for creating GUI (Graphical User Interface, natch) applications with .NET that run across multiple platforms using their native toolkit. Not like Java in the 90s with custom painted buttons on canvas. It's being used for real stuff! In fact, PabloDraw is an Ansi/Ascii text editor that you didn't know you needed in your life. But you do. It runs on Windows, Mac, and Linux and was written using Eto.Forms but has a native UI on each platform. Be sure to check out Curtis Wensley's Twitter account for some cool examples of what PabloDraw and Eto.Forms can do! OS X: MonoMac or Xamarin.Mac (and also iOS via Xamarin) Linux: GTK# 2 or 3 Windows: Windows Forms (using GDI or Direct2D) or WPF Here's an example Hello World. Note that it's not just Code First, you can also use Xaml, or even Json (.jeto) to layout your forms!using Eto.Forms;using Eto.Drawing;public class MyForm : Form{ public MyForm () { Title = "My Cross-Platform App"; ClientSize = new Size(200, 200); Content = new Label { Text = "Hello World!" }; } [STAThread] static void Main() { new Application().Run(new MyForm()); }} Or I can just File | New Project with their Visual Studio Extension. You should definitely give it a try. Even on the same platform (Windows in the below example) amazingly Eto.Forms can use whatever Native Controls you prefer. Here's a great example zip that has precompiled test apps. Once you've installed a new version of Mono on Ubuntu, you can run the same sample as Gtk3, as I'm doing here in a VM. AMAZING. Here's some example applications that are in the wild, using Eto.Forms: MonoGame Pipeline Tool - Content manager for MonoGame Manager - Accounting Software PabloDraw - Character based drawing application JabbR.Desktop - JabbR client Notedown - Note taking application Eto.Test - Application to test the functionality of each widget DotImaging.UI - Portable UI elements for DotImaging There's so much cool stuff happening in open source .NET right now, and Eto.Forms is actively looking for help. Go check out their excellent Wiki, read the Tutorials, and maybe get involved! Sponsor: Get the latest JetBrains Rider for debugging third-party .NET code, Smart Step Into, more debugger improvements, C# Interactive, new project wizard, and formatting code in columns.© 2018 Scott Hanselman. All rights reserved.       [...]

Setting up Application Insights took 10 minutes. It created two days of work for me.

Tue, 13 Mar 2018 06:01:10 GMT

I've been upgrading my podcast site from a 10 year old WebMatrix site to modern open-source ASP.NET Core with Razor Pages. The site is now off the IIS web server and  running cross-platform in Azure. I added Application Insights to the site in about 10 min just a few days ago. It was super easy to setup and basically automatic in Visual Studio 2017 Community. I left the defaults, installed a bit of script on the client, and enabled the server-side profiler, and AppInsights already found a few interesting things. It took 10 minutes to set up App Insights. It took two days (and work continues) to fix what it found. I love it. This tool has already given me a deeper insight into how my code runs and how it's behaving - and I'm just scratching the service. I'll need to do some videos and/or more blog posts to dig deeper. Truly, you need to try it. Slow performance in other countries I could fill this blog post with dozens of awesome screenshots of the useful charts, graphs, and filters that I got by just turning on AppInsights. But the most interesting part is that I turned it on really expecting nothing. I figured I'd get some "Google Analytics"-type behavior. Then I got this email: Huh. I had set up the Azure CDN at to handle all the faces for each episode. I then added lazy loading so that the webite only loads the images that enter the browser's viewport. I figured I was pretty much done. However I didn't really think about the page itself as it loads for folks from around the world - given that it's hosted on Azure in the West US. Ideally I'd want the site to load in less than a second, but this is my archives page with 600 shows so it's pretty heavy. Yuck. I have a few options. I could pay and load up another copy of the site in South Asia and then do some global load balancing. However, I'm hosting this on a single small (along with a dozen other sites) so I don't want to really pay much to fix this. I ended up signing up for a free account at CloudFlare and set up caching for my HTML. The images stay the same. served by the Azure CDN. Fixing Random and regular Server 500 errors I left the site up for a while and came back later to a warning. You can see my site availability is just 93%. Note that there's "2 Servers?" That's because one is my local machine! Very cool that AppInsights also (optionally) tracks your local development server as well. When I dig in I see a VERY interesting sawtooth pattern. Pro Tip - Recognizing that a Sawtooth Pattern is a Bad Thing (tm) is an important DevOps thing. Why is this happening regularly? Is it exactly regularly (like every 4 hours on a schedule?) or somewhat regularly (like a garbage collection issue?) What do these operations have in common? Look closely. It's not a GET it's a HEAD. Remember that HTTP Verbs are more than GET, POST, PUT, DELETE. There's also HEAD. It literally is a HEADer call. Like a GET, but no body. HTTP HEAD - The HEAD method is identical to GET except that the server MUST NOT return a message-body in the response. I installed HTTPie - which is like curl or wget for humans - and issue a HEAD command from my local machine while under the debugger.C:>http --verify=no HEAD https://localhost:5001HTTP/1.1 500 Internal Server ErrorContent-Type: text/html; charset=utf-8Date: Tue, 13 Mar 2018 03:41:51 GMTServer: Kestrel Ok that is bad. See the 500? I check out AppInsights and see it has the full call stack. See it's getting a NullReferenceException as it tries to Render() the Razor page? It turns out since I'm using Razor Pages, I have implemented "OnGet" where I do my data base work then pass a model to the pages to generate HTML. However, if someone issues a HEAD, then the pages still run but the local data work never happened (I have no OnHead() call). I have a few options here. I could handle HEAD myself. I could no-op it, but that'd be a lie. THOUGHT: I think this behavior is sub-optimal. While GET and POST are distinct and it m[...]

Upgrading my podcast site to ASP.NET Core 2.1 in Azure plus some Best Practices

Sat, 10 Mar 2018 08:28:43 GMT

I am continuing to upgrade to podcast's site. Today I upgraded it to .NET Core 2.1, keeping the work going from my upgrade from "Web Matrix WebPages" from last week. I upgraded to actually running ASP.NET Core 2.1's preview in Azure by following this blog post. Pro Tip: Be aware, you can still get up to 10x faster local builds but still keep your site's runtime as 2.0 to lower risk. So there's little reason to not download the .NET Core 2.1 Preview and test your build speeds. At this point the podcast site is live in Azure at Now that I've moved off of the (very old) site I've quickly set up some best practices in just a few hours. I should have taken the time to upgrade this site - and its "devops" a long time ago. Here's a few things I was able to get done just this evening while the boys' did homework. Each of these tasks were between 5 and 15 min. So not a big investment, but they represented real value I'd been wanting to add to the site. Git Deploy for Production The podcast site's code now lives in GitHub and deployment to production is a git push to master. A "deployment slot" for staging Some people like to have the master branch be Production, then they make a branch called Staging for a secondary staging site. Since Azure App Services (WebSites) has "deployment slots" I choose to do it differently. I deploy to Production from GitHub, sure, but I prefer to push manually to staging rather than litter my commits (and clean them up or squash commits later - it's just my preference) with little stuff. I hooked up Git Deployment but the git repro is in Azure and just for deploy. Then "git remote add azure ..." so when I want to deploy to staging it's:git push staging I use it for testing, so ya, it could have been test/dev, etc, but you get the idea. Plus the Deployment Slot/Staging Site is free as it's on the same Azure App Service Plan. A more sophisticated - but just as easy - plan would be to push to staging, get it perfect then do a "hot swap" with a single button click. Deployment Slots can have their own independent settings if you click "Slot Setting." Here I've set that this ASPNETCORE_ENVIRONMENT is "Staging" while the main one is "Production." The ASP.NET Core runtime picks up that environment variable and I can conditionally run code based on Environment. I run as "Development" on my local machine. For example:if (env.IsDevelopment()){ app.UseDeveloperExceptionPage(); } else{ app.UseExceptionHandler("/Error"); } Don't let Google Index the Staging Site - No Robots You should be careful to not let Google/Bing/DuckDuckGo index your staging site if it's public. Since I have an environment set on my slot, I can just add this Meta Robots element to the site's main layout. Note also that I use minified CSS when I'm not in Development. Require SSL Making the whole ASP.NET Core site use SSL has been on my list as well. I added my SSL Certs in the Azure Portal that added RequreHttps in my Startup.cs pretty easily. I could have also added it to the existing IISRewriteUrls.xml legacy file, but this was easier and faster.var options = new RewriteOptions().AddRedirectToHttps(); Here's how I'd do via IIS Rewrite Middleware, FYI: Application Insights for ASP.NET C[...]

Major build speed improvements - Try .NET Core 2.1 Preview 1 today

Wed, 07 Mar 2018 06:52:00 GMT

Head over to the main .NET Core download page and pick up .NET Core 2.1 - Preview 1. The SDK contains the tools you need to build and run apps with .NET Core and supports Mac, Windows, Ubuntu, Debian, Fedora, CentOS/Oracle, openSUSE, and we even have Docker images for Stretch, Alpine, and more. It's not your grandmother's Microsoft. ;) Once you've installed it, from a prompt type "dotnet" and note a few new built-in switches:C:\Users\scott> dotnet Usage: dotnet [options] Usage: dotnet [path-to-application] Options: -h|--help Display help. --version Display the current SDK version. --list-sdks Display the installed SDKs. --list-runtimes Display the installed runtimes. path-to-application: The path to an application .dll file to execute. I'll run it again twice with --list-sdks and --list-runtimes:C:\Users\scott> dotnet --list-sdks 2.1.300-preview1-008174 [C:\Program Files\dotnet\sdk] 2.1.4 [C:\Program Files\dotnet\sdk] C:\Users\scott> dotnet --list-runtimes Microsoft.AspNetCore.All 2.1.0-preview1-final [C:\Program Files\dotnet\shared] Microsoft.AspNetCore.App 2.1.0-preview1-final [C:\Program Files\dotnet\shared] Microsoft.NETCore.App 2.0.5 [C:\Program Files\dotnet\shared] Microsoft.NETCore.App 2.1.0-preview1-26216-03 [C:\Program Files\dotnet\shared] There's a few interesting things happening here. Youc an see before I had the runtime for .NET Core 2.0.5, and now I also have the 2.1.0 Preview. It can also be a little confusing that the SDK and Runtime sometimes have different versions, similar to JREs and JDKs. Simply stated - the thing that builds sometimes updates while then thing that runs doesn't. So the .NET Core SDK and compilers might get fixes but the runtime doesn't. I'm told they're going to line things up better. You can read deeply on versioning if you like. You'll also notice AspNetCore.App, which is a metapackage (package of packages) that's got less than All and helps you make smaller apps. If you install a beta or preview you might be worried it'll mess stuff up. It won't. You can type "dotnet new globaljson" and make a file that looks like this! Then "pin" the SDK version you want to use:{ "sdk": { "version": "2.1.300-preview1-008174" } } I'll change this to .NET Core's older SDK and try building the .NET Core based Gameboy Emulator in my last post. It's amazing. Let's see how fast it builds today on .NET 2.0:C:\github\Retro.Net> Measure-Command { dotnet build } Milliseconds : 586 Ticks : 65864065 TotalSeconds : 6.5864065 TotalMilliseconds : 6586.4065 Ok, about 6.5 seconds on my Surface. Let's make the SDK version the new .NET Core 2.1 Preview 1 - it has a bunch of build speed improvements. All I have to do is change the global.json file. Update the sdk version in the global.json and type "dotnet --version" to see that it took. I can have as many .NET Core SDKs as I like on my machine and I can control what SDK versions are being used on a tree by tree basis. That means you CAN download .NET Core 2.1 and not mess things up if you're paying attention.C:\github\Retro.Net> Measure-Command { dotnet build } Milliseconds : 727 Ticks : 27270864 TotalSeconds : 2.7270864 TotalMilliseconds : 2727.0864 Hey it's less than 3 seconds. 2.7 in fact! More than twice as fast. The bigger the app, the faster incremental builds should be. In some cases we will see (by release) 10x improvements. It's quick to install (and quick to uninstall) and you can control the SDK version (list them with "dotnet --list-sdks") with the global.json. Please go download the preview and let me know either on Twitter or in the comments what your before and after build times are! Sponsor: Unleash a faster Python! Supercharge your applications performance on future forward Intel platforms with The Intel Distribution for Python. Available for Windows, Linux, an[...]

A multi-player server-side GameBoy Emulator written in .NET Core and Angular

Mon, 05 Mar 2018 06:35:28 GMT

One of the great joys of sharing and discovering code online is when you stumble upon something so truly epic, so amazing, that you have to dig in. Head over to and ask yourself why this GitHub project has only 20 stars? Alex Haslehurst has created some retro hardware libraries in open source .NET Core with an Angular Front End! Translation? A multiplayer server-side Game Boy emulator. Epic. You can run it in minutes with docker run -p 2500:2500 alexhaslehurst/server-side-gameboy Then just browse to http://localhost:2500 and play Tetris on the original GameBoy! I love this for a number of reasons. First, I love his perspective: Please check out my GameBoy emulator written in .NET Core; Retro.Net. Yes, a GameBoy emulator written in .NET Core. Why? Why not. I plan to do a few write-ups about my experience with this project. Firstly: why it was a bad idea. Emulation on .NET Emulating the GameBoy CPU on .NET The biggest issue one has trying to emulate a CPU with a platform like .NET is the lack of reliable high-precision timing. However, he manages a nice from-scratch emulation of the Z80 processor, modeling low level things like registers in very high level C#. I love that public class GameBoyFlagsRegister is a thing. ;) I did similar things when I ported a 15 year old "Tiny CPU" to .NET Core/C#. Be sure to check out Alex's extremely detailed explanation on how he modeled the Z80 microprocessor. Luckily the GameBoy CPU, a Sharp LR35902, is derived from the popular and very well documented Zilog Z80 - A microprocessor that is unbelievably still in production today, over 40 years after it’s introduction. The Z80 is an 8-bit microprocessor, meaning that each operation is natively performed on a single byte. The instruction set does have some 16-bit operations but these are just executed as multiple cycles of 8-bit logic. The Z80 has a 16-bit wide address bus, which logically represents a 64K memory map. Data is transferred to the CPU over an 8-bit wide data bus but this is irrelevant to simulating the system at state machine level. The Z80 and the Intel 8080 that it derives from have 256 I/O ports for accessing external peripherals but the GameBoy CPU has none - favouring memory mapped I/O instead He didn't just create an emulator - there's lots of those - but uniquely he runs it on the server-side while allowing shared controls in a browser. "In between each unique frame, all connected clients can vote on what the next control input should be. The server will choose the one with the most votes… most of the time." Massively multi-player online GameBoy! Then he streams out the next frame! "GPU rendering is completed on the server once per unique frame, compressed with LZ4 and streamed out to all connected clients over websockets." This is a great learning repository because: it has complex business logic on the server-side but the front end uses Angular and web-sockets and open web technologies. It's also nice that he has a complete multi-stage Dockerfile that is itself a great example of how to build both .NET Core and Angular apps in Docker. Extensive (thousands) of Unit Tests with the Shouldly Assertion Framework and Moq Mocking Framework. Great example usages of Reactive Programming Unit Testing on both server AND client, using Karma Unit Testing for Angular Here's a few favorite elegant code snippets in this huge repository. The Reactive Button Presses:_joyPadSubscription = _joyPadSubject .Buffer(FrameLength) .Where(x => x.Any()) .Subscribe(presses => { var (button, name) = presses .Where(x => !string.IsNullOrEmpty( .GroupBy(x => x.button) .OrderByDescending(grp => grp.Count()) .Select(grp => (button: grp.Key,[...]

Running ASP.NET Core on GoDaddy's cheapest shared Linux Hosting - Don't Try This At Home

Thu, 01 Mar 2018 23:01:58 GMT

First, a disclaimer. Don't do this. I did this to test a theory and to prove a point. ASP.NET Core and the .NET Core that it runs on are open source and run pretty much anywhere. I wanted to see if I could run an ASP.NET Core site on GoDaddy's cheapest hosting ($3, although it scales to $8) that basically supports only PHP. It's not a full Linux VM. It's locked-down and limited. You don't have root. You are missing most tools you'd expect you'd have. BUT. I wanted to see if I could get ASP.NET Core running on it anyway. Maybe if I do, they (and other inexpensive hosts) will talk to the .NET team, learn that ASP.NET Core is open source and could easily run on their existing infrastructure. AGAIN: Don't do this. It's hacky. It's silly. But it's hella cool. IMHO. Also, big thanks to Tomas Weinfurt for his help! First, I went to GoDaddy and signed up for their cheap hosting. Again, not a VM, but their shared one. I also registered as well. They use a cPanel-based web management system that doesn't really let you do anything. You can turn on SSH, do some PHP stuff, and generally poke around, but it's not exactly low-level. First I ssh (shoosh!) in and see what I'm working with. I'm shooshing with Ubuntu on Windows 10 feature, that every developer should turn on. It's makes it really easy to work with Linux hosts if you're starting from Linux on Windows 10.secretname@theirvmname [/proc]$ cat version Linux version 2.6.32-773.26.1.lve1.4.46.el6.x86_64 ( (gcc version 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC) ) #1 SMP Tue Dec 5 18:55:41 EST 2017 secretname@theirvmname [/proc]$ OK, looks like Red Hat, so CentOS 6 should be compatible. I'm going to use .NET Core 2.1 (which is in preview now!) and get the SDK at and install it on my Windows machine where I will develop and build the app. I don't NEED to use Windows to do this, but it's the laptop I have and it's also nice to know I can build on Windows but target CentOS/RHEL6. Next I'll make a new ASP.NET site withdotnet new razor and then I'll publish a self-contained version like this:dotnet publish -r rhel.6-x64 And those files will end up in a folder like \supercheapaspnetsite\bin\Debug\netcoreapp2.1\rhel.6-x64\publish\ NOTE: You may need to add the NuGet feed for the dailies for this .NET Core preview in order to get the RHEL6 runtime downloaded during this local publish. Then I used WinSCP (or whatever FTP/SCP client you like, rsync, etc) to get the files over to the ~/www folder on your GoDaddy shared site. Then I chmod +x ./supercheapasnetsite to make it executable. Now, from my ssh session at GoDaddy, let's try to run my app!secretname@theirvmname [~/www]$ ./supercheapaspnetsite Failed to load hb, error: cannot open shared object file: No such file or directory Failed to bind to CoreCLR at '/home/secretname/public_html/' Of course it couldn't be that easy, right? .NET Core wants the unwind library (shared object) and it doesn't exist on this locked down system. AND I don't have yum/apt/rpm or a way to install it right? I could go looking for tar.gz file somewhere like this but I need to think about versions and make sure things line up. Given that I'm targeting CentOS6, I should start here and download libunwind-1.1-3.el6.x86_64.rpm. I need to crack open that rpm file and get the library. RPM packages are just headers on top of a CPIO archive, so I can apt-get install rpm2cpio from my local Ubuntu instances (on Windows 10). Then from /mnt/c/users/scott/Downloads (where I downloaded the file) I will extract it.rpm2cpio ./libunwind-1.1-3.el6.x86_64.rpm | cpio -idmv There they are. This part is cool. Even though [...]