Lanyon A Simple Blogger template

Free tutorials, courses, generative tools, and projects built with Javascript, PHP, Python, ML, AI,.Net, C#, Microsoft, Youtube, Github Code Download and more.

July 2021

Archive for July 2021

.NET Framework July 2021 Cumulative Update Preview

Today, we are releasing the July 2021 Cumulative Update Preview for .NET Framework.

Security

The July Cumulative Update Preview does not contain any new security fixes. See February 2021 Security and Quality Rollup for the latest security updates.

Quality and Reliability

This release contains the following quality and reliability improvements.

CLR1
  • In scenarios with both high numbers of assemblies and high numbers of GC heaps, Server GC can encounter serious lock contention during generation 2 GCs. A config switch has been introduced as a workaround. It can either be enabled from a .config file:
    <configuration>
      <runtime>
        <GCStaticsNoLock enabled="true"/>
      </runtime>
    </configuration>

    Or by setting environment variable COMPLUS_GCStaticsNoLockto a non-zero value. If the config switch is not enabled then behavior is unchanged compared to previous versions.

Windows Forms
  • Addresses an issue where some Windows Forms applications that use ToolStrip controls with ToolStripControlHost, and run under UIA Accessibility Tools, could make Accessibility Tools unresponsive.
  • Addresses a regression in the ComboBox item accessible object where Accessibility Tools was not able to distinguish between identical items in the ComboBox and was becoming unresponsive.

1 Common Language Runtime (CLR)

Getting the Update

The Cumulative Update Preview is available via Windows Update and Microsoft Update Catalog.

Microsoft Update Catalog

You can get the update via the Microsoft Update Catalog.

**Note**: Customers that rely on Windows Update will automatically receive the .NET Framework version-specific updates. Advanced system administrators can use of the below direct Microsoft Update Catalog download links to .NET Framework version specific updates.  Carefully review the .NET Framework version applicability to ensure that you only install updates on systems where they apply before installing updates.

Product Version Cumulative Update
Windows 10, version 21H1
.NET Framework 3.5, 4.8 Catalog 5004331
Windows 10, version 20H2 and Windows Server, version 20H2
.NET Framework 3.5, 4.8 Catalog 5004331
Windows 10 2004 and Windows Server, version 2004
.NET Framework 3.5, 4.8 Catalog 5004331
Windows 10 1909
.NET Framework 3.5, 4.8 Catalog 5004333
Windows 10 1809 (October 2018 Update) and Windows Server 2019 5004414
.NET Framework 3.5, 4.7.2 Catalog 5004335
.NET Framework 3.5, 4.8 Catalog 5004332

 

Previous Monthly Rollups

The last few updates are listed below for your convenience:

The post .NET Framework July 2021 Cumulative Update Preview appeared first on .NET Blog.



source https://devblogs.microsoft.com/dotnet/net-framework-july-2021-cumulative-update-preview/

Reinforcement Learning Course: Intro to Advanced Actor Critic Methods


Curriculum for the course Reinforcement Learning Course: Intro to Advanced Actor Critic Methods

Actor critic methods are used in machine learning. They are most useful for applications in robotics as they allow us to output continuous, rather than discrete actions. This enables control of electric motors to actuate movement in robotic systems, at the expense of increased computational complexity. 💻 Code for the algorithms covered: 🔗 Actor Critic: https://github.com/philtabor/Youtube-Code-Repository/tree/master/ReinforcementLearning/PolicyGradient/actor_critic/tensorflow2 🔗 Deep Deterministic Policy Gradients (DDPG): https://github.com/philtabor/Youtube-Code-Repository/tree/master/ReinforcementLearning/PolicyGradient/DDPG/tensorflow2/pendulum 🔗 Twin Delayed Deep Deterministic Policy Gradients (TD3): https://github.com/philtabor/Youtube-Code-Repository/tree/master/ReinforcementLearning/PolicyGradient/TD3/tf2 🔗 Proximal Policy Optimization (PPO): https://github.com/philtabor/Youtube-Code-Repository/tree/master/ReinforcementLearning/PolicyGradient/PPO/torch 🔗 Soft Actor Critic (SAC): https://github.com/philtabor/Youtube-Code-Repository/tree/master/ReinforcementLearning/PolicyGradient/SAC/tf2 🔗 Asynchronous Advantage Actor Critic (A3C): https://github.com/philtabor/Youtube-Code-Repository/tree/master/ReinforcementLearning/PolicyGradient/A3C/pytorch ✏️ Course from Phil Tabor. For more deep reinforcement learning tutorials check out his channel at: https://www.youtube.com/machinelearningwithphil ⭐️ Course Contents ⭐️ ⌨️ (0:00:00) Intro ⌨️ (0:04:03) Actor Critic (TF2) ⌨️ (0:44:50) DDPG (TF2) ⌨️ (1:52:36) TD3 (TF2) ⌨️ (3:08:29) PPO (PyTorch) ⌨️ (4:03:16) SAC (TF2) ⌨️ (5:09:28) A3C (PyTorch) ⭐️ Software requirements ⭐️ Python 3.x box2d-py 2.3.8 gym 0.15.4 matplotlib 3.1.1 numpy 1.18.1 pybullet 2.8.5 torch 1.4.0 tensorflow-gpu 2.3.1 🎉 Thanks to our Champion and Sponsor supporters: 👾 Wong Voon jinq 👾 hexploitation 👾 Katia Moran 👾 BlckPhantom 👾 Nick Raker 👾 Otis Morgan 👾 DeezMaster 👾 Treehouse -- Learn to code for free and get a developer job: https://www.freecodecamp.org Read hundreds of articles on programming: https://freecodecamp.org/news And subscribe for new videos on technology every day: https://youtube.com/subscription_center?add_user=freecodecamp

Watch Online Full Course: Reinforcement Learning Course: Intro to Advanced Actor Critic Methods


Click Here to watch on Youtube: Reinforcement Learning Course: Intro to Advanced Actor Critic Methods


This video is first published on youtube via freecodecamp. If Video does not appear here, you can watch this on Youtube always.


Udemy Reinforcement Learning Course: Intro to Advanced Actor Critic Methods courses free download, Plurasight Reinforcement Learning Course: Intro to Advanced Actor Critic Methods courses free download, Linda Reinforcement Learning Course: Intro to Advanced Actor Critic Methods courses free download, Coursera Reinforcement Learning Course: Intro to Advanced Actor Critic Methods course download free, Brad Hussey udemy course free, free programming full course download, full course with project files, Download full project free, College major project download, CS major project idea, EC major project idea, clone projects download free

Deploy 12 apps to AWS, Azure, & Google Cloud


Curriculum for the course Deploy 12 apps to AWS, Azure, & Google Cloud

Learn how to deploy 12 different apps to 3 different cloud services. ✏️ This course was created by Scalable Scripts. Check out their channel: https://www.youtube.com/c/ScalableScripts ⌨️ (0:00:00) Intro ⌨️ (0:00:37) Dockerize a React app ⌨️ (0:08:57) Dockerize a NodeJS app ⌨️ (0:13:40) Dockerize a VueJS app ⌨️ (0:20:00) Dockerize a NestJS app ⌨️ (0:26:26) Dockerize an Angular app ⌨️ (0:35:00) Dockerize a Golang app ⌨️ (0:41:23) Dockerize a Svelte app ⌨️ (0:47:27) Dockerize a Django app ⌨️ (0:52:12) Dockerize a Laravel app ⌨️ (0:56:32) Dockerize a .NET Core app ⌨️ (1:03:41) Dockerize a Spring Boot app with Kotlin ⌨️ (1:11:20) Dockerize a Deno app ⌨️ (1:16:33) Deploy a Container to AWS ⌨️ (1:25:22) Deploy a Container to Azure ⌨️ (1:32:32) Deploy a Container to Google Cloud 🎉 Thanks to our Champion and Sponsor supporters: 👾 Wong Voon jinq 👾 hexploitation 👾 Katia Moran 👾 BlckPhantom 👾 Nick Raker 👾 Otis Morgan 👾 DeezMaster 👾 Treehouse 👾 AppWrite -- Learn to code for free and get a developer job: https://www.freecodecamp.org Read hundreds of articles on programming: https://freecodecamp.org/news And subscribe for new videos on technology every day: https://youtube.com/subscription_center?add_user=freecodecamp

Watch Online Full Course: Deploy 12 apps to AWS, Azure, & Google Cloud


Click Here to watch on Youtube: Deploy 12 apps to AWS, Azure, & Google Cloud


This video is first published on youtube via freecodecamp. If Video does not appear here, you can watch this on Youtube always.


Udemy Deploy 12 apps to AWS, Azure, & Google Cloud courses free download, Plurasight Deploy 12 apps to AWS, Azure, & Google Cloud courses free download, Linda Deploy 12 apps to AWS, Azure, & Google Cloud courses free download, Coursera Deploy 12 apps to AWS, Azure, & Google Cloud course download free, Brad Hussey udemy course free, free programming full course download, full course with project files, Download full project free, College major project download, CS major project idea, EC major project idea, clone projects download free

Conversation about the .NET open source project

Open source was an attractive and exciting idea when we first considered sharing .NET Core on GitHub. At the same time, GitHub was a largely unknown platform for many of us and we had a lot of questions about how everything would work. “What if someone forks the runtime on the first day? Is the project over?”. We knew enough that we should take the time to learn the patterns that developers had already established and also what they expected of us. That said, we also had to host a project and org from day one, and it got busy much quicker than we expected. We’re several years and versions in at this point, and the rest is now history. It’s been a fun journey that we’ll reflect on with folks that have been part of it in a variety of ways.

We’re using the conversation format again, this time with collection of .NET engineers who want to share their experiences working on GitHub and establishing .NET as an open source project.

Why is open source important for the .NET project?

Immo: A modern developer stack needs to be cross platform. Open source is the most sustainable way to build a stack that has very wide support, over an ever changing landscape of operating systems and architectures. It also allows us to engage with consumers in real time, which has altered the way we plan, build, and iterate on .NET in more ways than I can describe here. And lastly, it’s now an expectation that fundamental technologies like developer stacks are available under an open source license.

Claire: Open Source enables anyone to view, debug, and contribute to the runtime that they use to build their application. They can address pain points that are important to them that might not be otherwise prioritized. Open Source helps ensure that the .NET project is available beyond a single vendor, Microsoft.

Kevin: I think Open Source is important for .NET for a few reasons:

  • It is pretty common for language and runtime implementations to be Open Source, so we’d be conspicuous if we weren’t.
  • We have a huge surface area, and despite our best attempts to write documentation, it’s really useful for people to be able to see and debug the implementation.
  • It opens us up to interesting collaborations from both individuals and other companies in a manner that is a lot more straightforward than trying to do one-off agreements on a closed source system.

Stephen: A multitude of reasons, but closest to my heart is the ability for anyone anywhere to find something important to them and improve it. In the times prior to .NET Core, requests for improvements would have to find their way to the right people at Microsoft, be collated and triaged against other requests, be scheduled for a developer to handle improving, and so on, and eventually it might find its way into a release in the next couple of years. Now, someone sees something they want to fix, they put up a PR, it’s reviewed, iterated on, merged, and it can be in a nightly build the next day. It’s a whole different world.

Dan: Open Source is the best way to be successful cross platform – it’s natural for targeting Linux.

Matt: I think it’s important for Microsoft to show that it’s invested in the OSS community in a meaningful way. We use OSS software as we develop, ship OSS software as part of our products, etc. OSS is a huge part of the entire software ecosystem these days. It’s important for Microsoft to be part of that. To give back.

Dan: Because we get more eyes on what we’re doing earlier, it helps us make sure we ship the right thing – before we ship. Also, the size of our community means there’s experts in many domains – more than we can have on our engineering team – and that helps us do better work as well.

The .NET team works directly on GitHub, right? There were some code bombs (the JIT and the GC) in the early days. There’s none of that now, right?

Immo: Only when Stephen Toub has a long layover.

Matt: We are almost entirely on GitHub. We do initially make security patches in internal repositories, but this code is merged into the open on release day. Otherwise we develop, discuss, and track issues almost entirely on GitHub.

Stephen: It’s much more rare these days. Every now and then there’s some additional existing component that’s brought into one of the dotnet/* repos, but it’s very infrequent. The only one I can think of from the past year was the System.Speech library.

Kevin: Actually, I think I have one of the largest code-bombs as I was the account that owned the first commit in the roslyn project (back in the days before we thought to use bots for things like that). That said, these days it’s true that the vast majority of our work happens directly on GitHub, and you can see it incrementally appear. But I wouldn’t rule out the possibility if we either decide to release the source for something other existing thing, or if we work on a prototype before deciding whether it makes sense to be Open Source or not.

Dan: We care a lot about working in the open – as well as being a commitment, it also gets more eyes on what we’re doing. So generally, it’s an anti-pattern for us to do significant non-public development.

Share a fun story about the original .NET Core 1.0 open source project.

Kevin: I was working on Roslyn at the time .NET Core 1.0 was being developed, but one thing that we were pretty happy about was that after Anders announced the compiler was released on CodePlex at the time, we were in a chat with their ops folks watching load increase on the server. Luckily it stayed up, but IIRC it was the highest load they’d seen to date.

Immo: For the dotnet org we created a dedicated user account (dotnet bot) that, among other things, we use as the author of the initial commits. We did this to make it clear that these commits represent existing code and wasn’t written by any specific individual. As you can imagine, initial commits tend have a lot of lines code. To this day, dotnet bot receives a lot of job offers by people who mine GitHub stats.

Stephen: Years ago on a plane flight from London I’d written a Sudoku app for generating, solving, and playing. That’s been my go-to app for porting to new platforms to try them out. It was originally written for Windows Forms. Then I ported it to WPF. When I was working on our parallel computing effort, I used it as a demo for parallelization. When Windows 8 came out, I ported it to WinRT. When we released an early tablet device, I ported it to run on that and light-up with ink. And when we were bringing up .NET Core on Linux, after “Hello, world” it was one of if not the first app to run on Linux on .NET Core (ported to have a console interface).

Matt: In the early days we used Jenkins as our public CI system. We had no idea what we should really be using. But this was a relatively old, monolithic version of Jenkins that was not designed to handle the scale we were trying to use it at (tens of thousands of jobs with a lot of orchestration). It got the job done, but managing a stable installation was a challenge. It ended up that we just created successively larger and larger VMs with larger amounts of memory (100s of GBs) and we still had to have someone watch to see when it would fall over so they could smash the restart button.

Dan: I’m constantly surprised at the engagement and expertise of the community. It’s very much a partnership, and it’s gratifying how many developers are so passionate about .NET that they have contributed such substantial features and changes that have made .NET better.

What’s the most surprising thing about the .NET open source project?

Immo: We have talked open sourcing for years. I’m still surprised how fast we went from having concerns to “why is it not done yet”. This has changed the entire team culture. We moved pretty much in weeks from an internal TFS with TF VC to GitHub with Git and developing in the open. I’m stunned, amazed, and incredibly proud of being part of a team that adapted so quickly, with relatively few hiccups.

Kevin: It’s getting normal at this point after doing it for the last 7 years, but I still get excited at the fact that my full time job is to work on Open Source technologies at Microsoft. It’s something I had a really hard time imagining when I started back in 2002.

Matt: I am always surprised at how fast it moves and how it seems to be continually accelerating. I used to be able to keep in my head the current set of efforts were going on, the state of the various repositories and their relationship between one another. I’ve had more and more moments of ‘wait…we do that now?’ in the last year than I did in perhaps the first 3 combined. But then again, I might just be getting old.

Dan: Since .NET open sourced, we’ve been approached many times by internal teams asking for help and guidance to open source their own projects. They’ve in turn helped become role models for other Microsoft teams. It’s really surprised me how much interest there has been in how we operate in the open and how they can learn from it.

Immo: One of the things that I didn’t foresee is how much open source has helped out internal engagement with partner teams. Looking back, it shouldn’t have been that surprising. Microsoft is a large company, with various different engineering systems, shipping cycles, and business goals. With open source, we try to make our code bases approachable by people who aren’t working on our team, which makes it simpler for anyone — including a different team at Microsoft.

Immo: .NET has a reputation with being very productive, especially with C#. Before open source, I’ve heard from many people, some die hard “Microsoft is evil” people, how awesome C# is but that they refuse to use it because it’s closed source and Windows-only. It seems many people finally had a chance to use it for their projects, even though they don’t involve Windows at all.

Kevin: Partly I think it goes to show how much .NET is a part of our customer’s lives. It’s something that people use day in and day out, and having the ability to have direct engagement between the engineers and customers is highly valuable. There are also a variety of folks on the team that spend a bunch of time thinking about how to work well with the community, and how to make our OSS presence more inclusive and welcoming. Definitely want to highlight Dan’s efforts in this space.

Matt: We’ve gotten the “core” of .NET solidified over the years. We now have the opportunities to branch out and try new and innovative things. Our engineering systems have gotten so much better compared to the early days. We can just move faster now.

Stephen: C# is a very approachable and well thought-out language, the .NET libraries are robust and sprawling, and the runtime is rock-solid. You can write very efficient and scalable apps and services, and you can do so productively.

Claire: For me, C#, .NET, and Visual Studio, has always been the “it just works” platform. I could get started and productive quickly and just start debugging without having to configure complicated things like class paths or manually specify garbage collector settings.

Dan: The .NET developer base is very large, plus as most of the .NET platform is written in C# it’s relatively easy to contribute to it and make a real difference. Plus, we became relevant to all developers, not just Windows developers – no matter what platform you work on, .NET is relevant.

In your view, are people happy with the project, open source wise?

Immo: From talking to other members in the .NET open source community it seems there are many things we got right. Specifically, when we started we told everyone that we’ll likely make mistakes and given our track record we’re grateful for honest feedback. I think that has set a great tone with our community engagement. That being said, it’s also clear that being great in OSS isn’t a destination — it’s a journey. And there is still a lot we can learn from other communities.

Dan: We know from surveys of our Github communities that for the most part, they’re very happy. It varies by repo, and there’s a lot we can do better: being more responsive and transparent, making it easier to get started and contribute. We can learn more from what other OSS projects do well. We’ve made improvements but there’s so much scope to do better.

Matt: I think the core developers are generally happy with .NET as an open source project. At least, I don’t see any fundamental push back to open-sourcing. Culturally within the .NET organization, it’s just the default. It’s just what we do. Disagreements we have these days are more on the nuts and bolts of working effectively. How can we best manage issues? What should our PR testing bar be?

Kevin: I think we’re always trying to improve. There are always going to be people that are disappointed that their thing doesn’t get fixed, but right now, it’s not that easy to build/debug/run tests in our repos. Sometimes we don’t do a good job of setting expectations of when or if issues will get addressed. And so on. So, I think we do okay, but I think we’re always looking to improve.

Dan: A couple of examples of changes we’ve made to be more inclusive: we logged our .NET 6 plans in Github, and manage them there; we’re also using the dotnet/designs repo extensively so from the start the community can help share and refine our designs and plans.

Project maintainers often talk about burn out. They are working after hours. You are doing this as your primary job, so the experience likely isn’t the same issue. What are the primary challenging issues you experience?

Dan: Because the repo never sleeps, you have to let go of the idea that you can keep up with what’s going on or that there’s an obligation to respond outside of work hours. On the other hand, for folks that like flexibility in when they work, it can be an advantage – there’s usually someone around to do a code review, for example.

Kevin: I think for me, it can still feel overwhelming trying to stay on top of what’s going on. Several of the repos I manage get hundreds to thousands of new issues every month, let alone PRs, comments, etc. Even though it’s a full-time job, it still doesn’t feel like there is enough time to give everything the attention it deserves. One way I’ve seen people address that is by expanding their working hours to the point where they still end up in that burnout state.

Stephen: Not having enough time to do everything I’d like to do. For example, I try to review a significant percentage of the PRs that come through dotnet/runtime, but there’s just so much volume, at the end of the day I have to prioritize.

Matt: One challenge is just avoiding being interrupt driven all the time. Since .NET moves so fast, I could spend my whole day responding to PR review requests, helping developers get unblocked, or fixing infrastructure bugs. The challenge is to stay focused on getting to the root of those issues I see to think strategically about how to solve whole classes of problems, rather than pounding individual ones all day.

Dan: There are many folks on the team who are really good at keeping strong boundaries on their availability. We are very clear that that’s fine, and actually ideal.

There are a fixed number of committers, and an unlimited number of potential contributors. That can make it hard to keep up with issues and PR reviews. We keep up more or less but I think we are still trying to find the right model to manage this. There’s likely opportunities we can offer to the community to help here.

Claire: There can be a never ending stream of issues posted given the global nature of the project and our contributors. I try to find a work/life balance by using the various “Do Not Disturb” features when after work hours.

It’s pretty obvious that the open source nature of the project goes well beyond the license and is mostly about the community. What has the team done to improve community engagement?

Claire: We’re constantly working to ensure interactions with and between the community are respectful so that anyone can participate.

Dan: Many examples. We’ve been piloting community triagers — several repos now have community members that can set labels and close duplicate issues. On the code side, we’ve in some cases brought our community contributors into our project standups: we did this for a push on networking performance last year, and it was very successful. Where possible, when there are community members who are passionate about implementing a feature, we’re happy to step out of the way – we’ve done this with Web Socket Compression and PriorityQueue for example.

Kevin: Dan and a few others have been running the survey for a while now, and we’ve been trying to apply learnings from that. As I mentioned above, trying to make expectations of about the state of issues clearer, making the repo more approachable and easier to build, putting systems in place to try to make sure that community PRs get reviewed in a timely fashion, etc.

Immo: In the past, we’ve had a track record of doing “source open”, that is throw-over-fence OSS where we work behind close doors and publish code bombs as was mentioned earlier. With .NET Core 1.0, we started to adopt the model that we work only of GitHub. This allows people to see code reviews between team members and our real bug tracker. Many of us also joined social media and promoted .NET and our GitHup projects a lot more. We also started to live stream design discussions on YouTube. We now have various web sites to share more content with the community, such as issuesof.net, apisof.net, apireview.net or themesof.net.

Matt: On the infrastructure side, our philosophy has always been to try and give non-Microsoft .NET contributors the same tools and processes Microsoft developers have at their disposal. The same PR checks and public access to results, the same coding tools, etc.

Dan: Build on Matt’s comment there, this has also made it easier for folks in our team who aren’t located in the office — they can work without having to connect a VPN.

Imagine you decided to move to a new (work) project. Would open source be part of your criteria? How important is it to you?

Stephen: That’s a sad thought; why would I want to leave? But yes, it’s extremely important.

Dan: I worked on closed source projects all my career until .NET. Now I can’t imagine working on a project that isn’t open source, or destined to be open source. It’s just so much more fun – more energy, more perspectives, more people to meet. It’s also more productive.

Claire: Being able to participate and contribute to open source is very important to me. Being able to interact with the community, get feedback on new ideas and iterate on them in the open, is critical.

Immo: As a PM, I massively value the ability to engage with my customers in real time, which includes connecting them directly with the artifacts my engineering team produces right now. Not being able to do this anymore would be hard take back. It doesn’t hurt that all my work is also visible publicly, should I ever leave Microsoft.

Kevin: I’ve been working on Open Source full-time for the last 7 years or so, and it was something I’ve wanted to do since I was in university. I have a hard time imagining being on a team that isn’t Open Source.

Matt: I don’t think OSS code would be a hard requirement for me. But certain OSS ‘ways of thinking’ are important. For example, transparency, diversity, integrity, community, public standards and debate, and OSS tooling are all important to me. It does happen that OSS projects often exhibit these attributes though.

Has .NET adoption increased because it is open source?

Claire: Without a doubt. Prior to being open source, .NET was limited to Windows. Now that it’s open source, it’s runs in so many more locations.

Immo: I like to believe the answer is yes, but I think .NET Core has changed the scenarios a lot with cross-platform support, including devices. It’s hard to tease apart which wins are due to what factor. But I think OSS is for sure a critical part of us being able to build .NET.

Dan: Open Source has made it much easier for us to be cross platform, because we can collaborate with Linux based communities that are naturally open source. And reaching Linux (and Mac) makes us an option for developers that are Linux based. Of course, there are also developers that just prefer open source stacks. It also makes it easier to trust .NET — you can read the sources yourself.

Matt: I think so. I think it’s a little hard to draw a direct line between the fact that .NET is OSS and adoption, but I think that OSS may have increased the visibility of the project in some ways, and also enables its use in some places (e.g. RedHat) that may not have been possible otherwise.

Microsoft, at least historically, has primarily delivered closed-source products. Have there been any challenges with long-time Microsoft customers adopting .NET as open source?

Kevin: There are definitely some. For me, this has typically come up around support. While it’s clear to most people that things published by Microsoft are supported, take an example like gRPC-dotnet, where Microsoft has written the vast majority of the code, but it’s actually owned and released by the CNCF. What’s our support story for that? (The answer is that we just got this straightened out and it is supported). But that comes up again and again for 3rd party libraries that we recommend, contribute to, etc.

Dan: Many .NET customers have historically composed their apps from Microsoft supplied libraries (which were historically closed source) and their own code, and are less comfortable depending on non-Microsoft libraries – which are typically open source. We’d like to make it easier for them to feel that they trust libraries that don’t come from the .NET team, and make the case that often times, open source should make it easier to trust them.

Matt: At least internally, there is occasionally some confusion about how our OSS projects are developed and the relationship between that and how they can get their needs met (servicing, new features etc.). Occasionally they might be a little uncomfortable with the idea that a traditionally “Microsoft” project like .NET has code developed by someone outside Microsoft in it. But I think that is largely historical assumptions about what .NET is rather than actual discomfort.

Describe the commitment to open source at Microsoft.

Immo: I feel like we have been pretty transparent about this from day one. Microsoft as a company is moving towards the cloud. Many of Microsoft’s customers are using .NET and we think making .NET great for the cloud is critical. And we believe open source is the best way to make .NET great for the cloud.

Dan: The best answer is to look at what’s been happening in recent years. The number of Microsoft maintained open source projects has continued to grow and now includes several of the most popular Github repositories. There is powerful momentum.

What has the relationship with the .NET Foundation been like?

Claire: There has been confusion with “.NET the project” and the .NET Foundation. The .NET Foundation holds the IP of the project, but it does not control how the projects operate. Microsoft controls the .NET project, as each other member project controls itself. In my roles as Executive Director of the .NET Foundation and as a Program Manager on the .NET team, I wear two hats and am always aware of which I’m wearing for a given conversation. I think at first, the lines between the .NET project and the .NET Foundation were blurry; over the past couple of years we’ve worked to put a cleaner separation between the two.

Closing

At this point, open source is so totally assumed that we don’t even really talk about working on an “OSS project”. Working in the open on GitHub has totally changed the team and the product in such meaningful and wonderful ways forever. We’re several years in at this point and the project and product is still growing. That’s heartening and satisfying. Clearly, open source is the best way to develop an application platform. It’s also a lot more fun. Thanks to everyone that has contributed to the project.

Thanks to Stephen, Matt, Kevin, Immo, Dan, and Claire for sharing your insights on the .NET open source project and what’s it’s been like to be part of it.

The post Conversation about the .NET open source project appeared first on .NET Blog.



source https://devblogs.microsoft.com/dotnet/conversation-about-the-net-open-source-project/

Tune in July 29 for .NET Conf: Focus on F#

Image FSharp 550 215 182

The .NET Conf team is bringing you another “Focus” event this Thursday, July 29 all about F#. We have finalized the agenda, speakers, and hosts that will make the day educational and fun. Whether you are a beginner or seasoned F# programmer, we have something for you.

.NET Conf: Focus on F# is a free, one-day livestream event that features speakers from the community and Microsoft teams working on and using the F# language. Learn how F# lets you write succinct, performant, and robust code backed by a powerful type system and the .NET runtime you can trust to build mission-critical software.

Learn from the creator of F# himself, Don Syme, and watch him kick off the day with F# community contributors and companies using F#. Guido van Rossum, creator of Python, will also be here learning F# from scratch from Don. You won’t want to miss this fascinating and informative session with two programming language creators. Here’s a sneak peak at the session:

Learn about the key ideas underlying F#, its unique and modern methodology, and hear live from F# users across the globe in fields including data science, supply chains, machine learning, biotech, risk management and more. Don’t miss .NET Conf: Focus on F#, a free, one-day livestream event. Tune into focus.dotnetconf.net on July 29, ask questions live, win a swag bag, and learn about what F# can do.

“.NET Conf: Focus” is a series of smaller, live events that we deliver to you throughout the year that are focused on specific things you can do with .NET. Of course, we will still have our big .NET Conf event on November 9 for the .NET 6 launch.

See you there!

The post Tune in July 29 for .NET Conf: Focus on F# appeared first on .NET Blog.



source https://devblogs.microsoft.com/dotnet/tune-in-july-29-for-net-conf-focus-on-f/

Try the new System.Text.Json source generator

In .NET 6.0, we are shipping a new C# source generator to help improve the performance of applications that use System.Text.Json. In this post, I’ll go over why we built it, how it works, and what benefits you can experience in your application.

With the introduction of the System.Text.Json source generator, we now have a few models for JSON serialization in .NET to choose from, using JsonSerializer. There is the existing model which is backed by runtime reflection, and two new compile-time source generation modes; where the generator generates optimized serialization logic, a static data access model, or both. In both source-generation scenarios, the generated artifacts are passed directly to JsonSerializer as a performance optimization. Here’s an overview of the functionality that each serialization model provides:

JsonSerializer JsonSerializer + pre-generating optimized serialization logic JsonSerializer + pre-generating data access model
Increases serialization throughput No (baseline) Yes No
Reduces start-up time No (baseline) Yes Yes
Reduces private memory usage No (baseline) Yes Yes
Eliminates runtime reflection No Yes Yes
Facilitates trim-safe app size reduction No Yes Yes
Supports all serialization features Yes No Yes

Getting the source generator

The source generator can be used in any .NET C# project, including console applications, class libraries, web, and Blazor applications. You can try out the source generator by using the latest build of the System.Text.Json NuGet package. Starting with the upcoming .NET 6.0 Preview 7 this won’t be necessary when targeting net6.0.

The source generator is compatible with other target framework monikers (TFMs) aside from .NET 6.0, that is .NET 5.0 and lower, .NET Framework, and .NET Standard. The API shape of the generated source code is consistent across the TFMs, but the implementation may vary based on the framework APIs that are available on each TFM.

The minimum version of the .NET SDK required for C# source generation is .NET 5.0.

What is the System.Text.Json source generator?

The backbone of nearly all .NET serializers is reflection. Reflection provides great capability for certain scenarios, but not as the basis of high-performance cloud-native applications (which typically (de)serialize and process a lot of JSON documents). Reflection is a problem for startup, memory usage, and assembly trimming.

An alternative to runtime reflection is compile-time source generation. Source generators generate C# source files that can be compiled as part of the library or application build. Generating source code at compile time can provide many benefits to .NET applications, including increased performance. In .NET 6, we are including a new source generator as part of System.Text.Json. The JSON source generator works in conjunction with JsonSerializer, and can be configured in multiple ways. Existing JsonSerializer functionality will continue to work as-is, so it’s your decision whether you use the new source generator. The approach the JSON source generator takes to provide these benefits is to move the runtime inspection of JSON-serializable types to compile-time, where it generates a static model to access data on the types, optimized serialization logic using Utf8JsonWriter directly, or both.

To opt into source generation, you can define a partial class which derives from a new class called JsonSerializerContext, and indicate serializable types using a new JsonSerializableAttribute class.

For example, given a simple Person type to serialize:

namespace Test
{
    internal class Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
}

We would specify the type to the source generator as follows:

using System.Text.Json.Serialization;

namespace Test
{
    [JsonSerializable(typeof(Person))]
    internal partial class MyJsonContext : JsonSerializerContext
    {
    }
}

As part of the build, the source generator will augment the MyJsonContext partial class with the following shape:

internal partial class MyJsonContext : JsonSerializerContext
{
    public static MyJsonContext Default { get; }

    public JsonTypeInfo<Person> Person { get; }

    public MyJsonContext(JsonSerializerOptions options) { }

    public override JsonTypeInfo GetTypeInfo(Type type) => ...;
}

The generated source code can be integrated into the compiling application by passing it directly to new overloads on JsonSerializer:

Person person = new() { FirstName = "Jane", LastName = "Doe" };
byte[] utf8Json = JsonSerializer.SerializeToUtf8Bytes(person, MyJsonContext.Default.Person);
person = JsonSerializer.Deserialize(utf8Json, MyJsonContext.Default.Person):

Why do source generation?

JsonSerializer is a tool that serializes .NET objects into JSON strings, and deserializes .NET objects from JSON strings. To process a type, the serializer needs information about how to access its members. When serializing, the serializer needs access to the object’s property and field getters. Similarly, when deserializing, the serializer needs access to a constructor to instantiate the type, and also to setters for the object’s properties and fields.

System.Text.Json exposes mechanisms for influencing serialization and deserialization behavior when using JsonSerializer, via JsonSerializerOptions (which allows runtime configuration), and also via attributes like [JsonPropertyName(string)] and [JsonIgnore] (which allow design-time configuration). When serializing and deserializing instances of a type, the serializer needs information about this configuration so that it can be honored.

When processing JSON-serializable types, the serializer needs information about object members and feature configuration in a structured, optimized format. We can refer to this structured information as the serialization metadata required to serialize a type.

In previous versions of System.Text.Json, serialization metadata could only be computed at runtime, during the first serialization or deserialization routine of every type in any object graph passed to the serializer. After this metadata is generated, the serializer performs the actual serialization and deserialization. The result of this computation is cached for reuse during subsequent JSON processing routines. The generation phase is based on reflection, and is computationally expensive both in terms of time and allocations. We can refer to this phase as the serializer’s “warm-up” phase.

The System.Text.Json source generator helps us to remove this warm-up phase by shifting the runtime inspection of serializable types using reflection to compile-time. The result of this inspection can be source code that initializes instances of structured serialization metadata. The generator can also generate highly-optimized serialization logic that can honor a set of serialization features that are specified ahead-of-time. By default, the generator emits both kinds of source, but can be configured to generate only one of these kinds of outputs either across a set of types, or per serializable type.

This generated metadata is included in the compiled assembly, where it can be initialized and passed directly to JsonSerializer so that the serializer doesn’t have to generate it at runtime. This helps reduce the costs of the first serialization or deserialization of each type. With these characteristics, using the source generator can provide the following benefits to applications that use System.Text.Json:

  • Increased serialization throughput
  • Reduced start-up time
  • Reduced private memory usage
  • Removed runtime use of System.Reflection and System.Reflection.Emit
  • Trim-compatible serialization which reduces application size

Introducing JsonTypeInfo<T>, JsonTypeInfo, and JsonSerializerContext

Implementations of the JsonTypeInfo<T>, JsonTypeInfo, and JsonSerializerContext types are the primary result of JSON source generation.

The JsonTypeInfo<T> type contains structured information about how to serialize and deserialize a single type. This information can contain metadata about how to access its members. This information is required when the serializer itself is performing the (de)serialization of the type, using the robust logic it has to support all the features that can be configured with JsonSerializerOptions or serialization attributes. This includes advanced features like async (de)serialization and reference handling. When only a limited set of features are needed, JsonTypeInfo<T> can contain optimized, pre-generated serialization logic (using Utf8JsonWriter directly) which the serializer can invoke instead of going through its own code-paths. Invoking this logic can lead to substantial serialization throughput improvements. A JsonTypeInfo<T> instance is tightly bound to a single instance of JsonSerializerOptions.

The JsonTypeInfo type provides an untyped abstraction over JsonTypeInfo<T>. JsonSerializer utilizes it to retrieve a JsonTypeInfo<T> instance from a JsonSerializerContext instance via JsonSerializerContext.GetTypeInfo.

The JsonSerializerContext type contains JsonTypeInfo<T> instances for multiple types. In addition to helping JsonSerializer retrieve instances of JsonTypeInfo<T> via JsonSerializerContext.GetTypeInfo, it also provides a mechanism for initializing all the type metadata using specific JsonSerializerOptions instances provided by users.

Source generation modes

The System.Text.Json source generator has two modes: one that generates type-metadata initialization logic, and another that generates serialization logic. Users can configure the source generator to use one or both of these modes for JSON-serializable types in a project, depending on the (de)serialization scenario. Metadata generated for a type contains structured information in a format that can be optimally utilized by the serializer to serialize and deserialize instances of that type to and from JSON representations. Serialization logic uses direct calls to Utf8JsonWriter methods to write JSON representations of .NET objects, using a predetermined set of serialization options. By default, the source generator generates both metadata initialization logic and serialization logic, but can be configured to generate just one type of logic. To set the generation mode for the entire context (set of serializable types), use JsonSourceGenerationOptionsAttribute.GenerationMode, while to set the mode for a specific type, use JsonSerializableAttribute.GenerationMode.

Generating optimized serialization logic

The first source generation mode we’ll look at is JsonSourceGenerationMode.Serialization. It delivers much higher performance than using existing JsonSerializer methods by generating source code that uses Utf8JsonWriter directly. In short, source generators offer a way of giving you a different implementation at compile-time in order to make the runtime experience better.

JsonSerializer is a powerful tool that has many features that can influence the (de)serialization of .NET types from/into the JSON format. It is fast, but can have some performance overhead when only a subset of features are needed for a serialization routine. Going forward, we will update JsonSerializer and the new source generator together. Sometimes, a new JsonSerializer feature will have accompanying support for optimized serialization logic and sometimes not, depending on how feasible it is to generate logic to support the feature.

Given our Person type from above, the source generator can be configured to generate serialization logic for instances of the type, given some pre-defined serializer options. Note that the class name MyJsonContext is arbitrary. You can use whatever class name you want.

using System.Text.Json.Serialization;

namespace Test
{
    [JsonSerializerOptions(
        PropertyNamingPolicy = JsonKnownNamingPolicy.CamelCase,
        GenerationMode = JsonSourceGenerationMode.Serialization)]
    [JsonSerializable(typeof(Person))]
    internal partial class MyJsonContext : JsonSerializerContext
    {
    }
}

We have defined a set of JsonSerializer features that are supported in this mode via JsonSourceGenerationOptionsAttribute. As shown above, these features can be specified to the source generator ahead of time, to avoid extra checks at runtime.

As part of the build, the source generator augments the MyJsonContext partial class with the same shape shown above.

The serializer invocation with this mode could look like the following example. This example allows us to trim out a lot of the System.Text.Json implementation since we don’t call into JsonSerializer.

using MemoryStream ms = new();
using Utf8JsonWriter writer = new(ms);

MyJsonContext.Default.Person.Serialize(writer, new Person { FirstName = "Jane", LastName = "Doe" });
writer.Flush();

// Writer contains:
// {"firstName":"Jane","lastName":"Doe"}

Alternatively, you can continue to use JsonSerializer, and instead pass an instance of the generated code to it, with MyJsonContext.Default.Person.

JsonSerializer.Serialize(person, MyJsonContext.Default.Person);

Here’s a similar use, with a different overload.

JsonSerializer.Serialize(person, typeof(Person), MyJsonContext.Default);

The difference between these two overloads is that the first is using the typed metadata implementation — JsonTypeInfo<T> — and the second one is using a more general JsonSerializerContext implementation that does type tests to determine if a typed implementation exists. It is a little slower (due to the type tests), as a result. If there is no source-generated implementation for a given type, then the serializer throws a NotSupportedException. It does not fallback to a reflection-based implementation (as an explicit design choice).

In the example above, the MyJsonContext.Default.Person property returns a JsonTypeInfo<Person>. The Default property returns a MyJsonContext instance whose backing JsonSerializerOptions instance matches the values set by the JsonSourceGenerationOptionsAttribute set on the JsonSerializerContext. If the attribute was not present, a default JsonSerializerOptions instance (i.e the result of new JsonSerializerOptions(JsonSerializerDefaults.General)) would be used.

This fastest and most optimized source generation mode — based on Utf8JsonWriter — is currently only available for serialization. Similar support for deserialization — based on Utf8JsonReader — will be considered for support in a future version of .NET. You will see in the following sections that there are other modes that benefit deserialization.

Generating type-metadata initialization logic

The generator can be configured to generate type-metadata initialization logic — with the JsonSourceGenerationMode.Metadata mode — instead of the complete serialization logic. This mode provides a static data access model for the regular JsonSerializer code paths to invoke when executing serialization and deserailization logic. This mode is useful if you need features that are not supported by the JsonSourceGenerationMode.Serialization mode, such as reference handling and async serialization. This mode also provide benefits for deserialization, which the serialization-logic mode does not.

The JsonSourceGenerationMode.Metadata mode provides much of the benefits of source generation, with the exception of improved serialization throughput. With this mode, runtime metadata generation is shifted to compile-time. Like the previous mode, the required metadata is generated into the compiling assembly, where it can be initialized and passed to JsonSerializer. This approach reduces the costs of the first serialization or deserialization of each type. Most of the other benefits stated earlier also apply, such as lower memory usage.

This mode is configured in a similar way as the previous example, except that we don’t specify feature options ahead of time, and we specify different generation mode:

using System.Text.Json.Serialization;

namespace Test
{
    [JsonSerializable(typeof(Person), GenerationMode = JsonSourceGenerationMode.Metadata)]
    internal partial class MyJsonContext : JsonSerializerContext
    {
    }
}

The generator augments the partial context class with the same shape as shown earlier.

The serializer invocation with this mode would look like the following example.

JsonSerializerOptions options = new()
{
    ReferenceHander = ReferenceHandler.Preserve,
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase
};

// Use your custom options to initialize a context instance.
MyJsonContext context = new(options);

string json = JsonSerializer.Serialize(person, context.Person);

// {"id":1,"firstName":"Jane","lastName":"Doe"}

Using this mode, you should see a significant performance improvement while enjoying the full range of (de)serializer features. This mode is a nice middle-ground option, depending on your needs.

Generating both serialization logic and metadata initialization logic

The default configuration for the source generation mode is JsonSourceGenerationMode.Default. This is an “everything on” mode that enables both of the source generator modes that were just covered. For example, you might only need features compatible with JsonSourceGenerationMode.Serialization for serialization, but also want to improve deserialization performance. In this scenario, you should see faster initial serialization and deserialization, faster serialization throughput, lower memory use, and decreased app size with assembly trimming.

You’d configure the generator as follows. Note you don’t have specify a generation mode since the default is to generate both kinds of logic.

using System.Text.Json.Serialization;

namespace Test
{
    [JsonSourceGenerationOptions(PropertyNamingPolicy = JsonKnownNamingPolicy.CamelCase)]
    [JsonSerializable(typeof(Person))]
    internal partial class MyJsonContext : JsonSerializerContext
    {
    }
}

Again, the generated API shape remains the same. We can use the generated source as follows:

// Serializer invokes pre-generated serialization logic for increased throughput and other benefits.
string json = JsonSerializer.Serialize(person, MyJsonContext.Default.Person);

// Serializer uses pre-generated type-metadata and avoids warm-up stage for deserialization, alongside other benefits.
Person person = JsonSerializer.Deserialize(json, MyJsonContext.Default.Person);

New APIs on JsonSerializer and in System.Net.Http.Json

In addition to the new APIs we’ve gone over to configure the source generator, we’ve added APIs to consume it’s output. We’ve already seen some of the new APIs in the examples above, where we pass JsonTypeInfo<T> and JsonSerializerContext instances directly to JsonSerializer as a performance optimization. We’ve also added more overloads to JsonSerializer and also in the System.Net.Http.Json APIs which help optimize the processing of JSON data when interacting with HttpClient and JsonContent.

New JsonSerializer APIs

namespace System.Text.Json
{
    public static class JsonSerializer
    {
        public static object? Deserialize(ReadOnlySpan<byte> utf8Json, Type returnType, JsonSerializerContext context) => ...;
        public static object? Deserialize(ReadOnlySpan<char> json, Type returnType, JsonSerializerContext context) => ...;
        public static object? Deserialize(string json, Type returnType, JsonSerializerContext context) => ...;
        public static object? Deserialize(ref Utf8JsonReader reader, Type returnType, JsonSerializerContext context) => ...;
        public static ValueTask<object?> DeserializeAsync(Stream utf8Json, Type returnType, JsonSerializerContext context, CancellationToken cancellationToken = default(CancellationToken)) => ...;
        public static ValueTask<TValue?> DeserializeAsync<TValue>(Stream utf8Json, JsonTypeInfo<TValue> jsonTypeInfo, CancellationToken cancellationToken = default(CancellationToken)) => ...;
        public static TValue? Deserialize<TValue>(ReadOnlySpan<byte> utf8Json, JsonTypeInfo<TValue> jsonTypeInfo) => ...;
        public static TValue? Deserialize<TValue>(string json, JsonTypeInfo<TValue> jsonTypeInfo) => ...;
        public static TValue? Deserialize<TValue>(ReadOnlySpan<char> json, JsonTypeInfo<TValue> jsonTypeInfo) => ...;
        public static TValue? Deserialize<TValue>(ref Utf8JsonReader reader, JsonTypeInfo<TValue> jsonTypeInfo) => ...;
        public static string Serialize(object? value, Type inputType, JsonSerializerContext context) => ...;
        public static void Serialize(Utf8JsonWriter writer, object? value, Type inputType, JsonSerializerContext context) { }
        public static Task SerializeAsync(Stream utf8Json, object? value, Type inputType, JsonSerializerContext context, CancellationToken cancellationToken = default(CancellationToken)) => ...;
        public static Task SerializeAsync<TValue>(Stream utf8Json, TValue value, JsonTypeInfo<TValue> jsonTypeInfo, CancellationToken cancellationToken = default(CancellationToken)) => ...;
        public static byte[] SerializeToUtf8Bytes(object? value, Type inputType, JsonSerializerContext context) => ...;
        public static byte[] SerializeToUtf8Bytes<TValue>(TValue value, JsonTypeInfo<TValue> jsonTypeInfo) => ...;
        public static void Serialize<TValue>(Utf8JsonWriter writer, TValue value, JsonTypeInfo<TValue> jsonTypeInfo) { }
        public static string Serialize<TValue>(TValue value, JsonTypeInfo<TValue> jsonTypeInfo) => ...;
    }
}

New System.Net.Http.Json APIs

namespace System.Net.Http.Json
{
    public static partial class HttpClientJsonExtensions
    {
        public static Task<object?> GetFromJsonAsync(this HttpClient client, string? requestUri, Type type, JsonSerializerContext context, CancellationToken cancellationToken = default(CancellationToken)) => ...;
        public static Task<object?> GetFromJsonAsync(this HttpClient client, System.Uri? requestUri, Type type, JsonSerializerContext context, CancellationToken cancellationToken = default(CancellationToken)) => ...;
        public static Task<TValue?> GetFromJsonAsync<TValue>(this HttpClient client, string? requestUri, JsonTypeInfo<TValue> jsonTypeInfo, CancellationToken cancellationToken = default(CancellationToken)) => ...;
        public static Task<TValue?> GetFromJsonAsync<TValue>(this HttpClient client, System.Uri? requestUri, JsonTypeInfo<TValue> jsonTypeInfo, CancellationToken cancellationToken = default(CancellationToken)) => ...;
        public static Task<HttpResponseMessage> PostAsJsonAsync<TValue>(this HttpClient client, string? requestUri, TValue value, JsonTypeInfo<TValue> jsonTypeInfo, CancellationToken cancellationToken = default(CancellationToken)) => ...;
        public static Task<HttpResponseMessage> PostAsJsonAsync<TValue>(this HttpClient client, System.Uri? requestUri, TValue value, JsonTypeInfo<TValue> jsonTypeInfo, CancellationToken cancellationToken = default(CancellationToken)) => ...;
        public static Task<HttpResponseMessage> PutAsJsonAsync<TValue>(this HttpClient client, string? requestUri, TValue value, JsonTypeInfo<TValue> jsonTypeInfo, CancellationToken cancellationToken = default(CancellationToken)) => ...;
        public static Task<HttpResponseMessage> PutAsJsonAsync<TValue>(this HttpClient client, System.Uri? requestUri, TValue value, JsonTypeInfo<TValue> jsonTypeInfo, CancellationToken cancellationToken = default(CancellationToken)) => ...;
    }
    public static partial class HttpContentJsonExtensions
    {
        public static Task<object?> ReadFromJsonAsync(this HttpContent content, Type type, JsonSerializerContext context, CancellationToken cancellationToken = default(CancellationToken)) => ...;
        public static Task<T?> ReadFromJsonAsync<T>(this HttpContent content, JsonTypeInfo<TValue> jsonTypeInfo, CancellationToken cancellationToken = default(CancellationToken)) => ...;
    }
    public sealed partial class JsonContent : HttpContent
    {
        public static JsonContent<object?> Create(object? inputValue, Type inputType, JsonSerializerContext context, MediaTypeHeaderValue? mediaType = null) => ...;
        public static JsonContent<TValue> Create<TValue>(TValue? inputValue, JsonTypeInfo<TValue> jsonTypeInfo, MediaTypeHeaderValue? mediaType = null) => ...;
    }
    public sealed partial class JsonContent<TValue> : JsonContent
    {
        public TValue? Value { get }
    }
}

How source generation provides benefits

Improved serialization throughput

Pre-generating and using optimized serialization logic that honors only features needed in an app leads to increased performance over using JsonSerializer‘s robust serialization logic. The serializer supports all features, which means there’s more logic to tear through during serialization, which can show up during measurements.

Serializing POCOs

Given our Person type, we can observe that serialization is ~1.62x faster when using the source generator.

Method Mean Error StdDev Ratio RatioSD Gen 0 Gen 1 Gen 2 Allocated
Serializer 243.1 ns 4.83 ns 9.54 ns 1.00 0.00
SrcGenSerializer 149.3 ns 2.04 ns 1.91 ns 0.62 0.03

Serializing collections

Using the same Person type, we observe significant performance boosts when serializing arrays with different lengths, all while not allocating at all.

Method Count Mean Error StdDev Ratio Gen 0 Gen 1 Gen 2 Allocated
Serializer 10 2,392.5 ns 17.42 ns 13.60 ns 1.00 0.0801 344 B
SrcGenSerializer 10 989.4 ns 6.74 ns 5.62 ns 0.41
Serializer 100 21,427.1 ns 189.33 ns 167.84 ns 1.00 0.0610 344 B
SrcGenSerializer 100 10,137.3 ns 125.61 ns 111.35 ns 0.47
Serializer 1000 215,102.4 ns 1,737.91 ns 1,356.85 ns 1.00 344 B
SrcGenSerializer 1000 104,970.5 ns 345.48 ns 288.49 ns 0.49

TechEmpower caching benchmark

The TechEmpower caching benchmark exercises a platform or framework’s in-memory caching of information sourced from a database. Following the benchmark specification, we perform JSON serialization of the cached data in order to send them as a response to the test harness. With source generation, we’ve been able to significantly increase our performance in this benchmark.

Requests/sec Requests
net5.0 243,000 3,669,151
net6.0 260,928 3,939,804
net6.0 + JSON source gen 364,224 5,499,468

We observe a ~100K RPS gain, which is a ~40% increase.

Faster startup & reduced private memory

Moving retrieval of type metadata from runtime to compile-time means that there is less work for the serializer to do on start-up, which leads to a reduction in the amount of time it takes to perform the first serialization or deserialization of each type.

In previous versions of System.Text.Json, the serializer always used Reflection.Emit where possible to generate fast member accessors to constructors, properties, and fields. Generating these IL methods takes a non-trivial amount of time, but also consumes private memory. With source generators, we are able to generate code that that statically invokes these accessors. This eliminates time and allocation cost due to reflection.

Similarly, all serialization and deserialization of JSON data was was performed within JsonConverter<T> instances. The serializer would statically initialize several built-in converter instances to provide default functionality. User applications paid the cost of these allocations, even when only a few of these converters are needed given the input object graphs. With source generation, we can initialize only the converters that are needed by the types indicated to the generator (in the JsonSourceGeneration.Metadata mode), and also skip the use of converters entirely (in the JsonSourceGeneration.Serialization mode).

Using a simple Message type:

public class JsonMessage
{
    public string message { get; set; }
}

We can observe startup improvements during serialization and deserialization.

Serialization

Elapsed time (ms) Allocated (KB)
Serializer 28.25 1110.00
SrcGenSerializer 12.75 563.00

Deserialization

Elapsed time (ms) Allocated (KB)
Serializer 24.75 1457.00
SrcGenSerializer 15.50 1025.00

We see that that it takes substantially less time and lower allocations to perform the first (de)serialization for the type.

Trim correctness

By eliminating runtime reflection, we avoid the primary coding pattern that is unfriendly to ILLinker analysis. Given that the reflection-based code is trimmed out, applications that use System.Text.Json go from having several ILLinker analysis warnings when trimming to having absolutely none. This means that applications that use the System.Text.Json source generator can be safely trimmed, provided there are no other warnings due to the user app itself, or other parts of the BCL.

Reduced app size

By inspecting serializable types at compile-time instead of at runtime, two major things are done to reduce the size of the consuming application. First, we can detect which custom or built-in JsonConverter<T> types are needed in the application at runtime, and reference them statically in the generated metadata. This allows the ILLinker to trim out JSON converter types which will not be needed in the application at runtime. Similarly, inspecting input types at compile-time eliminates the need to do so at runtime. This removes the need for lots of System.Reflection APIs at runtime, so the ILLinker can trim code internal code in System.Text.Json which uses with those APIs. Unused source code further in the dependency graph is also trimmed out.

Size reductions are based on which JsonSerializer methods are used. If the new APIs that take pre-generated metadata are used, then you may observe size reductions in your app.

Using a simple console program that does a roundtrip serialization and deserialization of our Message type using JSON source generation, we can observe a size reduction after trimming, when compared to the same program which does not use source generation.

App size (MB) System.Text.Json.dll size (KB)
Serializer 21.7 989
SrcGenSerializer 20.8 460

Using source generated code in ASP.NET Core

Blazor

In Blazor applications, pre-generated logic for serializable types can be forwarded to the serializer directly via the new APIs being added in the System.Net.Http.Json namespace. For example, to asynchronously deserialize a list of weather forecast objects from an HttpClient, you can use a new overload on the HttpClient.GetFromJsonAsync method:

[JsonSerializable(typeof(WeatherForecast[]))]
internal partial class MyJsonContext : JsonSerializerContext { }

@code {
    private WeatherForecast[] forecasts;

    private static JsonSerializerOptions Options = new(JsonSerializerDefaults.Web);
    private static MyJsonContext Context = new MyJsonContext(Options);

    protected override async Task OnInitializedAsync()
    {
        forecasts = await Http.GetFromJsonAsync("sample-data/weather.json", Context.WeatherForecastArray);
    }
}

MVC, WebAPIs, SignalR, Houdini

These ASP.NET Core services can retrieve user-generated contexts with already-existing APIs to configure serialization options.

[JsonSerializable(typeof(WeatherForecast[]))]
internal partial class MyJsonContext : JsonSerializerContext { }

services.AddControllers().AddJsonOptions(options => options.AddContext<MyJsonContext>());

In the future, these services can expose APIs to directly take JsonTypeInfo<T> or JsonSerializerContext instances.

Performing JSON serialization on behalf of others

Similar to the ASP.NET Core scenarios above, library or framework developers can provide new APIs that accept JsonSerializerOptions or JsonSerializerContext instances to forward to the serializer on behalf of the user.

Versioning

You might be wondering why the output of the source generator is passed directly to JsonSerializer via new overloads, rather than say initialized implicitly on application start up and registered in a global cache where the serializer can retrieve it. One benefit is for app trimming. By providing dedicated entry-points for source-generated serializers and data access models, we are statically providing the serializer with all the information that it needs to serialize input types, which allows it to shed lots of unused code and dependencies (both reflection-related and otherwise). Another benefit is that it provides an opportunity for callers to consider versioning, that is whether the code generated for serializable types is in sync with the serializable types themselves. This is an important consideration when using source generation, particulaly for serialization.

Having source-generator output that does not match the corresponding serializable types can cause serious issues, including having data being accidentally included or excluded from serialization. These issues could be really hard to diagnose. The source generator design avoids patterns which can cause versioning issues such as app-global registration of generated artifacts. This sort of global registration can cause contention issues between serialization settings across different assemblies. Each assembly might use different versions of the source generator, potentially resulting in apps having different behavior in development and in production, depending on which set of generated artifacts (among the implementations in various assemblies) are selected by the serializer.

Closing

Improving the performance of applications that use System.Text.Json has been a continuous process, and a primary goal of the library since its inception. Compile-time source generation has helped us increase performance and develop a new model of trim-safe serialization. We’d like you to try the source generator and give us feedback on how it affects the perf in your app, any usability issues, and any bugs you may find.

Community contributions are always welcome. If you’d like to contribute to System.Text.Json, check out our list of up-for-grabs issues on GitHub.

The post Try the new System.Text.Json source generator appeared first on .NET Blog.



source https://devblogs.microsoft.com/dotnet/try-the-new-system-text-json-source-generator/

Low-Code Tutorial – Build 3 Financial Apps (Full Course)


Curriculum for the course Low-Code Tutorial – Build 3 Financial Apps (Full Course)

Learn how to build 3 financial apps using low-code solutions from Ania - an ex-financial Broker turned Software Developer. ✏️ You can follow course creator Ania Kubów on her channel: https://www.youtube.com/aniakubow ⭐️ Timestamps ⭐️ ⌨️ (0:00:00) Introduction ⌨️ (0:01:53) Course Outline ⌨️ (0:02:45) Low-Code vs No-Code ⌨️ (0:04:17) Retool and Compatible Integrations ⌨️ (0:04:48) Building a Trade Dashboard ⌨️ (0:05:34) Integrating Google Sheets ⌨️ (0:59:22) Using Slack API ⌨️ (1:12:48) Building a Crypto Dashboard ⌨️ (1:13:12) Integrating a REST API ⌨️ (1:33:45) Using Twilio API ⌨️ (1:51:51) Building a Invoice Tracker ⌨️ (1:52:15) Integrating an external database ⌨️ (1:52:32) Getting data using GraphQL ⌨️ (2:19:29) Embedding external videos ⌨️ (2:22:03) Adding data using GraphQL ⌨️ (2:38:46) Updating data using GraphQL ⌨️ (2:42:42) Where to go next? 🔗 Readable Data for Project 1: https://docs.google.com/spreadsheets/d/1IxQ7gykdW46ox7ryAufAHUlUY1c8OWMhP_RF-X1YfoE/edit?usp=sharing 🎉 Thanks to Retool for providing a grant to make this course possible. 🎉 Thanks to our Champion and Sponsor supporters: 👾 Wong Voon jinq 👾 hexploitation 👾 Katia Moran 👾 BlckPhantom 👾 Nick Raker 👾 Otis Morgan 👾 DeezMaster 👾 Treehouse 👾 AppWrite -- Learn to code for free and get a developer job: https://www.freecodecamp.org Read hundreds of articles on programming: https://freecodecamp.org/news And subscribe for new videos on technology every day: https://youtube.com/subscription_center?add_user=freecodecamp

Watch Online Full Course: Low-Code Tutorial – Build 3 Financial Apps (Full Course)


Click Here to watch on Youtube: Low-Code Tutorial – Build 3 Financial Apps (Full Course)


This video is first published on youtube via freecodecamp. If Video does not appear here, you can watch this on Youtube always.


Udemy Low-Code Tutorial – Build 3 Financial Apps (Full Course) courses free download, Plurasight Low-Code Tutorial – Build 3 Financial Apps (Full Course) courses free download, Linda Low-Code Tutorial – Build 3 Financial Apps (Full Course) courses free download, Coursera Low-Code Tutorial – Build 3 Financial Apps (Full Course) course download free, Brad Hussey udemy course free, free programming full course download, full course with project files, Download full project free, College major project download, CS major project idea, EC major project idea, clone projects download free

Announcing .NET 6 Preview 6

We are happy to release .NET 6 Preview 6. Preview 6 is the second to last preview before we enter the RC period. There will be two RCs. This release itself is relatively small, while Preview 7 will be bigger. After that, we’re down to quality fixes until the final release in November. We’re looking forward to a great new .NET release.

You can download .NET 6 Preview 6 for Linux, macOS, and Windows.

See the ASP.NET Core, EF Core and .NET MAUI posts for more detail on what’s new for web, data access, and client scenarios.

Starting with .NET 6 Preview 6, we’ve tested and support Visual Studio 2022 Preview 2. Visual Studio 2022 enables you to leverage the Visual Studio tools developed for .NET 6 such as development in .NET MAUI, Hot Reload for C# apps, new Web Live Preview for WebForms, and other performance improvements in your IDE experience. .NET 6 has also been tested with Visual Studio for Mac 8.9.

Check out the new conversations posts for in-depth engineer-to-engineer discussions of the latest .NET features.

x64 emulation update

We’re done adding support for Apple Silicon for macOS and Arm64 for Windows. What’s left is supporting x64 emulation on macOS Apple Silicon and Windows Arm64. We need to do two things to enable that.

Until side-by-side capable installers are available (later in .NET 6), you’ll either need to install all x64 builds or all Arm64 ones. If you want to switch, you need to uninstall/delete all .NET versions on your Arm64 machine. That’s unfortunate, but where we are at at this point.

Tools: .NET SDK Optional Workload improvements

We have added three new workload commands that enable better discovery and management.

  • dotnet workload search — list workloads available to install.
  • dotnet workload uninstall — remove the specified workload if you no longer require a workload. Also a good option for space saving.
  • dotnet workload repair — re-install all workloads you’ve previously installed.
    • This is useful if your install fails in the middle because of a dropped internet connection.
    • Optional workloads are made up of multiple workload packs and you may have gotten into a state where some installed successfully but others didn’t.

In previous previews, we added the following commands:

  • dotnet workload install — installs a workload.
  • dotnet workload list — lists installed workloads.
  • dotnet workload update — updates installed workloads.

Libraries: TLS support for System.DirectoryServices.Protocols

TLS support has been enabled for System.DirectoryServices.Protocols for Linux and macOS. It was already enabled for Windows. .NET users can now enjoy secure communications with LDAP servers.

Credit to @iinuwa.

Tools: Crossgen2 replaces crossgen

Crossgen2 has been enabled for all existing crossgen scenarios. With that milestone behind us, we’ve also removed (the old) crossgen from the SDK. It is no longer accessible and cannot be used.

Crossgen (1 and 2) enables pre-compiling IL to native code as a publishing step. Pre-compilation is primarily beneficial for improving startup. Crossgen2 is a from-scratch implementation that is already proving to be a superior platform for code generation innovation. For example, crossgen2 can generate code for a broader set of IL patterns than crossgen1.

The following MSBuild properties demonstrate how to enable pre-compilation with crossgen2.

      <!-- Enable pre-compiling native code (in ready-to-run format) with crossgen2 -->
      <PublishReadyToRun>true</PublishReadyToRun> 
      <!-- Enable generating a composite R2R image -->
      <PublishReadyToRunComposite>true</PublishReadyToRunComposite>

Libraries: Improved sync-over-async performance

Sync-over-async is a common type of blocking work. It can lead to starvation when it happens on thread pool worker threads. Slow thread injection may delay other queued work from running, and may delay the starvation from being resolved.

This change improved the rate of thread injection by default when sync-over-async is the only type of blocking work happening on thread pool worker threads. There are some new AppContext config values that can be used to configure the rate of thread injection in response to sync-over-async.

Runtime: W^X memory policy

We are enabling support for W^X memory protection. It is a requirement on Apple Silicon machines and a useful security measure on other operating systems.

This feature has an abnormal name. It should be read as “write exclusive execute”. That means that a memory page can be marked for read/write or read/execute but never any combination that includes write and execute. Write/execute pages are subject to being exploited with buffer overrun attacks, for example.

This feature requires changes throughout the product, wherever write/execute pages are used. For example, preview 6 includes a change that requires the JIT to cooperate with the W^X scheme we’ve adopted.

W^X is a requirement of macOS on Apple Silicon machines, optional in all other environments for .NET 6 and will likely be the default mode in all environments for .NET 7.

Note: The W^X implementation has a startup regression with .NET 6 on all environments but Apple Silicon. It will be resolved as part of .NET 7. The Apple Silicon implementation has no such regression due to operating system support for this scenario.

CodeGen changelog

The following codegen changes are included in Preview 6.

Dynamic PGO

  • Add option to choose guarded devirt class randomly https://github.com/dotnet/runtime/pull/53399
  • pgo/devirt diagnostic improvements https://github.com/dotnet/runtime/pull/53247

LSRA

  • Refactor LSRA heuristics selection https://github.com/dotnet/runtime/pull/52832
    • Now, DEBUG mode includes a COMPlus variable that LsraOrdering will let the user set the heuristics ordering.
    • Tune the heuristics for register to select optimal register candidate to spill. https://github.com/dotnet/runtime/pull/53853

The following improvements are based on these changes.

image image image

More improvements:

Code quality

  • Eliminate redundant “test” instruction https://github.com/dotnet/runtime/pull/53214

Closing

The release is quickly coming together and to an end. We’ll soon be addressing only the most pressing feedback, approaching the same bug bar that we use for servicing releases. If you’ve been holding on to some feedback or have yet to try .NET 6, please do now. It’s your last chance to influence the release.

Thanks for everyone who has contributed to making .NET 6 another great release.

Thanks for being a .NET developer.

The post Announcing .NET 6 Preview 6 appeared first on .NET Blog.



source https://devblogs.microsoft.com/dotnet/announcing-net-6-preview-6/

Share this post

Search This Blog

What's New

The "AI is going to replace devs" hype is over – 22-year dev veteran Jason Lengstorf [Podcast #201]

Image
Curriculum for the course The "AI is going to replace devs" hype is over – 22-year dev veteran Jason Lengstorf [Podcast #201] Today Quincy Larson interviews Jason Lengstorf. He's a college dropout who taught himself programming while building websites for his emo band. 22 years later he's worked as a developer at IBM, Netlify, run his own dev consultancy, and he now runs CodeTV making reality TV shows for developers. We talk about: - How many CEOs over-estimated the impact of AI coding tools and laid off too many devs, whom they're now trying to rehire - Why the developer job market has already rebounded a bit, but will never be the same - Tips for how to land roles in the post-LLM résumé spam job search era - How devs are working to rebuild the fabric of the community through in-person community events Support for this podcast is provided by a grant from AlgoMonster. AlgoMonster is a platform that teaches data structure and algorithm patterns in a structure...

Labels

Programming Video Tutorials Coursera Video Tutorials Plurasight Programming Tutorials Udemy Tutorial C# Microsoft .Net Dot Net Udemy Tutorial, Plurasight Programming Tutorials, Coursera Video Tutorials, Programming Video Tutorials Asp.Net Core Asp.Net Programming AWS Azure GCP How To WordPress Migration C sharp AWS Project Git Commands FREE AWS Tutorial OldNewThings Git Tutorial Azure vs AWS vs GCP New in .Net javascript AI Google I/O 2025 Wordpress jquery Generative Video Git Git Squash Google Flow AI PHP SQL Veo 3 squash commit CSS Cloud Services React Tutorial With Live Project Source Code git rebase CPR Nummer Dropdown Reset Javascript Figma Figma Beginner Tutorial Geolocation Non-Programmer Content Python Free Course Think Simply Awesome Tutorial UI UX Live Project UI/UX Full Course Wireframing dotnet core runtime error html API Gateway AWS EKS vs Azure AKS All in one WP stuck C++ C++ Coroutines CPR Denmark ChatGPT Cloud Database Cloud DevOps Cloud Security Cloud Storage Contact Form 7 Dropdown Unselect Javascript E commerce Free AWS Terraform Project Training Git Commit Google Drive Files Google Drive Tips Http Error 500.30 Http Error 500.31 Interview Questions Learn Courutines C++ Microservices for Live Streaming PII Denmark Pub Sub SQL Server SSIS Terraform Course Free Terraform Tutorial Free USA E commerce strategies UpdraftPlus UpdraftPlus Manual Restore Website Optimization Strategies dropdown javascript select drop down javascript smarttube apk error 403 smarttube next 403 Error 413 Error 503 504 524 AI & ML AI Assistants AI Course CS50 AI in daily life AWS API Gateway AWS EBS AWS EC2 vs Azure VMs vs GCP Compute Engine AWS EFS AWS IAM AWS Lamda AWS RDS vs Azure SQL AWS Redshift AWS S3 AZ-104 AZ-104 Free Course AZ-104 Full Course AZ-104 Pass the exam Abstract Class C# Abstract Method Ajax Calender Control Ajax Control Toolkit All In One Extension Compatibility All In One WP Freeze All In One WP Migration All in one WP All-in-One WP Migration Android 15 Android TV Applying Theme html Asp.net core runtime Error Audio Auto Complete Azure AD Azure APIM Azure Administrator Certification Azure Blob Storage Azure Data Lake Azure Files Azure Function Azure Managed Disk Azure Synapse Base Class Child Class Best Grocery Price Big Data BigBasket vs Grofers Bing Homepage Quiz Blogger Import Blogger Post Import Blogger XML Import Bluetooth Connectivity Browser Detail Building Real-Time Web Applications Bulk Insert CI/CD CPR Address Update CPR Generator CPR Generator Denmark CS50 AI Course CS50 AI Python Course CS50 Artificial Intelligence Full Course CVR Centrale Virksomhedsregister Change Workspace TFS ChatGPT Essay Guide ChatGPT Usage ChatGPT vs Humans Cloud API Management Cloud CDN Cloud Computing Cloud Data Warehouse Cloud Event Streaming Cloud IAM Cloud Messaging Queue Cloud Monitoring and Logging Cloud Networking CloudFront Cloudflare Cloudwatch Compute Services Connect a Bluetooth Device to my PC site:microsoft.com Containers ControlService FAILED 1062 Corona Lockdown MP CosmosDB Covid19 Covid19 Bhopal Covid19 Home Delivery MP Covid19 Indore Covid19 Susner Covid19 Ujjain Cypress Javascript Cypress Javascript framework Cypress Javascript testing Cypress Javascript tutorial Cypress Javascript vs typescript DNS Danish CVR Data Analytics Data Analytics Course Free Data Engineering Data Structure Full Course Data Visualization Database Database Diagram Visualizer Davek Na Dodano Vrednost Dbdiagram export seeder Deep Learning Course Denmark Numbers Det Centrale Personregister Det Centrale Virksomhedsregister DevOps Device Compatibility Dictionary Dictionary in C# Digital Economy Disaster Recovery for Web Applications Disaster-Proof Infrastructure Dmart Frenchise Dmart Home Delibery Dmart Mumbai Address Dmart Pickup Points Doodle Jump Drive Images On Blog Drive Images On Website Driver Problems DropDown Dropbox Dropdown jquery DynamoDB ETL ETL Package Ecommerce Store using AWS & React Embed Drive Images Escape Sequences in c#.Net Event Hub Explicit Join Extract Facebook App Fake CVR Denmark Fake DDV Slovenia Fake VAT Number Fake Virk Number Faker Feature Toggle Find CPR Information Find a Word on Website Firestore Flappy Bird Game Form Selectors using jQuery Free React Portfolio Template FreeCodeCamp Frontend Best Practices for Millions of Users Full Text Index View G Drive Hosting GAN certification course GCP Cloud Data Lake GCP Filestore GCP Functions GCP IAM GCP Persistent Disk Gemini Git Checkout Google Adsense Setting Google Beam Google BigQuery Google Conversion Tracking Google Docs Advanced Tutorial Google Drive Clone Google Drive Clone Bot Google Drive Clone HTML CSS Google Drive Clone PHP Google Drive Clone React Google Drive Clone Tutorial Google Drive Clone VueJS Google Drive File Sharing Google Drive Images Google Drive Sharing Permissions Grocery Price Compare Online Grocery in Corona Grocery in Covid19 Grofers vs DMart vs Big basket HAXM installation HTML Storage HTML to PDF Javascript HTML2Canvas HTML5 HTML5 Append Data HTML5 Audio HTML5 Data Storage HTML5 Storage HTML5 Video Harvard University AI Course Header Sent Height Jquery High Availability in Live Streaming Platforms High-Concurrency Frontend Design High-Concurrency Web Applications How to Search for a Word on Mac Html2Canvas Black Background issue Http Error 413 Http Error 500.35 IIS INNER Join Image Gallery Blogger Image Gallery Blogger Picasa Image Gallery Blogger Template Image Gallery Blogger Template Free Implicit Join Indexing in SQL Instagram Clone React Instagram Clone Script Install NodeJS Ubuntu Internet Infrastructure Interview IoT IoT Core IoT Hub JS Game Tutorial Java Feature Toggle Javascript game tutorial JioCinema Case Study Keep Me Login Key Management Kinesis Learn Scrappy with a live project List Live Streaming Data Delivery Live Streaming Performance Optimization Load Load Balancer Looping Dictionary MTech First Semester Syllabus MTech Syllabus MVC Mac Mac Finder Shortcut Media Controller Media Group Attribute Microservices Architecture for Scalability Missing MySQL Extension Mobile Optimization Multiple Audio Sync Multiple Video Sync Mumbai Dmart List MySQL MySQL ERD Generator Next.js Beginner Tutorial Ngnix NodeJS NodeJS Ubuntu Commands Numpy OOPS Concepts OOPS in C# Object Oriented Programming Object Storage Outer Join PHP Installation Error PHP WordPress Installation Error Pandas Personligt identifikations nummer Pipedrive Pipedrive Quickbooks Integration Portfolio Website using React Project Astra PyTorch Quickbooks Quote Generator RGPV Syllabus Download Random SSN Generator ReCaptcha Dumbass React Feature Toggle Real-Time Video Processing Architecture Real-Time Video Processing Backend RegExp Regular Expression Reinstall Bluetooth Drivers Remember Me Remove NodeJS Ubuntu Renew DHCP Lease Reset IP Address Linux Reset IP Address Mac Reset IP Address Windows Reset Remote Connection Reset Remote Connection Failure Resize Textarea Restore Errors Restore Failed UpdraftPlus Route 53 SOS Phone SQL Indexed Tables SQL Joins SQL Seed generator SQS SSIS Package SSIS Tutorial SSN Generator for Paypal SSN Number SSN Number Generator SSN Validator Safari 8 Safari Video Delay SageMaker Scalable Backend for High Concurrency Scalable Cloud Infrastructure for Live Streaming Scalable Frontend Architectures Scalable Live Streaming Architecture Scrapy course for beginners Search A word Search for a Word in Google Docs Secret Management Serverless Service Bus Slovenian VAT Generator SmartTube Software Architect Interview Questions Software Architect Mock Interview Sparse Checkout Spotlight Mac Shortcut Stored Procedure Subtree Merge T-Mobile IMEI Check TFS TMobile IMEI check unlock Team Foundation Server Terraform Associate Certification Training Free Text Search Text color Textarea Resize Jquery Theme Top WordPress Plugins Transform Trim javascript Troubleshooting TypeScript Beginner Tutorial Ubuntu Unleash Feature Toggle Update Computer Name UpdraftPlus 500 UpdraftPlus Backup Restore UpdraftPlus Error 500 UpdraftPlus Error 504 UpdraftPlus Error 524 UpdraftPlus HTTP Error UpdraftPlus New Domain UpdraftPlus Restore Not Working UpdraftPlus Troubleshooting Upstream Reset Error Use Google Drive Images VAT Number Generator Verizon imei check Verizon imei check paid off Verizon imei check unlock Verizon imei check\ Version Control Vertex AI Video View Indexing SQL Views in SQL Virksomhedsregister Virtual friends Visual Studio 2013 WHERE Clause WHPX expo Web Security Web scraping full course with project Web3 What is Feature Toggle WordPress Backup Troubleshooting WordPress Backup UpdraftPlus WordPress Database Backup WordPress Error 503 WordPress Installation Error WordPress Migration UpdraftPlus Wordpress Restore Workspaces Commands Your ip has been banned Zero Click angle between two points bing homepage quiz answers bing homepage quiz answers today bing homepage quiz not working bing homepage quiz reddit bing homepage quiz today byod Verizon imei check chatgpt essay example chatgpt essay writer chatgpt essay writing check tmobile imei contact form 7 captcha contact form 7 captcha plugin contact form 7 recaptcha v3 cpr-nummer engelsk cpr-nummer liste cpr-nummer register cpr-nummer tjek dbdiagram dom load in javascript dotnet core hosting bundle dotnet failed to load dotnet runtime error get url in php how to search for a word on a page how to search for a word on a page windows ipconfig release is cypress javascript istio transport failure jQuery AutoComplete jQuery Input Selector jQuery Menu jQuery Options joins in mySql jquery selector jquery selectors jsPDF jsPDF images missing key key-value keypress event in jQuery kubernetes upstream error localStorage metro by t-mobile imei check nemid cpr-nummer react native expo setup react native on Windows react native setup recaptcha v3 contact form 7 recaptcha wordpress contact form 7 reset connection failure resize control jQuery response code 403 smarttube round number in javascript select sessionStorage smarttube 403 エラー smarttube apk smarttube beta smarttube download smarttube reddit smarttube unknown source error 403 smartube sos iphone top right sos on iphone 13 sos only iphone substr substr in javascript tmobile imei tmobile imei check paid off tmobile imei number total by Verizon imei check trim trim jquery turn off sos iphone turn off sos on iphone 11 unknown source error 403 unknown source error response code 403 smarttube upstream connect error url in php view hidden files mac finder zuegQmMdy8M ошибка 403 smarttube
  • ()
  • ()
Show more
an "open and free" initiative. Powered by Blogger.