Are you over 18 and want to see adult content?
More Annotations
![Dr.S.Venkatesan MD | Expressions in cardiology](https://www.archivebay.com/archive/5ac8739e-aa41-49b0-9bf2-b3e482d0295c.png)
Dr.S.Venkatesan MD | Expressions in cardiology
Are you over 18 and want to see adult content?
![17. Kieler Open Source und Linux Tage](https://www.archivebay.com/archive/dd40e660-034a-410f-a0ac-7edb6a99b0be.png)
17. Kieler Open Source und Linux Tage
Are you over 18 and want to see adult content?
![Every Light Bulb You'll Ever Need | Lightbulbs-Direct.com](https://www.archivebay.com/archive/7e805089-cfed-4bc4-abea-3f3bd3bb3d36.png)
Every Light Bulb You'll Ever Need | Lightbulbs-Direct.com
Are you over 18 and want to see adult content?
![JAG | Australian Womens & Mens Fashion | Official Site](https://www.archivebay.com/archive/189676e9-b7a4-417c-9cf0-e153f01a7a1f.png)
JAG | Australian Womens & Mens Fashion | Official Site
Are you over 18 and want to see adult content?
![A complete backup of sakraworldhospital.com](https://www.archivebay.com/archive/74277299-6535-4645-b85d-895f29df8b31.png)
A complete backup of sakraworldhospital.com
Are you over 18 and want to see adult content?
![Teal Swan - Personal Transformation Revolutionary - Teal Swan](https://www.archivebay.com/archive/682b52d8-4527-4c08-b9ad-c93668cd3518.png)
Teal Swan - Personal Transformation Revolutionary - Teal Swan
Are you over 18 and want to see adult content?
![Titki.Top | Сексуальные грудастые девушки онлайн](https://www.archivebay.com/archive/fff43b2b-d56b-4b96-bc17-7db0c841f9ed.png)
Titki.Top | Сексуальные грудастые девушки онлайн
Are you over 18 and want to see adult content?
Favourite Annotations
![A complete backup of https://okazii.ro](https://www.archivebay.com/archive6/images/6306639b-1309-49c0-acc0-9174b13fbfd7.png)
A complete backup of https://okazii.ro
Are you over 18 and want to see adult content?
![A complete backup of https://betweenthekids.com](https://www.archivebay.com/archive6/images/78d24040-2056-40f6-9373-9dd94b0f66fa.png)
A complete backup of https://betweenthekids.com
Are you over 18 and want to see adult content?
![A complete backup of https://davelandweb.com](https://www.archivebay.com/archive6/images/64cded0e-37d9-42a8-9fd8-29ff0c61de2f.png)
A complete backup of https://davelandweb.com
Are you over 18 and want to see adult content?
![A complete backup of https://targetsmart.com](https://www.archivebay.com/archive6/images/e1104346-ba88-41b5-82fb-be2dc1111018.png)
A complete backup of https://targetsmart.com
Are you over 18 and want to see adult content?
![A complete backup of https://l337tech.com](https://www.archivebay.com/archive6/images/a907ae38-a56b-4eac-8fc4-090a3f7ea845.png)
A complete backup of https://l337tech.com
Are you over 18 and want to see adult content?
![A complete backup of https://yalasarat.com](https://www.archivebay.com/archive6/images/11dd7506-6197-46d5-addf-0f298c88be89.png)
A complete backup of https://yalasarat.com
Are you over 18 and want to see adult content?
![A complete backup of https://ccwater.com](https://www.archivebay.com/archive6/images/92334c41-cffb-4337-b1b9-2bc0cff5fdf7.png)
A complete backup of https://ccwater.com
Are you over 18 and want to see adult content?
![A complete backup of https://btcbit.net](https://www.archivebay.com/archive6/images/d00c6a87-eded-47cd-bc35-1354b1aefdc9.png)
A complete backup of https://btcbit.net
Are you over 18 and want to see adult content?
![A complete backup of https://civic-club.ru](https://www.archivebay.com/archive6/images/8b7d8841-bdb4-4334-9b03-1365a3a0524f.png)
A complete backup of https://civic-club.ru
Are you over 18 and want to see adult content?
![A complete backup of https://enbrite.ly](https://www.archivebay.com/archive6/images/f0783ce1-9547-46f1-b1ec-26305584e1fa.png)
A complete backup of https://enbrite.ly
Are you over 18 and want to see adult content?
![A complete backup of https://publicallies.org](https://www.archivebay.com/archive6/images/6a387cbe-c6d7-491f-8b5c-b9d42bdcd2b7.png)
A complete backup of https://publicallies.org
Are you over 18 and want to see adult content?
![A complete backup of https://laluna.lt](https://www.archivebay.com/archive6/images/f4364866-9584-42d4-9b26-07ad3be721d2.png)
A complete backup of https://laluna.lt
Are you over 18 and want to see adult content?
Text
SCOTT HANSELMAN
Scott Hanselman is a programmer, teacher, speaker, technologist, podcaster, writer, inclusion advocate and more. WATCH THE BUILD 2021 APPLICATION DEVELOPMENT KEYNOTE We had a great time at the BUILD 2021 conference this year. My team and I worked really hard to put together a great Application Development Keynote and I TAKE YOUR WINDOWS TERMINAL AND POWERSHELL TO THE NEXT Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoftemployee. He is a
HOW TO RUN LINUX GUI APPS ON WINDOWS 10 WITH WSL AND WSLG It's already in Windows 10 Insiders Dev and is in builds 21364 or higher. (Run winver to see what version of Windows you have.) If you want to try it out, all you have to do is run "wsl --update" from and command line and you're set. If you have 21364 already but you don't have WSL installed, it's even easier to get started now.ONE EMAIL RULE
Yep, this is a great tip, I've been using it ever since I read your earlier post. One thing I would add is this: if an email comes from your boss, make sure it HOW TO DETECT WHERE AND IF THE .NET FRAMEWORK SDK ISThe values beneath
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\SxS\FRAMEWORKSDK tell you where the SDK is installed. If there's a 7.1 value, you know where the .NET 1.1 Framework SDK is installed. If there's an 8.0 value, you know where the .NET 2.0 Framework SDK is installed. The value on the other side of PENNY PINCHING IN THE CLOUD: AZURE STATIC WEB APPS ARE Penny Pinching in the Cloud: Azure Static Web Apps are saving me money. I've long run a few dozen websites in Azure and while I've long noticed people (frankly) wasting money by having one Azure App Service (a Web Site) per Azure App Service Plan (a VM) I tend to pack them tight. A Basic 1 (B1) Azure App Service running Linux is around $13 a INSTALLING POWERSHELL CORE ON A RASPBERRY PI (POWERED BY Earlier this week I set up .NET Core and Docker on a Raspberry Pi and found that I could run my podcast website quite easily on a Pi.Check that post out as there's a lot going on. I can test within a Linux Container and output the test results to the host and then open themin VS.
HOW TO FIX DFU-UTIL, STM, WINUSB, ZADIG, BOOTLOADERS AND I'm pretty happy with Windows 10 as my primary development box. It can do most anything I want, run a half-dozen Linuxes, and has a shiny new open source Terminal, and has great support for Docker now.. However. For years - YEARS I SAY - Windows has been a huge hassle when you want to flash the firmware of various devices over USB. DETECTING THAT A .NET CORE APP IS RUNNING IN A DOCKER Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoftemployee. He is a
SCOTT HANSELMAN
Scott Hanselman is a programmer, teacher, speaker, technologist, podcaster, writer, inclusion advocate and more. WATCH THE BUILD 2021 APPLICATION DEVELOPMENT KEYNOTE We had a great time at the BUILD 2021 conference this year. My team and I worked really hard to put together a great Application Development Keynote and I TAKE YOUR WINDOWS TERMINAL AND POWERSHELL TO THE NEXT Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoftemployee. He is a
HOW TO RUN LINUX GUI APPS ON WINDOWS 10 WITH WSL AND WSLG It's already in Windows 10 Insiders Dev and is in builds 21364 or higher. (Run winver to see what version of Windows you have.) If you want to try it out, all you have to do is run "wsl --update" from and command line and you're set. If you have 21364 already but you don't have WSL installed, it's even easier to get started now.ONE EMAIL RULE
Yep, this is a great tip, I've been using it ever since I read your earlier post. One thing I would add is this: if an email comes from your boss, make sure it HOW TO DETECT WHERE AND IF THE .NET FRAMEWORK SDK ISThe values beneath
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\SxS\FRAMEWORKSDK tell you where the SDK is installed. If there's a 7.1 value, you know where the .NET 1.1 Framework SDK is installed. If there's an 8.0 value, you know where the .NET 2.0 Framework SDK is installed. The value on the other side of PENNY PINCHING IN THE CLOUD: AZURE STATIC WEB APPS ARE Penny Pinching in the Cloud: Azure Static Web Apps are saving me money. I've long run a few dozen websites in Azure and while I've long noticed people (frankly) wasting money by having one Azure App Service (a Web Site) per Azure App Service Plan (a VM) I tend to pack them tight. A Basic 1 (B1) Azure App Service running Linux is around $13 a INSTALLING POWERSHELL CORE ON A RASPBERRY PI (POWERED BY Earlier this week I set up .NET Core and Docker on a Raspberry Pi and found that I could run my podcast website quite easily on a Pi.Check that post out as there's a lot going on. I can test within a Linux Container and output the test results to the host and then open themin VS.
HOW TO FIX DFU-UTIL, STM, WINUSB, ZADIG, BOOTLOADERS AND I'm pretty happy with Windows 10 as my primary development box. It can do most anything I want, run a half-dozen Linuxes, and has a shiny new open source Terminal, and has great support for Docker now.. However. For years - YEARS I SAY - Windows has been a huge hassle when you want to flash the firmware of various devices over USB. DETECTING THAT A .NET CORE APP IS RUNNING IN A DOCKER Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoftemployee. He is a
SCOTT HANSELMAN
Scott Hanselman is blogging about open source, .NET, and the cloud. GOOD, BETTER, BEST CREATING THE ULTIMATE REMOTE WORKER Sponsor: OzCode is a magical debugging extension for C#/.NET devs working in Visual Studio. Get to the root cause of your bugs faster with heads-up display, advanced search inside objects, LINQ query debugging, side-by-side object comparisons & more. HOW TO DETECT WHERE AND IF THE .NET FRAMEWORK SDK ISThe values beneath
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\SxS\FRAMEWORKSDK tell you where the SDK is installed. If there's a 7.1 value, you know where the .NET 1.1 Framework SDK is installed. If there's an 8.0 value, you know where the .NET 2.0 Framework SDK is installed. The value on the other side of TAKING YOUR POWERSHELL PROMPT TO THE NEXT LEVEL WITH I love my pretty prompt that I use with Windows Terminal and Powershell.I also like using PSReadline to bring even more cool features to the CLI (Command Line Interface).. One of the best and easiest ways to get an awesome looking prompt on Windows is with Oh My Posh, and there's now Oh My Posh 3!Now, to be clear, you get to be pretty extra with these prompts and some people find them to HOW TO MAKE A PRETTY PROMPT IN WINDOWS TERMINAL WITH I've blogged about Patching the new Cascadia Code to include Powerline Glyphs and other Nerd Fonts for the Windows Terminal but folks have asked very specifically, how do I make my prompt look like that?. Step One - Get the Terminal. Get Windows Terminal free from the Store.You can also get it from GitHub's releases but I recommend the store because it'll stay up to date automatically. REVIEW OF THE SURFACE BOOK 3 FOR DEVELOPERS The new Surface Book 3 is the exact size (23mm thick as a laptop) and weight (3.38 and 4.2 lbs.) as the SB2. I have had to add a small sticker to one otherwise I'd get them confused. The display resolutions are 3000×2000 for the 13.5-inch model and 3240×2160 for the 15-inch one that I GETTING THE LINE NUMBER AND FILE NAME FROM C# Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author. The only problem is this code only works in Debug builds. In a production Release build, the file name and line number informationdoesn't exist.
XSLT WITH POWERSHELL Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoftemployee. He is a
EXPLORING IMPOSTOR SYNDROME IN TECHNOLOGY Exploring Impostor Syndrome in Technology - SXSW '15. I've written before about the idea of Imposter Syndrome or being a " Phony. " It's the idea that on the surface you're an accomplished technologist but inside you're always questioning if you're really good enough. It turns out that this is SUPER common. You're not alone. HOW TO SET A NETWORK TO A "PRIVATE NETWORK" IN WINDOWS 8.1 A better, clearer way to change a Network to Private Network. Press the Windows Key + W to search Settings. Type "Network Connections" and Press Enter. Click on your Network. Turn "Find PCs and Content" to ON. This Network is now a Private Network.SCOTT HANSELMAN
Scott Hanselman is a programmer, teacher, speaker, technologist, podcaster, writer, inclusion advocate and more. WATCH THE BUILD 2021 APPLICATION DEVELOPMENT KEYNOTE We had a great time at the BUILD 2021 conference this year. My team and I worked really hard to put together a great Application Development Keynote and I TAKE YOUR WINDOWS TERMINAL AND POWERSHELL TO THE NEXT Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoftemployee. He is a
HOW TO RUN LINUX GUI APPS ON WINDOWS 10 WITH WSL AND WSLG It's already in Windows 10 Insiders Dev and is in builds 21364 or higher. (Run winver to see what version of Windows you have.) If you want to try it out, all you have to do is run "wsl --update" from and command line and you're set. If you have 21364 already but you don't have WSL installed, it's even easier to get started now. MICROSOFT TEAMS BUTTONS FOR STREAM DECK TO MUTE, SHARE The Stream Deck! (amazon link) is a lovely little device with bright LCD buttons that you can program to do basically anything. I decided to finally add a few hotkeys for Microsoft Teams.ONE EMAIL RULE
Yep, this is a great tip, I've been using it ever since I read your earlier post. One thing I would add is this: if an email comes from your boss, make sure it HOW TO FIX DFU-UTIL, STM, WINUSB, ZADIG, BOOTLOADERS AND I'm pretty happy with Windows 10 as my primary development box. It can do most anything I want, run a half-dozen Linuxes, and has a shiny new open source Terminal, and has great support for Docker now.. However. For years - YEARS I SAY - Windows has been a huge hassle when you want to flash the firmware of various devices over USB. EXPLORING IMPOSTOR SYNDROME IN TECHNOLOGY Exploring Impostor Syndrome in Technology - SXSW '15. I've written before about the idea of Imposter Syndrome or being a " Phony. " It's the idea that on the surface you're an accomplished technologist but inside you're always questioning if you're really good enough. It turns out that this is SUPER common. You're not alone. HOW TO UPDATE THE FIRMWARE ON YOUR ZUNE, WITHOUT MICROSOFT As I said on social media today, it's 2019 and I'm updating the Firmware on a Zune, fight me. ;) There's even an article on Vice about the Zune diehards.The Zune is a deeply under-respected piece of history and its UI marked the start of Microsoft's fluent design. HOW TO SET A NETWORK TO A "PRIVATE NETWORK" IN WINDOWS 8.1 A better, clearer way to change a Network to Private Network. Press the Windows Key + W to search Settings. Type "Network Connections" and Press Enter. Click on your Network. Turn "Find PCs and Content" to ON. This Network is now a Private Network.SCOTT HANSELMAN
Scott Hanselman is a programmer, teacher, speaker, technologist, podcaster, writer, inclusion advocate and more. WATCH THE BUILD 2021 APPLICATION DEVELOPMENT KEYNOTE We had a great time at the BUILD 2021 conference this year. My team and I worked really hard to put together a great Application Development Keynote and I TAKE YOUR WINDOWS TERMINAL AND POWERSHELL TO THE NEXT Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoftemployee. He is a
HOW TO RUN LINUX GUI APPS ON WINDOWS 10 WITH WSL AND WSLG It's already in Windows 10 Insiders Dev and is in builds 21364 or higher. (Run winver to see what version of Windows you have.) If you want to try it out, all you have to do is run "wsl --update" from and command line and you're set. If you have 21364 already but you don't have WSL installed, it's even easier to get started now. MICROSOFT TEAMS BUTTONS FOR STREAM DECK TO MUTE, SHARE The Stream Deck! (amazon link) is a lovely little device with bright LCD buttons that you can program to do basically anything. I decided to finally add a few hotkeys for Microsoft Teams.ONE EMAIL RULE
Yep, this is a great tip, I've been using it ever since I read your earlier post. One thing I would add is this: if an email comes from your boss, make sure it HOW TO FIX DFU-UTIL, STM, WINUSB, ZADIG, BOOTLOADERS AND I'm pretty happy with Windows 10 as my primary development box. It can do most anything I want, run a half-dozen Linuxes, and has a shiny new open source Terminal, and has great support for Docker now.. However. For years - YEARS I SAY - Windows has been a huge hassle when you want to flash the firmware of various devices over USB. EXPLORING IMPOSTOR SYNDROME IN TECHNOLOGY Exploring Impostor Syndrome in Technology - SXSW '15. I've written before about the idea of Imposter Syndrome or being a " Phony. " It's the idea that on the surface you're an accomplished technologist but inside you're always questioning if you're really good enough. It turns out that this is SUPER common. You're not alone. HOW TO UPDATE THE FIRMWARE ON YOUR ZUNE, WITHOUT MICROSOFT As I said on social media today, it's 2019 and I'm updating the Firmware on a Zune, fight me. ;) There's even an article on Vice about the Zune diehards.The Zune is a deeply under-respected piece of history and its UI marked the start of Microsoft's fluent design. HOW TO SET A NETWORK TO A "PRIVATE NETWORK" IN WINDOWS 8.1 A better, clearer way to change a Network to Private Network. Press the Windows Key + W to search Settings. Type "Network Connections" and Press Enter. Click on your Network. Turn "Find PCs and Content" to ON. This Network is now a Private Network. GOOD, BETTER, BEST CREATING THE ULTIMATE REMOTE WORKER Sponsor: OzCode is a magical debugging extension for C#/.NET devs working in Visual Studio. Get to the root cause of your bugs faster with heads-up display, advanced search inside objects, LINQ query debugging, side-by-side object comparisons & more. HOW TO FIX DFU-UTIL, STM, WINUSB, ZADIG, BOOTLOADERS AND I'm pretty happy with Windows 10 as my primary development box. It can do most anything I want, run a half-dozen Linuxes, and has a shiny new open source Terminal, and has great support for Docker now.. However. For years - YEARS I SAY - Windows has been a huge hassle when you want to flash the firmware of various devices over USB. TAKING YOUR POWERSHELL PROMPT TO THE NEXT LEVEL WITH I love my pretty prompt that I use with Windows Terminal and Powershell.I also like using PSReadline to bring even more cool features to the CLI (Command Line Interface).. One of the best and easiest ways to get an awesome looking prompt on Windows is with Oh My Posh, and there's now Oh My Posh 3!Now, to be clear, you get to be pretty extra with these prompts and some people find them to DOTNET SDK LIST AND DOTNET SDK LATEST No executable found matching command "dotnet-sdk". He created a dotnet-sdk.cmd you can get on his GitHub. Download his repo and put his command somewhere in your path. Now I can do this: C:\Users\scott\Desktop>dotnet sdk list. The installed .NET Core SDKs are: 1.0.0. 1.0.0-preview2-003131. 1.0.0-rc3-004530. INSTALLING POWERSHELL CORE ON A RASPBERRY PI (POWERED BY Earlier this week I set up .NET Core and Docker on a Raspberry Pi and found that I could run my podcast website quite easily on a Pi.Check that post out as there's a lot going on. I can test within a Linux Container and output the test results to the host and then open themin VS.
UPDATING AN ASP.NET CORE 2.2 WEB SITE TO .NET CORE 3.1 LTS First, it seems my main homepage is NET Core 2.2. I can tell because the csproj has a "TargetFramework" of netcoreapp2.2. So I'll start at the migration docs here to go from 2.2 to 3.0. . NET Core 2.2 reaches "end of life" (support) this month so it's a good time to update to the 3.1 version that will be supported for 3 years. HOW TO MAKE A PRETTY PROMPT IN WINDOWS TERMINAL WITH I've blogged about Patching the new Cascadia Code to include Powerline Glyphs and other Nerd Fonts for the Windows Terminal but folks have asked very specifically, how do I make my prompt look like that?. Step One - Get the Terminal. Get Windows Terminal free from the Store.You can also get it from GitHub's releases but I recommend the store because it'll stay up to date automatically. MIXING RAZOR VIEWS AND WEBFORMS MASTER PAGES WITH ASP.NET Two good options for mixing WebForms and Razor in your ASP.NET MVC application. The first has a little duplication, but is clean. The second is a little trickier and you're on your own, but you can directly share Master Pages between WebForms and Razor Views. You can get the code for the second over at Matt's blog. XSLT WITH POWERSHELL Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoftemployee. He is a
DEALING WITH APPLICATION BASE URLS AND RAZOR LINK I'm quietly moving my Website from a physical machine to a number of Cloud Services hosted in Azure. This is an attempt to not just modernize the system - no reason to change things just to change them - but to take advantage of a number of benefits thatSCOTT HANSELMAN
Scott Hanselman is a programmer, teacher, speaker, technologist, podcaster, writer, inclusion advocate and more. TAKE YOUR WINDOWS TERMINAL AND POWERSHELL TO THE NEXT Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoftemployee. He is a
SCOTT HANSELMAN
Scott Hanselman is blogging about open source, .NET, and the cloud. GOOD, BETTER, BEST CREATING THE ULTIMATE REMOTE WORKER Sponsor: OzCode is a magical debugging extension for C#/.NET devs working in Visual Studio. Get to the root cause of your bugs faster with heads-up display, advanced search inside objects, LINQ query debugging, side-by-side object comparisons & more. TAKING YOUR POWERSHELL PROMPT TO THE NEXT LEVEL WITH I love my pretty prompt that I use with Windows Terminal and Powershell.I also like using PSReadline to bring even more cool features to the CLI (Command Line Interface).. One of the best and easiest ways to get an awesome looking prompt on Windows is with Oh My Posh, and there's now Oh My Posh 3!Now, to be clear, you get to be pretty extra with these prompts and some people find them to USE A SECOND LAPTOP AS AN EXTENDED Sponsor: GdPicture.NET is an all-in-one SDK for WinForms, WPF, and Web development. It supports 100+ formats, including PDF and Office Open XML. Create powerful document imaging, image processing, and documentmanagement apps!
HOW TO MAKE A PRETTY PROMPT IN WINDOWS TERMINAL WITH I've blogged about Patching the new Cascadia Code to include Powerline Glyphs and other Nerd Fonts for the Windows Terminal but folks have asked very specifically, how do I make my prompt look like that?. Step One - Get the Terminal. Get Windows Terminal free from the Store.You can also get it from GitHub's releases but I recommend the store because it'll stay up to date automatically. SECURING AN AZURE APP SERVICE WEBSITE UNDER SSL IN MINUTES Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoftemployee. He is a
HEADLESS CMS AND DECOUPLED CMS IN .NET CORE Orchard is a CMS with a very strong community and fantastic documentation. Orchard Core is a redevelopment of Orchard using open source ASP.NET Core. While it's not "headless" it is using a Decoupled Architecture. Nothing would prevent you from removing the UI and presenting the content with your own front-end. HOW DO YOU USE SYSTEM.DRAWING IN .NET CORE? I've been doing .NET image processing since the beginning. In fact I wrote about it over 13 years ago on this blog when I talked about Compositing two images into one from the ASP.NET Server Side and in it I used System.Drawing to do the work. For over a decade folks using System.Drawing were just using it as a thin wrapper over GDI (Graphics Device Interface) which were very old Win32SCOTT HANSELMAN
Scott Hanselman is a programmer, teacher, speaker, technologist, podcaster, writer, inclusion advocate and more. TAKE YOUR WINDOWS TERMINAL AND POWERSHELL TO THE NEXT Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoftemployee. He is a
SCOTT HANSELMAN
Scott Hanselman is blogging about open source, .NET, and the cloud. GOOD, BETTER, BEST CREATING THE ULTIMATE REMOTE WORKER Sponsor: OzCode is a magical debugging extension for C#/.NET devs working in Visual Studio. Get to the root cause of your bugs faster with heads-up display, advanced search inside objects, LINQ query debugging, side-by-side object comparisons & more. TAKING YOUR POWERSHELL PROMPT TO THE NEXT LEVEL WITH I love my pretty prompt that I use with Windows Terminal and Powershell.I also like using PSReadline to bring even more cool features to the CLI (Command Line Interface).. One of the best and easiest ways to get an awesome looking prompt on Windows is with Oh My Posh, and there's now Oh My Posh 3!Now, to be clear, you get to be pretty extra with these prompts and some people find them to USE A SECOND LAPTOP AS AN EXTENDED Sponsor: GdPicture.NET is an all-in-one SDK for WinForms, WPF, and Web development. It supports 100+ formats, including PDF and Office Open XML. Create powerful document imaging, image processing, and documentmanagement apps!
HOW TO MAKE A PRETTY PROMPT IN WINDOWS TERMINAL WITH I've blogged about Patching the new Cascadia Code to include Powerline Glyphs and other Nerd Fonts for the Windows Terminal but folks have asked very specifically, how do I make my prompt look like that?. Step One - Get the Terminal. Get Windows Terminal free from the Store.You can also get it from GitHub's releases but I recommend the store because it'll stay up to date automatically. SECURING AN AZURE APP SERVICE WEBSITE UNDER SSL IN MINUTES Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoftemployee. He is a
HEADLESS CMS AND DECOUPLED CMS IN .NET CORE Orchard is a CMS with a very strong community and fantastic documentation. Orchard Core is a redevelopment of Orchard using open source ASP.NET Core. While it's not "headless" it is using a Decoupled Architecture. Nothing would prevent you from removing the UI and presenting the content with your own front-end. HOW DO YOU USE SYSTEM.DRAWING IN .NET CORE? I've been doing .NET image processing since the beginning. In fact I wrote about it over 13 years ago on this blog when I talked about Compositing two images into one from the ASP.NET Server Side and in it I used System.Drawing to do the work. For over a decade folks using System.Drawing were just using it as a thin wrapper over GDI (Graphics Device Interface) which were very old Win32 SCOTT HANSELMAN'S 2021 ULTIMATE DEVELOPER AND POWER USERS Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoftemployee. He is a
GOOD, BETTER, BEST CREATING THE ULTIMATE REMOTE WORKER Sponsor: OzCode is a magical debugging extension for C#/.NET devs working in Visual Studio. Get to the root cause of your bugs faster with heads-up display, advanced search inside objects, LINQ query debugging, side-by-side object comparisons & more. CAN YOU REALLY DEVELOP WITH LINUX GUI APPS ON WINDOWS 10 Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoftemployee. He is a
HOW TO RUN LINUX GUI APPS ON WINDOWS 10 WITH WSL AND WSLG It's already in Windows 10 Insiders Dev and is in builds 21364 or higher. (Run winver to see what version of Windows you have.) If you want to try it out, all you have to do is run "wsl --update" from and command line and you're set. If you have 21364 already but you don't have WSL installed, it's even easier to get started now. HOW TO FIX DFU-UTIL, STM, WINUSB, ZADIG, BOOTLOADERS AND I'm pretty happy with Windows 10 as my primary development box. It can do most anything I want, run a half-dozen Linuxes, and has a shiny new open source Terminal, and has great support for Docker now.. However. For years - YEARS I SAY - Windows has been a huge hassle when you want to flash the firmware of various devices over USB. HOW DO YOU USE SYSTEM.DRAWING IN .NET CORE? I've been doing .NET image processing since the beginning. In fact I wrote about it over 13 years ago on this blog when I talked about Compositing two images into one from the ASP.NET Server Side and in it I used System.Drawing to do the work. For over a decade folks using System.Drawing were just using it as a thin wrapper over GDI (Graphics Device Interface) which were very old Win32 RESETTING MICROSOFT UPDATE Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoftemployee. He is a
DOTNET SDK LIST AND DOTNET SDK LATEST No executable found matching command "dotnet-sdk". He created a dotnet-sdk.cmd you can get on his GitHub. Download his repo and put his command somewhere in your path. Now I can do this: C:\Users\scott\Desktop>dotnet sdk list. The installed .NET Core SDKs are: 1.0.0. 1.0.0-preview2-003131. 1.0.0-rc3-004530. GIT IS CASE-SENSITIVE AND YOUR FILESYSTEM MAY NOT BE Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoftemployee. He is a
RUNNING ASP.NET CORE ON GODADDY'S CHEAPEST SHARED LINUX Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoftemployee. He is a
This website uses cookies to ensure you get the best experience on ourwebsite. Learn more
Got it!
SCOTT HANSELMAN
* about
* blog
* podcast
* youtube
* speaking
browse by category or date RELEASE IS NOT DEBUG: 64BIT OPTIMIZATIONS AND C# METHOD INLINING IN RELEASE BUILD CALL STACKS October 25, 2007 Comment on this post Posted in ASP.NET |Learning .NET |
Microsoft |
Programming
Sponsored By
Just a reminder: Release builds are not Debug builds. Seems obvious, but it's worth saying again. Release builds are optimized for speed and debug builds are optimized for, well, debug-ability. However, most of the optimizations in managed code are done by the JIT compiler rather than the language compiler. However, sometimes in our zealous attempts to make Release builds easier to debug we can inadvertently (or totally "vertently") remove a lot of the optimizations that make Release builds faster.INTRODUCTION
I was talking to Jeremy and he had come upon some code that was inserting a try{} catch() { throw; } block in every method. The rationale was that "_they wanted the complete stack trace in their logging after an exception was thrown._" That's a noble goal, but their technique of adding these guards is what's called an "anti-pattern "or as Egon would
say "it would be bad." An anti-pattern is "_a pattern that tells how to go from a problem to a bad solution._" First, let's start by exploring WHY THEY AREN'T GETTING "A COMPLETE STACK TRACE" before we tackle why they believe they want/need acomplete one.
Here's a simple program:using System;
class NormalProgram{
static void Main(string args){
try
{
methodA();
}
catch (System.Exception e){
Console.WriteLine(e.ToString());}
}
static void methodA() { methodB(); } static void methodB() { methodC(); } static void methodC() { badMethod(); } static void badMethod() { throw new ApplicationException("generic bad thing"); }}
In this program, Main calls A, then A calls B, which calls C, which calls badMethod which throws an exception. That exception is caught up at Main. So far, makes sense right? We'll compile two versions, one in Debug mode and one in Release and run them on a regular 32-bit machine. Notice we're saying /o for enable optimizations for the Release build. We _are _making debug symbols for Release via /debug:pdbonly, but it doesn't affect performance in a significant way. "%FXROOT%\csc.exe" /t:exe /out:NormalRelease.exe /debug:pdbonly /oNormalProgram.cs
"%FXROOT%\csc.exe" /t:exe /out:NormalDebug.exe /debug NormalProgram.cs We run Debug on 32-bit and we see: System.ApplicationException: generic bad thing at NormalProgram.badMethod() in NormalProgram.cs:line 24 at NormalProgram.methodC() in NormalProgram.cs:line 23 at NormalProgram.methodB() in NormalProgram.cs:line 21 at NormalProgram.methodA() in NormalProgram.cs:line 19 at NormalProgram.Main(String args) in NormalProgram.cs:line 11 Looks good, makes sense. Now we run Release on 32-bit: System.ApplicationException: generic bad thing at NormalProgram.badMethod() in NormalProgram.cs:line 24 at NormalProgram.Main(String args) in NormalProgram.cs:line 11 Our call stack has been "collapsed"? Does it make it harder to debug? Not really, because we knew where we ended up and the path between the two is clear (otherwise this "inlining" wouldn't have happened.) However, it is confusing and there's a perception that "information is missing." It's important to note that information isn't missing but rather this stack trace is SHOWING THE RUNTIME REALITY. What you write (the Programmer's Intent)
isn't _exactly _what runs, especially when things are optimized. As programmers we are doing our best to tell the machine what to do and it is doing its best to do that _fast and correct - _let it do what it does best. When we see a stack like this our first reaction is that information is _there, but has been hidden. _In fact, the code we wrote ran, but not every method got their own local stack frame as they were optimized into fewer methods.INLINING
DISCLAIMER:_ I'm showing you this for informational purposes. Doing this without thinking or having a good reason is usually a bad idea and could confuse other issues. The only reason you might want to do this would be if you were doing some kind of funky thing that made your method require its own stack space. DON'T ADD THIS ATTRIBUTE WILLY-NILLY. Don't __Program By Coincidence__. Remember
the point of this post is that Release and Debug are different. Usethem differently._
What if I tell the runtime JIT-ter to not inline? I'll add one lineand one using:
using System;
using System.Runtime.CompilerServices; class NormalProgram{
static void Main(string args){
try
{
methodA();
}
catch (System.Exception e){
Console.WriteLine(e.ToString());}
}
static void methodA() { methodB(); } static void methodB() { methodC(); } static void methodC() { badMethod(); } static void badMethod() { throw new ApplicationException("generic bad thing"); }}
And run on 32-bit:
System.ApplicationException: generic bad thing at NormalProgram.badMethod() in NormalProgram.cs:line 24 at NormalProgram.methodA() in NormalProgram.cs:line 19 at NormalProgram.Main(String args) in NormalProgram.cs:line 11 Well, that stopped the inlining of method A, but of course B and C are still inlined. You can see how this is going to get icky. ASIDE: WE AS PROGRAMMERS HAVE ALL REACHED THIS MOMENT. THIS IS THE MOMENT WHEN WE DECIDE WHETHER OR NOT TO SLAP AN ATTRIBUTE ON EVERY METHOD IN OUR PROGRAM. (THIS ATTRIBUTE IS JUST AN EXAMPLE, BUT YOU KNOW THIS MOMENT...THERE'S STILL TIME TO ACTUALLY STOP AND TRY TO UNDERSTAND THE PROBLEM...) ...but we have to ship. So, let's try this:using System;
using System.Runtime.CompilerServices; class NormalProgram{
static void Main(string args){
try
{
methodA();
}
catch (System.Exception e){
Console.WriteLine(e.ToString());}
}
static void methodA() { methodB(); } static void methodB() { methodC(); } static void methodC() { badMethod(); } static void badMethod() { throw new ApplicationException("generic bad thing"); }}
And compile and run as Release on 32-bit... System.ApplicationException: generic bad thing at NormalProgram.badMethod() in NormalProgram.cs:line 24 at NormalProgram.methodC() in NormalProgram.cs:line 23 at NormalProgram.methodB() in NormalProgram.cs:line 21 at NormalProgram.methodA() in NormalProgram.cs:line 19 at NormalProgram.Main(String args) in NormalProgram.cs:line 11 Now we're back where we were before, right? Well, not really. We've got the full stack again, but we've neutered the build such that the JITter can't really do it's job. Plus, we haven't tried 64-bit yet. Let's run the Release build on64-bit:
System.ApplicationException: generic bad thing at NormalProgram.methodC() in NormalProgram.cs:line 23 at NormalProgram.Main(String args) in NormalProgram.cs:line 11 Weird. One conclusion to draw would be that 64-bit CLR ignores method inlining attributes. That's not necessarily the case. Another would be that 64-CLR is more aggressive about inlining. The deal is that there are MANY optimizations that the JITter can to. MANY. They wouldn't give me a number because it's Special Sauce, but le's just say it's not one or two. It's more than that. ;) Inlining isn't the only thing that can "collapse" a call stack like this. This also isn't exactly true. In this case, remember that x64 is a whole new processor architecture while x86 has been around for, let's say, a while. Turns out that x64 really likes to optimize and THIS IS AN EXAMPLE OF A "TAIL CALL OPTIMIZATION" RATHER THAN EXPLICITMETHOD INLINING.
Be sure to read David Broman'sdetailed blog
post on exactly x64 tail-call optimizes and when it doesn't.
A good explanation from The Original Wiki at the Portland Pattern Wiki:
> _"Tail-call optimization (or tail-call merging or tail-call > elimination) is a generalization of __TailRecursion_ > _: If the last thing a routine > does before it returns is call another routine, rather than doing a > jump-and-add-stack-frame immediately followed by a > pop-stack-frame-and-return-to-caller, it SHOULD be safe to simply > jump to the start of the second routine, letting it re-use the first > routine's stack frame (environment)...."_>
> _"However, TailCallOptimization > has some drawbacks. The > runtime environment will have a confusing stack during execution of > tail-called routines, which can make debugging difficult ("How did I > get here? baz() never even calls foo()!")."_ The wiki explanation was written with C in mind, but the concept is universal and it's the "confusing stack during execution of tail-called routines" that's got me writing this blog post today. There's some controversy on whether Tail Call Optimizations are a subset of Method Inlining . That may never be resolved, but for now they are discrete and different. Eric Gunnerson has a good article on some of the heuristicsthat the JIT uses
in its inlining decision making process. For some hardcore details, be sure to read David Notario's excellent series on x86 JIT inlining from 2004, both Part 1and Part 2
.
Perhaps start by reading his "The CLR x86 JIT, an overview"
as he explains seven basic stages the x86JIT.AN ANTI-PATTERN
Now, back to our customer from the beginning who was inserting a try{} catch() { throw; } block in every method. Let's try that (don't dothis at home):
using System;
class UglyProgram
{
static void Main(string args){
try
{
methodA();
}
catch (Exception e){
Console.WriteLine(e);}
}
static void methodA() { try { methodB(); } catch { throw; } } static void methodB() { try { methodC(); } catch { throw; } } static void methodC() { try { badMethod(); } catch { throw; } } static void badMethod(){throw new ApplicationException("generic bad thing");}}
...and compile both Debug and Release and this produces the same output on both 32-bit and 64-bit: System.ApplicationException: generic bad thing at UglyProgram.badMethod() in UglyProgram.cs:line 20 at UglyProgram.methodC() in UglyProgram.cs:line 19 at UglyProgram.methodB() in UglyProgram.cs:line 18 at UglyProgram.methodA() in UglyProgram.cs:line 17 at UglyProgram.Main(String args) in UglyProgram.cs:line 10 Why? Because by setting up the try's you're introducing the potential for other ways out of each method so the JIT'ter can't optimize anything that would collapse the call stack like we saw earlier. This isn't a good pattern as it doesn't deal with the underlying issue in a simple way. The customer wants to be able to debug Release buildseasier.
OPTIONS
Here's some options we could try: * Try/catch every method - Not a good idea. Not only are you cluttering your code, but you're paying a cost all the time when you only need to debug in Production/Release occasionally. * Put on every method - Also not a good idea, not only because of the operative "every method" violating the DRY Principle but also because it only deals with one specific optimization out of many. * Turn off Optimizations in the compiler - This particular kind of inlining appears to be a JITter thing, not a language compiler thing so turns out that doesn't work in this instance. Ok, so the customer wants a fuller call stack. I would propose that they in fact don't want this. One of my old bosses used to say: > _"Customer walks in with a cell phone and says 'this thing needs a > bigger antenna.' We have to ask ourselves does he want a bigger > antenna or better cell phone reception" - Mark Klein_ This is a great pithy analogy. Everyone comes in with both Problems and Solutions. This customer wants to be able to debug Release builds. They surely don't want full call stacks in Release Mode if it means turning off all optimizations.BEST SOLUTION
One thing the customer could do that would give them the best of both worlds is something Mark Pearce told me about a while back,
the section of an .ini file you've probably never used : > _This JIT configuration has two aspects: _>
> * _You can request the JIT-compiler to generate tracking > information. This makes it possible for the debugger to match up a > chain of MSIL with its machine code counterpart, and to track where > local variables and function arguments are stored._ > * _You can request the JIT-compiler to not optimize the resulting> machine code._
If you have a file Foo.exe you can create a Foo.ini with thesecontents:
GenerateTrackingInfo=1AllowOptimize=0
> _IMPLEMENTATION DETAIL: Why is it an INI file? Well, the .NET > runtime hasn't started up yet, so we don't have all that XML-parsey > goodness lying around. Instead they need to use the Win32 method > GetPrivateProfileString() in order to retrieve those._ This solution assumes you compiled with /debug:pdbonly in Release mode in order to generate the full stack when needed. Download Repro/Playground 32/64-bit JIT Optimizations DICSLAIMER: This isn't something you want to put into production! You'd only use this for debugging. It's something you'd enable on acase-by-case basis.
ABOUT SCOTT
Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a bookauthor.
About NewsletterHOSTING BY
Comment on this postShare on Twitter
or Facebook
or use the Permalink October 25, 2007 20:13Nice writeup!
Posted in ______. You forgot some tags.Josh Stodola
October 25, 2007 20:27 Scott, "advertently" is a word, it's just note widely used. "Vertently" certainly sounds better though.Matt
October 25, 2007 22:42 Wonderful article! I didn't know the inlining was NOT done in Debugmode..
Good to know!
Andrei Rinea
October 26, 2007 1:28 One guy in my team always use Release Build to do debugging. I must let him read this post today. Nice post.Li Yang
October 26, 2007 8:49 Well thought out and elequantly explained article! Nice post mate, my new "learn" for the day ;)Damian Gonsalves
October 26, 2007 9:00 Damien - Thanks, that's a very nice thing to say.Scott Hanselman
October 26, 2007 15:49 Excellent post scott!! P. S. there is one good use for disallowing method inlining in release builds. When using a try catch block and in the catch is a call to an 'extremely expensive' method, you mighy want to restrict the compiler from inlining the expensive method, otherwise the JIT optimizer will try to inline the expensive method on every call, even if an exceptionis not thrown.
But that should only be used when the expensive error handler is only used in catch blocks, otherwise every call to that method - even from normal calls - will loose performance.-simon f
Simon F
October 26, 2007 15:49nice posting!
Dominik
October 26, 2007 17:16 _"they wanted the complete stack trace in their logging after an exception was thrown."_ I wonder what a "five whys" exercise would have learned here? I'd guess that we might discover that the code has a tendency to crash a lot in production? So some important testing is actually occurring inthe wild?
So we might find we're in "two wrongs don't make a right" territory. Which is as good a description of "antipattern" as any.Mike Woodhouse
October 26, 2007 17:59 Brilliant presentation of the problem. I appreciate the time you take in research and explaining things to we mere mortals. As always, thank's for saving my butt. On an interesting corrolary, we were able to remove 1800 instances ofthis :)
If I could also convince the world that Hungarian Notation in .Net Code is also just as large of a party foul all will be well with theuniverse.
Jeremy Simmons
October 26, 2007 19:30 Building release builds with pdbonly compiler switch would inline and optimise the code with the detail stack trace information containingthe line numbers
I blogged about this back while: http://blog.vuscode.com/malovicn/archive/2007/08/05/releasing-the-build.aspxNikola Malovic
October 26, 2007 21:02Scott,
This is all well and good... and I have many times wanted to know if it would be able to get line numbers in the stack trace rather than offsets running with a "release" build. However, what you stated here sounds good, but what do you do for ASP.Net? In ASP.Net you do not deploy an EXE. Any advice in that case?BOb
Bob Archer
October 29, 2007 16:49 Brilliant post Scott! A must read for everyone here in the office. Debug, release builds, and optimizations seem to be common topics of confusion and heated political debate and the number of developers I've come across who are "trying to outwit the JITter" is astounding. Thank you for taking the time to develop clear examples and for presenting the argument in an easily digestible (and repeatable) fashion. I shall henceforth quote thee in meetings when this topicarises.
Stuart Thompson
November 10, 2007 0:20Hi Scott
Great article. I know it's only example code (but so many people read your blog), but the Framework Design Guidelines (7.3.2) states that you should not throw or derive from System.ApplicationException. ;) Nice tip about in the .ini file. BTW, the link to Mark Pearce's article seems to be broken.Mitch Wheat
Comments are closed. Disclaimer: The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.BLOG
* Privacy Policy
* Greatest Hits
* Dev Tool List
PODCAST
* Hanselminutes
* This Developer's Life * Ratchet & The GeekSPEAKING
* Speaking/Videos
* Presentations TipsBOOKS
* ASP.NET 4.5
* ASP.NET MVC 4
* Relationship Hacks Copyright 2021, Scott Hanselman . Design by @jzy , Powered by .NET Core 3.1.11 and deployed from commit affbcb via build 20201106.3Details
Copyright © 2024 ArchiveBay.com. All rights reserved. Terms of Use | Privacy Policy | DMCA | 2021 | Feedback | Advertising | RSS 2.0