<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Jon</title>
    <description>The latest articles on Forem by Jon (@jwtiller_c47bdfa134adf302).</description>
    <link>https://forem.com/jwtiller_c47bdfa134adf302</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1560840%2Fd98959f5-f218-4099-9e26-cd8f097648f6.jpg</url>
      <title>Forem: Jon</title>
      <link>https://forem.com/jwtiller_c47bdfa134adf302</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/jwtiller_c47bdfa134adf302"/>
    <language>en</language>
    <item>
      <title>Razorsharp - Demo</title>
      <dc:creator>Jon</dc:creator>
      <pubDate>Sat, 17 Aug 2024 19:34:46 +0000</pubDate>
      <link>https://forem.com/jwtiller_c47bdfa134adf302/razorsharp-demo-3g70</link>
      <guid>https://forem.com/jwtiller_c47bdfa134adf302/razorsharp-demo-3g70</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://razorsharp.dev" rel="noopener noreferrer"&gt;Razorsharp&lt;/a&gt; is a cutting-edge application performance monitoring (APM) tool designed for .NET applications. It allows developers to monitor and optimize their applications in real-time without modifying the source code. This week, I’ve been working on putting together an end-to-end demo that highlights what Razorsharp can do, and I’m excited to share it with you!&lt;/p&gt;

&lt;h2&gt;
  
  
  Live Demo
&lt;/h2&gt;

&lt;p&gt;We’ve set up a mock airline webpage at &lt;a href="https://airbyte.demo.razorsharp.dev" rel="noopener noreferrer"&gt;https://airbyte.demo.razorsharp.dev&lt;/a&gt;, built with a common tech stack: React on the frontend and C# ASP.NET Web API on the backend. The backend API is integrated with Razorsharp, enabling you to see how it works without any source code modifications.&lt;/p&gt;

&lt;p&gt;Feel free to click around on the site, then access the Razorsharp dashboard to observe the magic in action:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dashboard&lt;/strong&gt;: &lt;a href="https://demo.razorsharp.dev" rel="noopener noreferrer"&gt;https://demo.razorsharp.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Username&lt;/strong&gt;: &lt;a href="mailto:demo@demo.com"&gt;demo@demo.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Password&lt;/strong&gt;: Dotnet1234!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On the dashboard, you'll find detailed logs of the requests, time elapsed, and other useful metadata. This powerful insight makes it easier to identify performance bottlenecks and optimize your application's performance.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s Next?
&lt;/h2&gt;

&lt;p&gt;This is just the beginning! Razorsharp is still in its beta phase, and we’re working hard to add more features and polish the tool. Over the next few weeks, I’ll be extending this demo and adding more sample projects tailored to different industries. My goal is to show how Razorsharp can be a game-changer across various sectors, from finance to healthcare and beyond.&lt;/p&gt;

&lt;p&gt;Your feedback is invaluable to me, so please drop a comment if you have any suggestions or ideas on how we can make Razorsharp even better.&lt;/p&gt;

</description>
      <category>dotnet</category>
    </item>
    <item>
      <title>Will AI Replace Programming Languages?</title>
      <dc:creator>Jon</dc:creator>
      <pubDate>Wed, 31 Jul 2024 20:03:11 +0000</pubDate>
      <link>https://forem.com/jwtiller_c47bdfa134adf302/will-ai-replace-programming-languages-4hmn</link>
      <guid>https://forem.com/jwtiller_c47bdfa134adf302/will-ai-replace-programming-languages-4hmn</guid>
      <description>&lt;p&gt;Artificial intelligence (AI) has become a major player in technology, changing how we do many things and solve problems. As AI gets better at understanding and generating natural language, a big question comes up: &lt;strong&gt;Will AI replace programming languages?&lt;/strong&gt; This isn't just a theoretical question; it impacts how we make software and communicate with machines.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI: A Tool for Productivity
&lt;/h2&gt;

&lt;p&gt;AI has certainly made a lot of tasks easier. It can automate repetitive work, suggest code improvements, and even help write parts of programs. These are great tools that can save time and make developers' lives easier. But can AI fully replace programming languages? Let's explore this further.&lt;/p&gt;

&lt;h2&gt;
  
  
  Natural Language vs. Programming Languages
&lt;/h2&gt;

&lt;p&gt;Programming languages are designed to be precise and clear. They need specific syntax and instructions so computers can understand and do exactly what's needed. This clarity is crucial because even a small mistake in code can cause big problems.&lt;/p&gt;

&lt;p&gt;Natural language, like English, is flexible and rich but often vague and open to interpretation. AI models, despite their advancements, still have a hard time grasping all the details needed for complex programming tasks. For example, if you provided an AI with a user story and expected it to create the exact software you wanted, it probably wouldn't meet your expectations, especially for complex tasks. The gap between understanding a broad idea and translating it into detailed, working code is still large.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI as an Enhancer, Not a Replacement
&lt;/h2&gt;

&lt;p&gt;Given these limitations, it's unlikely that AI will replace programming languages anytime soon. Instead, AI acts as a helpful assistant. It can write simple code, automate testing, and spot potential errors. But the detailed and precise nature of programming, along with the need for human creativity and critical thinking, means human developers are still essential.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Human Element
&lt;/h2&gt;

&lt;p&gt;Writing code isn't just about translating instructions into a computer-friendly format. It's also about solving problems, being creative, and making decisions. These are areas where humans excel and where AI still has limitations. Programming often involves making choices, understanding context, and sometimes even breaking the rules—all of which require intuition and experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: A Symbiotic Relationship
&lt;/h2&gt;

&lt;p&gt;In summary, while AI can enhance the software development process, it won't replace programming languages. The precision required in coding, combined with the creativity and critical thinking of human developers, means that AI will continue to be a useful tool rather than a replacement. The future of software development lies in a partnership between AI and human expertise, working together to create better, more efficient, and innovative solutions. Embracing this partnership will be key to advancing technology.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Do I Think?
&lt;/h2&gt;

&lt;p&gt;Personally, I believe that AI has incredible potential to transform the way we develop software, but it won't make programming languages obsolete. AI is an exciting tool that can boost productivity and tackle mundane tasks, but the complexity and nuance of software development require human intelligence and creativity. There's something inherently human about solving problems through code that AI can't replicate. So, while AI will continue to play a big role in the future of technology, the human element in programming will remain irreplaceable.&lt;/p&gt;




&lt;p&gt;At &lt;a href="https://razorsharp.dev" rel="noopener noreferrer"&gt;razorsharp.dev&lt;/a&gt; utilize AI to make C# .NET developers more productive and enhance the security of solutions in matter of minutes without changing the source code&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Startup and Timing</title>
      <dc:creator>Jon</dc:creator>
      <pubDate>Sun, 07 Jul 2024 22:09:44 +0000</pubDate>
      <link>https://forem.com/jwtiller_c47bdfa134adf302/startup-and-timing-155d</link>
      <guid>https://forem.com/jwtiller_c47bdfa134adf302/startup-and-timing-155d</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;I got my first iPhone in the fall of 2007 after a trip from Norway to New York. Back then I had to jailbreak the phone to be able to use the phone with a different operator than AT&amp;amp;T. I had done some PHP and mySQL development for a while, and wanted to see if I could do some success on the app store. I did some research and found a framework named phonegap and later on apache cordova where you could leverage HTML and javascript and call native functions like map, camera etc. The same principles applies today with for instance React native. By mid-2009, I had published my first app, convinced that I was on the path to riches. The app was designed to help users find grocery stores, pharmacies, cinemas, and other businesses, complete with their locations and opening hours – quite similar to what Google Maps offers today. However, things didn’t go exactly as planned. While I garnered a decent user base in the Oslo area, particularly those seeking a store open on Sundays, the financial success  did not appear.&lt;/p&gt;

&lt;p&gt;Later in 2009, I launched another app that estimated taxi fares based on distance, time, and other factors. This was particularly useful for deciding whether the taxi fare was acceptable after a night out drinking or if taking the bus was a better option. Usually, its calculations were very accurate, with the actual price being just a few dollars off. This app brought in about $600 and gained some publicity. Reflecting on these experiences, I've come to appreciate the critical role of timing in the success of a startup. Being too early or too late can significantly impact an app's adoption and profitability.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Journey
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The First App: Finding Open Stores
&lt;/h3&gt;

&lt;p&gt;In mid-2009, with great excitement, I released an app that helped users find open stores, pharmacies, and other essential services. The app allowed users to input their location and discover nearby businesses, complete with opening hours. This was a time when few people had smartphones, and mobile internet access was still a novelty. Despite the challenges, the app found a niche audience in Oslo, especially among those searching for stores open on Sundays.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Second App: Estimating Taxi Fares
&lt;/h3&gt;

&lt;p&gt;At the end of 2009, I launched an app designed to estimate taxi fares. Users could input their current location and desired destination, and the app would calculate an estimated fare based on distance and time. This app earned around $600 and received a modest amount of publicity. While it was not a financial windfall, it was a valuable learning experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Role of Timing
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Too Early
&lt;/h3&gt;

&lt;p&gt;One of the critical lessons I learned was the impact of being too early in the market. When I released my first app, smartphone penetration was still low, and mobile internet access was not as widespread. This limited the potential user base and hindered the app's growth. Additionally, my app required manual data entry and updates, which was resource-intensive.&lt;/p&gt;

&lt;h3&gt;
  
  
  Too Late
&lt;/h3&gt;

&lt;p&gt;Conversely, being too late can also be detrimental. By the time my app for finding stores was gaining traction, Google was already developing similar functionalities for Google Maps. Their vast resources and ability to integrate such features seamlessly into an existing, widely-used platform made it difficult for a small independent developer to compete.&lt;/p&gt;

&lt;h3&gt;
  
  
  General Magic
&lt;/h3&gt;

&lt;p&gt;An example of being too early is the story of General Magic, a mobile computing company that emerged from Apple in 1990. General Magic developed a precursor to modern iPhone with their Magic Cap operating system and devices like the Sony Magic Link. Despite their visionary ideas, including rich graphics and user-friendly interfaces, the world was not ready for mobile computing in the early 1990s. Cellular networks were limited, and the concept of mobile communication and computing was still foreign to most people. This led to the company's eventual failure, but the technologies and ideas they pioneered influenced future developments in mobile technology.&lt;/p&gt;

&lt;h2&gt;
  
  
  RazorSharp
&lt;/h2&gt;

&lt;p&gt;Now, I am developing &lt;a href="https://razorsharp.dev" rel="noopener noreferrer"&gt;RazorSharp&lt;/a&gt;, a tool focused on .NET application performance monitoring and security. I started research and development part-time over two years ago, at a time when less were paying attention to observability. Throughout the development process .NET Aspire is added to the competitive landscape.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://razorsharp.dev" rel="noopener noreferrer"&gt;RazorSharp&lt;/a&gt; integrates advanced features such as AI-powered documentation and real-time performance data, providing developers with actionable insights to enhance their application's performance and security. This tool aims to simplify debugging, monitor resource usage, and provide comprehensive security monitoring through features like SQL injection detection.&lt;/p&gt;

&lt;p&gt;So time will show if im too late on this journey.&lt;/p&gt;

&lt;h2&gt;
  
  
  Balancing Act
&lt;/h2&gt;

&lt;p&gt;Timing is a delicate balance. Being an early mover can offer significant advantages, such as establishing a strong user base and brand recognition. However, it also comes with the risk of limited adoption if the market is not ready. On the other hand, entering the market too late means facing well-established competitors and possibly missing the initial excitement and novelty that can drive early adoption.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Reflecting on my journey, I've come to understand that timing is crucial in the world of startups. Both of my apps were innovative and solved real problems, but the timing of their release played a significant role in their ultimate success and failure. As technology continues to evolve, staying attuned to market readiness and competitive landscapes will remain essential for any aspiring entrepreneur.&lt;/p&gt;

&lt;p&gt;While I may not have achieved the financial success I initially envisioned, the experiences and lessons learned have been invaluable. They have shaped my understanding of the startup ecosystem and the importance of timing. These are experiences I would not trade for anything. The same principles still apply to app development today, and they enable me to have insightful conversations with other app developers. For anyone looking to embark on a similar journey, remember that success often lies not just in the idea, but in the timing of its execution.&lt;/p&gt;

&lt;p&gt;Have you had an idea where you were a bit too early or too late?&lt;/p&gt;

</description>
      <category>startup</category>
      <category>development</category>
      <category>timing</category>
      <category>lessonslearned</category>
    </item>
    <item>
      <title>Migrating from .NET Framework to .NET 8:</title>
      <dc:creator>Jon</dc:creator>
      <pubDate>Mon, 01 Jul 2024 18:09:06 +0000</pubDate>
      <link>https://forem.com/jwtiller_c47bdfa134adf302/migrating-from-net-framework-to-net-8-34d5</link>
      <guid>https://forem.com/jwtiller_c47bdfa134adf302/migrating-from-net-framework-to-net-8-34d5</guid>
      <description>&lt;h2&gt;
  
  
  Why You Should Migrate
&lt;/h2&gt;

&lt;p&gt;Migrating from the .NET Framework to .NET 8 is essential for modernizing your applications. Here’s why:&lt;/p&gt;

&lt;h3&gt;
  
  
  Performance
&lt;/h3&gt;

&lt;p&gt;.NET 8 offers significant performance improvements, including faster runtime execution and optimized libraries, leading to more responsive applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  Security
&lt;/h3&gt;

&lt;p&gt;.NET 8 includes the latest security updates, protecting your applications against new threats. The .NET Framework is more vulnerable to unpatched vulnerabilities.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reducing Technical Debt
&lt;/h3&gt;

&lt;p&gt;Maintaining legacy code is costly and time-consuming. Modernizing your codebase reduces technical debt, allowing your team to focus on new features and improvements.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Migration Issues
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Compatibility
&lt;/h3&gt;

&lt;p&gt;Not all libraries and dependencies from the .NET Framework are compatible with .NET 8. You may need to find alternatives or update existing libraries.&lt;/p&gt;

&lt;h3&gt;
  
  
  Breaking Changes
&lt;/h3&gt;

&lt;p&gt;.NET 8 introduces some breaking changes that may require code refactoring. Identifying and addressing these changes can be time-consuming.&lt;/p&gt;

&lt;h3&gt;
  
  
  Learning Curve
&lt;/h3&gt;

&lt;p&gt;Your development team might need time to get familiar with new features and best practices in .NET 8, temporarily slowing down development.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using the .NET Upgrade Assistant
&lt;/h2&gt;

&lt;p&gt;The .NET Upgrade Assistant helps automate the migration process by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Assessing your project for compatibility issues.&lt;/li&gt;
&lt;li&gt;Converting project files to the new SDK-style format.&lt;/li&gt;
&lt;li&gt;Updating NuGet packages to .NET 8-compatible versions.&lt;/li&gt;
&lt;li&gt;Providing reports on manual adjustments needed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Techniques for a Smooth Migration
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Abstracting Breaking Changes with Extension Methods
&lt;/h3&gt;

&lt;p&gt;Use extension methods to handle breaking changes and maintain a consistent API. For example, abstract JSON serialization changes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;JsonExtensions&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;ToJson&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;JsonSerializer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Serialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;FromJson&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;JsonSerializer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Deserialize&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Utilizing Dependency Injection
&lt;/h3&gt;

&lt;p&gt;Leverage .NET 8's built-in dependency injection to manage dependencies effectively. Here’s an example for logging:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Define an interface:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;ILoggerService&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;LogInformation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;LogError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Implement the interface:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;LoggerService&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ILoggerService&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;ILogger&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;LoggerService&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_logger&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;LoggerService&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ILogger&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;LoggerService&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;_logger&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;LogInformation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;_logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LogInformation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;LogError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;_logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LogError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Register the service:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Startup&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;ConfigureServices&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IServiceCollection&lt;/span&gt; &lt;span class="n"&gt;services&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddLogging&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;configure&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;configure&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddConsole&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
        &lt;span class="n"&gt;services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddSingleton&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ILoggerService&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LoggerService&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Incremental Migration
&lt;/h3&gt;

&lt;p&gt;Migrate in phases instead of all at once. Start with core libraries and services, then gradually update the rest of your application.&lt;/p&gt;

&lt;h3&gt;
  
  
  Comprehensive Testing
&lt;/h3&gt;

&lt;p&gt;Ensure you have a comprehensive suite of automated tests before starting the migration. Tests help identify issues introduced during the migration process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Best Practices
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Long-Term Support (LTS) vs. Short-Term Support (STS)
&lt;/h3&gt;

&lt;p&gt;Many developers prefer sticking with Long-Term Support (LTS) versions of .NET and skip Short-Term Support (STS) versions due to the effort required for upgrading, including updating build pipelines. Once you have upgraded to .NET 8, moving to .NET 9 or 10 typically only requires updating the version in the props file, simplifying future migrations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Centralizing Version Management
&lt;/h3&gt;

&lt;p&gt;Use a props file to centralize version information and other settings, making it easier to update them for future migrations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Modular Architecture
&lt;/h3&gt;

&lt;p&gt;Adopt a modular architecture to make parts of your application independently upgradable, reducing future migration efforts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Continuous Integration/Continuous Deployment (CI/CD)
&lt;/h3&gt;

&lt;p&gt;Implement CI/CD practices to automate testing and deployment, ensuring compatibility with future .NET releases.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cryptographic Changes
&lt;/h3&gt;

&lt;p&gt;Occasionally, there may be cryptographic breaking changes. It’s important to stay updated with the latest .NET release notes and ensure your application’s cryptographic implementations comply with the new standards.&lt;/p&gt;

&lt;h2&gt;
  
  
  Taking It to the Next Step
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Leveraging Copilot and LLM
&lt;/h3&gt;

&lt;p&gt;With tools like GitHub Copilot and other large language models (LLMs), you can further enhance your development process. These tools can suggest how to upgrade breaking changes and even automate the process for you, significantly boosting productivity.&lt;/p&gt;

&lt;h3&gt;
  
  
  Automating Code Fixes with Roslyn
&lt;/h3&gt;

&lt;p&gt;Consider using Roslyn to create code fix implementations that can automate parts of the migration process. Roslyn provides powerful APIs for code analysis and transformations, enabling you to automate refactoring tasks efficiently. This is a topic that will be covered in more detail in future articles.&lt;/p&gt;

&lt;h2&gt;
  
  
  New C# Language Opportunities
&lt;/h2&gt;

&lt;p&gt;The .NET Framework does not support the newest C# language features, which are available in .NET Core and .NET. Here are some features you can use after migrating:&lt;/p&gt;

&lt;h3&gt;
  
  
  Nullable Reference Types
&lt;/h3&gt;

&lt;p&gt;Enhanced null safety in your code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Async Streams
&lt;/h3&gt;

&lt;p&gt;The ability to await foreach.&lt;/p&gt;

&lt;h3&gt;
  
  
  Default Interface Methods
&lt;/h3&gt;

&lt;p&gt;Enabling interfaces to have default implementations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pattern Matching Enhancements
&lt;/h3&gt;

&lt;p&gt;Improved pattern matching capabilities.&lt;/p&gt;

&lt;h3&gt;
  
  
  Records
&lt;/h3&gt;

&lt;p&gt;A new reference type with built-in functionality for encapsulating data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Top-level Statements
&lt;/h3&gt;

&lt;p&gt;Simplified syntax for writing minimal code, especially useful for small scripts and tutorials.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Migrating from .NET Framework to .NET 8 is crucial for improving performance, security, and maintainability. Using tools like the .NET Upgrade Assistant and applying best practices can ensure a smooth migration process. Once you’ve upgraded to .NET 8, consider giving &lt;a href="https://razorsharp.dev/"&gt;RazorSharp APM&lt;/a&gt; a try to monitor and secure your applications effectively. RazorSharp offers real-time performance insights, enhanced security, and AI-powered documentation, helping you maintain high standards in your .NET applications.&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>dotnetframework</category>
      <category>dotnetcore</category>
    </item>
    <item>
      <title>Understanding and Preventing XSS Attacks in C# Applications</title>
      <dc:creator>Jon</dc:creator>
      <pubDate>Fri, 28 Jun 2024 21:56:02 +0000</pubDate>
      <link>https://forem.com/jwtiller_c47bdfa134adf302/understanding-and-preventing-xss-attacks-in-c-applications-55fg</link>
      <guid>https://forem.com/jwtiller_c47bdfa134adf302/understanding-and-preventing-xss-attacks-in-c-applications-55fg</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;As summer vacation approaches, it's essential to remain vigilant against cybersecurity threats, especially cross-site scripting (XSS) attacks. This article explores what XSS is, how to prevent it in C#, and how RazorSharp Guard can automate this protection for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is XSS?
&lt;/h2&gt;

&lt;p&gt;Cross-Site Scripting (XSS) is a type of security vulnerability commonly found in web applications. It occurs when an attacker injects malicious scripts into content from otherwise trusted websites. These scripts can then execute in the user's browser, potentially stealing data, hijacking sessions, or performing actions on behalf of the user.&lt;/p&gt;

&lt;p&gt;There are three main types of XSS:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Stored XSS&lt;/strong&gt;: The malicious script is stored on the server (e.g., in a database) and then served to users.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reflected XSS&lt;/strong&gt;: The script is reflected off a web server, such as in an error message or search result.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DOM-based XSS&lt;/strong&gt;: The vulnerability exists in the client-side code rather than the server-side code.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why is XSS Dangerous?
&lt;/h2&gt;

&lt;p&gt;XSS attacks can have severe consequences:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Data Theft&lt;/strong&gt;: Attackers can steal cookies, session tokens, and other sensitive information.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Session Hijacking&lt;/strong&gt;: Attackers can take over user sessions and impersonate them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Defacement&lt;/strong&gt;: Attackers can alter the content of web pages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Malware Distribution&lt;/strong&gt;: Attackers can use XSS to distribute malware.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Preventing XSS in Csharp
&lt;/h2&gt;

&lt;p&gt;To prevent XSS in your C# applications, follow these best practices:&lt;/p&gt;

&lt;h3&gt;
  
  
  Sanitize Inputs
&lt;/h3&gt;

&lt;p&gt;Always sanitize user inputs by encoding or escaping special characters.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Web&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;safeInput&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HttpUtility&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;HtmlEncode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;userInput&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Validate Inputs
&lt;/h3&gt;

&lt;p&gt;Ensure inputs meet expected formats and lengths.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Regex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IsMatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;userInput&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"^[a-zA-Z0-9]*$"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Input is valid&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Use Secure Frameworks
&lt;/h3&gt;

&lt;p&gt;Use frameworks and libraries that automatically handle input sanitization and validation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;@Html&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Property&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Content Security Policy (CSP)
&lt;/h3&gt;

&lt;p&gt;Implement CSP to restrict the sources from which scripts can be executed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;http-equiv=&lt;/span&gt;&lt;span class="s"&gt;"Content-Security-Policy"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"default-src 'self'; script-src 'self' https://trusted.cdn.com"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  HTTP Headers
&lt;/h3&gt;

&lt;p&gt;Use security headers to protect your application.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"X-XSS-Protection"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"1; mode=block"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Automating XSS Prevention with RazorSharp Guard
&lt;/h2&gt;

&lt;p&gt;Manually implementing XSS protection can be tedious and error-prone. This is where RazorSharp Guard comes in. The next version of RazorSharp Guard will automatically inspect all HTTP requests for potential XSS attacks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Automatic Inspection&lt;/strong&gt;: RazorSharp Guard will inspect all endpoints for XSS vulnerabilities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configurable Responses&lt;/strong&gt;: Choose between logging warnings or errors that block execution.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Seamless Integration&lt;/strong&gt;: RazorSharp Guard integrates smoothly into your .NET applications, providing real-time protection.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By leveraging RazorSharp Guard, you can ensure that your applications are protected from XSS attacks without the need for extensive manual coding. This allows you to focus on building features while RazorSharp Guard handles security.&lt;/p&gt;

&lt;p&gt;Stay tuned for the release, and enjoy your summer vacation knowing your applications are secure with RazorSharp Guard!&lt;/p&gt;

&lt;p&gt;For more details and to get started with RazorSharp Guard, visit &lt;a href="https://razorsharp.dev"&gt;RazorSharp.dev&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>security</category>
      <category>xss</category>
    </item>
    <item>
      <title>Computer Vision - Building a Motion Detection Camera in .NET</title>
      <dc:creator>Jon</dc:creator>
      <pubDate>Thu, 27 Jun 2024 18:34:47 +0000</pubDate>
      <link>https://forem.com/jwtiller_c47bdfa134adf302/building-a-motion-detection-camera-with-opencvsharp-in-net-kd4</link>
      <guid>https://forem.com/jwtiller_c47bdfa134adf302/building-a-motion-detection-camera-with-opencvsharp-in-net-kd4</guid>
      <description>&lt;p&gt;In our &lt;a href="https://dev.to/jwtiller_c47bdfa134adf302/introduction-to-computer-vision-in-net-160i"&gt;previous article&lt;/a&gt;, we introduced the basics of image processing with OpenCvSharp in .NET. Now, let's take it a step further and build a motion detection camera. This project will help you understand how motion detection works in various applications like security systems, wildlife monitoring, and more.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Familiarity with C# and .NET&lt;/li&gt;
&lt;li&gt;OpenCvSharp installed (via NuGet)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step-by-Step Guide
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Setup the Project
&lt;/h3&gt;

&lt;p&gt;Create a new .NET project and install OpenCvSharp:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet add package OpenCvSharp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Capture Video Frames
&lt;/h3&gt;

&lt;p&gt;Initialize video capture to read frames from your camera:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;OpenCvSharp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;VideoCapture&lt;/span&gt; &lt;span class="n"&gt;capture&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;VideoCapture&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;Mat&lt;/span&gt; &lt;span class="n"&gt;frame&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Mat&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;Mat&lt;/span&gt; &lt;span class="n"&gt;prevFrame&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Mat&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;Mat&lt;/span&gt; &lt;span class="n"&gt;diffFrame&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Mat&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Detect Motion
&lt;/h3&gt;

&lt;p&gt;Use a loop to read frames and detect motion using &lt;code&gt;Mat.AbsDiff&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;capture&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Empty&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;prevFrame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Empty&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Absdiff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prevFrame&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;diffFrame&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;Cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CvtColor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;diffFrame&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;diffFrame&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ColorConversionCodes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BGR2GRAY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;Cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Threshold&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;diffFrame&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;diffFrame&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ThresholdTypes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Binary&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;Cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ImShow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Motion"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;diffFrame&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CopyTo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prevFrame&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WaitKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;capture&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Release&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;Cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;DestroyAllWindows&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How Motion Detection Works
&lt;/h2&gt;

&lt;p&gt;Motion detection is a technology that enables cameras and other devices to detect movement within their field of view. This technology is widely used in security systems, home automation, and wildlife monitoring. Here’s how it works:&lt;/p&gt;

&lt;h3&gt;
  
  
  Frame Comparison
&lt;/h3&gt;

&lt;p&gt;Motion detection works by comparing consecutive frames from a video feed. The &lt;code&gt;Mat.AbsDiff&lt;/code&gt; method in OpenCvSharp computes the absolute difference between two frames. This helps in identifying changes between the frames.&lt;/p&gt;

&lt;h3&gt;
  
  
  Image Processing
&lt;/h3&gt;

&lt;p&gt;Once the difference is calculated, the resulting image is processed to highlight significant changes. Converting the difference frame to grayscale simplifies the analysis, while applying a binary threshold highlights the areas with movement.&lt;/p&gt;

&lt;h3&gt;
  
  
  Triggering Events
&lt;/h3&gt;

&lt;p&gt;When significant movement is detected, the system can trigger various actions like recording video, sending alerts, or turning on lights. This makes motion detection an essential feature in modern security and automation systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical Applications
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Security Systems
&lt;/h3&gt;

&lt;p&gt;Motion detection is critical in surveillance cameras to identify and record potential intruders.&lt;/p&gt;

&lt;h3&gt;
  
  
  Home Automation
&lt;/h3&gt;

&lt;p&gt;Smart home systems use motion detection to automate lighting and HVAC systems, improving energy efficiency.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wildlife Monitoring
&lt;/h3&gt;

&lt;p&gt;Researchers use motion-activated cameras to study wildlife behavior without human interference.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This tutorial demonstrates a simple way to implement motion detection using OpenCvSharp in .NET. By understanding the basics of frame comparison and image processing, you can expand this project to include advanced features like motion tracking and alerts.&lt;/p&gt;

&lt;p&gt;Continue exploring more advanced topics to enhance your computer vision skills and build more sophisticated applications. Happy coding!&lt;/p&gt;




&lt;p&gt;By following this guide, you'll gain practical experience in implementing motion detection, building on the foundational skills covered in our introductory article.&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>computervision</category>
    </item>
    <item>
      <title>Introduction to Computer Vision in C# .NET</title>
      <dc:creator>Jon</dc:creator>
      <pubDate>Tue, 25 Jun 2024 19:11:43 +0000</pubDate>
      <link>https://forem.com/jwtiller_c47bdfa134adf302/introduction-to-computer-vision-in-net-160i</link>
      <guid>https://forem.com/jwtiller_c47bdfa134adf302/introduction-to-computer-vision-in-net-160i</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Computer vision is a transformative technology that enables machines to interpret and understand the visual world. By utilizing the OpenCV library through OpenCvSharp in .NET, developers can perform various image processing and computer vision tasks effectively. This guide will introduce essential image operations, providing a strong foundation for more advanced applications.&lt;/p&gt;

&lt;p&gt;OpenCV (Open Source Computer Vision Library) is a comprehensive library for computer vision tasks that supports many popular programming languages, including Python, C++, and Java. In this article, we will focus on using the .NET wrapper, OpenCvSharp, to bring the power of OpenCV to the .NET ecosystem.&lt;/p&gt;

&lt;h2&gt;
  
  
  OpenCV and OpenCvSharp
&lt;/h2&gt;

&lt;p&gt;OpenCV is an open-source library designed for computational efficiency and real-time applications. It has a strong community and extensive documentation, making it a popular choice for computer vision tasks across various languages. OpenCvSharp is a .NET wrapper for OpenCV, allowing .NET developers to access OpenCV functions seamlessly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting Up OpenCvSharp
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Installation&lt;/strong&gt;: Install OpenCvSharp via the NuGet Package Manager in Visual Studio.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   Install-Package OpenCvSharp4
   Install-Package OpenCvSharp4.runtime.win
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Basic Project Setup&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Create a new .NET project.&lt;/li&gt;
&lt;li&gt;Add the OpenCvSharp references.&lt;/li&gt;
&lt;li&gt;Initialize and test OpenCvSharp with a simple code snippet.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Basics: Image Resize, Black and White Conversion, and More
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Image Resizing&lt;/strong&gt;:
Resizing an image is crucial for various applications, such as fitting images into specific dimensions for UI elements, preparing images for machine learning models, or reducing the image size for faster processing and transmission.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;   &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;OpenCvSharp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

   &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Mat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"path_to_image.jpg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ImreadModes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;dst&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Mat&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
   &lt;span class="n"&gt;Cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Resize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dst&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Size&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;300&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
   &lt;span class="n"&gt;Cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ImShow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Resized Image"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dst&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="n"&gt;Cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WaitKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why Use Image Resizing&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt;: Smaller images require less memory and processing power.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Standardization&lt;/strong&gt;: Ensures images fit a standard size for further processing or display.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transmission&lt;/strong&gt;: Smaller images are quicker to upload and download.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Converting to Black and White&lt;/strong&gt;:
Converting images to grayscale is a common preprocessing step that simplifies the image data, making it easier to detect edges, contours, and other features. It reduces computational complexity by working with a single channel instead of three.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;   &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;gray&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Mat&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
   &lt;span class="n"&gt;Cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CvtColor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gray&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ColorConversionCodes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BGR2GRAY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="n"&gt;Cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ImShow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Gray Image"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gray&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="n"&gt;Cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WaitKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why Use Grayscale Conversion&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Simplicity&lt;/strong&gt;: Easier to process and analyze.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feature Detection&lt;/strong&gt;: Enhances contrast between different regions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Preprocessing&lt;/strong&gt;: Prepares the image for further operations like edge detection and thresholding.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Blurring an Image&lt;/strong&gt;:
Blurring reduces image noise and detail, which is useful in various preprocessing tasks to enhance edge detection and reduce unwanted artifacts. It smooths the image by averaging pixel values with neighboring pixels.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;   &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;blurred&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Mat&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
   &lt;span class="n"&gt;Cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GaussianBlur&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;blurred&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Size&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;15&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="n"&gt;Cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ImShow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Blurred Image"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;blurred&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="n"&gt;Cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WaitKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why Use Blurring&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Noise Reduction&lt;/strong&gt;: Minimizes random noise and details.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Preprocessing&lt;/strong&gt;: Improves the accuracy of edge detection and other image processing tasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aesthetic Effect&lt;/strong&gt;: Produces a visually pleasing effect for certain applications.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Edge Detection&lt;/strong&gt;:
Edge detection is fundamental in identifying the boundaries within images, which is crucial for object detection, image segmentation, and pattern recognition. It highlights the transitions in intensity, indicating object contours.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;   &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;edges&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Mat&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
   &lt;span class="n"&gt;Cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Canny&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gray&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;edges&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="n"&gt;Cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ImShow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Edge Detected Image"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;edges&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="n"&gt;Cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WaitKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why Use Edge Detection&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Object Detection&lt;/strong&gt;: Helps in identifying and localizing objects within an image.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Image Segmentation&lt;/strong&gt;: Divides an image into its constituent parts or objects.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pattern Recognition&lt;/strong&gt;: Facilitates the identification of shapes and patterns within images.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Additional Basic Operations
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Image Thresholding&lt;/strong&gt;:
Converts grayscale images into binary images by applying a threshold value. This is useful for separating objects from the background.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;   &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;binary&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Mat&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
   &lt;span class="n"&gt;Cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Threshold&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gray&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;binary&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;128&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ThresholdTypes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Binary&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="n"&gt;Cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ImShow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Binary Image"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;binary&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="n"&gt;Cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WaitKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why Use Thresholding&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Segmentation&lt;/strong&gt;: Simplifies the image for analysis by converting it into a binary form.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Object Detection&lt;/strong&gt;: Separates objects from the background.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Image Simplification&lt;/strong&gt;: Reduces the complexity for further processing.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Image Rotation&lt;/strong&gt;:
Rotating images can be necessary for data augmentation or aligning images for further analysis.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;   &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;center&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Point2f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Width&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Height&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;rotationMatrix&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetRotationMatrix2D&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;center&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;45&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;rotated&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Mat&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
   &lt;span class="n"&gt;Cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WarpAffine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rotated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rotationMatrix&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Size&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
   &lt;span class="n"&gt;Cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ImShow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Rotated Image"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rotated&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="n"&gt;Cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WaitKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why Use Image Rotation&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Data Augmentation&lt;/strong&gt;: Increases the diversity of training data for machine learning models.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alignment&lt;/strong&gt;: Corrects the orientation of images for consistency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aesthetics&lt;/strong&gt;: Adjusts the image for visual presentation.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Drawing Shapes&lt;/strong&gt;:
Drawing shapes like circles, rectangles, and lines is useful for highlighting features or regions of interest in an image.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;   &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;drawImage&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Clone&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
   &lt;span class="n"&gt;Cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Rectangle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;drawImage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Rect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;200&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;Scalar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Red&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="n"&gt;Cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Circle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;drawImage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Point&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;150&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;150&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="m"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Scalar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Blue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="n"&gt;Cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Line&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;drawImage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Point&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Point&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;300&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;Scalar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Green&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="n"&gt;Cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ImShow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Shapes"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;drawImage&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="n"&gt;Cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WaitKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why Draw Shapes&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Annotation&lt;/strong&gt;: Marks important areas for analysis or reference.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visualization&lt;/strong&gt;: Helps in visualizing regions of interest or detected features.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Debugging&lt;/strong&gt;: Assists in debugging image processing algorithms by showing intermediate results.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This introduction to computer vision in .NET using OpenCvSharp has covered fundamental operations like image resizing, grayscale conversion, blurring, and edge detection. These basics are the building blocks for more advanced computer vision tasks. Future articles will delve deeper into complex techniques such as object detection, feature matching, and image segmentation.&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>computervision</category>
    </item>
    <item>
      <title>Ondoarding new developers</title>
      <dc:creator>Jon</dc:creator>
      <pubDate>Sun, 23 Jun 2024 19:29:48 +0000</pubDate>
      <link>https://forem.com/jwtiller_c47bdfa134adf302/ondoarding-new-developers-kmf</link>
      <guid>https://forem.com/jwtiller_c47bdfa134adf302/ondoarding-new-developers-kmf</guid>
      <description>&lt;p&gt;Hey Devs!&lt;/p&gt;

&lt;p&gt;In our previous discussion, we highlighted the importance of a great onboarding process and shared some of your best experiences and practices. Today, let's delve deeper into what makes an onboarding process truly exceptional and how tools like &lt;a href="https://razorsharp.dev"&gt;RazorSharp&lt;/a&gt; can enhance this crucial phase, ensuring your developers are empowered and engaged.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Elements of a Great Onboarding Process
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Structured Orientation Programs&lt;/strong&gt;: A well-defined schedule that includes an introduction to the company culture, processes, and tools sets the tone for a smooth transition.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Accessible Documentation&lt;/strong&gt;: Comprehensive and up-to-date documentation is essential. It helps new hires understand workflows, systems, and standards without constant hand-holding.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mentorship and Support&lt;/strong&gt;: Pairing new developers with experienced mentors can accelerate learning and foster a supportive environment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hands-On Training&lt;/strong&gt;: Practical sessions where new hires can work on actual projects with guidance ensure they gain confidence and competence quickly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Feedback Mechanisms&lt;/strong&gt;: Regular check-ins and feedback loops help identify and address any issues early, ensuring continuous improvement of the onboarding process.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How RazorSharp Enhances Onboarding
&lt;/h2&gt;

&lt;p&gt;RazorSharp APM is designed to make the onboarding process smoother and more effective for developers, especially in .NET environments. Here’s how:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Real-Time Performance Monitoring&lt;/strong&gt;: New developers can quickly understand the performance dynamics of the applications they work on. RazorSharp provides immediate insights into performance bottlenecks, helping them learn faster and contribute effectively from day one.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AI-Powered Automated Documentation&lt;/strong&gt;: RazorSharp’s AI-driven documentation tools automatically generate and update documentation based on real-time data. This ensures that new hires always have access to the latest information, reducing the learning curve and enhancing productivity.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Simplified Debugging&lt;/strong&gt;: RazorSharp simplifies the debugging process, allowing new developers to quickly identify and fix issues. This not only boosts their confidence but also ensures they can contribute to critical tasks without extensive oversight.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Enhanced Security with RazorSharp Guard&lt;/strong&gt;: Security is a crucial aspect of any development process. RazorSharp Guard actively monitors for potential security threats like SQL injection attacks, providing new developers with a secure environment to work in and learn from.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Seamless Integration&lt;/strong&gt;: RazorSharp can be integrated into your existing .NET applications with minimal setup. This ensures that new developers can start using the tool almost immediately, without having to navigate complex configurations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Comprehensive Visualizations&lt;/strong&gt;: Tools like the topology map and integration with platforms like OpenTelemetry provide new developers with a clear overview of system architecture and performance metrics. This holistic view aids in understanding complex systems quickly.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Empowering Developers to Reduce Turnover and Boost Engagement
&lt;/h2&gt;

&lt;p&gt;Using tools that empower your developers to understand and troubleshoot issues is crucial. When developers can quickly identify and resolve problems, they feel more competent and motivated. This empowerment reduces frustration and demotivation, which are significant factors in high turnover rates. Keeping your developers engaged and satisfied with their work environment leads to better retention and a more productive team.&lt;/p&gt;

&lt;h2&gt;
  
  
  Future of RazorSharp: Customizable AI-Driven Onboarding
&lt;/h2&gt;

&lt;p&gt;In the future, RazorSharp will further empower developers by offering customizable AI-driven onboarding processes. Imagine being able to tailor the onboarding experience based on a new developer's seniority, tech stack experience, and specific needs. Here’s how it could work:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Personalized Onboarding Plans&lt;/strong&gt;: Using AI, RazorSharp will analyze a new developer’s background and create a customized onboarding plan that focuses on their specific needs and knowledge gaps.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Adaptive Learning Paths&lt;/strong&gt;: The AI-driven system will adapt the onboarding process in real-time based on the developer’s progress, providing additional resources or adjusting the complexity of tasks as needed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Integrated Feedback Mechanisms&lt;/strong&gt;: Continuous feedback loops will help refine the onboarding process, ensuring it remains relevant and effective for each new hire.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Enhanced Collaboration Tools&lt;/strong&gt;: Future integrations will include advanced collaboration tools, making it easier for new developers to communicate with their mentors and peers, fostering a more inclusive and supportive onboarding environment.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>dotnet</category>
      <category>onboarding</category>
    </item>
    <item>
      <title>Practical Steps to Enhance Your Security Today</title>
      <dc:creator>Jon</dc:creator>
      <pubDate>Thu, 20 Jun 2024 19:21:47 +0000</pubDate>
      <link>https://forem.com/jwtiller_c47bdfa134adf302/practical-steps-to-enhance-your-security-today-91d</link>
      <guid>https://forem.com/jwtiller_c47bdfa134adf302/practical-steps-to-enhance-your-security-today-91d</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In the ever-evolving landscape of cybersecurity, numerous frameworks are available to measure maturity and guide improvements, such as OWASP SAMM, Microsoft's SDL (Security Development Lifecycle), and the NIST Cybersecurity Framework (CSF). These frameworks offer comprehensive guidelines but can sometimes be overwhelming for organizations looking for a quick, pragmatic approach to enhance their security posture.&lt;/p&gt;

&lt;p&gt;Having worked with complex government solutions that require high standards for confidentiality, integrity, and availability, I understand the importance of robust security measures. If you don't have a systematic approach today, following these steps can take your security light years ahead, setting the stage for adopting a more formal framework in the future.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Hands-On Approach to Jump-Start Your Security Today
&lt;/h2&gt;

&lt;p&gt;If you're looking to take immediate, pragmatic steps towards improving your security, here’s a streamlined approach:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Identify Your Assets&lt;/strong&gt;: List your assets, including data, systems, networks, and personnel.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Conduct a Risk Analysis&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Probability&lt;/strong&gt;: Estimate the likelihood of threats exploiting vulnerabilities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consequence&lt;/strong&gt;: Determine the potential impact of these threats.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Implement Measures to Mitigate Risks&lt;/strong&gt;: Apply security controls, update software, train employees, and establish policies to reduce risks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Prioritize by Cost and Effectiveness&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Order the cost of implementing measures.&lt;/li&gt;
&lt;li&gt;Define the effectiveness of each measure to prioritize actions with the greatest return on investment.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Focus on Quick Wins&lt;/strong&gt;: Target measures that can be implemented quickly and at a low cost but have a significant impact. Often, 80% of your desired improvements can be achieved with 20% of the effort.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;By following this pragmatic, hands-on approach, you can quickly and effectively enhance your organization's security posture. Comprehensive frameworks like OWASP SAMM, SDL, and NIST CSF provide extensive guidance, but focusing on immediate, practical steps allows you to make meaningful improvements without getting bogged down in complexity. Remember, the goal is to make significant strides in security with manageable effort, setting a strong foundation for future enhancements.&lt;/p&gt;

</description>
      <category>security</category>
      <category>sdlc</category>
    </item>
    <item>
      <title>Unlock New Features: RazorSharp CLI &amp; Dashboard Updates!</title>
      <dc:creator>Jon</dc:creator>
      <pubDate>Sun, 16 Jun 2024 19:16:49 +0000</pubDate>
      <link>https://forem.com/jwtiller_c47bdfa134adf302/unlock-new-features-razorsharp-cli-dashboard-updates-i50</link>
      <guid>https://forem.com/jwtiller_c47bdfa134adf302/unlock-new-features-razorsharp-cli-dashboard-updates-i50</guid>
      <description>&lt;p&gt;Hello, fellow developers! I'm excited to share some fantastic news—RazorSharp CLI 1.0.0-beta09 and Dashboard 0.0.5.1 are now available! As we move from beta to a more refined product, there will still be a freemium version available for everyone to enjoy.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's New?
&lt;/h3&gt;

&lt;h4&gt;
  
  
  🔒 Username and Password Protection
&lt;/h4&gt;

&lt;p&gt;You can now secure access to your logs with a username and password. The first time you access the dashboard, a configuration wizard will guide you through the setup process. This added layer of security ensures that your log data remains protected.&lt;/p&gt;

&lt;h4&gt;
  
  
  📡 gRPC Log Transfer
&lt;/h4&gt;

&lt;p&gt;We’ve introduced gRPC log transfer capabilities. This means you can now send logs directly to the dashboard using gRPC, making the logging process smoother and faster. This enhancement is designed to provide real-time insights and streamline your workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  Getting Started
&lt;/h3&gt;

&lt;p&gt;To help you get up and running quickly, we’ve put together a quick start guide. Here’s a brief overview of the steps:&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Install the Dashboard
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Database&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 27017:27017 &lt;span class="nt"&gt;--name&lt;/span&gt; mongodb mongo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;For production environments, additional configuration is needed to ensure data persistence and security.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dashboard&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker pull razorsharpdotnet/dashboard:latest
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:8080 &lt;span class="nt"&gt;-p&lt;/span&gt; 8081:8081 &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;RAZORSHARP_MONGODB_CONNECTION_STRING&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;mongodb://host.docker.internal:27017 razorsharpdotnet/dashboard:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. Install the Application
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet tool &lt;span class="nb"&gt;install &lt;/span&gt;Razorsharp.APM.CLI &lt;span class="nt"&gt;--global&lt;/span&gt; &lt;span class="nt"&gt;--version&lt;/span&gt; 1.0.0-beta&lt;span class="k"&gt;*&lt;/span&gt;
razorsharp &lt;span class="nt"&gt;--inject&lt;/span&gt; HelloWorld.dll &lt;span class="nt"&gt;--dashboard&lt;/span&gt; http://localhost:8081
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3. Test
&lt;/h4&gt;

&lt;p&gt;Perform an API call or a user action to allow RazorSharp APM to generate log entries. Access the dashboard at &lt;a href="http://localhost:8080"&gt;http://localhost:8080&lt;/a&gt; to view the topology map and detailed log information.&lt;/p&gt;

&lt;h3&gt;
  
  
  Disclaimer
&lt;/h3&gt;

&lt;p&gt;RazorSharp APM CLI is currently in beta. It is recommended for use only in test environments at this stage. By using RazorSharp APM CLI, you acknowledge and agree that the tool is provided "as is" without warranty of any kind, express or implied. We do not accept liability for any direct, indirect, incidental, special, exemplary, or consequential damages arising from the use of the software. Please read the license in the NuGet package for further details.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ready to Dive In?
&lt;/h3&gt;

&lt;p&gt;Check out the &lt;a href="https://razorsharp.dev/Documentation/quick-start"&gt;quick start guide&lt;/a&gt; to see how easy it is to get started.&lt;/p&gt;

&lt;p&gt;I'm excited to continue this journey with you, enhancing .NET application performance and security monitoring. Thanks for being part of the community!&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Feel free to share your feedback and suggestions in the comments. Let’s make RazorSharp even better together!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you found this article helpful, please give it a like and share it with your network. Follow me for more updates and insights on .NET application performance and security monitoring.&lt;/p&gt;

&lt;h1&gt;
  
  
  RazorSharp #dotnet #APM #Security #DevOps #NewRelease #BetaToEnterprise
&lt;/h1&gt;

</description>
      <category>dotnet</category>
      <category>programming</category>
    </item>
    <item>
      <title>Unlocking the Hidden Treasures of Your Applications</title>
      <dc:creator>Jon</dc:creator>
      <pubDate>Thu, 13 Jun 2024 20:31:17 +0000</pubDate>
      <link>https://forem.com/jwtiller_c47bdfa134adf302/unlocking-the-hidden-treasures-of-your-applications-ee</link>
      <guid>https://forem.com/jwtiller_c47bdfa134adf302/unlocking-the-hidden-treasures-of-your-applications-ee</guid>
      <description>&lt;p&gt;As a developer with over 15 years of experience in the industry, I've seen firsthand how many applications are like locked treasure chests, filled with valuable insights that often go unnoticed while digital pirates lurk, trying to exploit any weaknesses. This realization is what drove me to start RazorSharp. My goal is to help developers unlock this potential, turning raw data into actionable intelligence and ensuring the security of their digital assets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Spark of Inspiration&lt;/strong&gt;&lt;br&gt;
The concept for RazorSharp APM was born from my extensive experience in software development. Over the years, I've encountered countless applications that, despite their complexity, remained like treasure chests with a wealth of data locked inside. These chests were not only underutilized but also vulnerable to digital pirates looking to exploit any weaknesses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What RazorSharp APM Brings to the Table&lt;/strong&gt;&lt;br&gt;
Real-Time Insights: Gain immediate visibility into your application’s performance, helping you identify and resolve issues before they escalate.&lt;br&gt;
AI-Powered Documentation: Automatically generate and maintain comprehensive documentation, easing the workload on your team and ensuring accuracy.&lt;br&gt;
Enhanced Security: Leverage metadata analysis to protect your applications from potential threats, ensuring your valuable data stays secure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why This Matters&lt;/strong&gt;&lt;br&gt;
Unlocking the insights hidden within your application can lead to improved performance, enhanced security, and a more streamlined development process. With RazorSharp APM, you’re not just monitoring performance; you’re gaining a deep understanding of your application’s inner workings, driving more informed decisions and strategic enhancements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Getting Started with RazorSharp&lt;/strong&gt;&lt;br&gt;
To begin unlocking the treasures within your applications, visit our &lt;a href="https://razorsharp.dev/"&gt;homepage&lt;/a&gt; for more information. Our &lt;a href="https://razorsharp.dev/Documentation"&gt;documentation&lt;/a&gt; offers detailed setup instructions, making it easy to integrate RazorSharp APM into your development workflow.&lt;/p&gt;

&lt;p&gt;Join the Adventure&lt;br&gt;
RazorSharp APM is here to help you discover and protect the valuable treasures hidden in your applications. By providing comprehensive insights and robust security, we empower developers to fully realize the potential of their metadata. Join us on this exciting journey to unlock and secure your digital treasures with RazorSharp APM.&lt;/p&gt;

&lt;p&gt;Let's turn those locked chests into gold mines of insight and security. 🌟&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>observeability</category>
      <category>productivity</category>
    </item>
    <item>
      <title>What Makes a Great Developer Onboarding Process?</title>
      <dc:creator>Jon</dc:creator>
      <pubDate>Sat, 08 Jun 2024 19:34:11 +0000</pubDate>
      <link>https://forem.com/jwtiller_c47bdfa134adf302/what-makes-a-great-developer-onboarding-process-2jhj</link>
      <guid>https://forem.com/jwtiller_c47bdfa134adf302/what-makes-a-great-developer-onboarding-process-2jhj</guid>
      <description>&lt;p&gt;Hey Devs!&lt;/p&gt;

&lt;p&gt;A bad onboarding process can be costly and lead to high turnover, with the biggest consequence being that people quit. Let’s discuss how to make onboarding effective and enjoyable. Here are some questions to get the conversation started:&lt;/p&gt;

&lt;p&gt;🌟 What was the best onboarding experience you’ve had?&lt;br&gt;
📋 Which onboarding practices do you find most helpful?&lt;br&gt;
🛠️ What essential tools or resources should be provided to new developers?&lt;br&gt;
💻 How can remote onboarding be improved?&lt;br&gt;
🧑‍🤝‍🧑 What role does mentorship play in successful onboarding?&lt;br&gt;
📚 How important is documentation in the onboarding process?&lt;br&gt;
🚧 What challenges have you faced during onboarding, and how were they addressed?&lt;/p&gt;

&lt;p&gt;Anything I missed or you want to add? Looking forward to your insights!&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>development</category>
      <category>career</category>
      <category>onboarding</category>
    </item>
  </channel>
</rss>
