<?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>DEV Community: Matteo Maggiolini</title>
    <description>The latest articles on DEV Community by Matteo Maggiolini (@webinadvance).</description>
    <link>https://dev.to/webinadvance</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%2F1103862%2F3a42532e-46e0-4b40-9077-7e55d0d866e6.jpeg</url>
      <title>DEV Community: Matteo Maggiolini</title>
      <link>https://dev.to/webinadvance</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/webinadvance"/>
    <language>en</language>
    <item>
      <title>Top 10 GitHub Projects Worth Contributing to in July 2023⭐</title>
      <dc:creator>Matteo Maggiolini</dc:creator>
      <pubDate>Sun, 06 Aug 2023 12:58:26 +0000</pubDate>
      <link>https://dev.to/webinadvance/top-10-github-projects-worth-contributing-to-in-july-2023-2cnc</link>
      <guid>https://dev.to/webinadvance/top-10-github-projects-worth-contributing-to-in-july-2023-2cnc</guid>
      <description>&lt;p&gt;&lt;strong&gt;DioxusLabs / dioxus&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A versatile fullstack GUI library developed in Rust, designed for applications across desktop, web, and mobile platforms.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Why Contribute? Dive into the future of GUI development, and be at the forefront of creating cross-platform solutions with a cutting-edge language like Rust.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/DioxusLabs/dioxus"&gt;https://github.com/DioxusLabs/dioxus&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;microsoft / azurechatgpt&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Microsoft's enterprise-focused ChatGPT solution, offering enhanced privacy and security features, developed in TypeScript.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Why Contribute? Collaborate with Microsoft to shape the future of enterprise chat solutions, ensuring businesses communicate securely and efficiently.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/microsoft/azurechatgpt"&gt;https://github.com/microsoft/azurechatgpt&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;nextui-org / nextui&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A modern React UI library that combines speed and aesthetics, offering developers a fresh approach to web design.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Why Contribute? Be part of a community redefining UI design, and contribute to tools that will be used by developers globally.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nextui-org/nextui"&gt;https://github.com/nextui-org/nextui&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;jupyterlab / jupyter-ai&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An innovative AI extension for JupyterLab, enabling generative AI capabilities within the popular notebook platform.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Why Contribute? Engage with the fusion of AI and data science, enhancing the capabilities of a platform trusted by researchers worldwide.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/jupyterlab/jupyter-ai"&gt;https://github.com/jupyterlab/jupyter-ai&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;manticoresoftware / manticoresearch&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A fast, open-source database tailored for search, positioning itself as a robust alternative to Elasticsearch.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Why Contribute? Join the movement to provide a powerful alternative to mainstream search databases, and influence the future of search technology.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/manticoresoftware/manticoresearch"&gt;https://github.com/manticoresoftware/manticoresearch&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;public-apis / public-apis&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A comprehensive collection of free APIs, serving as a valuable resource for developers seeking diverse integrations.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Why Contribute? Help expand this invaluable resource, ensuring developers have access to the best free tools available.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/public-apis/public-apis"&gt;Repository Link: https://github.com/public-apis/public-apis&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ReVanced / revanced-manager&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An application designed to enhance the Android experience, developed using the Dart programming language.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Why Contribute? Shape the future of Android customization and contribute to a project that directly impacts millions of users.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a&gt;Link: https://github.com/ReVanced/revanced-manager&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lissy93 / web-check&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A comprehensive OSINT tool in TypeScript, designed for detailed website analysis, ideal for security research.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Why Contribute? Be at the forefront of online security, helping users and businesses protect their digital assets.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Lissy93/web-check"&gt;https://github.com/Lissy93/web-check&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SimplifyJobs / Summer2024-Internships&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A curated list of tech internships for Summer 2023 &amp;amp; 2024, providing insights and opportunities for aspiring tech interns.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Why Contribute? Play a role in shaping the careers of future tech leaders by ensuring they have access to the best opportunities.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/SimplifyJobs/Summer2024-Internships"&gt;https://github.com/SimplifyJobs/Summer2024-Internships&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;QwenLM / Qwen-7B&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Alibaba Cloud's official repository for Qwen-7B, a chat and pretrained language model, showcasing advancements in AI.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Why Contribute? Collaborate with one of the tech giants, Alibaba Cloud, and be part of the next big leap in AI-driven communication.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/QwenLM/Qwen-7B"&gt;https://github.com/QwenLM/Qwen-7B&lt;/a&gt;&lt;/p&gt;

</description>
      <category>github</category>
      <category>development</category>
      <category>coding</category>
    </item>
    <item>
      <title>Best AI Coding tools of 2023: A Comprehensive Pros/Cons Analysis</title>
      <dc:creator>Matteo Maggiolini</dc:creator>
      <pubDate>Sun, 06 Aug 2023 12:36:43 +0000</pubDate>
      <link>https://dev.to/webinadvance/best-ai-coding-tools-of-2023-a-comprehensive-proscons-analysis-5c5</link>
      <guid>https://dev.to/webinadvance/best-ai-coding-tools-of-2023-a-comprehensive-proscons-analysis-5c5</guid>
      <description>&lt;p&gt;&lt;strong&gt;GitHub Copilot&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;GitHub Copilot is an AI-powered code completion tool that helps developers generate code faster and more efficiently. It was developed by GitHub and OpenAI and has been gaining popularity since its technical preview release in June 2021.&lt;/p&gt;

&lt;p&gt;Pros&lt;/p&gt;

&lt;p&gt;Increased productivity: GitHub Copilot can generate code much faster than writing it from scratch, which is especially helpful for large projects or tight deadlines.&lt;br&gt;
Code consistency: It helps ensure that your project's code is consistent, making it easier to maintain and understand.&lt;br&gt;
Learning aid: It can be helpful for programmers who are new to a particular language or framework.&lt;/p&gt;

&lt;p&gt;Cons&lt;/p&gt;

&lt;p&gt;Unoptimized suggestions: Copilot can suggest code that is unoptimized or inefficient, leading to bad coding habits.&lt;br&gt;
Limited understanding: It may not fully understand the context of the code and may generate incorrect or inappropriate suggestions.&lt;br&gt;
Legal and copyright concerns: There are debates around the legality of the training process of Copilot, as it may infringe on copyrights by default.&lt;br&gt;
Source&lt;br&gt;
You can find GitHub Copilot at its official website: &lt;a href="https://copilot.github.com/"&gt;https://copilot.github.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenAI Codex&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;OpenAI Codex is a powerful AI code tool based on OpenAI's LLMs (GPT-3 and GPT-4) and trained on billions of lines of code. It can understand natural language inputs and perform a wide range of tasks such as programming, writing, and data analysis.&lt;/p&gt;

&lt;p&gt;Pros&lt;/p&gt;

&lt;p&gt;Impressive capacity: Codex can resolve references and write code for a variety of APIs and micro-tasks, saving developers time.&lt;br&gt;
Customizability: It can generate code in multiple programming languages and can be trained on specific tasks.&lt;br&gt;
Integration with ChatGPT: Codex has gained additional popularity by its incorporation into ChatGPT, which helps with code generation, language translation, creative content writing, and answering questions informatively.&lt;/p&gt;

&lt;p&gt;Cons&lt;/p&gt;

&lt;p&gt;Cost: OpenAI Codex may be expensive for some users.&lt;br&gt;
Complexity: It can be challenging to set up and use effectively.&lt;br&gt;
Limited interpretability and flexibility: Codex may not always provide the most efficient or appropriate code suggestions.&lt;br&gt;
Source&lt;br&gt;
You can find OpenAI Codex at its official website: &lt;a href="https://www.openai.com/codex/"&gt;https://www.openai.com/codex/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tabnine&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tabnine is an AI assistant trusted by millions of developers, including Amazon, Gitlab, and Comcast, that speeds up the coding process by suggesting real-time code completions while typing.&lt;/p&gt;

&lt;p&gt;Pros&lt;/p&gt;

&lt;p&gt;Versatility: Tabnine supports a wide range of programming languages and is compatible with popular code editors and IDEs.&lt;br&gt;
Free plan available: It offers a free plan for developers to try out the service.&lt;br&gt;
Absolute code privacy &amp;amp; compliance: Tabnine never stores or shares any of your code or AI data, ensuring compliance and control over your data.&lt;/p&gt;

&lt;p&gt;Cons&lt;/p&gt;

&lt;p&gt;Limited language support: Tabnine may not support all programming languages.&lt;br&gt;
Slow code completion: Some users have reported slow code completion times.&lt;br&gt;
Flow interruption: The need to review code suggestions from Tabnine may cause a break in flow while working on projects.&lt;br&gt;
Source&lt;br&gt;
You can find Tabnine at its official website: &lt;a href="https://www.tabnine.com/"&gt;https://www.tabnine.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CodeT5&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CodeT5 is an AI model developed by Salesforce that is trained exclusively to produce code snippets. It is capable of carrying out operations like code completion, summarization, and translation between different programming languages.&lt;/p&gt;

&lt;p&gt;Pros&lt;/p&gt;

&lt;p&gt;State-of-the-art performance: CodeT5 achieves top performance on fourteen subtasks in a code intelligence benchmark called CodeXGLUE.&lt;br&gt;
Built on a proven architecture: CodeT5 is based on the architecture of Google's T5 framework but incorporates better code-specific knowledge for improved code understanding.&lt;br&gt;
Wide range of code intelligence applications: CodeT5 can be used for various tasks in the software development lifecycle.&lt;/p&gt;

&lt;p&gt;Cons&lt;/p&gt;

&lt;p&gt;Limited availability: CodeT5 is not as widely available as other AI programming tools like GitHub Copilot or OpenAI Codex.&lt;br&gt;
Potentially less efficient than other tools: CodeT5 may not always provide the most efficient or appropriate code suggestions compared to other tools like Copilot or Codex.&lt;br&gt;
Source&lt;br&gt;
You can find more information about CodeT5 in the official blog post by Salesforce AI Research: &lt;a href="https://blog.salesforceairesearch.com/codet5/"&gt;https://blog.salesforceairesearch.com/codet5/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cody by Sourcegraph&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cody by Sourcegraph is an AI-driven coding assistant that offers automated code reviews and identifies and fixes potential bugs in the code. It helps developers improve their code quality and maintainability.&lt;/p&gt;

&lt;p&gt;Pros&lt;/p&gt;

&lt;p&gt;Automated code reviews: Cody helps identify potential issues in your code and suggests improvements.&lt;br&gt;
Bug detection: It can detect and fix potential bugs, reducing the time spent on debugging.&lt;br&gt;
Integration with popular code editors: Cody integrates with popular code editors like Visual Studio Code, making it easy to use in your existing workflow.&lt;br&gt;
Cons&lt;/p&gt;

&lt;p&gt;Limited language support: Cody may not support all programming languages.&lt;br&gt;
Subscription cost: Some users may find the subscription cost prohibitive.&lt;br&gt;
Source&lt;br&gt;
You can find more information about Cody by Sourcegraph on their official website: &lt;a href="https://sourcegraph.com/"&gt;https://sourcegraph.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Codiga&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Codiga is a code analysis and improvement tool that helps developers write better code by providing automated code reviews, refactoring suggestions, and more. It aims to improve code quality and maintainability.&lt;/p&gt;

&lt;p&gt;Pros&lt;/p&gt;

&lt;p&gt;Code quality improvement: Codiga helps identify issues in your code and suggests improvements.&lt;br&gt;
Refactoring suggestions: It provides refactoring suggestions to make your code more efficient and maintainable.&lt;br&gt;
Integration with popular code editors: Codiga integrates with popular code editors like Visual Studio Code, making it easy to use in your existing workflow.&lt;/p&gt;

&lt;p&gt;Cons&lt;/p&gt;

&lt;p&gt;Limited language support: Codiga may not support all programming languages.&lt;br&gt;
Subscription cost: Some users may find the subscription cost prohibitive.&lt;br&gt;
Source&lt;br&gt;
You can find more information about Codiga on their official website: &lt;a href="https://www.codiga.io/"&gt;https://www.codiga.io/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Snyk&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Snyk is a security tool that helps developers find and fix vulnerabilities in their code. It integrates with popular code editors and repositories to provide real-time security feedback.&lt;/p&gt;

&lt;p&gt;Pros&lt;/p&gt;

&lt;p&gt;Security-focused: Snyk helps identify and fix security vulnerabilities in your code.&lt;br&gt;
Integration with popular code editors and repositories: Snyk integrates with popular code editors like Visual Studio Code and repositories like GitHub, making it easy to use in your existing workflow.&lt;br&gt;
Continuous monitoring: Snyk continuously monitors your code for vulnerabilities, ensuring your code remains secure.&lt;br&gt;
Cons&lt;/p&gt;

&lt;p&gt;Limited language support: Snyk may not support all programming languages.&lt;br&gt;
Subscription cost: Some users may find the subscription cost prohibitive.&lt;br&gt;
Source&lt;br&gt;
You can find more information about Snyk on their official website: &lt;a href="https://snyk.io/"&gt;https://snyk.io/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mintlify&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Mintlify is an AI-powered code generator that specializes in creating full-fledged eCommerce websites from scratch. It helps developers build responsive and functional online stores quickly and efficiently.&lt;/p&gt;

&lt;p&gt;Pros&lt;/p&gt;

&lt;p&gt;eCommerce-focused: Mintlify is specifically designed for creating eCommerce websites.&lt;br&gt;
Rapid development: It helps developers build online stores quickly and efficiently.&lt;br&gt;
Customizable templates: Mintlify offers customizable templates to create unique and visually appealing websites.&lt;/p&gt;

&lt;p&gt;Cons&lt;/p&gt;

&lt;p&gt;Limited scope: Mintlify is focused on eCommerce websites, making it less suitable for other types of web development projects.&lt;br&gt;
Subscription cost: Some users may find the subscription cost prohibitive.&lt;br&gt;
Source&lt;br&gt;
You can find more information about Mintlify on their official website: &lt;a href="https://www.mintlify.com/"&gt;https://www.mintlify.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MutableAI&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;MutableAI is an advanced AI-powered platform designed to empower developers with cutting-edge tools for software development and data science tasks. Leveraging the latest advancements in artificial intelligence, MutableAI offers a range of features that enhance coding efficiency and data analysis capabilities.&lt;/p&gt;

&lt;p&gt;Pros&lt;/p&gt;

&lt;p&gt;Code generation and completion: MutableAI accelerates coding by providing smart code generation and completion, significantly reducing development time.&lt;br&gt;
Automated testing: The platform offers automated testing capabilities, ensuring code quality and reducing the burden of manual testing.&lt;br&gt;
Collaboration and version control: MutableAI supports seamless collaboration among team members and includes version control features for efficient project management.&lt;br&gt;
Data analysis and visualization: For data scientists, MutableAI enables quick data analysis and interactive visualization for deeper insights.&lt;br&gt;
API integration: The platform seamlessly integrates with various APIs, expanding its functionality and enhancing developers' productivity.&lt;/p&gt;

&lt;p&gt;Cons&lt;/p&gt;

&lt;p&gt;Learning curve: As an advanced AI platform, MutableAI may have a learning curve for new users to fully harness its capabilities.&lt;br&gt;
Limited support for niche programming languages: While MutableAI covers a wide range of programming languages, some niche languages may have limited support.&lt;br&gt;
Source&lt;br&gt;
You can find more information about MutableAI on their official website: &lt;a href="//mutable.ai"&gt;mutable.ai&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Replit GhostWriter&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Replit GhostWriter is an innovative AI-powered writing assistant that provides developers and content creators with valuable support in generating high-quality content. Whether you need help with writing code documentation, blog articles, or any other form of written content, GhostWriter is designed to streamline the writing process and enhance creativity.&lt;/p&gt;

&lt;p&gt;Pros&lt;/p&gt;

&lt;p&gt;Intelligent code documentation: GhostWriter can automatically generate clear and concise code documentation, saving developers time and effort in explaining their code.&lt;br&gt;
Blog article generation: For content creators, GhostWriter offers assistance in writing engaging blog articles, providing relevant content ideas and suggestions.&lt;br&gt;
Grammar and style improvements: The platform helps refine writing by offering grammar and style suggestions, ensuring polished and professional output.&lt;br&gt;
Customizability: GhostWriter can be tailored to suit individual writing styles and preferences, making it a versatile tool for various writing tasks.&lt;br&gt;
Seamless integration: GhostWriter integrates smoothly with the Replit coding environment, enhancing the writing experience for developers.&lt;/p&gt;

&lt;p&gt;Cons&lt;/p&gt;

&lt;p&gt;Language limitations: While GhostWriter supports multiple programming languages, it may have limited support for certain niche languages.&lt;br&gt;
Dependency on internet connection: As an online tool, GhostWriter relies on an internet connection, which may pose challenges in offline environments.&lt;br&gt;
Source&lt;br&gt;
You can find more information about Replit GhostWriter on their official website: &lt;a href="//replit.com/ghostwriter"&gt;replit.com/ghostwriter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Durable&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Durable is an AI-powered software testing tool that empowers developers to identify and resolve bugs and performance issues in their applications efficiently. With its advanced testing capabilities and intelligent analysis, Durable streamlines the testing process and ensures the robustness and reliability of your software.&lt;/p&gt;

&lt;p&gt;Pros&lt;/p&gt;

&lt;p&gt;Automated testing: Durable automates the testing process, enabling developers to conduct comprehensive tests without manual intervention, saving valuable time and effort.&lt;br&gt;
Bug detection: The tool identifies and reports bugs and errors, allowing developers to address issues promptly and improve the overall quality of their software.&lt;br&gt;
Performance analysis: Durable offers in-depth performance analysis, helping developers optimize the speed and efficiency of their applications.&lt;br&gt;
Test coverage assessment: The platform evaluates test coverage, ensuring that all critical functionalities of the software are thoroughly tested.&lt;br&gt;
Integration with CI/CD pipelines: Durable seamlessly integrates with continuous integration/continuous deployment (CI/CD) pipelines, enabling automated testing throughout the development process.&lt;/p&gt;

&lt;p&gt;Cons&lt;/p&gt;

&lt;p&gt;Learning curve: As a sophisticated testing tool, Durable may require some learning and familiarization to utilize its full potential.&lt;br&gt;
Limited platform support: While Durable supports various platforms, some niche platforms may have limited compatibility.&lt;br&gt;
Source&lt;br&gt;
You can find more information about Durable on their official website: &lt;a href="//durable.com"&gt;durable.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bugasura&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Bugasura is an AI-powered bug tracking and issue management tool designed to streamline the bug fixing process for developers and software teams. By leveraging artificial intelligence, Bugasura assists in detecting, tracking, and resolving bugs, ensuring smoother development workflows and enhanced software quality.&lt;/p&gt;

&lt;p&gt;Pros&lt;/p&gt;

&lt;p&gt;Intelligent bug detection: Bugasura uses AI algorithms to automatically detect and categorize bugs, saving developers time in identifying issues within their codebase.&lt;br&gt;
Issue management: The platform provides a centralized and organized interface to manage and track bugs, enabling seamless collaboration among team members.&lt;br&gt;
Real-time alerts: Bugasura offers real-time notifications for newly detected bugs, allowing developers to address issues promptly.&lt;br&gt;
Insights and analytics: The tool provides valuable insights and analytics on bug trends, helping developers identify recurring issues and improve code quality.&lt;br&gt;
Integration with popular development tools: Bugasura integrates with various popular development tools, ensuring a smooth workflow within existing development environments.&lt;/p&gt;

&lt;p&gt;Cons&lt;/p&gt;

&lt;p&gt;Learning curve: As a sophisticated bug tracking tool, Bugasura may require some learning and onboarding for new users to fully utilize its features.&lt;br&gt;
Limited platform support: While Bugasura supports various platforms, some less common platforms may have limited compatibility.&lt;br&gt;
Source&lt;br&gt;
You can find more information about Bugasura on their official website: &lt;a href="//bugasura.io"&gt;bugasura.io&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI Helper Bot&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AI Helper Bot is an intelligent virtual assistant designed to provide valuable support and assistance to developers and users alike. Powered by advanced artificial intelligence, the AI Helper Bot offers a wide range of functionalities and capabilities to simplify tasks and enhance productivity.&lt;/p&gt;

&lt;p&gt;Pros&lt;/p&gt;

&lt;p&gt;Code assistance: AI Helper Bot can assist developers by providing code snippets, syntax suggestions, and debugging help, making coding tasks more efficient and error-free.&lt;br&gt;
Natural language understanding: The bot can understand and respond to natural language queries, enabling seamless communication and interaction with users.&lt;br&gt;
Task automation: AI Helper Bot can automate repetitive tasks, saving time and effort for users and allowing them to focus on more complex and creative work.&lt;br&gt;
Personalization: The bot can be customized to adapt to individual preferences and workflows, providing personalized assistance for each user.&lt;br&gt;
Continuous learning: AI Helper Bot continuously learns from user interactions, improving its responses and capabilities over time.&lt;br&gt;
Cons&lt;/p&gt;

&lt;p&gt;Initial setup: Setting up and configuring AI Helper Bot may require some initial effort and customization to align with specific user needs.&lt;br&gt;
Limited context understanding: While AI Helper Bot is capable of natural language understanding, it may have limitations in fully grasping complex context or nuances.&lt;br&gt;
Source&lt;br&gt;
You can find more information about AI Helper Bot on their official website: &lt;a href="//aihelperbot.com"&gt;aihelperbot.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Android Studio Bot&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Android Studio Bot is an intelligent virtual assistant specifically designed to assist Android developers throughout their app development journey. Powered by advanced AI technologies, the bot offers a range of functionalities tailored to simplify Android app development and boost productivity.&lt;/p&gt;

&lt;p&gt;Pros&lt;/p&gt;

&lt;p&gt;Code completion and suggestions: Android Studio Bot provides smart code completion and intelligent suggestions, helping developers write code more efficiently and accurately.&lt;br&gt;
Error detection and debugging: The bot can identify and flag errors in the code, making debugging and issue resolution faster and more effective.&lt;br&gt;
Project management: Android Studio Bot assists with project organization and version control, streamlining collaboration among team members.&lt;br&gt;
Integration with Android Studio IDE: Seamlessly integrated with Android Studio, the bot enhances the IDE's capabilities and offers a cohesive development experience.&lt;br&gt;
Instant documentation: Android Studio Bot provides quick access to Android documentation, saving developers time in searching for relevant information.&lt;/p&gt;

&lt;p&gt;Cons&lt;/p&gt;

&lt;p&gt;Learning curve: As a sophisticated virtual assistant, Android Studio Bot may have a learning curve for developers new to AI-driven development tools.&lt;br&gt;
Limited to Android development: The bot's functionalities are tailored specifically for Android app development, limiting its scope to other platforms.&lt;br&gt;
Source&lt;br&gt;
You can find more information about Android Studio Bot on their official website: &lt;a href="//androidstudiobot.com"&gt;androidstudiobot.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>development</category>
      <category>coding</category>
    </item>
    <item>
      <title>some cool improvements introduced in .NET 8</title>
      <dc:creator>Matteo Maggiolini</dc:creator>
      <pubDate>Thu, 03 Aug 2023 10:15:42 +0000</pubDate>
      <link>https://dev.to/webinadvance/some-cool-improvements-introduced-in-net-8-3jnh</link>
      <guid>https://dev.to/webinadvance/some-cool-improvements-introduced-in-net-8-3jnh</guid>
      <description>&lt;p&gt;&lt;strong&gt;dotnet publish and dotnet pack Release Mode:&lt;/strong&gt; The dotnet publish and dotnet pack commands now build and pack with the Release mode by default. To produce in Debug mode, you need to set the parameter -p:PublishRelease as false.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;System.Text.Json Serialization:&lt;/strong&gt; Several enhancements have been made to object serialization and deserialization. The source generator now offers improved performance and reliability for Native AOT apps when used with ASP.NET Core. It also allows serializing types with required and init properties already supported in reflection-based serialization. There is now an option to customize the handling of members that are not present in the JSON payload. Support for serializing properties from interface hierarchies has been added. The JsonNamingPolicy feature has been expanded to include new naming policies for snake_case and kebab-case property name conversions. JsonSerializerOptions.MakeReadOnly method allows for explicit control over when a JsonSerializerOptions instance is frozen, and you can check its status using the IsReadOnly property.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Randomness:&lt;/strong&gt; Two new methods, Random.GetItems and RandomNumberGenerator.GetItems, have been introduced that enable developers to randomly select a set number of items from a given input set. If you need to randomize the order of a span in your application, you can take advantage of two new methods: Random.Shuffle and RandomNumberGenerator.Shuffle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Performance Improvements:&lt;/strong&gt; Various new types have been introduced to enhance application performance. The System.Collections.Frozen namespace in .NET 8 includes the FrozenDictionary and FrozenSet collection types. These types are designed to prevent changes to keys and values once a collection is created, resulting in faster read operations such as TryGetValue(). They are particularly useful for collections populated on first use and then persisted for a long-lived service. Buffers.IndexOfAnyValues is a new type in .NET 8, designed to be passed to methods that search for the first occurrence of any value in a passed collection. Text.CompositeFormat is a new type in .NET 8 useful for optimizing format strings that aren't known at compile time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Improvements in System.Numerics and System.Runtime.Intrinsics:&lt;/strong&gt; Enhancements have been made to the System.Numerics and System.Runtime.Intrinsics namespaces, including better hardware acceleration for Vector256, Matrix3x2, and Matrix4x4 in .NET 8. Vector256 was redesigned to utilize 2x Vector128 operations internally to achieve partial acceleration of certain functions on Arm64 processors. The introduction of Vector512 is also included in .NET 8. The ConstExpected attribute has been added to hardware intrinsic to alert users when a non-constant value might cause unexpected performance issues. The Lerp(TSelf, TSelf, TSelf) API has been added to IFloatingPointIeee754, enabling the efficient and accurate linear interpolation of two values in float(Single), double (Double), and Half.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;New Data Validation Attributes:&lt;/strong&gt; The DataAnnotations namespace has been expanded with new attributes aimed specifically for validation in cloud-native services. These new attributes are meant to validate data, not entered by users, like configuration options. Apart from the new attributes, the RangeAttribute and RequiredAttribute types also received new properties.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Function Pointers Introspection Support:&lt;/strong&gt; Function pointers were released with .NET 5. In .NET 8, a System.Type object is returned instead when using typeof or reflection on a function pointer, providing access to function pointer metadata, such as calling conventions, return type, and parameters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Native AOT:&lt;/strong&gt; The option to publish an application as native AOT enables the creation of a self-contained version of the app that does not require a separate runtime, bundling everything into a single file. In .NET 8, the support for native AOT now encompasses the x64 and Arm64 architectures on macOS. Moreover, native AOT applications on Linux are now up to 50% smaller in size.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code Generation Improvements:&lt;/strong&gt; .NET 8 includes enhancements to code generation and just-in-time (JIT) compilation, including JIT throughput improvements, Arm64 performance improvements, Profile-guided optimization (PGO) improvements, support for AVX-512 ISA extensions, SIMD improvements, cloud-native improvements, and loop and general optimizations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;.NET 8 DevOps Improvements:&lt;/strong&gt; There are some changes with .NET 8 on image containers. Debian 12 is the default Linux distribution in the container images. The images include a non-root user to make the images non-root capable. The default port has also changed from 80 to 8080 and a new environment variable ASPNETCORE_HTTP_PORTS is available to change ports easily. .NET 8 is now supported on Chiseled Ubuntu images, available at the Ubuntu/DotNet-deps Docker Hub. Chiseled images are designed to have a smaller attack surface as they are stripped down to be ultra-compact, and do not include a package manager or shell. Chiseled images are non-root, making them ideal for developers looking for the benefits of appliance-style computing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Building Your .NET on Linux:&lt;/strong&gt; In .NET 8, you can build .NET directly on Linux using dotnet/source-build to create runtimes, tools, and SDKs. Red Hat and Canonical also use this build for .NET. Building in a container is the easiest approach for most people since the dotnet-buildtools/prereqs container images have all the necessary dependencies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Minimum support baselines for Linux:&lt;/strong&gt; The support requirements for Linux have been updated for .NET 8, with changes to the minimum support baselines. All architectures will target Ubuntu 16.04 for building .NET. Red Hat Enterprise Linux 7 is no longer supported with .NET 8. Only supporting RHEL 8 and later.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Tips &amp; Tricks About Entity Framework Core 7.x Every .NET Developer Should Know</title>
      <dc:creator>Matteo Maggiolini</dc:creator>
      <pubDate>Sun, 16 Jul 2023 11:15:02 +0000</pubDate>
      <link>https://dev.to/webinadvance/tips-tricks-about-entity-framework-core-7x-every-net-developer-should-know-33in</link>
      <guid>https://dev.to/webinadvance/tips-tricks-about-entity-framework-core-7x-every-net-developer-should-know-33in</guid>
      <description>&lt;h2&gt;
  
  
  First of all, some common tricks
&lt;/h2&gt;

&lt;p&gt;Eager Loading: To load related data at the same time as its parent, use the Include method.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var blogs = context.Blogs
    .Include(blog =&amp;gt; blog.Posts)
    .ToList();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Shadow Properties&lt;/strong&gt;: Shadow properties are properties that aren't defined in your entity class but are defined for that entity in the EF Core model.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;modelBuilder.Entity&amp;lt;Blog&amp;gt;()
    .Property&amp;lt;DateTime&amp;gt;("LastUpdated");
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Concurrency Control&lt;/strong&gt;: It's important to handle conflicts when multiple users are updating the same record. You can use the [ConcurrencyCheck] data annotation attribute.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class Blog
{
    public int BlogId { get; set; }
    [ConcurrencyCheck]
    public string Url { get; set; }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Database Seeding&lt;/strong&gt;. You can seed data to your database in EF Core&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;modelBuilder.Entity&amp;lt;Blog&amp;gt;()
.HasData(new Blog {BlogId = 1, Url = "http://sample.com"});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Disable Automatic Detect Changes&lt;/strong&gt;: For better performance, consider turning off the AutoDetectChanges behavior when you don’t need it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;context.ChangeTracker.AutoDetectChangesEnabled = false;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var products = context.Products.AsNoTracking().ToList();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Streaming instead of buffering&lt;/strong&gt;: Streaming allows you to process data as it is being read from the database, rather than buffering it all in memory first. This can help reduce memory usage and improve performance.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;using var context = new MyDbContext();
using var stream = context.Blogs.AsNoTracking().Select(b =&amp;gt; b.Url)
.AsStream();
await stream.CopyToAsync(Response.Body);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Compiled queries&lt;/strong&gt;: Compiled queries can help improve performance by caching the query execution plan.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;private static readonly Func&amp;lt;MyDbContext, int, Blog&amp;gt; _blogById =
    EF.CompileQuery((MyDbContext context, int id) =&amp;gt;
        context.Blogs.FirstOrDefault(b =&amp;gt; b.Id == id));

var blog = _blogById(context, 1);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;InMemory database&lt;/strong&gt; provider for testing: The InMemory database provider allows you to create an in-memory database for testing purposes. It provides a lightweight and fast way to test your code without the need for a real database. Here's an example of using the InMemory provider:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;services.AddDbContext&amp;lt;MyDbContext&amp;gt;(options =&amp;gt;
    options.UseInMemoryDatabase("TestDatabase"));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Database Views&lt;/strong&gt;: Database views can provide a simplified and optimized representation of your data.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;modelBuilder.Entity&amp;lt;Blog&amp;gt;()
    .ToView("View_Blogs")
    .HasNoKey();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Query Filters&lt;/strong&gt;: Query filters allow you to apply global filters to your queries, which can be useful for implementing soft delete or multi-tenancy scenarios. Here's an example of using query filters:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;modelBuilder.Entity&amp;lt;Blog&amp;gt;()
    .HasQueryFilter(b =&amp;gt; !b.IsDeleted);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;DbContext pooling&lt;/strong&gt; can improve the performance of your web applications by reusing the same context instance across requests. This reduces the overhead of creating and disposing DbContext instances. To enable DbContext pooling in an ASP.NET Core application, use the AddDbContextPool method when configuring services in the Startup class:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContextPool&amp;lt;MyDbContext&amp;gt;(options =&amp;gt;
    {
        options.UseSqlServer(
        Configuration.GetConnectionString("DefaultConnection")
        );
    });
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;strong&gt;AsSplitQuery&lt;/strong&gt; method can be used to avoid the Cartesian explosion problem when including multiple navigational properties. This method configures EF Core to load the collections in the query results through separate database queries:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var customersWithOrdersAndProducts = context.Customers
    .Include(c =&amp;gt; c.Orders)
        .ThenInclude(o =&amp;gt; o.Products)
    .AsSplitQuery()
    .ToList();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Now let's dive into ef core 7 specific features
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Inserting a single row&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var blog = new Blog { Name = "MyBlog" };
ctx.Blogs.Add(blog);
await ctx.SaveChangesAsync();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In EF Core 6.0, this code would start a transaction, execute the command, and then commit the transaction. In EF Core 7.0, the transaction is removed, resulting in a 25% improvement in performance on localhost and a 45% improvement on a remote server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Inserting multiple rows&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;for (var i = 0; i &amp;lt; 4; i++)
{
    var blog = new Blog { Name = "Foo" + i };
    ctx.Blogs.Add(blog);
}
await ctx.SaveChangesAsync();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In EF Core 6.0, this would use a MERGE statement to insert four rows, which is significantly faster than four separate INSERT statements. In EF Core 7.0, the transaction is removed, and the temporary table is also removed, resulting in a 61% improvement in performance on a remote server and a 74% improvement on localhost.&lt;/p&gt;

&lt;p&gt;Using &lt;strong&gt;HiLo&lt;/strong&gt; feature for integer keys:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity&amp;lt;Blog&amp;gt;().Property(b =&amp;gt; b.Id).UseHiLo();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once HiLo is enabled, the SaveChanges output is efficient, and resembles the GUID scenario.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SQL Server Temporal Tables&lt;/strong&gt;. EF Core 7.0 now supports SQL Server Temporal Tables. This allows you to keep a history of data changes directly in the database&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;modelBuilder.Entity&amp;lt;YourEntity&amp;gt;()
    .UseTemporalTable();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Compiled Models&lt;/strong&gt;. EF Core 7.0 introduces compiled models, which can significantly improve startup performance. Here's how you can use it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var options = new DbContextOptionsBuilder&amp;lt;YourContext&amp;gt;()
    .UseModel(YourCompiledModel.Instance)
    .Options;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Table-per-Type (TPT) Mapping&lt;/strong&gt;. EF Core 7.0 introduces support for Table-per-Type (TPT) mapping.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;modelBuilder.Entity&amp;lt;YourBaseEntity&amp;gt;()
    .ToTable("YourBaseTable");

modelBuilder.Entity&amp;lt;YourDerivedEntity&amp;gt;()
    .ToTable("YourDerivedTable");
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;SQLite Online Schema Migrations&lt;/strong&gt;. EF Core 7.0 introduces support for SQLite online schema migrations.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var options = new DbContextOptionsBuilder&amp;lt;YourContext&amp;gt;()
.UseSqlite("YourConnectionString", b =&amp;gt; 
b.MigrationsAssembly("YourAssembly"))
    .Options;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;ExecuteUpdate&lt;/strong&gt; and &lt;strong&gt;ExecuteDelete&lt;/strong&gt; Methods. EF Core 7 introduces two new methods, ExecuteUpdate and ExecuteDelete, that perform changes and deletions of records without loading the entities in memory, resulting in performance gains. However, changes must be specified explicitly as they are not automatically detected by EF Core.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;await db.Posts
    .Where(p =&amp;gt; p.Id == "3fa85f64-5717-4562-b3fc-2c963f66afa6")
    .ExecuteUpdateAsync(s =&amp;gt; s
    .SetProperty(b =&amp;gt; b.AuthorName, "John Smith")
    .SetProperty(b =&amp;gt; b.Title, b =&amp;gt;  "EF7 is here!")
    .SetProperty(b =&amp;gt; b.Text, b =&amp;gt;  "\t")
    .SetProperty(b =&amp;gt; 
     b.LastUpdateDate, "2022-30-11 17:29:46.5028235"));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;await db.Posts
.Where(p =&amp;gt; p.Id == "3fa85f64-5717-4562-b3fc-2c963f66afa6")
.ExecuteDeleteAsync();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;JSON Columns&lt;/strong&gt;. EF7 has native support for JSON columns, which allows mapping .NET types to JSON documents. This includes LINQ queries that can be used in aggregations and will be converted to the appropriate query constructs for JSON. It's also possible to update and save changes to JSON documents.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity&amp;lt;Author&amp;gt;().OwnsOne(
        author =&amp;gt; author.Contact, ownedNavigationBuilder =&amp;gt;
        {
            ownedNavigationBuilder.ToJson();
            ownedNavigationBuilder
            .OwnsOne(contactDetails =&amp;gt; contactDetails.Address);
        });
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var authorsByCity = await db.Authors.Where(author =&amp;gt; author
.Contact.Address.City == city).ToListAsync();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var authorExists = await db.Authors
.Where(author =&amp;gt; author.Id == id)
.FirstOrDefaultAsync();
authorExists.Contact.Address.Street = "1523 Stellar Dr";
await db.SaveChangesAsync();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;New Query Options&lt;/strong&gt;. EF7 brought new features to queries like GroupBy as the final operator. The example below shows how grouping can be done using the GroupBy extension method:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var groupByAuthor = db.Posts.GroupBy(p =&amp;gt; p.AuthorName).ToList();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Bulk Updates and Deletes&lt;/strong&gt;. EF Core 7 introduces the ability to perform bulk updates and deletes. This allows you to express something similar to a LINQ query to push the changes directly to the database. The new ExecuteDelete and ExecuteUpdate methods are appended to LINQ queries in the same way that you'd apply a LINQ execution method.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;context.People
    .Where(p =&amp;gt; p.PersonId == 1)
    .ExecuteDelete();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;context.People
    .Where(p =&amp;gt; p.LastName == "Lehrman")
    .ExecuteUpdate(s =&amp;gt; s.SetProperty(c =&amp;gt; c.LastName, c =&amp;gt; "Lerman"));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Mapping Stored Procedures&lt;/strong&gt;. EF Core 7 introduces the ability to map stored procedures to entities. This allows you to use stored procedures to perform database operations when you call SaveChanges. The new InsertUsingStoredProcedure, UpdateUsingStoredProcedure, and DeleteUsingStoredProcedure methods allow you to map stored procedures to entities.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;modelBuilder.Entity&amp;lt;Person&amp;gt;()
    .InsertUsingStoredProcedure("PeopleInsert",
        spbuilder =&amp;gt; spbuilder
            .HasParameter(p =&amp;gt; p.PersonId, pb =&amp;gt; pb.IsOutput()
            .HasName("id"))
            .HasParameter(p =&amp;gt; p.FirstName)
            .HasParameter(p =&amp;gt; p.LastName)
    );

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>database</category>
      <category>efcore</category>
      <category>dotnet</category>
      <category>entityframework</category>
    </item>
    <item>
      <title>Unleashing the Power of Unit Testing: Supercharge Blazor Server Async Components' UI Behavior with .NET Core and BUnit</title>
      <dc:creator>Matteo Maggiolini</dc:creator>
      <pubDate>Sun, 25 Jun 2023 15:51:47 +0000</pubDate>
      <link>https://dev.to/webinadvance/unleashing-the-power-of-unit-testing-supercharge-blazor-server-async-components-ui-behavior-with-net-core-and-bunit-4n9j</link>
      <guid>https://dev.to/webinadvance/unleashing-the-power-of-unit-testing-supercharge-blazor-server-async-components-ui-behavior-with-net-core-and-bunit-4n9j</guid>
      <description>&lt;p&gt;Hi folks,&lt;/p&gt;

&lt;p&gt;&lt;em&gt;We are all familiar with unit testing frameworks like Angular, React, and Vue on the client side. But what if we want to test the UI of hybrid or server-side frameworks like Blazor?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Blazor&lt;/strong&gt;, the web framework by Microsoft, has gained popularity for building interactive web applications using C#. With the release of .NET 8, Blazor has become even more powerful.&lt;/p&gt;

&lt;p&gt;Testing is a crucial part of software development, and BUnit, a testing framework, makes it easy to write unit tests for Blazor components. In this blog post, we will explore how to use BUnit (and of course NUnit) to test button clicks in a server-side Blazor component.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Assuming that you are already familiar with Blazor server-side projects&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Let's consider a component similar to the one provided, incorporating asynchronous streaming rendering capabilities to enhance complexity. Additionally, it utilizes JS interop for interaction, dynamically rendering buttons, and so on...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@using Microsoft.AspNetCore.Components
@inject IJSRuntime JSRuntime

&amp;lt;h3&amp;gt;Test Component&amp;lt;/h3&amp;gt;

&amp;lt;p&amp;gt;Click the button to call a server action and display data:&amp;lt;/p&amp;gt;

@if (dataList != null &amp;amp;&amp;amp; dataList.Any())
{
    &amp;lt;h4&amp;gt;Data List&amp;lt;/h4&amp;gt;
    &amp;lt;ul&amp;gt;
        @foreach (var item in dataList)
        {
            &amp;lt;li&amp;gt;
                @item
                &amp;lt;button class="server-action-button" @onclick="() =&amp;gt; CallServerAction(item)"&amp;gt;Call Server Action&amp;lt;/button&amp;gt;
            &amp;lt;/li&amp;gt;
        }
    &amp;lt;/ul&amp;gt;
}

@code {
    private List&amp;lt;string&amp;gt; dataList;

    private async Task CallServerAction(string item)
    {
        await Task.Delay(1000);

        dataList.Add(item + " (Added on server)");

        await JSRuntime.InvokeVoidAsync("myCustomJsFunction", "Server action completed!");

        await InvokeAsync(StateHasChanged);
    }

    protected override void OnInitialized()
    {
        dataList = new List&amp;lt;string&amp;gt; { "Item 1", "Item 2", "Item 3" };
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, we can test the button click behavior in a simple and straightforward way&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; [Test]
        public void Test_ButtonClick()
        {
            using var ctx = new TestContext();

            var jsInteropMock = new Mock&amp;lt;IJSRuntime&amp;gt;();
            var jsRuntime = jsInteropMock.Object;
            ctx.Services.AddSingleton(jsRuntime);

            var component = ctx.RenderComponent&amp;lt;TestComponent&amp;gt;();
            component.WaitForState(() =&amp;gt; component.Instance.dataList != null, TimeSpan.FromSeconds(10));
            component.Render();

            var button = component.FindAll("button.server-action-button")[0];

            var serializeObject = JsonConvert.SerializeObject(component.Instance.dataList);

            Assert.DoesNotThrow(() =&amp;gt; button.Click());

            component.WaitForState(() =&amp;gt;
            {
                var serializeObjectToCheck = JsonConvert.SerializeObject(component.Instance.dataList);
                return !serializeObjectToCheck.Equals(serializeObject);
            }, TimeSpan.FromSeconds(30));

            Assert.Pass("data has changed successfully.");
        }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The test case sets up a *&lt;em&gt;TestContext *&lt;/em&gt;(Bunit.TestContext, the factory that makes it possible to create components under tests)&lt;/p&gt;

&lt;p&gt;A mock instance of IJSRuntime is created using Mock and assigned to jsRuntime. It is then added to the services collection of the TestContext using ctx.Services.AddSingleton(jsRuntime). This allows us to provide a mock implementation of IJSRuntime to the component.&lt;/p&gt;

&lt;p&gt;Of course, you will understand that in this context, you can add all the necessary injected services and, if needed, mock them for testing purposes.&lt;/p&gt;

&lt;p&gt;The TestComponent is rendered by calling &lt;strong&gt;ctx.RenderComponent()&lt;/strong&gt;. The WaitForState method is used to wait until the initial state of the dataList is not null before rendering the component.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;component.Render()&lt;/strong&gt; is called explicitly to render the component.&lt;/p&gt;

&lt;p&gt;The button element with the CSS class "server-action-button" is found using &lt;strong&gt;component.FindAll&lt;/strong&gt;("button.server-action-button")...&lt;/p&gt;

&lt;p&gt;The button is simulated to be clicked by calling button.Click().&lt;/p&gt;

&lt;p&gt;The test case waits for the state to change using &lt;strong&gt;component.WaitForState()&lt;/strong&gt;. It provides a condition that checks if the dataList has been updated by comparing the serialized dataList before and after the button click.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Of course, we can see that the testing assertions used here are for demonstration purposes only. In reality, you have the flexibility to perform various types of checks and validations, including verifying UI state changes, user interactions, and much more. The possibilities are virtually limitless when it comes to testing and ensuring the desired behavior of your Blazor components.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That's all Folks!&lt;/p&gt;

&lt;p&gt;IMHO the Automated testing in Blazor opens up a world of possibilities for ensuring the functionality and reliability of real user interfaces. The example we discussed represents a simple case scenario where we tested the button click behavior and state update in a Blazor component.&lt;/p&gt;

&lt;p&gt;By utilizing BUnit and NUnit, we were able to simulate user interactions, trigger server actions, and validate the resulting changes in the component's state. This demonstrates the potential of automated testing in Blazor to catch bugs, validate expected behavior, and provide confidence in the quality of the application.&lt;/p&gt;

&lt;p&gt;I think this is a good point to start from&lt;/p&gt;

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

&lt;p&gt;The flexibility and extensibility of automated testing allow you to test various scenarios and handle complex interactions within Blazor components. From validating UI elements to testing complex user workflows, the only limit is your imagination and the specific requirements of your application.&lt;/p&gt;

&lt;p&gt;Automated testing in Blazor not only saves time and effort in manual testing but also provides a safety net for detecting issues early in the development cycle. It enables developers to iterate quickly, make changes confidently, and deliver a high-quality user experience.&lt;/p&gt;

&lt;p&gt;So, unleash your creativity and explore the full potential of automated testing to ensure that your Blazor applications are robust, reliable, and provide an exceptional user experience.&lt;/p&gt;

&lt;p&gt;See you for the next Blazor and .NET post!&lt;br&gt;
Stay tuned&lt;/p&gt;

</description>
      <category>blazor</category>
      <category>testing</category>
      <category>net8</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
