alvinashcraft's blurbloghttps://alvinashcraft.newsblur.com/2024-03-28T09:05:27.304000ZalvinashcraftDev Proxy v0.16 with simulated handling Teams Admin Center notifications for Microsoft Graph connectors2024-03-28T09:05:27.304000ZWaldek Mastykarzhttps://devblogs.microsoft.com/microsoft365dev/dev-proxy-v0-16-with-simulated-handling-teams-admin-center-notifications-for-microsoft-graph-connectors/<table style="border: 1px solid #E0E0E0; margin: 0; padding: 0; background-color: #F0F0F0" valign="top" align="left" cellpadding="0" width="100%">
<tr>
<td rowspan="2" style="padding: 6px;width: 36px;white-space:nowrap" width="36" valign="top"><img src="https://www.gravatar.com/avatar/19ac6a9d902c1d6ae33f41405e47b385" style="width: 36px; height: 36px; border-radius: 4px;"></td>
<td width="100%" style="padding-top: 6px;">
<b>
alvinashcraft
<a href="https://alvinashcraft.newsblur.com/story/dev-proxy-v016-with-/8914242:c4dce9">shared this story</a>
from <img src="https://s3.amazonaws.com/icons.newsblur.com/8914242.png" style="vertical-align: middle;width:16px;height:16px;"> Microsoft 365 Developer Blog.</b>
</td>
</tr>
</table>
<hr style="clear: both; margin: 0 0 24px;">
<p>Focus on developing your app and not on things that won’t go into production. See how your apps deal with API errors. We’re excited to share the launch of Dev Proxy v0.16, which has new features that help you create better apps.</p>
<p>In this version:</p>
<ul>
<li>Simulate Teams Admin Center notifications for Microsoft Graph connectors</li>
<li>Microsoft Graph connectors guidance for Copilot for Microsoft 365</li>
<li>Simulate webhooks</li>
<li>Support for including comments in Dev Proxy config files</li>
<li>Improved UI</li>
<li>…and more!</li>
</ul>
<h2 id="simulate-teams-admin-center-notifications-for-microsoft-graph-connectors">Simulate Teams Admin Center notifications for Microsoft Graph connectors</h2>
<p>Microsoft Graph connectors allow you to bring your organizational content to Microsoft 365. This allows you to find your content from one place, no matter where it’s stored. What’s more, it gives Copilot for Microsoft 365 access to the content, so that it can help you get more relevant answers.</p>
<p>When deploying Graph connectors in your organization, you should consider packaging them as Microsoft Teams app. That way, they’ll be deployed to the Teams Admin Center, from which admins can control them in a familiar way. To package a Graph connector as a Teams app, you need to extend it with an API that receives the webhook from Teams Admin Center.</p>
<p>In this release of Dev Proxy, we’re excited to ship the ability for you to simulate the Teams Admin Center notification for enabling and disabling Graph connectors. With the new feature, you can test your code locally end to end: from validating the token, to creating the connection with the ticket from the notification. And you can do all of this locally without deploying anything to Microsoft 365!</p>
<p style="text-align: center;"><img alt="Code, Dev Proxy simulating the Teams Admin Center notification for Graph connectors and mocking subsequent requests for validating the token and creating the external connection." class="aligncenter wp-image-19959" height="1377" src="https://devblogs.microsoft.com/microsoft365dev/wp-content/uploads/sites/73/2024/03/word-image-19958-1.png" width="2202" /><em>Dev Proxy simulating the Teams Admin Center notification for Graph connectors and mocking subsequent requests for validating the token and creating the external connection.</em></p>
<p>We not only simulate the Teams Admin Center notification. We also check if your code correctly implements the different steps, like properly responding to the notification request or including the ticket from the notification on the external connection creation request. If we see that one of the required steps is missing or implemented incorrectly, we’ll warn you about it. This way you can find potential issues earlier and deploy your Graph connector with confidence.</p>
<p style="text-align: center;"><img alt="Code, PowerShell. Dev Proxy warning about the lack of ticket on the request to create an external connection after receiving a Teams Admin Center notification" class="alignnone wp-image-19960" height="1324" src="https://devblogs.microsoft.com/microsoft365dev/wp-content/uploads/sites/73/2024/03/word-image-19958-2.png" width="2378" /><em>Dev Proxy warning about the lack of ticket on the request to create an external connection after receiving a Teams Admin Center notification</em></p>
<p>Learn more about <a href="https://learn.microsoft.com/microsoft-cloud/dev/dev-proxy/how-to/mock-teams-admin-center-notification-graph-connectors">simulating the Teams Admin Center notification for Graph connectors using Dev Proxy</a>.</p>
<h2 id="microsoft-graph-connectors-guidance-for-copilot-for-microsoft-365">Microsoft Graph connectors guidance for Copilot for Microsoft 365</h2>
<p>Using Microsoft Graph connectors, you can bring your organizational content to Microsoft 365. The ingested content shows up in several user experiences including Microsoft Search, ContextIQ and of course Copilot for Microsoft 365.</p>
<p>There are <a href="https://learn.microsoft.com/graph/connecting-external-content-experiences#microsoft-365-copilot">several requirements</a> that you have to meet for the content you ingest using your Graph connector to show up in Copilot for Microsoft 365.</p>
<p>In this version of Dev Proxy, we’re introducing a new Graph connector guidance plugin, which checks if your external connection is configured properly for use with Copilot for Microsoft 365. We start with validating if your external connection contains the required semantic labels. If it doesn’t, we’ll warn you and tell you which labels are missing.</p>
<p style="text-align: center;"><img alt="Code. Dev Proxy showing an error after detecting a missing semantic label in an external connection schema provisioning request." class="aligncenter wp-image-19961" height="1350" src="https://devblogs.microsoft.com/microsoft365dev/wp-content/uploads/sites/73/2024/03/word-image-19958-3.png" width="2164" /><em>Dev Proxy showing an error after detecting a missing semantic label in an external connection schema provisioning request.</em></p>
<p>We’ll be expanding our checks in the future and hope that they’ll help you deploy your Graph connectors with confidence.</p>
<p>Learn more about the new <a href="https://learn.microsoft.com/microsoft-cloud/dev/dev-proxy/technical-reference/graphconnectorguidanceplugin">GraphConnectorGuidancePlugin</a>.</p>
<h2 id="simulate-webhooks">Simulate webhooks</h2>
<p>Many applications these days rely on webhooks. Webhooks are a common way for systems to notify each other of changes.</p>
<p>A common challenge for working with webhooks is simulating the change in the external system that triggers the webhook. In this version of Dev Proxy, we’re introducing the MockRequestPlugin that allows you to send a preconfigured notification to your application with a single key press.</p>
<p style="text-align: center;"><img alt="Code, Dev Proxy simulating a webhook notification request to a local API." class="aligncenter wp-image-19962" height="1385" src="https://devblogs.microsoft.com/microsoft365dev/wp-content/uploads/sites/73/2024/03/word-image-19958-4.png" width="2206" /><em>Dev Proxy simulating a webhook notification request to a local API.</em></p>
<p>By itself, the MockRequestPlugin is a convenient method to send webhook notifications to your app. You can configure the different requests in an easy way in your project and share them with your colleagues. The plugin is also a powerful building block for implementing specialized plugins which encapsulate some additional logic and guidance, such as the one we’ve just mentioned that simulates Teams Admin Center notifications for Graph connectors.</p>
<p>Learn more about the new <a href="https://learn.microsoft.com/microsoft-cloud/dev/dev-proxy/technical-reference/mockrequestplugin">MockRequestPlugin</a>.</p>
<h2 id="support-for-including-comments-in-dev-proxy-config-files">Support for including comments in Dev Proxy config files</h2>
<p>Over the last year, Dev Proxy evolved into a powerful API simulator that supports many different scenarios. While some require little to no configuration, others are more advanced and use elaborate configuration.</p>
<p>To help you document your settings, we now introduce support for including comments in Dev Proxy configuration and plugin files.</p>
<p style="text-align: center;"><img alt="Code, Dev Proxy configuration file with a comment" class="aligncenter wp-image-19963" height="838" src="https://devblogs.microsoft.com/microsoft365dev/wp-content/uploads/sites/73/2024/03/word-image-19958-5.png" width="1758" /><em>Dev Proxy configuration file with a comment</em></p>
<p>We hope that it’ll help you keep relevant notes next to your configuration so that you can easily share it with your colleagues. Oh, and if you happen to use VSCode, use .jsonc as the file extension for your config files. It’ll keep VSCode from highlighting comments as errors.</p>
<h2 id="improved-ui">Improved UI</h2>
<p>As we keep extending Dev Proxy with new features, we want to help you get the most out of it. In this version, we extend the UI with a list of hotkeys that you can use with Dev Proxy to invoke its different features.</p>
<p style="text-align: center;"><img alt="Code, Dev Proxy running in the terminal showing its hotkeys" class="alignnone wp-image-19964" height="1332" src="https://devblogs.microsoft.com/microsoft365dev/wp-content/uploads/sites/73/2024/03/word-image-19958-6.png" width="2124" /><em>Dev Proxy running in the terminal showing its hotkeys</em></p>
<h2 id="theres-more">There’s more</h2>
<p>This release also includes several bug fixes and improvements. Check out the <a href="https://github.com/microsoft/dev-proxy/releases/tag/v0.16.0">release notes</a> for the complete list of changes in this version.</p>
<h2 id="try-it-now">Try it now</h2>
<p><a href="https://learn.microsoft.com/microsoft-cloud/dev/dev-proxy/get-started#install-dev-proxy">Download Dev Proxy v0.16</a> today and build better apps connected to APIs!</p>
<p>Thanks to <a href="https://github.com/SilentSobs">Ramesh Adhikari</a>, and <a href="https://github.com/oleguchok">Oleg Guchok</a> for contributing to this release.</p>
<p>Have any questions, feedback, or suggestions? Join us on <a href="https://aka.ms/devproxy/discord">Discord</a>. We can’t wait to see what you create with Dev Proxy!</p>
<p><em>Follow us on <a href="http://twitter.com/microsoft365dev">X (Twitter) / @Microsoft365Dev</a> and subscribe to our <a href="https://www.youtube.com/microsoft365developer">YouTube channel</a> to stay up to date on the latest developer news and announcements.</em></p>
<p>The post <a href="https://devblogs.microsoft.com/microsoft365dev/dev-proxy-v0-16-with-simulated-handling-teams-admin-center-notifications-for-microsoft-graph-connectors/">Dev Proxy v0.16 with simulated handling Teams Admin Center notifications for Microsoft Graph connectors</a> appeared first on <a href="https://devblogs.microsoft.com/microsoft365dev">Microsoft 365 Developer Blog</a>.</p>BingAds SDK March 2024 Release (V13.0.19)2024-03-28T09:05:08.399000Zrtgarittahttps://techcommunity.microsoft.com/t5/bing-ads-api-blog/bingads-sdk-march-2024-release-v13-0-19/ba-p/4099210<table style="border: 1px solid #E0E0E0; margin: 0; padding: 0; background-color: #F0F0F0" valign="top" align="left" cellpadding="0" width="100%">
<tr>
<td rowspan="2" style="padding: 6px;width: 36px;white-space:nowrap" width="36" valign="top"><img src="https://www.gravatar.com/avatar/19ac6a9d902c1d6ae33f41405e47b385" style="width: 36px; height: 36px; border-radius: 4px;"></td>
<td width="100%" style="padding-top: 6px;">
<b>
alvinashcraft
<a href="https://alvinashcraft.newsblur.com/story/bingads-sdk-march-20/6829025:5534e2">shared this story</a>
from <img src="https://s3.amazonaws.com/icons.newsblur.com/6829025.png" style="vertical-align: middle;width:16px;height:16px;"> New blog articles in Microsoft Community Hub.</b>
</td>
</tr>
</table>
<hr style="clear: both; margin: 0 0 24px;">
<p><span>We are pleased to announce the following new features, improvements, and bug fixes in the </span><a href="https://learn.microsoft.com/advertising/guides/release-notes?view=bingads-13#march2024" rel="noreferrer" target="_self" title="BingAds SDK March 2024 Release (V13.0.19).">BingAds SDK March 2024 Release (V13.0.19).</a></p>
<p> </p>
<p><strong><span>Key Features</span></strong><span> </span></p>
<ul>
<li><span>New API Interfaces</span><span> </span><br />
<ul>
<li>Campaign Management API:<span> </span><a href="https://learn.microsoft.com/en-us/advertising/campaign-management-service/adddataexclusions?view=bingads-13" rel="noopener" target="_blank">AddDataExclusions</a>,<span> </span><a href="https://learn.microsoft.com/en-us/advertising/campaign-management-service/getdataexclusionsbyaccountid?view=bingads-13" rel="noopener" target="_blank">GetDataExclusionsByAccountId</a>,<span> </span><a href="https://learn.microsoft.com/en-us/advertising/campaign-management-service/getseasonalityadjustmentsbyids?view=bingads-13" rel="noopener" target="_blank">GetDataExclusionsByIds</a>,<span> </span><a href="https://learn.microsoft.com/en-us/advertising/campaign-management-service/updatedataexclusions?view=bingads-13" rel="noopener" target="_blank">UpdateDataExclusions</a>,<span> </span><a href="https://learn.microsoft.com/en-us/advertising/campaign-management-service/deletedataexclusions?view=bingads-13" rel="noopener" target="_blank">DeleteDataExclusions</a><span> </span>for<span> </span><a href="https://learn.microsoft.com/en-us/advertising/campaign-management-service/dataexclusion?view=bingads-13" rel="noopener" target="_blank">DataExclusion</a>.<span> </span><a href="https://learn.microsoft.com/en-us/advertising/campaign-management-service/addseasonalityadjustments?view=bingads-13" rel="noopener" target="_blank">AddSeasonalityAdjustment</a>,<span> </span><a href="https://learn.microsoft.com/en-us/advertising/campaign-management-service/getseasonalityadjustmentsbyaccountid?view=bingads-13" rel="noopener" target="_blank">GetSeasonalityAdjustmentsByAccountId</a>,<span> </span><a href="https://learn.microsoft.com/en-us/advertising/campaign-management-service/getseasonalityadjustmentsbyids?view=bingads-13" rel="noopener" target="_blank">GetSeasonalityAdjustmentByIds</a>,<span> </span><a href="https://learn.microsoft.com/en-us/advertising/campaign-management-service/updateseasonalityadjustments?view=bingads-13" rel="noopener" target="_blank">UpdateSeasonalityAdjustments</a>,<span> </span><a href="https://learn.microsoft.com/en-us/advertising/campaign-management-service/deleteseasonalityadjustments?view=bingads-13" rel="noopener" target="_blank">DeleteSeasonalityAdjustments</a><span> </span>for<span> </span><a href="https://learn.microsoft.com/en-us/advertising/campaign-management-service/seasonalityadjustment?view=bingads-13" rel="noopener" target="_blank">SeasonalityAdjustment</a>.</li>
</ul>
</li>
<li><span>Bulk service</span><span> </span><br />
<ul>
<li>Disable<span> </span><em>VerifiedTrackingSettings</em><span> </span>in BulkCampaign. New fields<span> </span><em>AutoGeneratedImageOptOut</em><span> </span>and<span> </span><em>AutoGeneratedTextOptOut</em><span> </span>for Perfromance Max in BulkCampaign.</li>
<li>Add bulk mappings<span> </span><em>BulkAccountNegativeKeywordList</em>,<span> </span><em>BulkAccountNegativeKeywordListAssociation</em><span> </span>and<span> </span><em>BulkAccountSharedNegativeKeyword</em><span> </span>for Account Level Negative Keyword List.</li>
<li>Support <em>PageFeedIds</em> for Performance Max in BulkCampaign.</li>
<li>Add bulk mapping for<span> </span><em>TargetCostPerSale</em>.</li>
<li>Add bulk mappings for<span> </span><em>AutoBidding</em>,<span> </span><em>BulkSeasonalityAdjustment</em><span> </span>and<span> </span><em>BulkDataExclusion</em>.</li>
</ul>
</li>
</ul>
<p><strong><span>Release notes </span></strong><span> </span></p>
<ul>
<li><a href="https://github.com/BingAds/BingAds-dotNet-SDK/releases/tag/v13.0.19" rel="noopener noreferrer" target="_blank">.NET</a><span> </span></li>
<li><a href="https://github.com/BingAds/BingAds-Java-SDK/releases/tag/v13.0.19" rel="noopener noreferrer" target="_blank"><span>Java</span></a></li>
<li><a href="https://github.com/BingAds/BingAds-Python-SDK/releases/tag/v13.0.19" rel="noreferrer" target="_self">Python</a></li>
<li><a href="https://github.com/BingAds/BingAds-PHP-SDK/releases/tag/v13.0.19" rel="noreferrer" target="_self">Php</a></li>
</ul>API Observability with Anthony Alaribe2024-03-28T09:04:52.792000ZCarl Franklinhttps://www.spreaker.com/episode/api-observability-with-anthony-alaribe--59203087<table style="border: 1px solid #E0E0E0; margin: 0; padding: 0; background-color: #F0F0F0" valign="top" align="left" cellpadding="0" width="100%">
<tr>
<td rowspan="2" style="padding: 6px;width: 36px;white-space:nowrap" width="36" valign="top"><img src="https://www.gravatar.com/avatar/19ac6a9d902c1d6ae33f41405e47b385" style="width: 36px; height: 36px; border-radius: 4px;"></td>
<td width="100%" style="padding-top: 6px;">
<b>
alvinashcraft
<a href="https://alvinashcraft.newsblur.com/story/api-observability-wi/4925:fa6065">shared this story</a>
from <img src="https://s3.amazonaws.com/icons.newsblur.com/4925.png" style="vertical-align: middle;width:16px;height:16px;"> .NET Rocks!.</b>
</td>
</tr>
</table>
<hr style="clear: both; margin: 0 0 24px;">
Do you understand how your APIs are being used? Carl and Richard talk to Anthony Alaribe about his experiences dealing with poorly documented APIs that need updates - but no breaking changes! Anthony tells a story about missing a use case for an API that cost a lot of money, which started him down the path to making APItoolkit.io. The toolkit allows you to see how your API is being used and any exceptions that are happening. It will also generate tests to validate that your new version won't cause problems! Check it out!<br><br>
<audio controls="controls" preload="none">
<source src="https://dts.podtrac.com/redirect.mp3/api.spreaker.com/download/episode/59203087/dotnetrocks_1891_api_observability.mp3" type="audio/mpeg" />
</audio><br><br>
Download audio: <a href="https://dts.podtrac.com/redirect.mp3/api.spreaker.com/download/episode/59203087/dotnetrocks_1891_api_observability.mp3">https://dts.podtrac.com/redirect.mp3/api.spreaker.com/download/episode/59203087/dotnetrocks_1891_api_observability.mp3</a>How to Get the HTML Content of a Web Page as a String in .NET2024-03-28T09:04:41.928000ZCode Mazehttps://code-maze.com/dotnet-get-the-html-content-of-a-web-page-as-a-string/<table style="border: 1px solid #E0E0E0; margin: 0; padding: 0; background-color: #F0F0F0" valign="top" align="left" cellpadding="0" width="100%">
<tr>
<td rowspan="2" style="padding: 6px;width: 36px;white-space:nowrap" width="36" valign="top"><img src="https://www.gravatar.com/avatar/19ac6a9d902c1d6ae33f41405e47b385" style="width: 36px; height: 36px; border-radius: 4px;"></td>
<td width="100%" style="padding-top: 6px;">
<b>
alvinashcraft
<a href="https://alvinashcraft.newsblur.com/story/how-to-get-the-html-/6933904:d75ee6">shared this story</a>
from <img src="https://s3.amazonaws.com/icons.newsblur.com/6933904.png" style="vertical-align: middle;width:16px;height:16px;"> Code Maze.</b>
</td>
</tr>
</table>
<hr style="clear: both; margin: 0 0 24px;">
<p>In this article, we will look into a comprehensive guide on how to get the HTML content of a web page as a string and how to parse the content retrieved. First things first, we’ll learn how to retrieve HTML content as a string from the web using tools like HttpClient, HtmlAgilityPack, and AngleSharp. Then, […]</p>
<p>The post <a href="https://code-maze.com/dotnet-get-the-html-content-of-a-web-page-as-a-string/">How to Get the HTML Content of a Web Page as a String in .NET</a> appeared first on <a href="https://code-maze.com">Code Maze</a>.</p>adr - A .NET Tool for Creating & Managing Architecture Decision Records2024-03-28T09:04:34.885000ZHoward van Rooijenhttps://endjin.com/blog/2024/03/adr-a-dotnet-tool-for-creating-and-managing-architecture-decision-records.html<table style="border: 1px solid #E0E0E0; margin: 0; padding: 0; background-color: #F0F0F0" valign="top" align="left" cellpadding="0" width="100%">
<tr>
<td rowspan="2" style="padding: 6px;width: 36px;white-space:nowrap" width="36" valign="top"><img src="https://www.gravatar.com/avatar/19ac6a9d902c1d6ae33f41405e47b385" style="width: 36px; height: 36px; border-radius: 4px;"></td>
<td width="100%" style="padding-top: 6px;">
<b>
alvinashcraft
<a href="https://alvinashcraft.newsblur.com/story/adr-a-net-tool-for-c/569298:fdf3e3">shared this story</a>
from <img src="https://s3.amazonaws.com/icons.newsblur.com/569298.png" style="vertical-align: middle;width:16px;height:16px;"> endjin.com.</b>
</td>
</tr>
</table>
<hr style="clear: both; margin: 0 0 24px;">
<p><strong>TLDR;</strong> Architectural Decision Records (ADRs) are a simple markdown based document for capturing the context, options, decision, and consequences of a decision. <code>dotnet-adr</code> is a .NET global tool for creating and managing ADRs. It allows you to create ADRs using a variety of templates, and to manage the ADRs in your repo. It's designed to be simple, flexible, and customisable. ADRs have made a huge positive impact to our software and data engineering processes, and we wholeheartedly recommend you adopt them too. You can install dotnet adr with the following command: <code>dotnet tool install -g adr</code></p>
<h2 id="make-future-you-thank-past-you">Make Future You Thank Past You</h2>
<p>Context drives intent, which manifests as code. This is the socio-technical contract of modern software development. If over time, code is the only remaining archaeological artefact, we are simply left with <em>effect</em> without knowing the <em>cause</em>.</p>
<p>Over the last decade we have found immense value in <a href="https://specflow.org/learn/gherkin/">Gherkin</a> based <a href="https://gojko.net/books/specification-by-example/">Executable Specifications</a> to describe the behaviour (or intent) of a system; in fact the Gherkin (<a href="https://specflow.org/">Specflow</a>) feature files have often outlived the original code and have been used to re-implement the system using a more modern language or framework. They are also the secret sauce for providing RAG context to GitHub Copilot to more accurately generate code aligned with the intent of the system.</p>
<p>Now we have the code, and the intent, but we're still missing an artefact that captures the context. Architectural Decision Records (ADRs) fill this requirement exceedingly well. ADRs are simple text documents (our preferred format is Markdown) which <a href="https://www.merriam-webster.com/dictionary/pr%C3%A9cis">précis</a> some or all of the following aspects of a decision:</p>
<ul>
<li>Context</li>
<li>Assumptions</li>
<li>Options</li>
<li>Rationale</li>
<li>Decision</li>
<li>Consequences</li>
</ul>
<p>The 1st <a href="http://lawsofsimplicity.com/">Law of Simplicity</a> is "Reduce", and much like Bezos' infamous <a href="https://www.cnbc.com/2018/04/23/what-jeff-bezos-learned-from-requiring-6-page-memos-at-amazon.html">6-page memo format</a>, brevity is the key to the power of ADRs. Rather than a heavyweight functional specification, ADRs have much more in common with minutes from a meeting. The meeting may take hours, but reading the minutes, should take... minutes.</p>
<p>Good code comments don't explain what the code does, they explain what the developer was thinking when they wrote the code, what assumptions they were making, and what they were trying to achieve. This allows anyone reviewing the code to spot any faults with logic, assumptions that proved to be incorrect, or requirements which have evolved. ADRs operate on the same principle. Anyone can review the ADRs and quickly <a href="https://en.wikipedia.org/wiki/Grok">grok</a> the context, the assumptions, the rationale, the decision, and the consequences, without being bogged down in detail.</p>
<p>With modern cloud native solutions, recording context takes on a nuanced significance; cloud services vary from IaaS to PaaS to SaaS, as a consumer you are not in control of the feature set, the scale characteristics, or the price point. When making an architectural decision you may be constrained by a missing feature, a financial budget, or a performance target. The speed of cloud innovation means that any of these constraints can change on a monthly basis. <a href="https://azureweekly.info">Keeping track</a> of <a href="https://powerbiweekly.info">feature announcements</a> and re-evaluating the context of previously made decisions is an engineering practice you should adopt as part of the ADR process.</p>
<p>The principles of ADRs are straightforward, but the implementation can be simple or as complex as your team or organization requires. The out-of-the-box default template is the <a href="https://endjin.com/rss.xml#markdown-architectural-decision-records-madr">Markdown Architectural Decision Records (MADR)</a>, but this tool and repo contains a number of alternative <a href="https://endjin.com/rss.xml#which-adr-templates-are-available-out-of-the-box">templates</a> you can choose from, or you can <a href="https://endjin.com/rss.xml#custom-adr-templates-and-adr-template-packages">create your own</a>. If you want to read some real ADRs, check out these <a href="https://endjin.com/rss.xml#example-adrs">examples</a> from our own OSS projects.</p>
<p>We find ADRs to be most effective when they are co-located with the code, in the same repo. We've worked on projects where "all documentation lives in Wiki / Confluence / SharePoint" because not all stakeholders have access to source control repos, but we find this approach to be high friction for all parties involved. This tool, <code>adr</code>, is designed to encapsulate our recommended practices.</p>
<h2 id="why-we-adopted-adrs">Why we adopted ADRs</h2>
<p>Several years ago we worked on a very complex project which required R&D, technical spikes, benchmarking, load-testing, performance tuning cycles, and further benchmarking in order to find the optimal solution. This process worked incredibly well and we delivered orders of magnitude performance improvements over the existing solution.</p>
<p>During the end-of-project retrospective we identified two sub-optimal outcomes; firstly we felt that while we had worked minor miracles in our technical solutions, the customer never seemed particularly impressed by the improvements. Secondly, the customer hired a new architect just as we finished delivering the solution, and as part of their onboarding process reviewed the solution and criticized almost every aspect with "I wouldn't have done it that way. At my last job we approached it like X and found it to be best".</p>
<p>We realized that the two issues were related. For the first problem, we concluded that we had failed to follow the most basic instruction you're given at school; "show your workings". We had hidden all the hard work, all the complexity, all of the hypothesis-testing experiments, and just presented the results <em>Fait Accompli</em>. The second problem had the same root cause. Because we had not recorded all of our experiments in a systematic way, we had no evidence to show that the approach the architect considered "best" was actually the first approach we took, but when we benchmarked and load-tested the approach it couldn't handle the data throughput at the price-point required by the customer. "Best" is entirely based on situational context. What's "best" in one situation is inappropriate in another.</p>
<p>We embrace evidence-based-decision-making as part of our experimental approach, and wanted to find a process that would allow us to document this in a formalized way. We did some research and discovered Architectural Decision Records. They have now become a fundamental part of our software and data engineering processes.</p>
<p>As a fully-remote organization, a secondary benefit from adopting ADRs has been how it allows us to enable distributed and asynchronous evidence gathering, discussions, decision making, and onboarding. This benefit manifests in a number of different ways; firstly, the process of drafting and evolving an ADR as a working group. Secondly, once the ADR reaches its "proposed status" it's very easy for senior decision makers to quickly grok the summary of the decision and provide input. Thirdly, any new contributor can get up to speed by using the collection of ADRs, AKA an Architecture Decision Log (ADL), to understand all the historical decisions that have been made, and most importantly what the situational context was at the point the decisions were made.</p>
<p><a href="https://endjin.com/who-we-are/our-people/james-broome/">James Broome</a> wrote a very nice <a href="https://endjin.com/blog/2023/07/architecture-decision-records">introduction to Architectural Decision Records</a>, which contains some useful tips based on our real-world experience.</p>
<h2 id="why-create-another-adr-tool">Why create another ADR tool?</h2>
<p>One of the reasons for "re-inventing the wheel" with <code>adr</code> when there are so many ADR tools already in existence, is that almost all of those existing tools are opinionated to the point of embedding the ADR templates into the tooling.</p>
<p><img alt="adr running in Windows Terminal" src="https://res.cloudinary.com/endjin/image/upload/f_auto/q_80/assets/images/blog/2024/03/dotnet-adr-cli.jpg" /><em>adr running in Windows Terminal</em></p>
<p>Since we adopted ADRs in 2018, we've changed our default template a number of times (we've currently settled on MADR). Thus, with <code>adr</code> we wanted to decouple the tool from the templates, and make use of NuGet content packages as a mechanism to enable the ecosystem to build / use / share their own templates internally (using Azure DevOps or GitHub private package feeds), or publicly using <a href="https://www.nuget.org/packages?q=Tags%3A%22dotnet-adr%22">nuget.org</a>.</p>
<h2 id="getting-started">Getting Started</h2>
<p>To install the <code>adr</code> global tool use the following command:</p>
<p><code>dotnet tool install -g adr</code></p>
<p>If you have previously installed <code>adr</code> and want to update to the latest version, use the following command:</p>
<p><code>dotnet tool update -g adr</code></p>
<p><code>adr templates package set <PACKAGE ID></code> - Sets the default NuGet ADR Template Package. Use <code>adr.templates</code>.</p>
<p><code>adr templates package install</code> - Installs the latest version of the currently set ADR Templates Package.</p>
<p><code>adr templates set <TEMPLATE ID></code> - Sets the default ADR Template. The <code><TEMPLATE ID></code> can be obtained from <code>adr templates show</code></p>
<h2 id="using-adr">Using adr</h2>
<p><code>adr new <TITLE></code> - Creates a new Architectural Decision Record, from the current default ADR Template, from the current ADR Template package.</p>
<p><code>adr new <TITLE> -i <RECORD NUMBER></code> - Creates a new Architectural Decision Record, superseding the specified ADR record, which will have its status updated to reflect to point to this newly created ADR.</p>
<p><code>adr new <TITLE> -p <PATH></code> - Creates a new Architectural Decision Record, from the current default ADR Template, from the current ADR Template package, for the Architecture Knowledge Management (AKM) folder located at the specified path.</p>
<p><code>adr new <TITLE> -i <RECORD NUMBER> -p <PATH></code> - Creates a new Architectural Decision Record, for the Architecture Knowledge Management (AKM) folder located at the specified path, superseding the specified ADR record, which will have its status updated to reflect to point to this newly created ADR.</p>
<h3 id="configure-the-default-adr-location-in-your-repo">Configure the default ADR location in your repo</h3>
<p>While <code>adr</code> is quite flexible in allowing you to specify were to create or update an ADR, either in the current directory, or by specifying a custom path using <code>adr new <TITLE> -p <PATH></code>, sometime it's better to create a "pit of quality" and standardize the Architecture Knowledge Management (AKM) folder location for all users of the tool.</p>
<p>To support this requirement you can create a file in the root of your repo called <code>adr.config.json</code> which must have the following format:</p>
<pre><code class="language-json">{
"path": "./Docs/Adr"
}
</code></pre>
<p>Where the value of <code>path</code> is relative to the root of the repo.</p>
<h2 id="adr-templates-and-adr-template-packages">ADR Templates and ADR Template Packages</h2>
<h3 id="example-adrs">Example ADRs</h3>
<p>It's always hard to write a document starting from scratch; this is why the default ADR templates contain guidance in the form of headings and notes. Real-world examples are always much more helpful, so below is a list of some publicly available ADRs from our <a href="https://endjin.com/what-we-do/open-source/">Open Source projects</a>. If you explore the repos, you can find more examples:</p>
<ul>
<li><a href="https://github.com/dotnet/reactive/blob/main/Rx.NET/Documentation/adr/0001-net7.0-era-tooling-update.md">Updating Rx.NET Build for .NET 7.0 era Tooling</a></li>
<li><a href="https://github.com/marain-dotnet/Marain.Claims/blob/main/Documentation/ADRs/0001-client-side-claims-evaluation.md">Implementation of client-side Claims Evaluation</a></li>
<li><a href="https://github.com/corvus-dotnet/Corvus.Tenancy/blob/main/docs/adr/0003-no-automatic-storage-container-creation.md">Corvus.Tenancy will not create storage containers automatically</a></li>
<li><a href="https://github.com/menes-dotnet/Menes/blob/main/docs/adr/0002-multitargeting-.net-standard-2.0-and-2.1.md">Multitargeting .NET Standard 2.0 and 2.1</a></li>
<li><a href="https://github.com/marain-dotnet/Marain.Workflow/blob/master/docs/adr/0001-integration-of-event-store.md">Integration of an Event Store for audit and "change feed" purposes</a></li>
</ul>
<h3 id="which-adr-templates-are-available-out-of-the-box">Which ADR templates are available out of the box?</h3>
<p>We have collected a number of popular ADR templates and packaged them into the default template package.</p>
<div class="aside"><p>NOTE: the status of the Open Source License for some of the templates is unclear. See each template for more details.</p>
</div>
<h4 id="alexandrian-pattern">Alexandrian Pattern</h4>
<p>ADR using the Alexandrian <a href="https://en.wikipedia.org/wiki/Pattern_language">Pattern Language Approach</a> coined by Architect Christopher Alexander et. al in 1977, which distils the decision record into the following headings:</p>
<ul>
<li>Prologue (Summary)</li>
<li>Discussion (Context)</li>
<li>Solution (Decision)</li>
<li>Consequences (Results)</li>
</ul>
<p>Source <a href="https://github.com/joelparkerhenderson/architecture-decision-record/">Joel Parker Henderson</a>, see this <a href="https://github.com/joelparkerhenderson/architecture-decision-record/issues/30">issue about licensing</a>.</p>
<p>Set as the default template using <code>adr templates set alexandrian</code></p>
<h4 id="business-case-pattern">Business Case Pattern</h4>
<p>Emphasizes creating a business case for a decision, including criteria, candidates, and costs, <a href="https://github.com/joelparkerhenderson/architecture-decision-record/blob/main/templates/decision-record-template-for-business-case/index.md">created by Joel Parker Henderson</a>, which distils the decision record into the following headings:</p>
<ul>
<li>Title</li>
<li>Status</li>
<li>Evaluation criteria</li>
<li>Candidates to consider</li>
<li>Research and analysis of each candidate
<ul>
<li>Does/doesn't meet criteria and why</li>
<li>Cost analysis</li>
<li>SWOT analysis</li>
<li>Opinions and feedback</li>
</ul>
</li>
<li>Recommendation</li>
</ul>
<p>Source <a href="https://github.com/joelparkerhenderson/architecture-decision-record/">Joel Parker Henderson</a>, see this <a href="https://github.com/joelparkerhenderson/architecture-decision-record/issues/30">issue about licensing</a>.</p>
<p>Set as the default template using <code>adr templates set business-case</code></p>
<h4 id="markdown-architectural-decision-records-madr">Markdown Architectural Decision Records (MADR)</h4>
<p>Architectural Decisions using Markdown and Architectural Decision Records, by <a href="https://adr.github.io/madr/">Oliver Kopp</a>, which distils the decision record into the following headings:</p>
<ul>
<li>Title</li>
<li>Status</li>
<li>Context and Problem Statement</li>
<li>Decision Drivers</li>
<li>Considered Options</li>
<li>Decision Outcome
<ul>
<li>Positive Consequences</li>
<li>Negative Consequences</li>
</ul>
</li>
<li>Pros and Cons of the Options
<ul>
<li>[option 1]</li>
<li>[option 2]</li>
<li>[option 3]</li>
</ul>
</li>
<li>Links</li>
</ul>
<p><a href="https://adr.github.io/madr/">Available</a> as dual-license under <a href="https://opensource.org/licenses/MIT">MIT</a> and <a href="https://creativecommons.org/share-your-work/public-domain/cc0/">CC0</a>. You can choose between one of them if you use this work.</p>
<p>Set as the default template using <code>adr templates set madr</code></p>
<h4 id="merson-pattern">Merson Pattern</h4>
<p>An adaptation of the <a href="https://endjin.com/rss.xml#nygard-pattern">Nygard pattern</a>, by <a href="https://github.com/pmerson/ADR-template">Paulo Merson</a> which adds the rationale behind the decision. It distils the decision record into the following headings:</p>
<ul>
<li>Title</li>
<li>Status</li>
<li>Decision</li>
<li>Rationale</li>
<li>Consequences</li>
</ul>
<p><a href="https://github.com/pmerson/ADR-template">Available</a> under the <a href="https://github.com/pmerson/ADR-template/blob/master/LICENSE">MIT License</a>.</p>
<p>Set as the default template using <code>adr templates set merson</code></p>
<h4 id="nygard-pattern">Nygard Pattern</h4>
<p>A simple, low-friction "Agile" ADR approach by <a href="http://thinkrelevance.com/blog/2011/11/15/documenting-architecture-decisions">Michael Nygard</a>, which distils the decision record into the following headings:</p>
<ul>
<li>Title</li>
<li>Status</li>
<li>Context</li>
<li>Decision</li>
<li>Consequences</li>
</ul>
<p><a href="https://cognitect.com/blog/2011/11/15/documenting-architecture-decisions">Available</a> under <a href="https://creativecommons.org/publicdomain/zero/1.0/">CC0 1.0 Universal (CC0 1.0) Public Domain Dedication</a>.</p>
<p>Set as the default template using <code>adr templates set nygard</code></p>
<h4 id="planguage-pattern">Planguage Pattern</h4>
<p>A Quality Assurance oriented approach by <a href="http://www.iaria.org/conferences2012/filesICCGI12/Tutorial%20Specifying%20Effective%20Non-func.pdf">John Terzakis</a>, which distils the decision record into the following headings:</p>
<ul>
<li>Title</li>
<li>Status</li>
<li>Tag</li>
<li>Gist</li>
<li>Requirement</li>
<li>Rationale</li>
<li>Priority</li>
<li>Stakeholders</li>
<li>Owner</li>
<li>Author</li>
<li>Revision</li>
<li>Date</li>
<li>Assumptions</li>
<li>Risks</li>
<li>Defined</li>
</ul>
<p>Source <a href="https://github.com/joelparkerhenderson/architecture-decision-record/">Joel Parker Henderson</a>, see this <a href="https://github.com/joelparkerhenderson/architecture-decision-record/issues/30">issue about licensing</a>.</p>
<p>Set as the default template using <code>adr templates set planguage</code></p>
<h4 id="tyree-and-akerman-pattern">Tyree and Akerman Pattern</h4>
<p>ADR approach by <a href="https://personal.utdallas.edu/%7Echung/SA/zz-Impreso-architecture_decisions-tyree-05.pdf">Jeff Tyree and Art Akerman</a>, Capital One Financial, which distils the decision record into the following headings:</p>
<ul>
<li>Title</li>
<li>Status</li>
<li>Issue</li>
<li>Decision</li>
<li>Group</li>
<li>Assumptions</li>
<li>Constraints</li>
<li>Positions</li>
<li>Argument</li>
<li>Implications</li>
<li>Related decisions</li>
<li>Related requirements</li>
<li>Related artifacts</li>
<li>Related principles</li>
<li>Notes</li>
</ul>
<p>Source <a href="https://github.com/joelparkerhenderson/architecture-decision-record/">Joel Parker Henderson</a>, see this <a href="https://github.com/joelparkerhenderson/architecture-decision-record/issues/30">issue about licensing</a>.</p>
<p>Set as the default template using <code>adr templates set tyree-ackerman</code></p>
<h2 id="custom-adr-templates-and-adr-template-packages">Custom ADR Templates and ADR Template Packages</h2>
<p>You can create your own custom ADR Templates and Template packages, so that you can tailor them to your, your team's or your organisation's needs. For more information see the <a href="https://github.com/endjin/dotnet-adr?tab=readme-ov-file#custom-adr-templates-and-adr-template-packages">Custom ADR Templates and ADR Template Packages</a> section of the <code>dotnet-adr</code> repo readme.</p>
<p>There is an example for adding your own <a href="https://github.com/endjin/dotnet-adr/tree/main/Solutions/ThirdParty.Adr.Templates">3rd Party template</a>. If you do create your own NuGet template package please add <code>dotnet-adr</code> to the <code>PackageTags</code> element, so make it discoverable.</p>
<p>If you don't want to create a NuGet package, you can store the template file file inside the repository, and specify the TemplatePath in the <code>adr.config.json</code> file.</p>
<pre><code class="language-json">{
"templatePath": "./Docs/adr-template.md"
}
</code></pre>
<h2 id="conclusion">Conclusion</h2>
<p>If you want to make a small change to your team processes that can have a massive positive impact, we wholeheartedly recommend you adopt ADRs. Make Future You Thank Past You.</p>From Request to Response: How APIs Work – Beginners Guide2024-03-28T09:04:20.511000ZAbhijit Janahttps://dailydotnettips.com/from-request-to-response-how-apis-work-beginners-guide/<table style="border: 1px solid #E0E0E0; margin: 0; padding: 0; background-color: #F0F0F0" valign="top" align="left" cellpadding="0" width="100%">
<tr>
<td rowspan="2" style="padding: 6px;width: 36px;white-space:nowrap" width="36" valign="top"><img src="https://www.gravatar.com/avatar/19ac6a9d902c1d6ae33f41405e47b385" style="width: 36px; height: 36px; border-radius: 4px;"></td>
<td width="100%" style="padding-top: 6px;">
<b>
alvinashcraft
<a href="https://alvinashcraft.newsblur.com/story/from-request-to-resp/1788206:327033">shared this story</a>
from <img src="https://s3.amazonaws.com/icons.newsblur.com/1788206.png" style="vertical-align: middle;width:16px;height:16px;"> Daily .NET Tips.</b>
</td>
</tr>
</table>
<hr style="clear: both; margin: 0 0 24px;">
<p>In the vast expanse of the digital ecosystem, APIs (Application Programming Interfaces) act as critical conduits, facilitating seamless conversations between…</p>
<p>The post <a href="https://dailydotnettips.com/from-request-to-response-how-apis-work-beginners-guide/">From Request to Response: How APIs Work – Beginners Guide</a> appeared first on <a href="https://dailydotnettips.com">Daily .NET Tips</a>.</p>Beyond the Basics: Best Practices for UI Handling in .NET MAUI2024-03-28T09:03:59.986000ZLeomaris Reyeshttps://www.telerik.com/blogs/beyond-basics-best-practices-ui-handling-net-maui<table style="border: 1px solid #E0E0E0; margin: 0; padding: 0; background-color: #F0F0F0" valign="top" align="left" cellpadding="0" width="100%">
<tr>
<td rowspan="2" style="padding: 6px;width: 36px;white-space:nowrap" width="36" valign="top"><img src="https://www.gravatar.com/avatar/19ac6a9d902c1d6ae33f41405e47b385" style="width: 36px; height: 36px; border-radius: 4px;"></td>
<td width="100%" style="padding-top: 6px;">
<b>
alvinashcraft
<a href="https://alvinashcraft.newsblur.com/story/beyond-the-basics-be/524584:b411cf">shared this story</a>
from <img src="https://s3.amazonaws.com/icons.newsblur.com/524584.png" style="vertical-align: middle;width:16px;height:16px;"> Telerik Blogs.</b>
</td>
</tr>
</table>
<hr style="clear: both; margin: 0 0 24px;">
<p><span class="featured">Making the move from Xamarin Forms to .NET MAUI? These tips are for you! </span></p><p> Hello there! Are you ready to learn some exciting tips for best practices in .NET MAUI? Whether you’re experienced with developing applications using Xamarin Forms or just starting out in .NET MAUI, the following content will be useful to you.</p><p>In this article, I’ll provide you with tips to improve your .NET MAUI app development practices. These insights are based on updates from the official documentation, which includes interesting improvements. The goal is for our apps to maintain their quality while enhancing performance and simplifying our work as developers. ️ I’m here to share tips that will keep you ahead in the .NET MAUI field. Ready to explore? </p><h2 id="want-to-add-a-border-dont-use-frame—use-border">1. Want to Add a Border? Don’t Use Frame—Use Border</h2><p><img alt="Unhappy scenarie using frame: Frame CornerRadius=" background="Red" src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2024/2024-03/tip_one_border_vs_frame.png?sfvrsn=9418b262_2" /></p><p>In Xamarin Forms, the Frame is mainly used to add borders. However, in .NET MAUI, a new control named Border has been introduced specifically for this purpose.</p><p><strong>So, when is it appropriate to use Border, and when should you use Frame?</strong> The official documentation indicates that Frame is maintained for users transitioning their applications from Xamarin.Forms to .NET MAUI. For new developments, it’s recommended to use the Border control.</p><p>Here are a few reasons why I prefer using <strong>Border</strong> over Frame:</p><ul><li><strong>Flexibility in rounding:</strong> If you want to set a value to round each edge separately, you have the ability to do so.</li><li><strong>Freedom in the border shape:</strong> You have control over the edge’s shape. For example, you can use shapes like RoundRectangle (as shown in the explanatory image), or experiment with others such as Polyline, among other <a href="https://learn.microsoft.com/en-us/dotnet/maui/user-interface/controls/border?view=net-maui-8.0#define-the-border-shape-with-a-string" target="_blank">shapes you can see here</a>.</li></ul><p>As shown in the main image of this tip, the Border is quite straightforward to use. To gain a more in-depth understanding of the Border, I recommend reading the article <a href="https://learn.microsoft.com/en-us/dotnet/maui/user-interface/controls/border?view=net-maui-8.0" target="_blank">Border in .NET MAUI</a>.</p><h2 id="use-horizontalverticalstacklayout-instead-of-stacklayout">2. Use Horizontal/VerticalStackLayout Instead of StackLayout</h2><p><img alt="Unhappy scenario uses StackLayout Orientation=" src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2024/2024-03/tip_two_horizontal_verticalstacklayout.png?sfvrsn=23ed6467_2" /></p><p>If you’re familiar with Xamarin Forms, then you already know how the StackLayout works. By default, the orientation is vertical, but you can set it to horizontal using the Orientation property. In .NET MAUI, the same concept applies to StackLayout.</p><p>In addition to the existing layout, there are new ones where you don’t need to use the Orientation property. You can directly use VerticalStackLayout or HorizontalStackLayout instead. Depending on your preferred orientation, I recommend considering one of these new layouts!</p><p>I encourage you to learn more about these layouts by reading the article <a href="https://www.telerik.com/blogs/exploring-layout-options-dotnet-maui" target="_blank">Exploring Layout Options in .NET MAUI</a>.</p><h2 id="avoid-using-andexpand-in-the-horizontalverticalstacklayout">3. Avoid Using AndExpand in the Horizontal/VerticalStackLayout</h2><p>In Xamarin Forms, we use expansion properties such as Horizontal/VerticalOptions. These properties define alignment preferences and contain a set of values, some of which end with the “AndExpand” suffix. For instance, we have <code class="inline-code">CenterAndExpand</code>, <code class="inline-code">Start</code> and <code class="inline-code">StartEndExpand</code>, among others.</p><p>However, in .NET MAUI, the “AndExpand” suffix no longer exists. It will only respond to values without the suffix, like <code class="inline-code">Center</code> or <code class="inline-code">Start</code>.</p><p><strong>What happens if you use a value with an “AndExpand” suffix? </strong> .NET MAUI simply ignores the suffix and considers the root word. For instance, if you write:</p><pre class=" language-xml"><code class="prism language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>VerticalStackLayout</span> <span class="token attr-name">HorizontalOptions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>CenterAndExpand<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
...
<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>VerticalStackLayout</span><span class="token punctuation">></span></span>
</code></pre><p>.NET MAUI will interpret it as <strong>Center</strong>.</p><h2 id="don’t-use-relativelayout">4. Don’t Use RelativeLayout</h2><p><img alt="Happy scenario uses Grid RowDefinitions=" src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2024/2024-03/tip_four_relativelayout.png?sfvrsn=764cc676_2" /></p><p><strong>If you’ve been using RelativeLayout in Xamarin Forms, prepare for a change.</strong> RelativeLayout does not exist in .NET MAUI. Say goodbye. </p><p>You might wonder what to do if you’re migrating your app from Xamarin Forms to .NET MAUI and you use RelativeLayout. Microsoft has provided a solution with a compatibility namespace that can be found in the Microsoft.Maui.Controls.Compatibility namespace. For more information, you can refer to the article <a href="https://www.telerik.com/blogs/xamarin-forms-dotnet-maui-how-layout-behavior-evolved" target="_blank">Xamarin.Forms to .NET MAUI: How Layout Behavior Has Evolved</a>.</p><p>However, I personally recommend refactoring your code as soon as you complete the migration. The Grid layout is an ideal replacement, achieving the same behavior as the RelativeLayout.</p><h2 id="desktop-apps-need-more-info-enhance-with-tooltips">5. Desktop Apps: Need More Info? Enhance with Tooltips</h2><p><img alt="Happy scenario: Entry ToolTipProperties.Text =" src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2024/2024-03/tip_five_tooltips.png?sfvrsn=86a18f4c_2" /></p><p>Consider a registration form that requires additional information. Typically, placeholders are used for this purpose. But what if more detailed information is needed? This is where tooltips come in handy. Tooltips allow you to add detailed information without affecting your UI design, as they only appear when the user directly interacts with the visual element (the Entry, for this example).</p><p>This is just one example. You can add tooltips to many other controls, not just entry! This is one of the new features of .NET MAUI that doesn’t exist in Xamarin Forms.</p><p>For more information about Tooltips, I invite you to read the article <a href="https://www.telerik.com/blogs/improving-desktop-applications-tooltips-dotnet-maui" target="_blank">Improving Your Desktop Applications With ToolTips in .NET MAUI</a>.</p><h2 id="using-the-same-hex-colors-in-various-places-add-them-to-color.xaml">6. Using the Same Hex Colors in Various Places? Add Them to Color.xaml</h2><p><img alt=" Unhappy Scenario: Label BackgroundColor=" src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2024/2024-03/tip_six_colorxaml.png?sfvrsn=386b674_2" /></p><p>Branding colors are an integral part of app development. Suppose your branding has three colors, and you need to use them across 10 pages. A common approach might be to simply repeat the same hexadecimal codes as needed on each screen. This works, but it can complicate the maintenance of our app and increase the risk of errors when changing a color. It also makes our app less scalable.</p><p>Creating a color palette in a single file is a more efficient method. This allows us to reference these colors with an alias in other files. If the branding colors change, we only need to update one file rather than the whole codebase. (In fact, the app’s default predefined colors are already set up this way).</p><p><strong>Here are the steps to accomplish this:</strong></p><p><strong>1. Identify the colors to use and navigate to Your Project ➡️ Resources ➡️ Styles ➡️ Colors.xaml.</strong></p><p>Add as many color lines as needed in the following format:</p><pre class=" language-xml"><code class="prism language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Color</span> <span class="token attr-name"><span class="token namespace">x:</span>Key</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>GrayPrimaryColor<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>#6E6E6E<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Color</span><span class="token punctuation">></span></span>
</code></pre><p>In this context, <code class="inline-code">GrayPrimaryColor</code> is the alias of the color, and <code class="inline-code">#6E6E6E</code> is its hexadecimal representation.</p><p><strong>2. Use the StaticResource to refer to the color.</strong></p><pre class=" language-xml"><code class="prism language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Label</span> <span class="token attr-name">BackgroundColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{StaticResource GrayPrimaryColor}<span class="token punctuation">"</span></span> <span class="token attr-name">Text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>..<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>
</code></pre><p>Future color updates will be much easier to implement!</p><h2 id="conclusion">Conclusion</h2><p>‍ And that’s all for today! I hope the tips in this article will help you uphold best practices in .NET MAUI. Remember, great code originates from small and intelligent modifications! ️ Thank you for taking the time to read! See you in the next article!</p><p>Happy coding! </p>Azure Static Web App - Bring your own API2024-03-28T09:03:50.876000ZBart Wullems (noreply@blogger.com)https://bartwullems.blogspot.com/2024/03/azure-static-web-app-bring-your-own-api.html<table style="border: 1px solid #E0E0E0; margin: 0; padding: 0; background-color: #F0F0F0" valign="top" align="left" cellpadding="0" width="100%">
<tr>
<td rowspan="2" style="padding: 6px;width: 36px;white-space:nowrap" width="36" valign="top"><img src="https://www.gravatar.com/avatar/19ac6a9d902c1d6ae33f41405e47b385" style="width: 36px; height: 36px; border-radius: 4px;"></td>
<td width="100%" style="padding-top: 6px;">
<b>
alvinashcraft
<a href="https://alvinashcraft.newsblur.com/story/azure-static-web-app/1359017:3ef320">shared this story</a>
from <img src="https://s3.amazonaws.com/icons.newsblur.com/1359017.png" style="vertical-align: middle;width:16px;height:16px;"> The art of simplicity.</b>
</td>
</tr>
</table>
<hr style="clear: both; margin: 0 0 24px;">
<p>As a follow-up on the presentation I did at <a href="https://bartwullems.blogspot.com/2023/12/cloudbrew-2023azure-static-web-apps.html">CloudBrew</a> about Azure Static Web Apps I want to write a series of blog posts.</p> <ul> <li><a href="https://bartwullems.blogspot.com/2023/12/azure-static-web-apps-vs-code-extension.html">Part I - Using the VS Code Extension</a></li> <li><a href="https://bartwullems.blogspot.com/2023/12/azure-static-web-apps-using-astro.html">Part II - Using the Astro Static Site Generator</a></li> <li><a href="https://bartwullems.blogspot.com/2023/12/azure-static-web-appdeploying-to.html">Part III – Deploying to multiple environments</a></li> <li><a href="https://bartwullems.blogspot.com/2023/12/azure-static-web-apppassword-protect.html">Part IV – Password protect your environments</a></li> <li><a href="https://bartwullems.blogspot.com/2023/12/azure-static-web-apptraffic-splitting.html">Part V – Traffic splitting</a></li> <li><a href="https://bartwullems.blogspot.com/2024/01/azure-static-web-app-authentication.html">Part VI – Authentication using pre-configured providers</a></li> <li><a href="https://bartwullems.blogspot.com/2024/01/azure-static-web-app-application.html">Part VII – Application configuration using staticwebapp.config.json</a></li> <li><a href="https://bartwullems.blogspot.com/2024/01/azure-static-web-appapi-configuration.html">Part VIII – API Configuration</a></li> <li><a href="https://bartwullems.blogspot.com/2024/01/azure-static-web-appinject-snippets.html">Part IX – Injecting snippets</a></li> <li><a href="https://bartwullems.blogspot.com/2024/02/azure-static-web-appcustom.html">Part X – Custom authentication</a></li> <li><a href="https://bartwullems.blogspot.com/2024/02/azure-static-web-appauthorization.html">Part XI – Authorization</a></li> <li><a href="https://bartwullems.blogspot.com/2024/03/azure-static-web-appassign-roles.html">Part XII - Assign roles through an Azure function</a></li> <li><a href="https://bartwullems.blogspot.com/2024/03/azure-static-web-app-api-integration.html">Part XIII - API integration</a></li> <li>Part XIV(this post) – Bring your own API </li> </ul> <p>In the last post in this series, I explained that with every Static Web App you get a serverless API endpoint (based on Azure Functions) for free. However you have also the option to bring your own API. This can be an Azure Function but also an API exposed through Azure API Management, an Azure App Service or Azure Container Apps.</p> <p>The advantage of using this feature is that you get:</p> <ul> <li> <p><strong>Integrated security</strong> with direct access to user <a href="https://learn.microsoft.com/en-us/azure/static-web-apps/user-information">authentication and role-based authorization</a> data.</p> </li> <li> <p><strong>Seamless routing</strong> that makes the <code>/api</code> route available to the front-end web app without requiring custom CORS rules.</p> </li> </ul> <p>In this post I’ll show you how to do this and I’ll use Azure Container Apps to demonstrate it.</p> <h1>The Azure Container App</h1> <p>I already created the Azure Container App(ACA) in Visual Studio and deployed it to Azure. Most important is that the ACA exposes an API listening on the <code>/api</code> endpoint.</p> <p>As I mentioned I deployed the ACA. I didn’t add any authentication or authorization so right now anyone can call this api.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtz4ma_wC-tSEuY2Bl8A1q3PHq5yxQPmv9-J68W7iKyWVQcdRYD_nrWJoiWgFobhUgPf9Lh_Zh9431hS29z5s4kVuvgiw8QkC3RdvQFf4mEf30cIBPQqRoSJ61nikoABgyWQqTnMNsOM6Ei9mkoR0Fvr11A_w7Pzb2zTFjZ176XtVfXt5AGVG9iLLpB2m1/s1606/API1.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtz4ma_wC-tSEuY2Bl8A1q3PHq5yxQPmv9-J68W7iKyWVQcdRYD_nrWJoiWgFobhUgPf9Lh_Zh9431hS29z5s4kVuvgiw8QkC3RdvQFf4mEf30cIBPQqRoSJ61nikoABgyWQqTnMNsOM6Ei9mkoR0Fvr11A_w7Pzb2zTFjZ176XtVfXt5AGVG9iLLpB2m1/s16000/API1.png" /></a></div> <h1>Linking our API</h1> <p>Next step is to link the API to our Azure Static Web App. Therefore we go to our Static Web App in the Azure Portal and click on the APIs section:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOqoark2hJczfScVaBb3DB6XGIn0XS7D5sceo8P1PiJUtvHYVYC2koA_rE1ANtDzc-2iyqE3_TY0SI1q00uOVRtAtPx2s-ayP2rus6xFpU-wgmacjXBVegzKIwqetZvwFR4hObb180-gOcV5qxZ94POEbo5eOjRvASbUkBtrom15o42Ku3Wxs-hMlfL8qf/s534/API2.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOqoark2hJczfScVaBb3DB6XGIn0XS7D5sceo8P1PiJUtvHYVYC2koA_rE1ANtDzc-2iyqE3_TY0SI1q00uOVRtAtPx2s-ayP2rus6xFpU-wgmacjXBVegzKIwqetZvwFR4hObb180-gOcV5qxZ94POEbo5eOjRvASbUkBtrom15o42Ku3Wxs-hMlfL8qf/s16000/API2.png" /></a></div><p></p> <p>To link an API we need to click on the <strong>Link</strong> hyperlink next to the environment.</p> <p><strong>Remark:</strong> The link option will only be available when Azure Static Web App has detected that no existing Managed Function is found inside your source repository.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifMGrOMT6b5wJsPW2pAhJbm1EXMjGSbEBrNZ4TMv02zlJ3BvOOz2gSn4lJ2A3IqqScFit6jHJcbiicsipG5kXn3oEn-pI2ts5IBtTrY_CkHAzWjff4zZBHgP_PEjDQ1lKsTaRDrVLMqZQU5PEWzzq-Esw8Df5WpNqNPSaSnxhCMxkHIf8LIJEz58ZldPj7/s2468/API3.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifMGrOMT6b5wJsPW2pAhJbm1EXMjGSbEBrNZ4TMv02zlJ3BvOOz2gSn4lJ2A3IqqScFit6jHJcbiicsipG5kXn3oEn-pI2ts5IBtTrY_CkHAzWjff4zZBHgP_PEjDQ1lKsTaRDrVLMqZQU5PEWzzq-Esw8Df5WpNqNPSaSnxhCMxkHIf8LIJEz58ZldPj7/s16000/API3.png" /></a></div><p></p> <p>On the Link new Backend screen, we can select a Resource Type and select the Resource itself. Click on Link to complete the process.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTkYA7aRDXgfIdhNXDjcqyEREwFOpSLSraQ0JJhbBV4lyXFJtWhcj3AlT3W593nxBd_JZHumpN8rXJSAdgMWpOECqY5Ec7OayE-BcGgt7hGnrj6Qle0jUw-IJ1Fw5uWVqIEKTKnHPVQKeYs8QlYYfXbxcDqce8fTNGBSkTLcxYNbxbk8aMxYF9Q217fGuE/s1808/API4.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTkYA7aRDXgfIdhNXDjcqyEREwFOpSLSraQ0JJhbBV4lyXFJtWhcj3AlT3W593nxBd_JZHumpN8rXJSAdgMWpOECqY5Ec7OayE-BcGgt7hGnrj6Qle0jUw-IJ1Fw5uWVqIEKTKnHPVQKeYs8QlYYfXbxcDqce8fTNGBSkTLcxYNbxbk8aMxYF9Q217fGuE/s16000/API4.png" /></a></div><p></p><p>You can see that the 'withoutapi' environment is now linked to our Azure Container App:<br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjM_y1lbXHUMD02LTTYnUChXcdz_nec-TJwOFdr0nRDB7kPufx-9KN94Autch-0pbUu1XE1AAHXMe1CJTcuhAGMsD2sapXX3BWKIN3c1M9ZXN5chBUvh9mqUPL3FANtRQM6eB-WP47er83DbmbWIqIggIltuO_xB5Qw7JearDh2RU3jt-hX7P9lNUtAKlOF/s2516/API5.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjM_y1lbXHUMD02LTTYnUChXcdz_nec-TJwOFdr0nRDB7kPufx-9KN94Autch-0pbUu1XE1AAHXMe1CJTcuhAGMsD2sapXX3BWKIN3c1M9ZXN5chBUvh9mqUPL3FANtRQM6eB-WP47er83DbmbWIqIggIltuO_xB5Qw7JearDh2RU3jt-hX7P9lNUtAKlOF/s16000/API5.png" /></a></div><p></p> <p>Now our ACA API is no longer directly accessible but can only be called through our Azure Static Web App. </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnoXJyyR2dwMLmNY_wxsSAU2BpitHCPKCUsr3JglLm60ZuB-rwVhC9e7uFQHxXyhMwFXSyHy4IrqhbTaUatrmuDDcwE8mobkTL8xoWZ0FpbsEOI0awenY3DDsKSPwFIlHB5lM_NmgfcJXO_VgO-csESb9xM4wjCHEXKfU1iqVaa0BNGTAeyDecZdiQFHQm/s1656/API7.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnoXJyyR2dwMLmNY_wxsSAU2BpitHCPKCUsr3JglLm60ZuB-rwVhC9e7uFQHxXyhMwFXSyHy4IrqhbTaUatrmuDDcwE8mobkTL8xoWZ0FpbsEOI0awenY3DDsKSPwFIlHB5lM_NmgfcJXO_VgO-csESb9xM4wjCHEXKfU1iqVaa0BNGTAeyDecZdiQFHQm/s16000/API7.png" /></a></div><p></p><p>If you go to the ACA resource in the Azure Portal, you can see that an Azure Static Web App is used as the Identity Provider.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJfrVGuAEQ4cM4L5z_-3PcDfGkF64qfyZAAthqy9OHV6euMziVz2y2Mn-6USPNE5kZuN_2hFMXlU-8dHyQ_PtPEtu9zza5uvUe8tkz6HmTBwCOjp0lBAUqk15iSy9DvYesUDxjpK3LMQQoQURKAdtglwb1RyVB0PRIj4sO3TP4mN79ubdTlLQ5xxUulzGy/s2530/API6.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJfrVGuAEQ4cM4L5z_-3PcDfGkF64qfyZAAthqy9OHV6euMziVz2y2Mn-6USPNE5kZuN_2hFMXlU-8dHyQ_PtPEtu9zza5uvUe8tkz6HmTBwCOjp0lBAUqk15iSy9DvYesUDxjpK3LMQQoQURKAdtglwb1RyVB0PRIj4sO3TP4mN79ubdTlLQ5xxUulzGy/s16000/API6.png" /></a></div><p></p> <h1>Calling the API</h1> <p>To call our API we first need to make sure that a corresponding route is configured in our <code>staticwebapp.config.json</code> file:</p> <p>Once that is done, we can invoke the API through our frontend code:</p> <h1>More information</h1> <p><a href="https://learn.microsoft.com/en-us/azure/static-web-apps/apis-overview">Overview of API support in Azure Static Web Apps | Microsoft Learn</a></p> <p><a href="https://learn.microsoft.com/en-us/azure/static-web-apps/functions-bring-your-own">Bring your own functions to Azure Static Web Apps | Microsoft Learn</a></p> <p><font style="background-color: yellow;"> </font></p>Drop Index, Recreate and Script out Indexes in SQL Server2024-03-28T09:03:38.193000Zhttps://www.mssqltips.com/sqlservertip/7957/drop-index-sql-server-examples/<table style="border: 1px solid #E0E0E0; margin: 0; padding: 0; background-color: #F0F0F0" valign="top" align="left" cellpadding="0" width="100%">
<tr>
<td rowspan="2" style="padding: 6px;width: 36px;white-space:nowrap" width="36" valign="top"><img src="https://www.gravatar.com/avatar/19ac6a9d902c1d6ae33f41405e47b385" style="width: 36px; height: 36px; border-radius: 4px;"></td>
<td width="100%" style="padding-top: 6px;">
<b>
alvinashcraft
<a href="https://alvinashcraft.newsblur.com/story/drop-index-recreate-/19247:e8a897">shared this story</a>
from <img src="https://s3.amazonaws.com/icons.newsblur.com/19247.png" style="vertical-align: middle;width:16px;height:16px;"> MSSQLTips - Latest SQL Server Tips.</b>
</td>
</tr>
</table>
<hr style="clear: both; margin: 0 0 24px;">
In this article, learn how to drop or disable a SQL Server index that is no longer needed. Also, learn how to recreate and script out indexes.<br><br><img src="https://www.mssqltips.com/images_newsletter/7957_NewsletterImage.png" />The Morning Brew #39122024-03-28T09:03:22.253000ZChris Alcockhttps://blog.cwa.me.uk/2024/03/28/the-morning-brew-3912/<table style="border: 1px solid #E0E0E0; margin: 0; padding: 0; background-color: #F0F0F0" valign="top" align="left" cellpadding="0" width="100%">
<tr>
<td rowspan="2" style="padding: 6px;width: 36px;white-space:nowrap" width="36" valign="top"><img src="https://www.gravatar.com/avatar/19ac6a9d902c1d6ae33f41405e47b385" style="width: 36px; height: 36px; border-radius: 4px;"></td>
<td width="100%" style="padding-top: 6px;">
<b>
alvinashcraft
<a href="https://alvinashcraft.newsblur.com/story/the-morning-brew-391/13393:27b461">shared this story</a>
from <img src="https://s3.amazonaws.com/icons.newsblur.com/13393.png" style="vertical-align: middle;width:16px;height:16px;"> The Morning Brew.</b>
</td>
</tr>
</table>
<hr style="clear: both; margin: 0 0 24px;">
<p>Friday and Monday are public holidays here in England, so I’m going to take advantage of that and have an extended publication break for a week. The Brew will return on Monday 8th April.</p>
<h3 class="wp-block-heading">Information</h3>
<ul>
<li><a href="https://devblogs.microsoft.com/visualstudio/experimental-msbuild-editor/">A new MSBuild editing experience</a> – Mikayla Hutchinson</li>
<li><a href="https://techcommunity.microsoft.com/t5/apps-on-azure-blog/net-on-azure-functions-march-2024-roadmap-update/ba-p/4097744">.NET on Azure Functions – March 2024 roadmap update</a> – Matthew Henderson</li>
<li><a href="https://devblogs.microsoft.com/dotnet/dotnet-7-end-of-support/">.NET 7 will reach End of Support on May 14, 2024</a> – Rahul Bhandari</li>
<li><a href="https://devblogs.microsoft.com/dotnet/dotnet-framework-march-2024-cumulative-update-preview/">.NET Framework – March 2024 Cumulative Update Preview</a> – Salini Agarwal</li>
<li><a href="https://bartwullems.blogspot.com/2024/03/microsoftextensionsdependencyinjectionr.html">Microsoft.Extensions.DependencyInjection–Register a type with all its interfaces</a> – Bart Wullems</li>
<li><a href="https://weblog.west-wind.com/posts/2024/Mar/26/Html-to-PDF-Generation-using-the-WebView2-Control">Programmatic Html to PDF Generation using the WebView2 Control</a> – Rick Strahl</li>
<li><a href="https://techcommunity.microsoft.com/t5/azure-networking-blog/improve-dns-security-by-using-domain-name-label-scope/ba-p/4093371">Improve DNS security by using Domain Name Label Scope</a> – Brian Lehr</li>
<li><a href="https://ayende.com/blog/200897-A/certificates-from-the-ground-up?Key=9e98e4bd-d871-4bc1-92f0-5bdd5995f30f">Certificates from the Ground Up</a> – Oren Eini</li>
<li><a href="https://devblogs.microsoft.com/oldnewthing/20240327-00/?p=109580">Some choices for encrypting data so that it can be decrypted only by the same user or computer</a> – Raymond Chen</li>
<li><a href="https://www.telerik.com/blogs/ux-crash-course-information-architecture">UX Crash Course: Information Architecture</a> – Kathryn Grayson Nanz</li>
<li><a href="https://textslashplain.com/2024/03/27/attacker-techniques-gesture-jacking/">Attacker Techniques: Gesture Jacking</a> – Eric Lawrence</li>
</ul>Daily Reading List – March 27, 2024 (#285)2024-03-28T01:58:06.323000ZRichard Seroterhttps://seroter.com/2024/03/27/daily-reading-list-march-27-2024-285/<table style="border: 1px solid #E0E0E0; margin: 0; padding: 0; background-color: #F0F0F0" valign="top" align="left" cellpadding="0" width="100%">
<tr>
<td rowspan="2" style="padding: 6px;width: 36px;white-space:nowrap" width="36" valign="top"><img src="https://www.gravatar.com/avatar/19ac6a9d902c1d6ae33f41405e47b385" style="width: 36px; height: 36px; border-radius: 4px;"></td>
<td width="100%" style="padding-top: 6px;">
<b>
alvinashcraft
<a href="https://alvinashcraft.newsblur.com/story/daily-reading-list-m/56004:2b4861">shared this story</a>
from <img src="https://s3.amazonaws.com/icons.newsblur.com/56004.png" style="vertical-align: middle;width:16px;height:16px;"> Richard Seroter's Architecture Musings.</b>
</td>
</tr>
</table>
<hr style="clear: both; margin: 0 0 24px;">
<p>Up to Sunnyvale again today, this time for a Cloud Next ’24 rehearsal session tomorrow. Just a couple weeks until the event. We’ve got a <a href="https://cloud.withgoogle.com/next">couple tickets left to purchase</a>, so get on that!</p>
<p>[blog] <strong><a href="https://draft.dev/learn/12-documentation-examples-every-developer-tool-can-learn-from">12 Documentation Examples Every Developer Tool Can Learn From</a></strong>. I’m learning how tricky it is to get documentation “right.” There are so many different audiences, learning goals, and ways to explain a product. This post looks at who does docs well.</p>
<p>[blog] <strong><a href="https://blog.google/technology/safety-security/a-review-of-zero-day-in-the-wild-exploits-in-2023/">A review of zero-day in-the-wild exploits in 2023</a></strong>. This summarizes and links to a free paper that explains how attacks are shifting, and how you can better protect yourself. <a href="https://cloud.google.com/blog/topics/threat-intelligence/2023-zero-day-trends/?e=48754805">More here</a>.</p>
<p>[blog] <strong><a href="https://thenewstack.io/stack-exchange-expands-beyond-qa-format-with-discussions/">Stack Exchange Expands Beyond Q&A Format with ‘Discussions’</a></strong>. Important experiment for Stack Overflow, and it should help keep folks engaged on the site.</p>
<p>[blog] <strong><a href="https://doordash.engineering/2024/03/27/setting-up-kafka-multi-tenancy/">Setting Up Kafka Multi-Tenancy</a></strong>. Here’s how DoorDash does “testing in production” with a multi-tenant architecture that includes their messaging system.</p>
<p>[article] <strong><a href="https://www.infoworld.com/article/3714941/google-vertex-ai-studio-puts-the-promise-in-generative-ai.html">Google Vertex AI Studio puts the promise in generative AI</a></strong>. Here’s a thorough review of our AI app building platform and what’s included.</p>
<p>[blog] <strong><a href="https://www.databricks.com/blog/announcing-dbrx-new-standard-efficient-open-source-customizable-llms">Announcing DBRX: A new standard for efficient open source LLMs</a></strong>. Congrats to our friends at Databricks on delivering a new open model that looks like it has great performance. Some <a href="https://techcrunch.com/2024/03/27/databricks-spent-10m-on-a-generative-ai-model-that-still-cant-beat-gpt-4/">spicy media coverage here</a>.</p>
<p>[blog] <strong><a href="https://www.docker.com/blog/is-your-container-image-really-distroless/">Is Your Container Image Really Distroless?</a></strong> Are you using a distroless image, or wondering what that means? This Docker post explains.</p>
<p>[blog] <strong><a href="https://cloud.google.com/blog/products/identity-security/how-to-choose-a-known-trusted-supplier-for-open-source-software?e=48754805">How to choose a known, trusted supplier for open source software</a></strong>. Other hot trends have drowned out secure software supply chain as a topic, but it’s more important than ever.</p>
<p>##</p>
<p>Want to get this update sent to you every day? <a href="https://seroter.com/feed/" rel="noreferrer noopener" target="_blank">Subscribe to my RSS feed</a> or subscribe via email below:</p>
<div class="wp-block-jetpack-subscriptions__supports-newline wp-block-jetpack-subscriptions">
<div>
<div>
<div>
<p>
<a href="https://seroter.com/?post_type=post&p=16097" style="font-size: 16px; padding: 15px 23px 15px 23px; margin: 0px; margin-left: 10px; border-radius: 0px; border-width: 1px; background-color: #113AF5; color: #FFFFFF; text-decoration: none; white-space: nowrap; margin-left: 0;">Subscribe</a>
</p>
</div>
</div>
</div>
</div><br><br><img src="https://2.gravatar.com/avatar/2fab44e2f8decc2654cf4cb6b3bef813b072a16c7206880423c14d2e4be6f910?s=96&d=https%3A%2F%2F2.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" />How to Create Tables Using the React-Data-Table-Component Library in React & TypeScript2024-03-28T01:57:56.949000ZLosalini Rokocakauhttps://www.freecodecamp.org/news/create-tables-using-the-react-datatable-component-library/<table style="border: 1px solid #E0E0E0; margin: 0; padding: 0; background-color: #F0F0F0" valign="top" align="left" cellpadding="0" width="100%">
<tr>
<td rowspan="2" style="padding: 6px;width: 36px;white-space:nowrap" width="36" valign="top"><img src="https://www.gravatar.com/avatar/19ac6a9d902c1d6ae33f41405e47b385" style="width: 36px; height: 36px; border-radius: 4px;"></td>
<td width="100%" style="padding-top: 6px;">
<b>
alvinashcraft
<a href="https://alvinashcraft.newsblur.com/story/how-to-create-tables/6176133:dc26aa">shared this story</a>
from <img src="https://s3.amazonaws.com/icons.newsblur.com/6176133.png" style="vertical-align: middle;width:16px;height:16px;"> freeCodeCamp.org.</b>
</td>
</tr>
</table>
<hr style="clear: both; margin: 0 0 24px;">
In this tutorial, I'll teach you how to use the react-data-table-component library in your React projects. You'll learn how to render a table that has features such as pagination, searching/filtering, and sorting. I'll walk you through each step, from setting up a React and TypeScript project with Vite<br><br><img src="https://www.freecodecamp.org/news/content/images/2024/03/cover-image-21.png" />Game Bytes · March 20242024-03-28T01:16:57.496000ZLee Reillyhttps://github.blog/2024-03-27-game-bytes-march-2024/<table style="border: 1px solid #E0E0E0; margin: 0; padding: 0; background-color: #F0F0F0" valign="top" align="left" cellpadding="0" width="100%">
<tr>
<td rowspan="2" style="padding: 6px;width: 36px;white-space:nowrap" width="36" valign="top"><img src="https://www.gravatar.com/avatar/19ac6a9d902c1d6ae33f41405e47b385" style="width: 36px; height: 36px; border-radius: 4px;"></td>
<td width="100%" style="padding-top: 6px;">
<b>
alvinashcraft
<a href="https://alvinashcraft.newsblur.com/story/game-bytes-march-202/7893929:3631b6">shared this story</a>
from <img src="https://s3.amazonaws.com/icons.newsblur.com/7893929.png" style="vertical-align: middle;width:16px;height:16px;"> The GitHub Blog.</b>
</td>
</tr>
</table>
<hr style="clear: both; margin: 0 0 24px;">
<p>Game Bytes is our monthly series taking a peek at the world of gamedev on GitHub—featuring game engine updates, game jam details, open source games, mods, maps, and more. Game on!</p>
<h2 id="game-news">Game news<a class="heading-link pl-2 text-italic text-bold" href="https://github.blog/feed/#game-news"></a></h2>
<h3 id="wizard-simulator-keeperrl-hits-1-0">Wizard simulator KeeperRL hits 1.0<a class="heading-link pl-2 text-italic text-bold" href="https://github.blog/feed/#wizard-simulator-keeperrl-hits-1-0"></a></h3>
<div class="project-bar mt-0 mb-3">
<p><img alt="Screenshot od KeeperRL." class="aligncenter size-full wp-image-77055 width-fit" height="576" src="https://github.blog/wp-content/uploads/2024/03/keeperrl.jpeg?resize=1024%2C576" width="1024" /></p>
<div class="d-flex flex-row flex-wrap flex-items-center">
<div class="d-flex flex-row flex-items-center width-full width-md-auto mt-2">
<a class="btn-mktg btn-small-mktg d-block mr-2 width-full width-md-auto" href="https://keeperrl.com/" target="_blank">
<svg class="octicon d-inline-block mr-1" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M9.5 15.584V8.416a.5.5 0 01.77-.42l5.576 3.583a.5.5 0 010 .842l-5.576 3.584a.5.5 0 01-.77-.42z"></path><path d="M12 2.5a9.5 9.5 0 100 19 9.5 9.5 0 000-19zM1 12C1 5.925 5.925 1 12 1s11 4.925 11 11-4.925 11-11 11S1 18.075 1 12z" fill-rule="evenodd"></path></svg>
Download </a>
<a class="btn-mktg btn-small-mktg btn-muted-mktg d-block mr-md-2 width-full width-md-auto" href="https://github.com/miki151/keeperrl" target="_blank">
<svg class="octicon d-inline-block mr-1" height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z" fill-rule="evenodd"></path></svg>
Source </a>
<div class="d-none d-md-flex flex-row mr-2 mr-lg-3">
<svg class="d-block mx-1" fill="currentColor" fill-rule="evenodd" height="18" viewBox="0 0 24 24" width="18" xmlns="http://www.w3.org/2000/svg">
<path d="M22 17.607c-.786 2.28-3.139 6.317-5.563 6.361-1.608.031-2.125-.953-3.963-.953-1.837 0-2.412.923-3.932.983-2.572.099-6.542-5.827-6.542-10.995 0-4.747 3.308-7.1 6.198-7.143 1.55-.028 3.014 1.045 3.959 1.045.949 0 2.727-1.29 4.596-1.101.782.033 2.979.315 4.389 2.377-3.741 2.442-3.158 7.549.858 9.426zm-5.222-17.607c-2.826.114-5.132 3.079-4.81 5.531 2.612.203 5.118-2.725 4.81-5.531z">
</svg>
<svg class="d-block mx-1" fill="currentColor" fill-rule="evenodd" height="18" viewBox="0 0 24 24" width="18" xmlns="http://www.w3.org/2000/svg">
<path d="M0 12v-8.646l10-1.355v10.001h-10zm11 0h13v-12l-13 1.807v10.193zm-1 1h-10v7.646l10 1.355v-9.001zm1 0v9.194l13 1.806v-11h-13z">
</svg>
<svg class="d-block mx-1" fill="currentColor" fill-rule="evenodd" height="18" viewBox="0 0 24 24" width="18" xmlns="http://www.w3.org/2000/svg">
<path d="M20.581 19.049c-.55-.446-.336-1.431-.907-1.917.553-3.365-.997-6.331-2.845-8.232-1.551-1.595-1.051-3.147-1.051-4.49 0-2.146-.881-4.41-3.55-4.41-2.853 0-3.635 2.38-3.663 3.738-.068 3.262.659 4.11-1.25 6.484-2.246 2.793-2.577 5.579-2.07 7.057-.237.276-.557.582-1.155.835-1.652.72-.441 1.925-.898 2.78-.13.243-.192.497-.192.74 0 .75.596 1.399 1.679 1.302 1.461-.13 2.809.905 3.681.905.77 0 1.402-.438 1.696-1.041 1.377-.339 3.077-.296 4.453.059.247.691.917 1.141 1.662 1.141 1.631 0 1.945-1.849 3.816-2.475.674-.225 1.013-.879 1.013-1.488 0-.39-.139-.761-.419-.988zm-9.147-10.465c-.319 0-.583-.258-1-.568-.528-.392-1.065-.618-1.059-1.03 0-.283.379-.37.869-.681.526-.333.731-.671 1.249-.671.53 0 .69.268 1.41.579.708.307 1.201.427 1.201.773 0 .355-.741.609-1.158.868-.613.378-.928.73-1.512.73zm1.665-5.215c.882.141.981 1.691.559 2.454l-.355-.145c.184-.543.181-1.437-.435-1.494-.391-.036-.643.48-.697.922-.153-.064-.32-.11-.523-.127.062-.923.658-1.737 1.451-1.61zm-3.403.331c.676-.168 1.075.618 1.078 1.435l-.31.19c-.042-.343-.195-.897-.579-.779-.411.128-.344 1.083-.115 1.279l-.306.17c-.42-.707-.419-2.133.232-2.295zm-2.115 19.243c-1.963-.893-2.63-.69-3.005-.69-.777 0-1.031-.579-.739-1.127.248-.465.171-.952.11-1.343-.094-.599-.111-.794.478-1.052.815-.346 1.177-.791 1.447-1.124.758-.937 1.523.537 2.15 1.85.407.851 1.208 1.282 1.455 2.225.227.871-.71 1.801-1.896 1.261zm6.987-1.874c-1.384.673-3.147.982-4.466.299-.195-.563-.507-.927-.843-1.293.539-.142.939-.814.46-1.489-.511-.721-1.555-1.224-2.61-2.04-.987-.763-1.299-2.644.045-4.746-.655 1.862-.272 3.578.057 4.069.068-.988.146-2.638 1.496-4.615.681-.998.691-2.316.706-3.14l.62.424c.456.337.838.708 1.386.708.81 0 1.258-.466 1.882-.853.244-.15.613-.302.923-.513.52 2.476 2.674 5.454 2.795 7.15.501-1.032-.142-3.514-.142-3.514.842 1.285.909 2.356.946 3.67.589.241 1.221.869 1.279 1.696l-.245-.028c-.126-.919-2.607-2.269-2.83-.539-1.19.181-.757 2.066-.997 3.288-.11.559-.314 1.001-.462 1.466zm4.846-.041c-.985.38-1.65 1.187-2.107 1.688-.88.966-2.044.503-2.168-.401-.131-.966.36-1.493.572-2.574.193-.987-.023-2.506.431-2.668.295 1.753 2.066 1.016 2.47.538.657 0 .712.222.859.837.092.385.219.709.578 1.09.418.447.29 1.133-.635 1.49zm-8-13.006c-.651 0-1.138-.433-1.534-.769-.203-.171.05-.487.253-.315.387.328.777.675 1.281.675.607 0 1.142-.519 1.867-.805.247-.097.388.285.143.382-.704.277-1.269.832-2.01.832z">
</svg>
</div>
</div>
<div class="d-flex flex-row flex-items-center mt-2">
<div class="d-flex flex-row flex-wrap text-semibold f5-mktg">
<span class="d-flex flex-row flex-items-center mr-1 my-1">
<svg class="d-block" fill="#f34b7d" height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M8 4a4 4 0 100 8 4 4 0 000-8z" fill-rule="evenodd"></path></svg>
C++ </span>
</div>
<div class="d-flex flex-row flex-wrap ml-auto f5-mktg">
<div class="my-1 ml-2">
<a href="https://github.com/miki151" target="_blank" title="@miki151">
<img alt="@miki151" class="d-block circle height-auto" height="24" src="https://avatars.githubusercontent.com/u/5932991?v=4&s=64" width="24" />
</a>
</div>
</div>
</div>
</div>
</div>
</p><p>After 11 years of development, <i>KeeperRL</i> is <a href="https://keeperrl.com/index.html@p=13109">celebrating the big 1.0</a> and is now out of early access. Billed as “the ultimate evil wizard simulator,” <i>KeeperRL</i> is a roguelike base builder that lets you dig into the earth to expand your dungeon and build up to intimidate the countryside with a fortress. The 1.0 release introduces minor villains, new workshops, new items, and many other improvements. So, tent your fingers evilly and check out <a href="https://store.steampowered.com/app/329970/KeeperRL/"><i>KeeperRL</i> on Steam</a>.</p>
<h3 id="haxeflixel-port-of-canabalt-%f0%9f%8f%83%f0%9f%8f%bb%e2%99%82%ef%b8%8f%f0%9f%8f%a2">HaxeFlixel port of Canabalt 🏃🏻‍♂️🏢<a class="heading-link pl-2 text-italic text-bold" href="https://github.blog/feed/#haxeflixel-port-of-canabalt-%f0%9f%8f%83%f0%9f%8f%bb%e2%99%82%ef%b8%8f%f0%9f%8f%a2"></a></h3>
<div class="project-bar mt-0 mb-3">
<p><img alt="Screenshot of Canabalt." class="aligncenter size-full wp-image-77057 width-fit" height="341" src="https://github.blog/wp-content/uploads/2024/03/cannabalt.png?resize=1024%2C341" width="1024" /></p>
<div class="d-flex flex-row flex-wrap flex-items-center">
<div class="d-flex flex-row flex-items-center width-full width-md-auto mt-2">
<a class="btn-mktg btn-small-mktg d-block mr-2 width-full width-md-auto" href="https://canabalt.com/" target="_blank">
<svg class="octicon d-inline-block mr-1" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M9.5 15.584V8.416a.5.5 0 01.77-.42l5.576 3.583a.5.5 0 010 .842l-5.576 3.584a.5.5 0 01-.77-.42z"></path><path d="M12 2.5a9.5 9.5 0 100 19 9.5 9.5 0 000-19zM1 12C1 5.925 5.925 1 12 1s11 4.925 11 11-4.925 11-11 11S1 18.075 1 12z" fill-rule="evenodd"></path></svg>
Play </a>
<a class="btn-mktg btn-small-mktg btn-muted-mktg d-block mr-md-2 width-full width-md-auto" href="https://github.com/ninjamuffin99/canabalt-hf" target="_blank">
<svg class="octicon d-inline-block mr-1" height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z" fill-rule="evenodd"></path></svg>
Source </a>
<div class="d-none d-md-flex flex-row mr-2 mr-lg-3">
<svg class="d-block mx-1" fill="currentColor" fill-rule="evenodd" height="18" viewBox="0 0 24 24" width="18" xmlns="http://www.w3.org/2000/svg">
<path d="M12 0c6.623 0 12 5.377 12 12s-5.377 12-12 12-12-5.377-12-12 5.377-12 12-12m2.557 16h-5.115c.546 2.46 1.441 4.114 2.558 5.744 1.194-1.741 2.041-3.41 2.557-5.744m-7.157 0h-4.567c1.236 2.825 3.704 4.972 6.755 5.716-1.048-1.733-1.783-3.658-2.188-5.716m13.767 0h-4.567c-.391 1.988-1.095 3.887-2.175 5.694 3.012-.763 5.517-2.895 6.742-5.694m-14.005-6h-4.962c-.267 1.313-.267 2.685 0 4h4.915c-.119-1.329-.101-2.672.047-4m7.661 0h-5.647c-.165 1.326-.185 2.672-.053 4h5.753c.133-1.328.111-2.673-.053-4m6.977 0h-4.963c.148 1.328.166 2.671.048 4h4.915c.26-1.285.273-2.648 0-4m-12.156-7.729c-3.077.732-5.567 2.886-6.811 5.729h4.653c.435-2.042 1.178-3.985 2.158-5.729m2.355-.048c-1.089 1.77-1.91 3.453-2.463 5.777h4.927c-.534-2.246-1.337-3.948-2.464-5.777m2.368.069c1.013 1.812 1.733 3.76 2.146 5.708h4.654c-1.232-2.816-3.762-4.958-6.8-5.708">
</svg>
<svg class="d-block mx-1" fill="currentColor" fill-rule="evenodd" height="18" viewBox="0 0 24 24" width="18" xmlns="http://www.w3.org/2000/svg">
<path d="M22 17.607c-.786 2.28-3.139 6.317-5.563 6.361-1.608.031-2.125-.953-3.963-.953-1.837 0-2.412.923-3.932.983-2.572.099-6.542-5.827-6.542-10.995 0-4.747 3.308-7.1 6.198-7.143 1.55-.028 3.014 1.045 3.959 1.045.949 0 2.727-1.29 4.596-1.101.782.033 2.979.315 4.389 2.377-3.741 2.442-3.158 7.549.858 9.426zm-5.222-17.607c-2.826.114-5.132 3.079-4.81 5.531 2.612.203 5.118-2.725 4.81-5.531z">
</svg>
<svg class="d-block mx-1" fill="currentColor" fill-rule="evenodd" height="18" viewBox="0 0 24 24" width="18" xmlns="http://www.w3.org/2000/svg">
<path d="M0 12v-8.646l10-1.355v10.001h-10zm11 0h13v-12l-13 1.807v10.193zm-1 1h-10v7.646l10 1.355v-9.001zm1 0v9.194l13 1.806v-11h-13z">
</svg>
<svg class="d-block mx-1" fill="currentColor" fill-rule="evenodd" height="18" viewBox="0 0 24 24" width="18" xmlns="http://www.w3.org/2000/svg">
<path d="M20.581 19.049c-.55-.446-.336-1.431-.907-1.917.553-3.365-.997-6.331-2.845-8.232-1.551-1.595-1.051-3.147-1.051-4.49 0-2.146-.881-4.41-3.55-4.41-2.853 0-3.635 2.38-3.663 3.738-.068 3.262.659 4.11-1.25 6.484-2.246 2.793-2.577 5.579-2.07 7.057-.237.276-.557.582-1.155.835-1.652.72-.441 1.925-.898 2.78-.13.243-.192.497-.192.74 0 .75.596 1.399 1.679 1.302 1.461-.13 2.809.905 3.681.905.77 0 1.402-.438 1.696-1.041 1.377-.339 3.077-.296 4.453.059.247.691.917 1.141 1.662 1.141 1.631 0 1.945-1.849 3.816-2.475.674-.225 1.013-.879 1.013-1.488 0-.39-.139-.761-.419-.988zm-9.147-10.465c-.319 0-.583-.258-1-.568-.528-.392-1.065-.618-1.059-1.03 0-.283.379-.37.869-.681.526-.333.731-.671 1.249-.671.53 0 .69.268 1.41.579.708.307 1.201.427 1.201.773 0 .355-.741.609-1.158.868-.613.378-.928.73-1.512.73zm1.665-5.215c.882.141.981 1.691.559 2.454l-.355-.145c.184-.543.181-1.437-.435-1.494-.391-.036-.643.48-.697.922-.153-.064-.32-.11-.523-.127.062-.923.658-1.737 1.451-1.61zm-3.403.331c.676-.168 1.075.618 1.078 1.435l-.31.19c-.042-.343-.195-.897-.579-.779-.411.128-.344 1.083-.115 1.279l-.306.17c-.42-.707-.419-2.133.232-2.295zm-2.115 19.243c-1.963-.893-2.63-.69-3.005-.69-.777 0-1.031-.579-.739-1.127.248-.465.171-.952.11-1.343-.094-.599-.111-.794.478-1.052.815-.346 1.177-.791 1.447-1.124.758-.937 1.523.537 2.15 1.85.407.851 1.208 1.282 1.455 2.225.227.871-.71 1.801-1.896 1.261zm6.987-1.874c-1.384.673-3.147.982-4.466.299-.195-.563-.507-.927-.843-1.293.539-.142.939-.814.46-1.489-.511-.721-1.555-1.224-2.61-2.04-.987-.763-1.299-2.644.045-4.746-.655 1.862-.272 3.578.057 4.069.068-.988.146-2.638 1.496-4.615.681-.998.691-2.316.706-3.14l.62.424c.456.337.838.708 1.386.708.81 0 1.258-.466 1.882-.853.244-.15.613-.302.923-.513.52 2.476 2.674 5.454 2.795 7.15.501-1.032-.142-3.514-.142-3.514.842 1.285.909 2.356.946 3.67.589.241 1.221.869 1.279 1.696l-.245-.028c-.126-.919-2.607-2.269-2.83-.539-1.19.181-.757 2.066-.997 3.288-.11.559-.314 1.001-.462 1.466zm4.846-.041c-.985.38-1.65 1.187-2.107 1.688-.88.966-2.044.503-2.168-.401-.131-.966.36-1.493.572-2.574.193-.987-.023-2.506.431-2.668.295 1.753 2.066 1.016 2.47.538.657 0 .712.222.859.837.092.385.219.709.578 1.09.418.447.29 1.133-.635 1.49zm-8-13.006c-.651 0-1.138-.433-1.534-.769-.203-.171.05-.487.253-.315.387.328.777.675 1.281.675.607 0 1.142-.519 1.867-.805.247-.097.388.285.143.382-.704.277-1.269.832-2.01.832z">
</svg>
</div>
</div>
<div class="d-flex flex-row flex-items-center mt-2">
<div class="d-flex flex-row flex-wrap text-semibold f5-mktg">
<span class="d-flex flex-row flex-items-center mr-1 my-1">
<svg class="d-block" fill="#df7900" height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M8 4a4 4 0 100 8 4 4 0 000-8z" fill-rule="evenodd"></path></svg>
Haxe </span>
</div>
<div class="d-flex flex-row flex-wrap ml-auto f5-mktg">
<div class="my-1 ml-2">
<a href="https://github.com/ninjamuffin99" target="_blank" title="@ninjamuffin99">
<img alt="@ninjamuffin99" class="d-block circle height-auto" height="24" src="https://avatars.githubusercontent.com/u/22229331?v=4&s=64" width="24" />
</a>
</div>
</div>
</div>
</div>
</div>
</p><p><i>Canabalt</i> has returned to the web! <a href="https://github.com/adamatomic">@AdamAtomic</a>‘s 2009 <i>Flash</i> game didn’t invent the endless runner genre: it set it on fire. While it has remained available on various other platforms, it’s back in your browser with an official port by <a href="https://github.com/ninjamuffin99">@ninjamuffin99</a>. He tells us that it’s a very faithful port, since it was built with <a href="https://haxeflixel.com/">HaxeFlixel</a>, a descendant of both <i>Flash’s</i> ActionScript and <i>Canabalt</i>‘s original Flixel framework. <a href="https://canabalt.com/">Start your daring escape now</a>, or check out <a href="https://github.com/ninjamuffin99/canabalt-hf">the source on GitHub</a>.</p>
<h3 id="megacity-metro-struts-unitys-stuff">Megacity Metro struts Unity’s stuff<a class="heading-link pl-2 text-italic text-bold" href="https://github.blog/feed/#megacity-metro-struts-unitys-stuff"></a></h3>
<div class="project-bar mt-0 mb-3">
<p><img alt="Megacity Metro Screenshot." class="aligncenter size-full wp-image-77164 width-fit" height="576" src="https://github.blog/wp-content/uploads/2024/03/megacity.jpg?resize=1024%2C576" width="1024" /></p>
<div class="d-flex flex-row flex-wrap flex-items-center">
<div class="d-flex flex-row flex-items-center width-full width-md-auto mt-2">
<a class="btn-mktg btn-small-mktg d-block mr-2 width-full width-md-auto" href="https://unity.com/demos/megacity-competitive-action-sample" target="_blank">
<svg class="octicon d-inline-block mr-1" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M9.5 15.584V8.416a.5.5 0 01.77-.42l5.576 3.583a.5.5 0 010 .842l-5.576 3.584a.5.5 0 01-.77-.42z"></path><path d="M12 2.5a9.5 9.5 0 100 19 9.5 9.5 0 000-19zM1 12C1 5.925 5.925 1 12 1s11 4.925 11 11-4.925 11-11 11S1 18.075 1 12z" fill-rule="evenodd"></path></svg>
Download </a>
<a class="btn-mktg btn-small-mktg btn-muted-mktg d-block mr-md-2 width-full width-md-auto" href="https://github.com/Unity-Technologies/megacity-metro" target="_blank">
<svg class="octicon d-inline-block mr-1" height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z" fill-rule="evenodd"></path></svg>
Source </a>
<div class="d-none d-md-flex flex-row mr-2 mr-lg-3">
<svg class="d-block mx-1" fill="currentColor" fill-rule="evenodd" height="18" viewBox="0 0 24 24" width="18" xmlns="http://www.w3.org/2000/svg">
<path d="M22 17.607c-.786 2.28-3.139 6.317-5.563 6.361-1.608.031-2.125-.953-3.963-.953-1.837 0-2.412.923-3.932.983-2.572.099-6.542-5.827-6.542-10.995 0-4.747 3.308-7.1 6.198-7.143 1.55-.028 3.014 1.045 3.959 1.045.949 0 2.727-1.29 4.596-1.101.782.033 2.979.315 4.389 2.377-3.741 2.442-3.158 7.549.858 9.426zm-5.222-17.607c-2.826.114-5.132 3.079-4.81 5.531 2.612.203 5.118-2.725 4.81-5.531z">
</svg>
<svg class="d-block mx-1" fill="currentColor" fill-rule="evenodd" height="18" viewBox="0 0 24 24" width="18" xmlns="http://www.w3.org/2000/svg">
<path d="M0 12v-8.646l10-1.355v10.001h-10zm11 0h13v-12l-13 1.807v10.193zm-1 1h-10v7.646l10 1.355v-9.001zm1 0v9.194l13 1.806v-11h-13z">
</svg>
<svg class="d-block mx-1" fill="currentColor" fill-rule="evenodd" height="18" viewBox="0 0 24 24" width="18" xmlns="http://www.w3.org/2000/svg">
<path d="M20.581 19.049c-.55-.446-.336-1.431-.907-1.917.553-3.365-.997-6.331-2.845-8.232-1.551-1.595-1.051-3.147-1.051-4.49 0-2.146-.881-4.41-3.55-4.41-2.853 0-3.635 2.38-3.663 3.738-.068 3.262.659 4.11-1.25 6.484-2.246 2.793-2.577 5.579-2.07 7.057-.237.276-.557.582-1.155.835-1.652.72-.441 1.925-.898 2.78-.13.243-.192.497-.192.74 0 .75.596 1.399 1.679 1.302 1.461-.13 2.809.905 3.681.905.77 0 1.402-.438 1.696-1.041 1.377-.339 3.077-.296 4.453.059.247.691.917 1.141 1.662 1.141 1.631 0 1.945-1.849 3.816-2.475.674-.225 1.013-.879 1.013-1.488 0-.39-.139-.761-.419-.988zm-9.147-10.465c-.319 0-.583-.258-1-.568-.528-.392-1.065-.618-1.059-1.03 0-.283.379-.37.869-.681.526-.333.731-.671 1.249-.671.53 0 .69.268 1.41.579.708.307 1.201.427 1.201.773 0 .355-.741.609-1.158.868-.613.378-.928.73-1.512.73zm1.665-5.215c.882.141.981 1.691.559 2.454l-.355-.145c.184-.543.181-1.437-.435-1.494-.391-.036-.643.48-.697.922-.153-.064-.32-.11-.523-.127.062-.923.658-1.737 1.451-1.61zm-3.403.331c.676-.168 1.075.618 1.078 1.435l-.31.19c-.042-.343-.195-.897-.579-.779-.411.128-.344 1.083-.115 1.279l-.306.17c-.42-.707-.419-2.133.232-2.295zm-2.115 19.243c-1.963-.893-2.63-.69-3.005-.69-.777 0-1.031-.579-.739-1.127.248-.465.171-.952.11-1.343-.094-.599-.111-.794.478-1.052.815-.346 1.177-.791 1.447-1.124.758-.937 1.523.537 2.15 1.85.407.851 1.208 1.282 1.455 2.225.227.871-.71 1.801-1.896 1.261zm6.987-1.874c-1.384.673-3.147.982-4.466.299-.195-.563-.507-.927-.843-1.293.539-.142.939-.814.46-1.489-.511-.721-1.555-1.224-2.61-2.04-.987-.763-1.299-2.644.045-4.746-.655 1.862-.272 3.578.057 4.069.068-.988.146-2.638 1.496-4.615.681-.998.691-2.316.706-3.14l.62.424c.456.337.838.708 1.386.708.81 0 1.258-.466 1.882-.853.244-.15.613-.302.923-.513.52 2.476 2.674 5.454 2.795 7.15.501-1.032-.142-3.514-.142-3.514.842 1.285.909 2.356.946 3.67.589.241 1.221.869 1.279 1.696l-.245-.028c-.126-.919-2.607-2.269-2.83-.539-1.19.181-.757 2.066-.997 3.288-.11.559-.314 1.001-.462 1.466zm4.846-.041c-.985.38-1.65 1.187-2.107 1.688-.88.966-2.044.503-2.168-.401-.131-.966.36-1.493.572-2.574.193-.987-.023-2.506.431-2.668.295 1.753 2.066 1.016 2.47.538.657 0 .712.222.859.837.092.385.219.709.578 1.09.418.447.29 1.133-.635 1.49zm-8-13.006c-.651 0-1.138-.433-1.534-.769-.203-.171.05-.487.253-.315.387.328.777.675 1.281.675.607 0 1.142-.519 1.867-.805.247-.097.388.285.143.382-.704.277-1.269.832-2.01.832z">
</svg>
<svg class="d-block mx-1" fill="currentColor" fill-rule="evenodd" height="18" viewBox="0 0 24 24" width="18" xmlns="http://www.w3.org/2000/svg">
<path d="M12 0c6.623 0 12 5.377 12 12s-5.377 12-12 12-12-5.377-12-12 5.377-12 12-12m2.557 16h-5.115c.546 2.46 1.441 4.114 2.558 5.744 1.194-1.741 2.041-3.41 2.557-5.744m-7.157 0h-4.567c1.236 2.825 3.704 4.972 6.755 5.716-1.048-1.733-1.783-3.658-2.188-5.716m13.767 0h-4.567c-.391 1.988-1.095 3.887-2.175 5.694 3.012-.763 5.517-2.895 6.742-5.694m-14.005-6h-4.962c-.267 1.313-.267 2.685 0 4h4.915c-.119-1.329-.101-2.672.047-4m7.661 0h-5.647c-.165 1.326-.185 2.672-.053 4h5.753c.133-1.328.111-2.673-.053-4m6.977 0h-4.963c.148 1.328.166 2.671.048 4h4.915c.26-1.285.273-2.648 0-4m-12.156-7.729c-3.077.732-5.567 2.886-6.811 5.729h4.653c.435-2.042 1.178-3.985 2.158-5.729m2.355-.048c-1.089 1.77-1.91 3.453-2.463 5.777h4.927c-.534-2.246-1.337-3.948-2.464-5.777m2.368.069c1.013 1.812 1.733 3.76 2.146 5.708h4.654c-1.232-2.816-3.762-4.958-6.8-5.708">
</svg>
</div>
</div>
<div class="d-flex flex-row flex-items-center mt-2">
<div class="d-flex flex-row flex-wrap text-semibold f5-mktg">
<span class="d-flex flex-row flex-items-center mr-1 my-1">
<svg class="d-block" fill="#178600" height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M8 4a4 4 0 100 8 4 4 0 000-8z" fill-rule="evenodd"></path></svg>
C# </span>
</div>
<div class="d-flex flex-row flex-wrap ml-auto f5-mktg">
<div class="my-1 ml-2">
<a href="https://github.com/Unity-Technologies" target="_blank" title="@Unity-Technologies">
<img alt="@Unity-Technologies" class="d-block circle height-auto" height="24" src="https://avatars.githubusercontent.com/u/426196?v=4&s=64" width="24" />
</a>
</div>
</div>
</div>
</div>
</div>
</p><p>The Unity team has released <i>Megacity Metro</i>, a demo for building a game in Unity with a little bit of everything: large scale multiplayer, cross-platform clients, prediction netcode, and server-authoritative gameplay. The open source demo is an interesting peek behind the curtain. If a game uses a lot of what Unity has to offer, what does it look like? <i>Megacity Metro</i> is one impressive answer. Head over to <a href="https://unity.com/demos/megacity-competitive-action-sample">the project site</a> or <a href="https://github.com/Unity-Technologies/megacity-metro">repo</a> to learn more.</p>
<h3 id="return-to-area-51">Return to Area 51<a class="heading-link pl-2 text-italic text-bold" href="https://github.blog/feed/#return-to-area-51"></a></h3>
<p>Classic first-person shooter <a href="https://en.wikipedia.org/wiki/Area_51_(2005_video_game)"><i>Area 51</i></a> was originally released in 2005 for Playstation 2, Xbox, and Windows. The preservationists of Project Dreamland have since shared source code “found at a garage sale of a former THQ developer.” Work is now ongoing to see if the game can be built and run on modern systems. Get yourself ready to pay a visit to “Groom Lake” by checking out <a href="https://github.com/ProjectDreamland/area51">the project on GitHub</a>.</p>
<h2 id="engine-watch">Engine watch<a class="heading-link pl-2 text-italic text-bold" href="https://github.blog/feed/#engine-watch"></a></h2>
<h3 id="defold-1-7">Defold 1.7<a class="heading-link pl-2 text-italic text-bold" href="https://github.blog/feed/#defold-1-7"></a></h3>
<div class="project-bar mt-0 mb-3">
<p><img alt="Screenshot od Defold 1.7." class="aligncenter size-full wp-image-77115 width-fit" height="576" src="https://github.blog/wp-content/uploads/2024/03/defold-1.7.png?resize=1024%2C576" width="1024" /></p>
<div class="d-flex flex-row flex-wrap flex-items-center">
<div class="d-flex flex-row flex-items-center width-full width-md-auto mt-2">
<a class="btn-mktg btn-small-mktg d-block mr-2 width-full width-md-auto" href="https://defold.com/" target="_blank">
<svg class="octicon d-inline-block mr-1" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M9.5 15.584V8.416a.5.5 0 01.77-.42l5.576 3.583a.5.5 0 010 .842l-5.576 3.584a.5.5 0 01-.77-.42z"></path><path d="M12 2.5a9.5 9.5 0 100 19 9.5 9.5 0 000-19zM1 12C1 5.925 5.925 1 12 1s11 4.925 11 11-4.925 11-11 11S1 18.075 1 12z" fill-rule="evenodd"></path></svg>
Download </a>
<a class="btn-mktg btn-small-mktg btn-muted-mktg d-block mr-md-2 width-full width-md-auto" href="https://github.com/defold/defold" target="_blank">
<svg class="octicon d-inline-block mr-1" height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z" fill-rule="evenodd"></path></svg>
Source </a>
<div class="d-none d-md-flex flex-row mr-2 mr-lg-3">
<svg class="d-block mx-1" fill="currentColor" fill-rule="evenodd" height="18" viewBox="0 0 24 24" width="18" xmlns="http://www.w3.org/2000/svg">
<path d="M22 17.607c-.786 2.28-3.139 6.317-5.563 6.361-1.608.031-2.125-.953-3.963-.953-1.837 0-2.412.923-3.932.983-2.572.099-6.542-5.827-6.542-10.995 0-4.747 3.308-7.1 6.198-7.143 1.55-.028 3.014 1.045 3.959 1.045.949 0 2.727-1.29 4.596-1.101.782.033 2.979.315 4.389 2.377-3.741 2.442-3.158 7.549.858 9.426zm-5.222-17.607c-2.826.114-5.132 3.079-4.81 5.531 2.612.203 5.118-2.725 4.81-5.531z">
</svg>
<svg class="d-block mx-1" fill="currentColor" fill-rule="evenodd" height="18" viewBox="0 0 24 24" width="18" xmlns="http://www.w3.org/2000/svg">
<path d="M0 12v-8.646l10-1.355v10.001h-10zm11 0h13v-12l-13 1.807v10.193zm-1 1h-10v7.646l10 1.355v-9.001zm1 0v9.194l13 1.806v-11h-13z">
</svg>
<svg class="d-block mx-1" fill="currentColor" fill-rule="evenodd" height="18" viewBox="0 0 24 24" width="18" xmlns="http://www.w3.org/2000/svg">
<path d="M20.581 19.049c-.55-.446-.336-1.431-.907-1.917.553-3.365-.997-6.331-2.845-8.232-1.551-1.595-1.051-3.147-1.051-4.49 0-2.146-.881-4.41-3.55-4.41-2.853 0-3.635 2.38-3.663 3.738-.068 3.262.659 4.11-1.25 6.484-2.246 2.793-2.577 5.579-2.07 7.057-.237.276-.557.582-1.155.835-1.652.72-.441 1.925-.898 2.78-.13.243-.192.497-.192.74 0 .75.596 1.399 1.679 1.302 1.461-.13 2.809.905 3.681.905.77 0 1.402-.438 1.696-1.041 1.377-.339 3.077-.296 4.453.059.247.691.917 1.141 1.662 1.141 1.631 0 1.945-1.849 3.816-2.475.674-.225 1.013-.879 1.013-1.488 0-.39-.139-.761-.419-.988zm-9.147-10.465c-.319 0-.583-.258-1-.568-.528-.392-1.065-.618-1.059-1.03 0-.283.379-.37.869-.681.526-.333.731-.671 1.249-.671.53 0 .69.268 1.41.579.708.307 1.201.427 1.201.773 0 .355-.741.609-1.158.868-.613.378-.928.73-1.512.73zm1.665-5.215c.882.141.981 1.691.559 2.454l-.355-.145c.184-.543.181-1.437-.435-1.494-.391-.036-.643.48-.697.922-.153-.064-.32-.11-.523-.127.062-.923.658-1.737 1.451-1.61zm-3.403.331c.676-.168 1.075.618 1.078 1.435l-.31.19c-.042-.343-.195-.897-.579-.779-.411.128-.344 1.083-.115 1.279l-.306.17c-.42-.707-.419-2.133.232-2.295zm-2.115 19.243c-1.963-.893-2.63-.69-3.005-.69-.777 0-1.031-.579-.739-1.127.248-.465.171-.952.11-1.343-.094-.599-.111-.794.478-1.052.815-.346 1.177-.791 1.447-1.124.758-.937 1.523.537 2.15 1.85.407.851 1.208 1.282 1.455 2.225.227.871-.71 1.801-1.896 1.261zm6.987-1.874c-1.384.673-3.147.982-4.466.299-.195-.563-.507-.927-.843-1.293.539-.142.939-.814.46-1.489-.511-.721-1.555-1.224-2.61-2.04-.987-.763-1.299-2.644.045-4.746-.655 1.862-.272 3.578.057 4.069.068-.988.146-2.638 1.496-4.615.681-.998.691-2.316.706-3.14l.62.424c.456.337.838.708 1.386.708.81 0 1.258-.466 1.882-.853.244-.15.613-.302.923-.513.52 2.476 2.674 5.454 2.795 7.15.501-1.032-.142-3.514-.142-3.514.842 1.285.909 2.356.946 3.67.589.241 1.221.869 1.279 1.696l-.245-.028c-.126-.919-2.607-2.269-2.83-.539-1.19.181-.757 2.066-.997 3.288-.11.559-.314 1.001-.462 1.466zm4.846-.041c-.985.38-1.65 1.187-2.107 1.688-.88.966-2.044.503-2.168-.401-.131-.966.36-1.493.572-2.574.193-.987-.023-2.506.431-2.668.295 1.753 2.066 1.016 2.47.538.657 0 .712.222.859.837.092.385.219.709.578 1.09.418.447.29 1.133-.635 1.49zm-8-13.006c-.651 0-1.138-.433-1.534-.769-.203-.171.05-.487.253-.315.387.328.777.675 1.281.675.607 0 1.142-.519 1.867-.805.247-.097.388.285.143.382-.704.277-1.269.832-2.01.832z">
</svg>
</div>
</div>
<div class="d-flex flex-row flex-items-center mt-2">
<div class="d-flex flex-row flex-wrap text-semibold f5-mktg">
<span class="d-flex flex-row flex-items-center mr-1 my-1">
<svg class="d-block" fill="#f34b7d" height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M8 4a4 4 0 100 8 4 4 0 000-8z" fill-rule="evenodd"></path></svg>
C++ </span>
</div>
<div class="d-flex flex-row flex-wrap ml-auto f5-mktg">
<div class="my-1 ml-2">
<a href="https://github.com/defold" target="_blank" title="@defold">
<img alt="@defold" class="d-block circle height-auto" height="24" src="https://avatars.githubusercontent.com/u/1090871?v=4&s=64" width="24" />
</a>
</div>
</div>
</div>
</div>
</div>
</p><p><a href="https://defold.com/"><i>Defold</i></a>, the all-in-one cross-platform game engine and editor, has shipped version 1.7. Defold 1.7 includes a new API for converting world to local coordinates, getting and setting sprites’ vertex attributes, and many bug fixes. There’s much more to the release, but you’ll have to <a href="https://forum.defold.com/t/defold-1-7-0-has-been-released/76266">read the Defold 1.7 release notes to get all the details</a>.</p>
<h2 id="mods-maps-tools-and-more">Mods, maps, tools, and more<a class="heading-link pl-2 text-italic text-bold" href="https://github.blog/feed/#mods-maps-tools-and-more"></a></h2>
<h3 id="the-mirror">The Mirror<a class="heading-link pl-2 text-italic text-bold" href="https://github.blog/feed/#the-mirror"></a></h3>
<div class="project-bar mt-0 mb-3">
<p><img alt="Screenshot of The Mirror." class="aligncenter size-full wp-image-77165 width-fit" height="413" src="https://github.blog/wp-content/uploads/2024/03/the-mirror.jpg?resize=800%2C413" width="800" /></p>
<div class="d-flex flex-row flex-wrap flex-items-center">
<div class="d-flex flex-row flex-items-center width-full width-md-auto mt-2">
<a class="btn-mktg btn-small-mktg d-block mr-2 width-full width-md-auto" href="https://www.themirror.space/" target="_blank">
<svg class="octicon d-inline-block mr-1" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M9.5 15.584V8.416a.5.5 0 01.77-.42l5.576 3.583a.5.5 0 010 .842l-5.576 3.584a.5.5 0 01-.77-.42z"></path><path d="M12 2.5a9.5 9.5 0 100 19 9.5 9.5 0 000-19zM1 12C1 5.925 5.925 1 12 1s11 4.925 11 11-4.925 11-11 11S1 18.075 1 12z" fill-rule="evenodd"></path></svg>
Download </a>
<a class="btn-mktg btn-small-mktg btn-muted-mktg d-block mr-md-2 width-full width-md-auto" href="https://github.com/the-mirror-gdp/the-mirror" target="_blank">
<svg class="octicon d-inline-block mr-1" height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z" fill-rule="evenodd"></path></svg>
Source </a>
<div class="d-none d-md-flex flex-row mr-2 mr-lg-3">
<svg class="d-block mx-1" fill="currentColor" fill-rule="evenodd" height="18" viewBox="0 0 24 24" width="18" xmlns="http://www.w3.org/2000/svg">
<path d="M22 17.607c-.786 2.28-3.139 6.317-5.563 6.361-1.608.031-2.125-.953-3.963-.953-1.837 0-2.412.923-3.932.983-2.572.099-6.542-5.827-6.542-10.995 0-4.747 3.308-7.1 6.198-7.143 1.55-.028 3.014 1.045 3.959 1.045.949 0 2.727-1.29 4.596-1.101.782.033 2.979.315 4.389 2.377-3.741 2.442-3.158 7.549.858 9.426zm-5.222-17.607c-2.826.114-5.132 3.079-4.81 5.531 2.612.203 5.118-2.725 4.81-5.531z">
</svg>
<svg class="d-block mx-1" fill="currentColor" fill-rule="evenodd" height="18" viewBox="0 0 24 24" width="18" xmlns="http://www.w3.org/2000/svg">
<path d="M0 12v-8.646l10-1.355v10.001h-10zm11 0h13v-12l-13 1.807v10.193zm-1 1h-10v7.646l10 1.355v-9.001zm1 0v9.194l13 1.806v-11h-13z">
</svg>
<svg class="d-block mx-1" fill="currentColor" fill-rule="evenodd" height="18" viewBox="0 0 24 24" width="18" xmlns="http://www.w3.org/2000/svg">
<path d="M20.581 19.049c-.55-.446-.336-1.431-.907-1.917.553-3.365-.997-6.331-2.845-8.232-1.551-1.595-1.051-3.147-1.051-4.49 0-2.146-.881-4.41-3.55-4.41-2.853 0-3.635 2.38-3.663 3.738-.068 3.262.659 4.11-1.25 6.484-2.246 2.793-2.577 5.579-2.07 7.057-.237.276-.557.582-1.155.835-1.652.72-.441 1.925-.898 2.78-.13.243-.192.497-.192.74 0 .75.596 1.399 1.679 1.302 1.461-.13 2.809.905 3.681.905.77 0 1.402-.438 1.696-1.041 1.377-.339 3.077-.296 4.453.059.247.691.917 1.141 1.662 1.141 1.631 0 1.945-1.849 3.816-2.475.674-.225 1.013-.879 1.013-1.488 0-.39-.139-.761-.419-.988zm-9.147-10.465c-.319 0-.583-.258-1-.568-.528-.392-1.065-.618-1.059-1.03 0-.283.379-.37.869-.681.526-.333.731-.671 1.249-.671.53 0 .69.268 1.41.579.708.307 1.201.427 1.201.773 0 .355-.741.609-1.158.868-.613.378-.928.73-1.512.73zm1.665-5.215c.882.141.981 1.691.559 2.454l-.355-.145c.184-.543.181-1.437-.435-1.494-.391-.036-.643.48-.697.922-.153-.064-.32-.11-.523-.127.062-.923.658-1.737 1.451-1.61zm-3.403.331c.676-.168 1.075.618 1.078 1.435l-.31.19c-.042-.343-.195-.897-.579-.779-.411.128-.344 1.083-.115 1.279l-.306.17c-.42-.707-.419-2.133.232-2.295zm-2.115 19.243c-1.963-.893-2.63-.69-3.005-.69-.777 0-1.031-.579-.739-1.127.248-.465.171-.952.11-1.343-.094-.599-.111-.794.478-1.052.815-.346 1.177-.791 1.447-1.124.758-.937 1.523.537 2.15 1.85.407.851 1.208 1.282 1.455 2.225.227.871-.71 1.801-1.896 1.261zm6.987-1.874c-1.384.673-3.147.982-4.466.299-.195-.563-.507-.927-.843-1.293.539-.142.939-.814.46-1.489-.511-.721-1.555-1.224-2.61-2.04-.987-.763-1.299-2.644.045-4.746-.655 1.862-.272 3.578.057 4.069.068-.988.146-2.638 1.496-4.615.681-.998.691-2.316.706-3.14l.62.424c.456.337.838.708 1.386.708.81 0 1.258-.466 1.882-.853.244-.15.613-.302.923-.513.52 2.476 2.674 5.454 2.795 7.15.501-1.032-.142-3.514-.142-3.514.842 1.285.909 2.356.946 3.67.589.241 1.221.869 1.279 1.696l-.245-.028c-.126-.919-2.607-2.269-2.83-.539-1.19.181-.757 2.066-.997 3.288-.11.559-.314 1.001-.462 1.466zm4.846-.041c-.985.38-1.65 1.187-2.107 1.688-.88.966-2.044.503-2.168-.401-.131-.966.36-1.493.572-2.574.193-.987-.023-2.506.431-2.668.295 1.753 2.066 1.016 2.47.538.657 0 .712.222.859.837.092.385.219.709.578 1.09.418.447.29 1.133-.635 1.49zm-8-13.006c-.651 0-1.138-.433-1.534-.769-.203-.171.05-.487.253-.315.387.328.777.675 1.281.675.607 0 1.142-.519 1.867-.805.247-.097.388.285.143.382-.704.277-1.269.832-2.01.832z">
</svg>
</div>
</div>
<div class="d-flex flex-row flex-items-center mt-2">
<div class="d-flex flex-row flex-wrap text-semibold f5-mktg">
<span class="d-flex flex-row flex-items-center mr-1 my-1">
<svg class="d-block" fill="#ededed" height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M8 4a4 4 0 100 8 4 4 0 000-8z" fill-rule="evenodd"></path></svg>
Godot </span>
<span class="d-flex flex-row flex-items-center mr-1 my-1">
<svg class="d-block" fill="#355570" height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M8 4a4 4 0 100 8 4 4 0 000-8z" fill-rule="evenodd"></path></svg>
GDScript </span>
</div>
<div class="d-flex flex-row flex-wrap ml-auto f5-mktg">
<div class="my-1 ml-2">
<a href="https://github.com/the-mirror-gdp" target="_blank" title="@the-mirror-gdp">
<img alt="@the-mirror-gdp" class="d-block circle height-auto" height="24" src="https://avatars.githubusercontent.com/u/160080128?v=4&s=64" width="24" />
</a>
</div>
</div>
</div>
</div>
</div>
</p><p><a href="https://www.themirror.space/"><i>The Mirror</i></a> is an all-in-one game development environment, built atop Godot Engine. The no/low-code engine and editor promises to help you “edit a game with friends in real-time.” The project just went open source on March 15. Read <a href="https://www.themirror.space/blog/freedom-to-own-open-sourcing-the-mirror">the announcement</a>, then head over to <a href="https://github.com/the-mirror-gdp/the-mirror">the repo</a> to get started.</p>
<h3 id="discord-embedded-app-sdk-in-developer-preview">Discord Embedded App SDK in developer preview<a class="heading-link pl-2 text-italic text-bold" href="https://github.blog/feed/#discord-embedded-app-sdk-in-developer-preview"></a></h3>
<p><i>Discord</i> has <a href="https://twitter.com/discord/status/1769775006211252643">unveiled a new embedded app SDK</a>. Now in a preview, developers will be able to create multiplayer games and other social activities in an <iframe> that runs directly within the Discord client. The SDK handles coordination between Discord and the third-party applications. We’re excited to see how developers will connect chat communities with their games! Head over to <a href="https://discord.com/build/embedded-app-sdk">the Discord site</a> for more.</p>
<h3 id="new-phaser-docs-go-wherever-you-go">New Phaser Docs go wherever you go<a class="heading-link pl-2 text-italic text-bold" href="https://github.blog/feed/#new-phaser-docs-go-wherever-you-go"></a></h3>
<div class="wp-video" style="width: 1920px;">
<video class="wp-video-shortcode js-viewport-aware-video events-none" height="1080" id="video-77050-1" loop="1" preload="metadata" width="1920"><source src="https://github.blog/wp-content/uploads/2024/03/phaser-docs.mp4?_=1" type="video/mp4" /><a href="https://github.blog/wp-content/uploads/2024/03/phaser-docs.mp4">https://github.blog/wp-content/uploads/2024/03/phaser-docs.mp4</a></video></div>
<p><a href="https://phaser.io/"><i>Phaser</i></a>, a desktop and mobile web game framework, has shipped a brand new docs app called Phaser Explorer. Phaser Explorer is a new way to check out reference documentation, play with sample code, and explore the Phaser API. In a standout move for gamedev docs, Phaser Explorer is a progressive web application (PWA), so it works offline. Plus, in some browsers (such as Microsoft Edge), you can install the PWA as a standalone app. <a href="https://explorer.phaser.io/">Try out Phaser Explorer now.</a></p>
<h2 id="game-jams">Game jams<a class="heading-link pl-2 text-italic text-bold" href="https://github.blog/feed/#game-jams"></a></h2>
<h3 id="upcoming-jams">Upcoming jams<a class="heading-link pl-2 text-italic text-bold" href="https://github.blog/feed/#upcoming-jams"></a></h3>
<ul>
<li><a href="https://gamedevjs.com/jam/2024/"><i>Gamedev.js Jam</i></a> (April 13 to 26)—Build an HTML5 game in 13 days, with a theme to be announced when the jam opens.</li>
<li><a href="https://itch.io/jam/fishfest"><i>Fish Fest</i></a> (April 1 to 8)—Not some kind of April Fools joke, I swear. All games created must feature fish. PROMINENTLY.</li>
</ul>
<h3 id="recently-ended-jams">Recently-ended jams<a class="heading-link pl-2 text-italic text-bold" href="https://github.blog/feed/#recently-ended-jams"></a></h3>
<p><i>7DRL</i> recently wrapped its 20th year of jamming to make and finish a roguelike in 7 days or less. Though voting is still in progress, it’s already clear that there are many great entries this year. Here are a few entries to play and hack on:</p>
<ul>
<li><a href="https://jzhang113.itch.io/gladiatorrl"><i>GladiatorRL</i></a> (<a href="https://github.com/jzhang113/7drl-2024/">source</a>) challenges you with gladiatorial combat, focused on movement and positioning. The game explores a fresh combat system using abilities in space—moving both yourself and your enemies, interrupting or intercepting attacks—not simply bumping into opponents.</li>
<li><a href="https://ceccopierangiolieugenio.itch.io/a-snake-on-a-plane"><i>A Snake on a Plane</i></a> (<a href="https://github.com/ceccopierangiolieugenio/7drl-ASnakeOnAPLane">source</a>) is a clever, funny homage to both <a href="https://www.imdb.com/title/tt0417148/"><i>Snakes on a Plane</i></a> and <a href="https://en.wikipedia.org/wiki/Metal_Gear"><i>Metal Gear</i></a> ( ” Snake? Snake!? Snaaaake!” ). You’ll get it when you play it. And is that a nod to <a href="https://github.blog/2024-03-27-game-bytes-march-2024/#haxeflixel-port-of-canabalt"><i>Canabalt</i></a> in the background?</li>
</ul>
<p><img alt="Animation showing Snake on a Plane gameplay." class="aligncenter size-full wp-image-77166 width-fit" height="500" src="https://github.blog/wp-content/uploads/2024/03/snake-on-a-plane.gif?resize=771%2C500" width="771" /></p>
<h3 id="game-jam-game-of-the-month-lithic">Game jam game of the month: Lithic<a class="heading-link pl-2 text-italic text-bold" href="https://github.blog/feed/#game-jam-game-of-the-month-lithic"></a></h3>
<div class="project-bar mt-0 mb-3">
<p><img alt="Screenshot of Lithic." class="aligncenter size-full wp-image-77060 width-fit" height="577" src="https://github.blog/wp-content/uploads/2024/03/lithic.png?resize=1024%2C577" width="1024" /></p>
<div class="d-flex flex-row flex-wrap flex-items-center">
<div class="d-flex flex-row flex-items-center width-full width-md-auto mt-2">
<a class="btn-mktg btn-small-mktg d-block mr-2 width-full width-md-auto" href="https://lukko-digital.itch.io/lithic" target="_blank">
<svg class="octicon d-inline-block mr-1" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M9.5 15.584V8.416a.5.5 0 01.77-.42l5.576 3.583a.5.5 0 010 .842l-5.576 3.584a.5.5 0 01-.77-.42z"></path><path d="M12 2.5a9.5 9.5 0 100 19 9.5 9.5 0 000-19zM1 12C1 5.925 5.925 1 12 1s11 4.925 11 11-4.925 11-11 11S1 18.075 1 12z" fill-rule="evenodd"></path></svg>
Play in your browser </a>
<a class="btn-mktg btn-small-mktg btn-muted-mktg d-block mr-md-2 width-full width-md-auto" href="https://github.com/Lukko-Digital/Lithic" target="_blank">
<svg class="octicon d-inline-block mr-1" height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z" fill-rule="evenodd"></path></svg>
Source </a>
<div class="d-none d-md-flex flex-row mr-2 mr-lg-3">
<svg class="d-block mx-1" fill="currentColor" fill-rule="evenodd" height="18" viewBox="0 0 24 24" width="18" xmlns="http://www.w3.org/2000/svg">
<path d="M12 0c6.623 0 12 5.377 12 12s-5.377 12-12 12-12-5.377-12-12 5.377-12 12-12m2.557 16h-5.115c.546 2.46 1.441 4.114 2.558 5.744 1.194-1.741 2.041-3.41 2.557-5.744m-7.157 0h-4.567c1.236 2.825 3.704 4.972 6.755 5.716-1.048-1.733-1.783-3.658-2.188-5.716m13.767 0h-4.567c-.391 1.988-1.095 3.887-2.175 5.694 3.012-.763 5.517-2.895 6.742-5.694m-14.005-6h-4.962c-.267 1.313-.267 2.685 0 4h4.915c-.119-1.329-.101-2.672.047-4m7.661 0h-5.647c-.165 1.326-.185 2.672-.053 4h5.753c.133-1.328.111-2.673-.053-4m6.977 0h-4.963c.148 1.328.166 2.671.048 4h4.915c.26-1.285.273-2.648 0-4m-12.156-7.729c-3.077.732-5.567 2.886-6.811 5.729h4.653c.435-2.042 1.178-3.985 2.158-5.729m2.355-.048c-1.089 1.77-1.91 3.453-2.463 5.777h4.927c-.534-2.246-1.337-3.948-2.464-5.777m2.368.069c1.013 1.812 1.733 3.76 2.146 5.708h4.654c-1.232-2.816-3.762-4.958-6.8-5.708">
</svg>
</div>
</div>
<div class="d-flex flex-row flex-items-center mt-2">
<div class="d-flex flex-row flex-wrap text-semibold f5-mktg">
<span class="d-flex flex-row flex-items-center mr-1 my-1">
<svg class="d-block" fill="#ededed" height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M8 4a4 4 0 100 8 4 4 0 000-8z" fill-rule="evenodd"></path></svg>
Godot </span>
<span class="d-flex flex-row flex-items-center mr-1 my-1">
<svg class="d-block" fill="#355570" height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M8 4a4 4 0 100 8 4 4 0 000-8z" fill-rule="evenodd"></path></svg>
GDScript </span>
</div>
<div class="d-flex flex-row flex-wrap ml-auto f5-mktg">
<div class="my-1 ml-2">
<a href="https://github.com/Lukko-Digital" target="_blank" title="@Lukko-Digital">
<img alt="@Lukko-Digital" class="d-block circle height-auto" height="24" src="https://avatars.githubusercontent.com/u/160654092?v=4&s=64" width="24" />
</a>
</div>
<div class="my-1 ml-2">
<a href="https://github.com/joshuatehrlich" target="_blank" title="@joshuatehrlich">
<img alt="@joshuatehrlich" class="d-block circle height-auto" height="24" src="https://avatars.githubusercontent.com/u/21961358?v=4&s=64" width="24" />
</a>
</div>
<div class="my-1 ml-2">
<a href="https://github.com/milesfrank" target="_blank" title="@milesfrank">
<img alt="@milesfrank" class="d-block circle height-auto" height="24" src="https://avatars.githubusercontent.com/u/38819342?v=4&s=64" width="24" />
</a>
</div>
</div>
</div>
</div>
</div>
</p><p>This month’s Game Jam Game of the Month may have you sliding dull rocks around, but the game itself is a gem. <i>Lithic</i>, an entry to <a href="https://itch.io/jam/brackeys-11">Brackeys Game Jam 2024.1</a>, is a sokoban puzzle game with a twist: to proceed, you’ll need some help from the statues that reside in <i>Lithic</i>‘s levels. The game won’t just test your logic skills, you’ll solve some lightly challenging word games, too. With excellent art, music, tutorialization, and written dialogue, don’t delay sliding into <a href="https://lukko-digital.itch.io/lithic"><i>Lithic</i> on itch.io</a>.</p>
<p>The post <a href="https://github.blog/2024-03-27-game-bytes-march-2024/">Game Bytes · March 2024</a> appeared first on <a href="https://github.blog">The GitHub Blog</a>.</p>Learning from interaction with Microsoft Copilot (web)2024-03-28T01:16:44.976000ZAlyssa Hugheshttps://www.microsoft.com/en-us/research/blog/learning-from-interaction-with-microsoft-copilot-web/<table style="border: 1px solid #E0E0E0; margin: 0; padding: 0; background-color: #F0F0F0" valign="top" align="left" cellpadding="0" width="100%">
<tr>
<td rowspan="2" style="padding: 6px;width: 36px;white-space:nowrap" width="36" valign="top"><img src="https://www.gravatar.com/avatar/19ac6a9d902c1d6ae33f41405e47b385" style="width: 36px; height: 36px; border-radius: 4px;"></td>
<td width="100%" style="padding-top: 6px;">
<b>
alvinashcraft
<a href="https://alvinashcraft.newsblur.com/story/learning-from-intera/6635590:1947d4">shared this story</a>
from <img src="https://s3.amazonaws.com/icons.newsblur.com/6635590.png" style="vertical-align: middle;width:16px;height:16px;"> Microsoft Research.</b>
</td>
</tr>
</table>
<hr style="clear: both; margin: 0 0 24px;">
<figure class="wp-block-image size-full"><img alt="flowchart showing how AI learns from user interactions" class="wp-image-1017312" height="788" src="https://www.microsoft.com/en-us/research/uploads/prodnew/2024/03/Learning-from-User-Interactions-BlogHeroFeature-1400x788-1.jpg" width="1400" /></figure>
<p>AI systems like Bing and Microsoft Copilot (web) are as good as they are because they continuously learn and improve from people’s interactions. Since the early 2000s, user clicks on search result pages have fueled the continuous improvements of search engines. Recently, reinforcement learning from human feedback (RLHF) brought step-function improvements to response quality of generative AI models. Bing has a rich history of success in improving its AI offerings by learning from user interactions. For example, Bing pioneered the idea of <a class="msr-external-link glyph-append glyph-append-open-in-new-tab glyph-append-xsmall" href="https://dl.acm.org/doi/abs/10.1145/1148170.1148177" rel="noreferrer noopener" target="_blank">improving search ranking<span class="sr-only"> (opens in new tab)</span></a> and <a href="https://www.microsoft.com/en-us/research/publication/personalizing-search-via-automated-analysis-of-interests-and-activities/" rel="noreferrer noopener" target="_blank">personalizing search<span class="sr-only"> (opens in new tab)</span></a> using <a class="msr-external-link glyph-append glyph-append-open-in-new-tab glyph-append-xsmall" href="https://dl.acm.org/doi/abs/10.1145/1148170.1148177" rel="noreferrer noopener" target="_blank">short- and long-term user behavior data<span class="sr-only"> (opens in new tab)</span></a>.</p>
<p>With the introduction of Microsoft Copilot (web), the way that people interact with AI systems has fundamentally changed from searching to conversing and from simple actions to complex workflows. Today, we are excited to share three technical reports on how we are <em>starting</em> to leverage new types of user interactions to understand and improve Copilot (web) for our consumer customers. <a href="https://www.microsoft.com/en-us/research/feed/#_ftn1" id="_ftnref1">[1]</a></p>
<h2 class="wp-block-heading" id="how-are-people-using-copilot-web">How are people using Copilot (web)?</h2>
<p>One of the first questions we asked about user interactions with Copilot (web) was, “How are people using Copilot (web)?” Generative AI can perform many tasks that were not possible in the past, and it’s important to understand people’s expectations and needs so that we can continuously improve Copilot (web) in the ways that will help users the most.</p>
<p>A key challenge of understanding user tasks at scale is to transform unstructured interaction data (e.g., Copilot logs) into a <a href="https://www.microsoft.com/en-us/research/publication/using-large-language-models-to-generate-validate-and-apply-user-intent-taxonomies/" rel="noreferrer noopener" target="_blank">meaningful task taxonomy</a>. Existing methods heavily rely on manual effort, which is not scalable in novel and under-specified domains like generative AI. To address this challenge, we introduce <a href="https://www.microsoft.com/en-us/research/publication/tnt-llm-text-mining-at-scale-with-large-language-models/" rel="noreferrer noopener" target="_blank">TnT-LLM (<strong>T</strong>axonomy Generation <strong>and T</strong>ext Prediction with <strong>LLM</strong>s)</a>, a two-phase LLM-powered framework that generates and predicts task labels end-to-end with minimal human involvement (Figure 1).</p>
<figure class="wp-block-image aligncenter size-full"><img alt="The figure illustrates a comparison of three text data processing frameworks. The first, a labor-intensive human-in-the-loop framework, involves the manual derivation of label taxonomy and annotation before the developing the classifier. The second, a conventional unsupervised text clustering framework, clusters data initially and generates label taxonomy afterwards. The third, the TnT-LLM framework, integrates LLM in both the derivation of label taxonomy and annotation. A scatter plot shows that human-in-the-loop is highly interpretable but not very scalable, the text clustering framework is highly scalable but less interpretable, the TnT-LLM framework excels in both. " class="wp-image-1017252" height="375" src="https://www.microsoft.com/en-us/research/uploads/prodnew/2024/03/Copilot_Fig1.png" width="738" /><figcaption class="wp-element-caption">Figure 1. Comparing our TnT-LLM framework against existing methods in terms of interpretability and scalability.</figcaption></figure>
<p>We conducted extensive human evaluation to understand how TnT-LLM performs. In discovering user intent and domain from Copilot (web) conversations, taxonomies generated by TnT-LLM are significantly more accurate than existing baselines (Figure 2).</p>
<figure class="wp-block-image aligncenter size-full"><img alt="The figure compares the accuracy of different AI methods in generating user intent taxonomies. Two bar plots are presented side by side, labeled with “Accuracy (Intent)” and “Accuracy (Domain)”. The methods compared are “GPT-4 (TnT-LLM)”, “GPT-3.5-turbo (TnT-LLM)”, “ada2 + GPT-4”, “ada2 + GPT-3.5-turbo”, “Instructor-XL + GPT-4” and “Instructor-XL + GPT-3.5-turbo”. The label “GPT-4 evaluation” is noted at the bottom. “GPT-4 (TnT-LLM)” appears to outperform other methods in this figure. " class="wp-image-1017255" height="294" src="https://www.microsoft.com/en-us/research/uploads/prodnew/2024/03/Copilot_Fig2.png" width="858" /><figcaption class="wp-element-caption">Figure 2. Evaluating the performance of TnT-LLM on user intent taxonomy generation. Error bars indicate 95% confidence intervals.</figcaption></figure>
<p>We applied TnT-LLM to a large-scale number of fully de-identified Copilot (web) conversations and traditional Bing Search sessions. <a href="https://www.microsoft.com/en-us/research/publication/the-use-of-generative-search-engines-for-knowledge-work-and-complex-tasks/">The results</a> (Figure 3) suggest that people use Copilot (web) for knowledge work tasks in domains such as writing and editing, data analysis, programming, science, and business. Further, tasks done in Copilot (web) generally are of higher complexity and more knowledge work-oriented compared to tasks done in traditional search engines. Generative AI’s emerging capabilities have evolved the tasks that machines can perform, to include some that humans have traditionally had to do without assistance. Results demonstrate that people are doing more complex tasks, frequently in the context of knowledge work, and show that this type of work is being newly assisted by Copilot (web).</p>
<figure class="wp-block-image aligncenter size-full"><img alt="The figure compares Bing Copilot conversations with Bing Search sessions for the degree to which they are complex in nature and oriented toward knowledge work. Two scatterplots are presented side by side, one each for Bing Copilot and Bing Search. The x-axes are labeled “Percent of Per-Domain Copilot Chats Classified as Complex” and “Percent of Per-Domain Search Sessions Classified as Complex”. The y-axes are labeled “Percent of Per-Domain Copilot Chats Classified as Knowledge Work” for Bing Copilot and “Percent of Per-Domain Search Sessions Classified as Knowledge Work” for Bing Search. The points in the scatterplot are task domains, such as “Programming and scripting” and “Gaming and entertainment”. The data points in the scatter plot show that for Bing Search, the majority of search sessions are lower in both complexity and knowledge work relevance, whereas for Bing Copilot, many data points are high in both complexity and knowledge work. " class="wp-image-1017294" height="726" src="https://www.microsoft.com/en-us/research/uploads/prodnew/2024/03/Copilot_Fig3.png" width="1400" /><figcaption class="wp-element-caption">Figure 3. Comparing the distribution of topical domains and task complexity between Bing search (left) and Copilot (web) (right).</figcaption></figure>
<h2 class="wp-block-heading" id="estimating-and-interpreting-user-satisfaction">Estimating and interpreting user satisfaction</h2>
<p>To effectively learn from user interactions, it is equally important to classify user satisfaction and to understand why people are satisfied or dissatisfied while trying to complete a given task. Most important, this will allow system developers to identify areas of improvement and to amplify and suggest successful use cases for broader groups of users.</p>
<p>People give explicit and implicit feedback when interacting with AI systems. In the past, user feedback was in the form of clicks, ratings, or survey verbatims. When it comes to conversational systems like Copilot (web), people also give feedback in the messages they send during the conversations (Figure 4).</p>
<figure class="wp-block-image aligncenter size-full"><img alt="The figure illustrates the continuous improvement process of an AI assistant. The process starts with an example conversation between a user and an AI assistant. The user in the example is unsatisfied with the response of the AI assistant. An improvement process takes the unsatisfied example as input and outputs better responses in the same conversation. After improvement, the user is satisfied with the response. " class="wp-image-1017258" height="571" src="https://www.microsoft.com/en-us/research/uploads/prodnew/2024/03/Copilot_Fig4.png" width="802" /><figcaption class="wp-element-caption">Figure 4. Illustrations of how people may give feedback to a chatbot in their messages.</figcaption></figure>
<p>To capture this new category of feedback signals, we propose our <a class="msr-external-link glyph-append glyph-append-open-in-new-tab glyph-append-xsmall" href="https://arxiv.org/abs/2403.12388" rel="noreferrer noopener" target="_blank">Supervised Prompting for User Satisfaction Rubrics (SPUR)<span class="sr-only"> (opens in new tab)</span></a> framework (Figure 5). It’s a three-phase prompting framework for estimating user satisfaction with LLMs:</p>
<ol>
<li>The <strong>supervised extraction prompt</strong> extracts diverse <em>in situ</em> textual feedback from users interacting with Copilot (web).</li>
<li>The <strong>summarization rubric prompt</strong> identifies prominent textual feedback patterns and summarizes them into rubrics for estimating user satisfaction.</li>
<li>Based on the summarized rubrics, the final <strong>scoring prompt</strong> takes a conversation between a user and the AI agent and rates how satisfied the user was.</li>
</ol>
<figure class="wp-block-image aligncenter size-full"><img alt="The figure shows the framework of Supervised Prompting for User Satisfaction Rubrics. The first step shows that a LLM explains user satisfaction or dissatisfaction based on user utterances. Then, LLM summarizes satisfaction or dissatisfaction reasons into SAT and DSAT rubrics in the second step. Finally, LLM uses SAT and DSAT rubrics to determine whether a user is satisfied with the responses of an AI agent in the third step. " class="wp-image-1017261" height="480" src="https://www.microsoft.com/en-us/research/uploads/prodnew/2024/03/Copilot_Fig5.png" width="975" /><figcaption class="wp-element-caption">Figure 5. Framework of Supervised Prompting for User Satisfaction Rubrics.</figcaption></figure>
<p>We evaluated our framework on fully de-identified conversations with explicit user thumbs up/down in Copilot (web) (Table 1). We find that SPUR outperforms other LLM-based and embedding-based methods, especially only limited human annotations of user satisfaction are available. Open-source reward models used for RLHF cannot be a proxy for user satisfaction, because reward models are usually trained with auxiliary human feedback that may differ from the feedback from the user who was involved in the conversation with the AI agent.</p>
<figure class="wp-block-table"><table><thead><tr><th>Method</th><th>Weighted F1-score</th></tr></thead><tbody><tr><td>Reward (RLHF)</td><td>17.8</td></tr><tr><td>ASAP (SOTA of embedding)</td><td>57.0</td></tr><tr><td>Zero-Shot (GPT4)</td><td>74.1</td></tr><tr><td>SESRP (GPT4)</td><td><strong>77.4</strong><strong></strong></td></tr></tbody></table><figcaption class="wp-element-caption"><center>Table 1. Performance comparison between models for user satisfaction estimation.</center></figcaption></figure>
<p>Another critical feature of SPUR is its interpretability. It shows how people express satisfaction or dissatisfaction (Figure 6). For example, we see that users often give explicit positive feedback by clearly praising the response from Copilot (web). Conversely, they express explicit frustration or switch topics when encountering mistakes in the response from Copilot (web). This presents opportunities for providing customized user experience at critical moments of user satisfaction and dissatisfaction, such as context and memory reset after switching topics.</p>
<figure class="wp-block-image aligncenter size-full"><img alt="The figure shows two histogram plots. The left histogram plot shows the distribution of the ten-item SAT rubric, and the right histogram plot shows the distribution of the ten-item DSAT rubric in Bing Copilot. The y-axis of the left histogram shows ten summarized patterns that express how a user is satisfied with the responses of Bing Copilot, and the x-axis shows the percentage of each pattern occurring in Bing Copilot. Similarly, the y-axis of the right histogram shows 10 summarized patterns that express how a user is dissatisfied with the responses of Bing Copilot, and the x-axis shows the percentage of each pattern happening in Bing Copilot. " class="wp-image-1017852" height="241" src="https://www.microsoft.com/en-us/research/uploads/prodnew/2024/03/Copilot_Fig6_v2.png" width="624" /><figcaption class="wp-element-caption">Figure 6. SPUR reveals the distribution of satisfaction and dissatisfaction patterns among conversations with explicit user upvotes or downvotes.</figcaption></figure>
<p>In the user task classification discussed earlier, we know that people are using Copilot (web) for knowledge work and more complex tasks. As we further apply SPUR for user satisfaction estimation, we find that people are also more satisfied when they complete or partially complete cognitively complex tasks. Specifically, when regressing task complexity on the SPUR-derived summary user-satisfaction score, we find generally increasing coefficients on increasing levels of task complexity when using the lowest level of task complexity (i.e. Remember) as a baseline, provided the task was at least partially completed (see Table 2). For instance, partially completing a Create-level task, which is the highest level of task complexity, leads to an increase in user satisfaction that is more than double the increase when partially completing an Understand-level task. Fully completing a Create-level task leads to the largest increase in user satisfaction.</p>
<figure class="wp-block-image aligncenter size-full"><img alt="The table shows results from a regression analysis, including the predictor variables and their respective coefficients in the regression. In this regression, three predictor variables are regressed on user satisfaction as the outcome variable. The three predictors are task complexity, task completion, and the number of user messages. Additionally, interaction terms are included for the interactions between task complexity and task completion, and between the number of user messages and task completion. The results indicate that that when users complete more complex tasks, their user satisfaction increases. " class="wp-image-1017267" height="436" src="https://www.microsoft.com/en-us/research/uploads/prodnew/2024/03/Copilot_Table2.png" width="605" /><figcaption class="wp-element-caption">Table 2. Regression results where the dependent variable is user satisfaction. In general, the more complex the task, the more satisfied the user whether it was partially or totally completed.</figcaption></figure>
<p>These three reports present a comprehensive and multi-faceted approach to dynamically learning from conversation logs in Copilot (web) at scale. As AI’s generative capabilities increase, users are finding new ways to use the system to help them do more and shift from traditional click reactions to more nuanced, continuous dialogue-oriented feedback. To navigate this evolving user-AI interaction landscape, it is crucial to shift from established task frameworks and relevance evaluations to a more dynamic, bottom-up approach to task identification and user satisfaction evaluation.</p>
<h5 class="wp-block-heading" id="key-contributors">Key Contributors </h5>
<p><a href="https://www.microsoft.com/en-us/research/people/reidan/">Reid Andersen</a>, Georg Buscher, <a href="https://www.microsoft.com/en-us/research/people/counts/">Scott Counts</a>, Deepak Gupta, <a href="https://www.microsoft.com/en-us/research/people/brhecht/">Brent Hecht</a>, Dhruv Joshi, <a href="https://www.microsoft.com/en-us/research/people/sjauhar/">Sujay Kumar Jauhar</a>, Ying-Chun Lin, Sathish Manivannan, <a href="https://www.microsoft.com/en-us/research/people/jenneville/">Jennifer Neville</a>, Nagu Rangan, Chirag Shah, Dolly Sobhani, <a href="https://www.microsoft.com/en-us/research/people/suri/">Siddharth Suri</a>, <a href="https://www.microsoft.com/en-us/research/people/tarasafavi/">Tara Safavi</a>, <a href="https://www.microsoft.com/en-us/research/people/teevan/">Jaime Teevan</a>, <a href="https://www.microsoft.com/en-us/research/people/satiwary/">Saurabh Tiwary</a>, <a href="https://www.microsoft.com/en-us/research/people/mengtwan/">Mengting Wan</a>, <a href="https://www.microsoft.com/en-us/research/people/ryenw/">Ryen W. White</a>, <a href="https://www.microsoft.com/en-us/research/people/xiaso/">Xia Song</a>, Jack W. Stokes, Xiaofeng Xu, and <a href="https://www.microsoft.com/en-us/research/people/loy/">Longqi Yang</a>.</p>
<hr class="wp-block-separator has-alpha-channel-opacity" />
<p><a href="https://www.microsoft.com/en-us/research/feed/#_ftnref1" id="_ftn1">[1]</a> <em>The research was performed only on fully de-identified interaction data from Copilot (web) consumers. No enterprise data was used per our commitment to enterprise customers. We have taken careful steps to protect user privacy and adhere to strict ethical and responsible AI standards. All personal, private or sensitive information was scrubbed and masked before conversations were used for the research. The access to the dataset is strictly limited to approved researchers. The study was reviewed and approved by our institutional review board (IRB).</em></p>
<span class="sr-only" id="label-external-link">Opens in a new tab</span><p>The post <a href="https://www.microsoft.com/en-us/research/blog/learning-from-interaction-with-microsoft-copilot-web/">Learning from interaction with Microsoft Copilot (web)</a> appeared first on <a href="https://www.microsoft.com/en-us/research">Microsoft Research</a>.</p>Controlling cloud costs: Where to start, and where to go from there2024-03-28T01:16:30.698000ZRyan Donovanhttps://stackoverflow.blog/2024/03/27/controlling-cloud-costs-where-to-start-and-where-to-go-from-there/<table style="border: 1px solid #E0E0E0; margin: 0; padding: 0; background-color: #F0F0F0" valign="top" align="left" cellpadding="0" width="100%">
<tr>
<td rowspan="2" style="padding: 6px;width: 36px;white-space:nowrap" width="36" valign="top"><img src="https://www.gravatar.com/avatar/19ac6a9d902c1d6ae33f41405e47b385" style="width: 36px; height: 36px; border-radius: 4px;"></td>
<td width="100%" style="padding-top: 6px;">
<b>
alvinashcraft
<a href="https://alvinashcraft.newsblur.com/story/controlling-cloud-co/6025048:09d035">shared this story</a>
from <img src="https://s3.amazonaws.com/icons.newsblur.com/6025048.png" style="vertical-align: middle;width:16px;height:16px;"> Stack Overflow Blog.</b>
</td>
</tr>
</table>
<hr style="clear: both; margin: 0 0 24px;">
In this episode, Ben and Ryan are joined by Joshua Fox, a senior cloud architect at DoiT, to discuss cloud cost optimization. They explore the importance of controlling and understanding cloud costs, the role of good architecture in cost optimization, and strategies for dealing with surprise costs.We're flipping the script2024-03-28T01:15:32.013000ZChangelog Mediahttps://changelog.com/podcast/584<table style="border: 1px solid #E0E0E0; margin: 0; padding: 0; background-color: #F0F0F0" valign="top" align="left" cellpadding="0" width="100%">
<tr>
<td rowspan="2" style="padding: 6px;width: 36px;white-space:nowrap" width="36" valign="top"><img src="https://www.gravatar.com/avatar/19ac6a9d902c1d6ae33f41405e47b385" style="width: 36px; height: 36px; border-radius: 4px;"></td>
<td width="100%" style="padding-top: 6px;">
<b>
alvinashcraft
<a href="https://alvinashcraft.newsblur.com/story/were-flipping-the-sc/151979:6a8af7">shared this story</a>
from <img src="https://s3.amazonaws.com/icons.newsblur.com/151979.png" style="vertical-align: middle;width:16px;height:16px;"> The Changelog: Software Development, Open Source.</b>
</td>
</tr>
</table>
<hr style="clear: both; margin: 0 0 24px;">
<p>Script flipped! Today we’re sharing two interviews of us on Other People’s Podcasts (OPP): Kathrine Druckman from the <a href="https://www.intel.com/content/www/us/en/developer/topic-technology/open/podcast.html">Open at Intel</a> podcast invited us on the show at KubeCon NA in November and Den Delimarsky hosted Jerod on <a href="https://theworkitem.com">The Work Item</a> podcast in February.</p>
<p><a href="https://changelog.com/podcast/584/discuss">Leave us a comment</a></p>
<p><a href="https://changelog.com/++" rel="payment">Changelog++</a> members save 11 minutes on this episode because they made the ads disappear. Join today!</p>
<p>Sponsors:</p>
<p><ul>
<li><a href="https://www.synadia.com/changelog">Synadia</a> – <strong>Take NATS to the next level</strong> via a global, multi-cloud, multi-geo and extensible service, fully managed by Synadia. They take care of all the infrastructure, management, monitoring, and maintenance for you so you can focus on building exceptional distributed applications.
</li><li><a href="https://firehydrant.com/signals">FireHydrant</a> – <strong>The alerting and on-call tool designed for humans, not systems.</strong> Signals puts teams at the center, giving you ultimate control over rules, policies, and schedules. No need to configure your services or do wonky work-arounds. Signals filters out the noise, alerting you only on what matters. Manage coverage requests and on-call notifications effortlessly within Slack. But here’s the game-changer…Signals natively integrates with FireHydrant’s full incident management suite, so as soon as you’re alerted you can seamlessly kickoff and manage your entire incident inside a single platform. Learn more or switch today at <a href="https://firehydrant.com/signals">firehydrant.com/signals</a>
</li><li><a href="https://www.cloudflare.com/developerweek">Cloudflare</a> – Cloudflare’s Developer Week is happening April 1-5, 2024. Also you can hang with Adam and the rest of the folks at Cloudflare at the Cloudflare offices in Austin, TX on Wednesday, April 3rd at 5:30pm — <a href="https://cloudflaresdeveloperweekcelebr.splashthat.com">register here</a>.
</li>
</ul></p>
<p>Featuring:</p>
<p><ul><li>Katherine Druckman – <a href="https://reality2.social/@katherined" rel="external ugc">Mastodon</a>, <a href="https://twitter.com/katherined" rel="external ugc">Twitter</a>, <a href="https://www.linkedin.com/in/katherinedruckman" rel="external ugc">LinkedIn</a></li><li>Den Delimarsky – <a href="https://twitter.com/denniscode" rel="external ugc">Twitter</a>, <a href="https://github.com/dend" rel="external ugc">GitHub</a>, <a href="https://www.linkedin.com/in/dendeli" rel="external ugc">LinkedIn</a>, <a href="https://den.dev/" rel="external ugc">Website</a></li><li>Adam Stacoviak – <a href="https://changelog.social/@adam" rel="external ugc">Mastodon</a>, <a href="https://twitter.com/adamstac" rel="external ugc">Twitter</a>, <a href="https://github.com/adamstac" rel="external ugc">GitHub</a>, <a href="https://www.linkedin.com/in/adamstacoviak" rel="external ugc">LinkedIn</a>, <a href="https://adamstacoviak.com/" rel="external ugc">Website</a></li><li>Jerod Santo – <a href="https://changelog.social/@jerod" rel="external ugc">Mastodon</a>, <a href="https://twitter.com/jerodsanto" rel="external ugc">Twitter</a>, <a href="https://github.com/jerodsanto" rel="external ugc">GitHub</a>, <a href="https://www.linkedin.com/in/jerodsanto" rel="external ugc">LinkedIn</a></li></ul></p>
<p>Show Notes:</p>
<p><ul>
<li><a href="https://www.intel.com/content/www/us/en/developer/topic-technology/open/podcast.html">Open at Intel</a> <a href="https://www.intel.com/content/www/us/en/developer/articles/community/changelog-show-talks-about-the-art-of-the-podcast.html">Our episode</a></li>
<li><a href="https://theworkitem.com/">The Work Item</a> (<a href="https://theworkitem.com/blog/give-people-what-they-came-for-jerod-santo/">Jerod’s episode</a>)</li>
</ul>
</p>
<p>Something missing or broken? <a href="https://github.com/thechangelog/show-notes/blob/master/podcast/the-changelog-584.md">PRs welcome!</a></p><br><br>
<audio controls="controls" preload="none">
<source src="https://op3.dev/e/https://cdn.changelog.com/uploads/podcast/584/the-changelog-584.mp3" type="audio/mpeg" />
</audio><br><br>
Download audio: <a href="https://op3.dev/e/https://cdn.changelog.com/uploads/podcast/584/the-changelog-584.mp3">https://op3.dev/e/https://cdn.changelog.com/uploads/podcast/584/the-changelog-584.mp3</a>IoT Coffee Talk: Episode 202 - Farts in Space!! (The Carbon Emissions Episode)2024-03-28T01:15:24.958000ZIot Coffee Talkhttp://www.youtube.com/watch?v=_1YLPZVtbhI<table style="border: 1px solid #E0E0E0; margin: 0; padding: 0; background-color: #F0F0F0" valign="top" align="left" cellpadding="0" width="100%">
<tr>
<td rowspan="2" style="padding: 6px;width: 36px;white-space:nowrap" width="36" valign="top"><img src="https://www.gravatar.com/avatar/19ac6a9d902c1d6ae33f41405e47b385" style="width: 36px; height: 36px; border-radius: 4px;"></td>
<td width="100%" style="padding-top: 6px;">
<b>
alvinashcraft
<a href="https://alvinashcraft.newsblur.com/story/iot-coffee-talk-epis/8951215:2775d7">shared this story</a>
from <img src="https://s3.amazonaws.com/icons.newsblur.com/8951215.png" style="vertical-align: middle;width:16px;height:16px;"> Iot Coffee Talk.</b>
</td>
</tr>
</table>
<hr style="clear: both; margin: 0 0 24px;">
<div class="NB-youtube-player">
<iframe allowfullscreen="true" src="https://www.youtube.com/embed/_1YLPZVtbhI?iv_load_policy=3"></iframe>
</div>
<div class="NB-youtube-stats"><small>
<b>From:</b> <a href="https://www.youtube.com/channel/UC__h4YtveUjhjsRjCvBpG4A">Iot Coffee Talk</a><br />
<b>Duration:</b> 1:03:37<br />
</small></div><hr />
<div class="NB-youtube-description"><p>Welcome to IoT Coffee Talk, where hype comes to die a terrible death. We have a fireside chat about all things #IoT over a cup of coffee or two with some of the industry's leading business minds, thought leaders and technologists in a totally unscripted, organic format. </p>
<p>This week, Pete, Rob, Leonard, Jan, Andreea, Steve, Dimitri and Bill jump on Web3 to talk about:</p>
<p>* BAD KARAOKE: "Everlong", Foo Fighters<br />* Pete breaks down his impressions and takes from NVIDIA GTC 2024<br />* Adobe Firefly and finding value of generative AI in isolation<br />* Public acceptance of stuff that is not prime time. Is that cool? Is that okay?<br />* The great generative AI security gap <br />* The Battlestar Galactica of Gen AI<br />* Farts in Spaaaaaaaace!!<br />* Rob sports a Superman curly Q!<br />* Rob's report out on the Carbon Tracking & Reporting Conference 2024 in Houston! <br />* Sustainability innovation born out of necessity<br />* Jan gives everyone an Industry 4.0 update!<br />* What comes next? Industry 5.0? 4.5? 3.7? Industry 4.0 wants to know!<br />* What is transparency?<br />* Fleet management has been an aspiration in many sectors. What can make it happen?<br />* Why IoT Coffee Talk is the only X-rated IoT tech show in the known Metaverse!</p>
<p>It's a great episode. Grab an extraordinarily expensive latte at your local coffee shop and check out the whole thing. You will get all you need to survive another week in the world of IoT and greater tech!</p>
<p>Tune in! Like! Share! Comment and share your thoughts on IoT Coffee Talk, the greatest weekly assembly of Onalytica and CBT tech and IoT influencers on the planet!!</p>
<p>If you are interested in sponsoring an episode, please contact Stephanie Atkinson at Elevate Our Kids. Just make a minimum donation to <a href="http://www.elevateourkids.org">www.elevateourkids.org</a> and you can jump on and hang with the gang and amplify your brand on one of the top IoT/Tech podcasts in the known metaverse!!!</p>
<p>Take IoT Coffee Talk on the road with you on your favorite podcast platform. Go to IoT Coffee Talk on BuzzSprout, like, subscribe, and share: <a href="https://iotcoffeetalk.buzzsprout.com">https://iotcoffeetalk.buzzsprout.com</a></p></div>
<img src="https://i.ytimg.com/vi/_1YLPZVtbhI/maxresdefault.jpg" style="display:none" />How to Use jQuery’s ajax() Function for Asynchronous HTTP Requests2024-03-27T21:05:01.820000ZAurelio De Rosa, Maria Antonietta Pernahttps://www.sitepoint.com/use-jquerys-ajax-function/?utm_source=rss<table style="border: 1px solid #E0E0E0; margin: 0; padding: 0; background-color: #F0F0F0" valign="top" align="left" cellpadding="0" width="100%">
<tr>
<td rowspan="2" style="padding: 6px;width: 36px;white-space:nowrap" width="36" valign="top"><img src="https://www.gravatar.com/avatar/19ac6a9d902c1d6ae33f41405e47b385" style="width: 36px; height: 36px; border-radius: 4px;"></td>
<td width="100%" style="padding-top: 6px;">
<b>
alvinashcraft
<a href="https://alvinashcraft.newsblur.com/story/how-to-use-jquerys-a/8334867:cddb6a">shared this story</a>
from <img src="https://s3.amazonaws.com/icons.newsblur.com/8334867.png" style="vertical-align: middle;width:16px;height:16px;"> SitePoint.</b>
</td>
</tr>
</table>
<hr style="clear: both; margin: 0 0 24px;">
<a href="https://www.sitepoint.com/use-jquerys-ajax-function/?utm_source=rss" rel="nofollow" title="How to Use jQuery’s ajax() Function for Asynchronous HTTP Requests">
<img alt="How to Use jQuery's $.ajax() for Asynchronous HTTP Requests" class="webfeedsFeaturedVisual" src="https://uploads.sitepoint.com/wp-content/uploads/2015/08/1588210620jquery-ajax.png" style="display: block; margin: auto; margin-bottom: 5px;" />
</a>
Discover how to master AJAX in jQuery for powerful asynchronous HTTP requests. Learn to control AJAX calls with detailed examples and tips.
<p>
Continue reading
<a href="https://www.sitepoint.com/use-jquerys-ajax-function/?utm_source=rss" rel="nofollow">How to Use jQuery’s ajax() Function for Asynchronous HTTP Requests</a>
on <a href="https://www.sitepoint.com" rel="nofollow">SitePoint</a>.
</p>Azure SDK Release (March 2024)2024-03-27T21:04:50.985000ZHector Norzagarayhttps://devblogs.microsoft.com/azure-sdk/azure-sdk-release-march-2024/<table style="border: 1px solid #E0E0E0; margin: 0; padding: 0; background-color: #F0F0F0" valign="top" align="left" cellpadding="0" width="100%">
<tr>
<td rowspan="2" style="padding: 6px;width: 36px;white-space:nowrap" width="36" valign="top"><img src="https://www.gravatar.com/avatar/19ac6a9d902c1d6ae33f41405e47b385" style="width: 36px; height: 36px; border-radius: 4px;"></td>
<td width="100%" style="padding-top: 6px;">
<b>
alvinashcraft
<a href="https://alvinashcraft.newsblur.com/story/azure-sdk-release-ma/7922028:9e6221">shared this story</a>
from <img src="https://s3.amazonaws.com/icons.newsblur.com/7922028.png" style="vertical-align: middle;width:16px;height:16px;"> Azure SDK Blog.</b>
</td>
</tr>
</table>
<hr style="clear: both; margin: 0 0 24px;">
<p>Thank you for your interest in the new Azure SDKs! We release new features, improvements, and bug fixes every month. Subscribe to our <a href="https://devblogs.microsoft.com/azure-sdk/feed/">Azure SDK Blog RSS Feed</a> to get notified when a new release is available.</p>
<p>You can find links to packages, code, and docs on our <a href="https://aka.ms/azsdk/releases">Azure SDK Releases page</a>.</p>
<h2 id="give-feedback">Give Feedback</h2>
<p>If you’ve been using the Azure SDK, we’d love to hear your thoughts! Complete <a href="https://aka.ms/azsdk/blog-survey">the survey</a>!</p>
<h2 id="release-highlights">Release highlights</h2>
<ul>
<li>Azure SDK for Python (Conda)
<ul>
<li>New Python (Conda) packages are available in the <a href="https://anaconda.org/microsoft">Microsoft channel</a>.</li>
</ul>
</li>
</ul>
<h3 id="initial-stable-releases">Initial Stable Releases</h3>
<ul>
<li>Client Libraries for .NET
<ul>
<li>Communication Messages</li>
</ul>
</li>
<li>Client Libraries for Java
<ul>
<li>Communication Messages</li>
</ul>
</li>
<li>Management Libraries for .NET
<ul>
<li>IoT Firmware Defense</li>
</ul>
</li>
<li>Management Libraries for Go
<ul>
<li>API Center</li>
</ul>
</li>
<li>Management Libraries for Java
<ul>
<li>API Center</li>
</ul>
</li>
<li>Management Libraries for JavaScript
<ul>
<li>API Center</li>
</ul>
</li>
<li>Management Libraries for Python
<ul>
<li>API Center</li>
</ul>
</li>
</ul>
<h3 id="initial-beta-releases">Initial Beta Releases</h3>
<ul>
<li>Client Libraries for .NET
<ul>
<li>Defender EASM and Health Insights</li>
</ul>
</li>
<li>Client Libraries for Go
<ul>
<li>Web PubSub, Event Grid, Monitor Query for Logs, Monitor Query for Metrics, and OpenAI Assistants</li>
</ul>
</li>
<li>Client Libraries for Java
<ul>
<li>Health Insights Radiology Insights and Purview DataMap</li>
</ul>
</li>
<li>Client Libraries for JavaScript
<ul>
<li>Health Insights Radiology Insights and Purview DataMap</li>
</ul>
</li>
<li>Client Libraries for Python
<ul>
<li>Health Insights Radiology Insights and Microsoft Purview</li>
</ul>
</li>
<li>Management Libraries for Go
<ul>
<li>Astro, Large Instance, and Storage Actions</li>
</ul>
</li>
<li>Management Libraries for Java
<ul>
<li>Astro and Large Instance</li>
</ul>
</li>
<li>Management Libraries for JavaScript
<ul>
<li>Astro, Azure Large Instance, and Spring App Discovery</li>
</ul>
</li>
<li>Management Libraries for Python
<ul>
<li>Astro and Large Instance</li>
</ul>
</li>
</ul>
<h2 id="supportability">Supportability</h2>
<p>Python libraries stopped supporting Python 3.7 in December 2023. The next minor version, Python 3.8, is supported until April 2025. For more information, see the <a href="https://github.com/Azure/azure-sdk-for-python/wiki/Azure-SDKs-Python-version-support-policy">Azure SDK for Python version support policy</a>.</p>
<p>Numerous older Azure SDK libraries, which weren’t compliant with the <a href="https://azure.github.io/azure-sdk/general_introduction.html">Azure SDK Guidelines</a>, were retired (deprecated) in 2023. Our next deprecation milestone is March 2024. While no code stops working, support and updates end when a library reaches retirement. You can see a list of retired libraries along with their replacement libraries at <a href="https://azure.github.io/azure-sdk/releases/deprecated/index.html">Azure SDK Deprecated Releases</a>.</p>
<h2 id="release-notes">Release notes</h2>
<p>For a list of language-specific release notes, see the following links:</p>
<ul>
<li><a href="https://azure.github.io/azure-sdk/releases/2024-03/index.html">All</a></li>
<li><a href="https://azure.github.io/azure-sdk/releases/2024-03/dotnet.html">.NET</a></li>
<li><a href="https://azure.github.io/azure-sdk/releases/2024-03/java.html">Java</a></li>
<li><a href="https://azure.github.io/azure-sdk/releases/2024-03/python.html">Python</a></li>
<li><a href="https://azure.github.io/azure-sdk/releases/2024-03/js.html">JavaScript/TypeScript</a></li>
<li><a href="https://azure.github.io/azure-sdk/releases/2024-03/go.html">Go</a></li>
<li><a href="https://azure.github.io/azure-sdk/releases/2024-03/cpp.html">C++</a></li>
<li><a href="https://azure.github.io/azure-sdk/releases/2024-03/c.html">Embedded C</a></li>
<li><a href="https://azure.github.io/azure-sdk/releases/2024-03/android.html">Android</a></li>
<li><a href="https://azure.github.io/azure-sdk/releases/2024-03/ios.html">iOS</a></li>
</ul>
<p>The post <a href="https://devblogs.microsoft.com/azure-sdk/azure-sdk-release-march-2024/">Azure SDK Release (March 2024)</a> appeared first on <a href="https://devblogs.microsoft.com/azure-sdk">Azure SDK Blog</a>.</p>Public preview of SharePoint Framework 1.19 – First release of upcoming features2024-03-27T21:04:41.200000ZVesa Juvonenhttps://devblogs.microsoft.com/microsoft365dev/public-preview-of-sharepoint-framework-1-19-first-release-of-upcoming-features/<table style="border: 1px solid #E0E0E0; margin: 0; padding: 0; background-color: #F0F0F0" valign="top" align="left" cellpadding="0" width="100%">
<tr>
<td rowspan="2" style="padding: 6px;width: 36px;white-space:nowrap" width="36" valign="top"><img src="https://www.gravatar.com/avatar/19ac6a9d902c1d6ae33f41405e47b385" style="width: 36px; height: 36px; border-radius: 4px;"></td>
<td width="100%" style="padding-top: 6px;">
<b>
alvinashcraft
<a href="https://alvinashcraft.newsblur.com/story/public-preview-of-sh/8914242:71948c">shared this story</a>
from <img src="https://s3.amazonaws.com/icons.newsblur.com/8914242.png" style="vertical-align: middle;width:16px;height:16px;"> Microsoft 365 Developer Blog.</b>
</td>
</tr>
</table>
<hr style="clear: both; margin: 0 0 24px;">
<p>We are excited to announce the availability of the first <strong>public preview of the SharePoint Framework (SPFx) 1.19 – with updates for Microsoft Viva, Microsoft Teams and SharePoint Online</strong> experiences. This is the baseline release for the upcoming 1.19 release focused primarily on the new features within the Microsoft Viva side and on technical dependency updates. We will be rolling out several capabilities and features to the preview, before it’s generally available and ready for production usage.</p>
<p>We are looking into providing the general availability (GA) version in spring 2024 (April/May). As with previous preview releases, our objective is to provide more insights on the upcoming features and to provide our worldwide ecosystem an option to directly influence on the released capabilities. Your feedback is welcome. <img alt="👋" class="wp-smiley" src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f44b.png" style="height: 1em;" /></p>
<p>You can find full list of release details from the following documentation:</p>
<ul>
<li class=""><a href="https://docs.microsoft.com/en-us/sharepoint/dev/spfx/release-1.19" rel="noopener" target="_blank">SharePoint Framework 1.19 preview release notes</a></li>
</ul>
<h2 id="whats-updated-on-this-latest-beta-version">Key features in the 1.19 preview release <img alt="📝" class="wp-smiley" src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f4dd.png" style="height: 1em;" /><i class="fabric-icon fabric-icon--Link"></i></h2>
<p>Key changes and updates in this preview release are as follows:</p>
<ul>
<li>Introduction of new layout options for the Viva Connections card view – specifically new text box layout for example for surveys and search scenarios
<ul>
<li>See below video and sample code for more details on the option</li>
</ul>
</li>
<li>Webpack 5 support</li>
<li>Buildtime packages release is decoupled from the SPFx release</li>
<li>Numerous other improvements and adjustments based on the reported issues by customers and partners</li>
</ul>
<p style="padding-left: 40px;"><a href="https://devblogs.microsoft.com/microsoft365dev/wp-content/uploads/sites/73/2024/03/chart-card-viva-connections.png"><img alt="Image chart card viva connections" class="alignnone size-full wp-image-20010" height="218" src="https://devblogs.microsoft.com/microsoft365dev/wp-content/uploads/sites/73/2024/03/chart-card-viva-connections.png" width="601" /></a></p>
<p>and more <img alt="🚀" class="wp-smiley" src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f680.png" style="height: 1em;" /></p>
<p>As part of the preview release, we also provide following new code sample showcasing the chart card experience for the Microsoft Viva</p>
<ul>
<li><a href="https://github.com/pnp/sp-dev-fx-aces/tree/main/samples/ChartCard-ThreeSeries">Chart card layout option for the Viva Connections</a></li>
</ul>
<p>Usage and creation of chart card layout option is demonstrated in the below video.</p>
<p><iframe height="360" src="https://www.youtube.com/embed/JOIb4KhiWAI?feature=oembed" title="Introducing new Viva Connections chart card layout option" width="640"></iframe></p>
<p>We will be including additional new features for the 1.19 general availability, so this is just a start with initial baseline features.</p>
<h2 id="installing-sharepoint-framework-1-13-preview">Installing SharePoint Framework 1.19 preview <img alt="👩💻" class="wp-smiley" src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f469-200d-1f4bb.png" style="height: 1em;" /><i class="fabric-icon fabric-icon--Link"></i></h2>
<p>You can install <strong>preview of the SharePoint Framework 1.19 </strong>by using the following command which will always install the latest preview packages.</p>
<pre tabindex="0"><span class="pl-c1">npm install @microsoft/generator-sharepoint@next --global
</span></pre>
<h2 id="whats-sharepoint-framework">What’s SharePoint Framework? <img alt="🚀" class="wp-smiley" src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f680.png" style="height: 1em;" /><i class="fabric-icon fabric-icon--Link"></i></h2>
<p>SharePoint Framework is a widely used extensibility option in <span class="brand">Microsoft 365</span> with <strong>tens of millions of end users each month for the custom components built by developers for Microsoft Teams, Microsoft Viva and SharePoint</strong>. It’s the easiest way to build developer extensibility for <span class="brand">Microsoft 365</span> and it’s taken advantage by thousands of partners and customers on building custom experiences for end users.</p>
<p>You can build SharePoint Framework powered solutions by using <a href="https://learn.microsoft.com/en-us/microsoftteams/platform/toolkit/teams-toolkit-fundamentals?pivots=visual-studio-code">Microsoft Teams Toolkit</a>, <a href="https://learn.microsoft.com/en-us/sharepoint/dev/spfx/set-up-your-development-environment">SharePoint Framework Yeoman Generator</a> or with the <a href="https://github.com/pnp/vscode-viva">Microsoft Viva Toolkit</a>. Key advantage is the flexibility of automatic hosting with the option to use the exact same component across the different hosts without any code level changes. This is designed to maximize the value of your development investments regardless of which primary host you are targeting.</p>
<p class="">Key capabilities of the SharePoint Framework for <span class="brand">Microsoft 365</span> are following:</p>
<ul>
<li><b>Content Driven Applications </b>– SharePoint Framework can be used to build content driven applications on surfacing information easily from Microsoft 365 with Microsoft Graph or to integrate with externally hosted content.</li>
<li><strong>Automatic Single Sign On</strong> – SharePoint Framework components have automatic and seamless SSO included for all platforms they are hosted. No specific consents needed from Microsoft 365 end users.</li>
<li><strong>Automatic hosting</strong> – SharePoint Framework components are automatically hosted in SharePoint without additional maintenance or operational costs.</li>
<li><strong>Industry standard tooling</strong> – SharePoint Framework is using standard web stack tooling with node, npm, TypeScript and any JavaScript framework of your preference. Just standard web skill to succeed without any proprietary tooling.</li>
</ul>
<p>SharePoint Framework has also made the permission and token management for accessing the data in <span class="brand">Microsoft 365</span> easy. You will be using the awesome <strong>Microsoft Graph APIs</strong> for accessing business data and you can further simplify the development of SharePoint Framework components by taking advantage of the <strong>Microsoft Graph Toolkit</strong>, which provides reusable controls with data connectivity to Microsoft Graph.</p>
<pre tabindex="0"><span class="pl-c1"><a href="https://devblogs.microsoft.com/microsoft365dev/wp-content/uploads/sites/73/2023/02/spfx-across-m365-hosts-features-spfx.png"><img alt="Image showing SharePoint Framework across Microsoft 365 host features" class="aligncenter wp-image-12835 size-full" height="675" src="https://devblogs.microsoft.com/microsoft365dev/wp-content/uploads/sites/73/2023/02/spfx-across-m365-hosts-features-spfx.png" width="1199" /></a>
</span></pre>
<h2 id="additional-resources-and-support">Additional resources and support <img alt="🤝" class="wp-smiley" src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f91d.png" style="height: 1em;" /><i class="fabric-icon fabric-icon--Link"></i></h2>
<ul>
<li>
<ul>
<li>Please report any issues or feedback using following issue list – <a href="https://aka.ms/spfx-issues">https://aka.ms/spfx-issues</a>
<ul>
<li>We have engineering people monitoring any incoming issues and helping you to get unblocked or getting your questions answered</li>
</ul>
</li>
<li><a href="https://docs.microsoft.com/en-us/sharepoint/dev/spfx/sharepoint-framework-overview?WT.mc_id=m365-47395-cxa">Overview documentation</a></li>
<li><a href="https://docs.microsoft.com/en-us/sharepoint/dev/spfx/web-parts/get-started/build-a-hello-world-web-part?WT.mc_id=m365-47395-cxa">Getting started documentation</a></li>
<li><a href="https://docs.microsoft.com/en-us/sharepoint/dev/spfx/build-for-teams-overview?WT.mc_id=m365-47395-cxa">Build for Microsoft Teams using SharePoint Framework</a></li>
<li><a href="https://learn.microsoft.com/en-us/sharepoint/dev/spfx/office/overview">Extend Outlook and Office with the SharePoint Framework</a></li>
<li><a href="https://docs.microsoft.com/en-us/sharepoint/dev/spfx/viva/overview-viva-connections?WT.mc_id=m365-47395-cxa">Overview of Viva Connections Extensibility</a></li>
<li><a href="https://aka.ms/m365/dev/learn/connections">Microsoft Learn – Extend Microsoft Viva Connections</a></li>
<li><a href="https://docs.microsoft.com/en-us/learn/paths/m365-sharepoint-associate/?WT.mc_id=m365-47395-cxa">Microsoft Learn – Extend Microsoft SharePoint – Associate</a></li>
<li><a href="https://marketplace.visualstudio.com/items?itemName=m365pnp.viva-connections-toolkit">Microsoft Viva Connections Toolkit – Simplify your development experience for Viva Connections</a></li>
<li><a href="https://pnp.github.io/cli-microsoft365/cmd/spfx/project/project-upgrade/" rel="noopener" target="_blank">CLI for Microsoft 365</a> – SharePoint Framework Upgrade tooling from previous versions to latest</li>
<li><a href="https://aka.ms/spfx-webparts" rel="noopener" target="_blank">SharePoint Framework web part samples</a></li>
<li><a href="https://aka.ms/viva/samples">Viva Connections samples</a></li>
</ul>
</li>
</ul>
<p>If you are looking to build experiences for <span class="brand">Microsoft 365</span>, we strongly recommend joining our community calls and other <a href="https://aka.ms/community/home"><span class="brand">Microsoft 365</span> & Power Platform Community</a> activities covering Microsoft Graph, Microsoft Teams, Power Platform, Microsoft Viva, OneDrive, SharePoint and more… More details here <a href="https://aka.ms/community/home">https://aka.ms/community/home</a> <img alt="🚀" class="wp-smiley" src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f680.png" style="height: 1em;" /></p>
<p>And, follow us on <a href="https://twitter.com/Microsoft365Dev">@Microsoft365Dev)/Twitter</a> to stay up to date on Microsoft 365 Platform announcements.</p>
<p class="">Happy coding! Sharing is caring! <a class="lightbox-link" href="https://s.w.org/images/core/emoji/13.1.0/svg/1f9e1.svg" rel="noopener" target="_blank"><img alt="🧡" class="emoji" draggable="false" src="https://s.w.org/images/core/emoji/13.1.0/svg/1f9e1.svg" /></a></p>
<p>The post <a href="https://devblogs.microsoft.com/microsoft365dev/public-preview-of-sharepoint-framework-1-19-first-release-of-upcoming-features/">Public preview of SharePoint Framework 1.19 – First release of upcoming features</a> appeared first on <a href="https://devblogs.microsoft.com/microsoft365dev">Microsoft 365 Developer Blog</a>.</p>Handling Form Field Data in Angular Applications2024-03-27T21:04:23.637000ZBjoern Meyer at Text Control GmbHhttps://www.textcontrol.com/blog/2024/03/27/handling-form-field-data-in-angular-applications/<table style="border: 1px solid #E0E0E0; margin: 0; padding: 0; background-color: #F0F0F0" valign="top" align="left" cellpadding="0" width="100%">
<tr>
<td rowspan="2" style="padding: 6px;width: 36px;white-space:nowrap" width="36" valign="top"><img src="https://www.gravatar.com/avatar/19ac6a9d902c1d6ae33f41405e47b385" style="width: 36px; height: 36px; border-radius: 4px;"></td>
<td width="100%" style="padding-top: 6px;">
<b>
alvinashcraft
<a href="https://alvinashcraft.newsblur.com/story/handling-form-field-/7044088:1c05f7">shared this story</a>
from <img src="https://s3.amazonaws.com/icons.newsblur.com/7044088.png" style="vertical-align: middle;width:16px;height:16px;"> Text Control Blog.</b>
</td>
</tr>
</table>
<hr style="clear: both; margin: 0 0 24px;">
<p>The Document Viewer in Angular can be used to fill form fields in documents. In this article, we will show how to handle the filled form field data in Angular applications.</p><p><a href="https://www.textcontrol.com/blog/2024/03/27/handling-form-field-data-in-angular-applications/" title="Handling Form Field Data in Angular Applications">Read more</a></p><br><br><img src="https://s1-www.textcontrol.com/application-1.7115.67202/blog/2024/03/27/a/assets/thumbnail.jpg" />Mocking SvelteKit Stores in Storybook2024-03-27T21:04:18.223000Zhttps://tylergaw.com/blog/mocking-sveltekit-stores-in-storybook/<table style="border: 1px solid #E0E0E0; margin: 0; padding: 0; background-color: #F0F0F0" valign="top" align="left" cellpadding="0" width="100%">
<tr>
<td rowspan="2" style="padding: 6px;width: 36px;white-space:nowrap" width="36" valign="top"><img src="https://www.gravatar.com/avatar/19ac6a9d902c1d6ae33f41405e47b385" style="width: 36px; height: 36px; border-radius: 4px;"></td>
<td width="100%" style="padding-top: 6px;">
<b>
alvinashcraft
<a href="https://alvinashcraft.newsblur.com/story/mocking-sveltekit-st/1308583:9a7101">shared this story</a>
from <img src="https://s3.amazonaws.com/icons.newsblur.com/1308583.png" style="vertical-align: middle;width:16px;height:16px;"> Tyler Gaw's blog.</b>
</td>
</tr>
</table>
<hr style="clear: both; margin: 0 0 24px;">
<p>If you’re using SvelteKit with Storybook and the <a href="https://github.com/storybookjs/addon-svelte-csf">Svelte Story Format addon</a> and need a way to mock built in <code>$app/stores</code> in stories, this post is for you. This was written using the following versions:</p>
<ul>
<li>Svelte 4</li>
<li>SvelteKit 2</li>
<li>Storybook 7</li>
<li>addon-svelte-csf 4</li>
</ul>
<p>If you’re using newer versions, there’s a chance the examples here won’t work the same or at all.</p>
<h2>The Component</h2>
<p>Say we have a small component that gets data from the <code>page</code> store.</p>
<pre><code class="language-javascript">// MyComponent.svelte
<script>
import { page } from '$app/stores'
</script>
<a href={$page.data.href}>{$page.data.text}</a>
</code></pre>
<p>To create Stories for it, we use the following reduced example from the <code>svelte-csf</code> docs:</p>
<pre><code class="language-javascript">// MyComponent.stories.svelte
<script context="module">
import MyComponent from './MyComponent.svelte'
export const meta = {
title: 'MyComponent',
component: MyComponent
}
</script>
<script>
import { Story, Template } from '@storybook/addon-svelte-csf'
</script>
<Template let:args>
<MyComponent {...args} />
</Template>
<Story name="Default" />
</code></pre>
<p>If we start up Storybook and try to view <code>MyComponent</code>, we’ll get a big error.</p>
<figure>
<img alt="Screenshot of an error in Storybook when trying to view MyComponent" src="https://stuff.tylergaw.com/post-mocking-sveltekit-stores/storybook-error.jpg" />
<figcaption>fig 1: The error we see on first run</figcaption>
</figure>
<p>There’s a lot of error stuff there, but the key part is right at the top.</p>
<pre><code class="language-html">Cannot read properties of undefined (reading 'data')</code></pre>
<p>That makes sense, because in <code>MyComponent</code> we’re trying to access members of <code>$page.data</code> in two places. In this context, <code>$page</code> is <code>undefined</code>, so that means <code>data</code> is also <code>undefined</code>.</p>
<p>We could update <code>MyComponent</code> to guard against throwing an error by making sure these objects exist before trying to use them, but then we wouldn’t have an <code>href</code> or <code>text</code> value visible in <code>MyComponent</code> stories.</p>
<p>What we need is for the stories to have access to a <code>$page</code> object in the same way it does in regular usage.</p>
<h2>Use Context</h2>
<p>This took me a while to track down and I never found full example of it, but I was able to piece together that we can use <a href="https://svelte.dev/docs/svelte#setcontext">Svelte context</a> to mock <code>page</code> (and other) stores. The most helpful clue was a partial example from this <a href="https://www.reddit.com/r/sveltejs/comments/pakmb1/has_anyone_managed_to_mock_page_from_appstores/">3+ year old Reddit thread</a>.</p>
<p>We’ll use the <code>setContext</code> function to manually define <code>$page.data</code>. First we need to know what name Svelte uses for page context. In <code>MyComponent.stories.svelte</code> use <code>getAllContexts</code> to see what’s available:</p>
<pre><code class="language-javascript">// MyComponent.stories.svelte
//...
<script>
import { Story, Template } from '@storybook/addon-svelte-csf'
// Note: we can only use Svelte context functions in scripts without context="module"
import { getAllContexts } from 'svelte'
console.log(getAllContexts())
</script>
//...
</code></pre>
<p>This gives us a <code>Map</code> of all the contexts we have access to in <code>MyComponent</code>.</p>
<figure>
<img alt="Screenshot from Chrome devtools showing the Map logged from invoking getAllContexts()" src="https://stuff.tylergaw.com/post-mocking-sveltekit-stores/all-contexts.jpg" />
<figcaption>fig 2: The Map showing all available contexts</figcaption>
</figure>
<p>The keys are what we’re interested in, and with the exception of the storybook keys, they should look familiar. Each one matches an available <a href="https://kit.svelte.dev/docs/modules#$app-stores"><code>$app/stores</code> module</a>. We need to mock the page store, so we’ll use "page-ctx" as our context. We do that in <code>MyComponent.stories</code>:</p>
<pre><code class="language-javascript">// MyComponent.stories.svelte
//...
<script>
import { Story, Template } from '@storybook/addon-svelte-csf'
// Note: we can only use Svelte context functions in scripts without context="module"
import { setContext } from 'svelte'
setContext('page-ctx', {
data: {
href: '/some/href/we/want',
text: 'My Link Text'
}
})
</script>
//...
</code></pre>
<p>The second parameter of <code>setContext</code> takes any value and assigns it to <code>$page</code>. In our case, <code>MyComponent</code> expects a <code>data</code> object with <code>href</code> and <code>text</code> members. Here, we manually create the object so accessing <code>$page.data.*</code> works as expected in <code>MyComponent</code> stories. If we reload the <code>MyComponent</code> story we see the expected link.</p>
<h2>What else?</h2>
<p>This example is specific to issues I’d been running into for weeks <a href="https://www.summer.io/">at work</a>, but I’m sure this approach of using context for mocking has more uses.</p>Beautiful .NET Test Reports Using GitHub Actions2024-03-27T21:04:10.163000ZSean Killeen (SeanKilleen@gmail.com)https://seankilleen.com/2024/03/beautiful-net-test-reports-using-github-actions/<table style="border: 1px solid #E0E0E0; margin: 0; padding: 0; background-color: #F0F0F0" valign="top" align="left" cellpadding="0" width="100%">
<tr>
<td rowspan="2" style="padding: 6px;width: 36px;white-space:nowrap" width="36" valign="top"><img src="https://www.gravatar.com/avatar/19ac6a9d902c1d6ae33f41405e47b385" style="width: 36px; height: 36px; border-radius: 4px;"></td>
<td width="100%" style="padding-top: 6px;">
<b>
alvinashcraft
<a href="https://alvinashcraft.newsblur.com/story/beautiful-net-test-r/7278072:fe8415">shared this story</a>
from <img src="https://s3.amazonaws.com/icons.newsblur.com/7278072.png" style="vertical-align: middle;width:16px;height:16px;"> SeanKilleen.com.</b>
</td>
</tr>
</table>
<hr style="clear: both; margin: 0 0 24px;">
<p>I know some folks who would like to move to GitHub Actions from Azure DevOps, but would really miss the “Test View” that Azure DevOps provides. Let’s see if we can work some magic with GitHub Actions to get us close to that within GitHub.</p>
<h2 id="goals">Goals</h2>
<ul>
<li>Work entirely within GitHub Actions</li>
<li>Show test results within a pull request</li>
<li>Show difference in number of tests</li>
<li>When tests fail, be able to quickly see which tests failed, and the failure/trace</li>
<li>Understand test coverage</li>
</ul>
<h2 id="sample-project">Sample Project</h2>
<p>I’ve created <a href="https://github.com/SeanKilleen/ExampleTestResultsWithGithubActions">a sample project that uses these techniques</a> at <a href="https://github.com/SeanKilleen/ExampleTestResultsWithGithubActions">https://github.com/SeanKilleen/ExampleTestResultsWithGithubActions</a>. Feel free to submit a pull request to see it in action!</p>
<h2 id="project-structure">Project Structure</h2>
<p>For the sample, I created a basic project structure that you might find in the wild:</p>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">ExampleTestResultsWithGithubActions.sln
src
/Project1
/Project2
test
/Project1.Tests
/Project2.Tests
</span></code></pre></div></div>
<h2 id="creating-the-github-action-for-our-build">Creating the GitHub Action for our Build</h2>
<p>I create a file at <a href="https://github.com/SeanKilleen/ExampleTestResultsWithGithubActions/blob/main/.github/workflows/build.yaml"><code class="language-plaintext highlighter-rouge">.github/workflows/build.yaml</code></a>. You can view the <a href="https://github.com/SeanKilleen/ExampleTestResultsWithGithubActions/blob/main/.github/workflows/build.yaml">full file contents</a> but I’ll break down the relevant portions below.</p>
<h2 id="enabling-permissions">Enabling Permissions</h2>
<p>Some of these steps need to write pull requests comments, etc. so in the job definition I include <code class="language-plaintext highlighter-rouge">permissions: write-all</code>. I probably could get away with less permissions, but for this example I’m living dangerously.</p>
<h2 id="setup-and-running-our-tests">Setup and Running our Tests</h2>
<p>First, I check out the code and set up .NET:</p>
<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Check out the code</span>
<span class="na">uses</span><span class="pi">:</span> <span class="s">actions/checkout@v4</span>
<span class="na">with</span><span class="pi">:</span>
<span class="na">fetch-depth</span><span class="pi">:</span> <span class="s">0</span>
<span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Setup .NET</span>
<span class="na">uses</span><span class="pi">:</span> <span class="s">actions/setup-dotnet@v4</span>
<span class="na">with</span><span class="pi">:</span>
<span class="na">dotnet-version</span><span class="pi">:</span> <span class="pi">|</span>
<span class="s">8.x</span>
</code></pre></div></div>
<p>Next, we run our tests:</p>
<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s2">"</span><span class="s">Restore/Build/Test"</span>
<span class="na">run</span><span class="pi">:</span> <span class="s">dotnet test --configuration Release --verbosity normal --logger trx --collect:"XPlat Code Coverage"</span>
</code></pre></div></div>
<p>A few things to note here:</p>
<ul>
<li>We’re specifically logging to TRX files, which will make our reporting easier later</li>
<li><code class="language-plaintext highlighter-rouge">--collect: "XPlat Code Coverage"</code> is a signal to Coverlet for the type of output it’s going to produce.</li>
<li>The projects themselves have the NUnit packages installed but also the <code class="language-plaintext highlighter-rouge">Coverlet.Collector</code> NuGet package.</li>
</ul>
<h2 id="reporting-code-coverage">Reporting Code Coverage</h2>
<p>First, we combine our coverage reports. This is because each project has its own coverage output, so we need to combine them.</p>
<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Combine Coverage Reports</span> <span class="c1"># This is because one report is produced per project, and we want one result for all of them.</span>
<span class="na">uses</span><span class="pi">:</span> <span class="s">danielpalme/ReportGenerator-GitHub-Action@5.2.4</span>
<span class="na">with</span><span class="pi">:</span>
<span class="na">reports</span><span class="pi">:</span> <span class="s2">"</span><span class="s">**/*.cobertura.xml"</span> <span class="c1"># REQUIRED # The coverage reports that should be parsed (separated by semicolon). Globbing is supported.</span>
<span class="na">targetdir</span><span class="pi">:</span> <span class="s2">"</span><span class="s">$"</span> <span class="c1"># REQUIRED # The directory where the generated report should be saved.</span>
<span class="na">reporttypes</span><span class="pi">:</span> <span class="s2">"</span><span class="s">Cobertura"</span> <span class="c1"># The output formats and scope (separated by semicolon) Values: Badges, Clover, Cobertura, CsvSummary, Html, Html_Dark, Html_Light, Html_BlueRed, HtmlChart, HtmlInline, HtmlInline_AzurePipelines, HtmlInline_AzurePipelines_Dark, HtmlInline_AzurePipelines_Light, HtmlSummary, JsonSummary, Latex, LatexSummary, lcov, MarkdownSummary, MarkdownSummaryGithub, MarkdownDeltaSummary, MHtml, PngChart, SonarQube, TeamCitySummary, TextSummary, TextDeltaSummary, Xml, XmlSummary</span>
<span class="na">verbosity</span><span class="pi">:</span> <span class="s2">"</span><span class="s">Info"</span> <span class="c1"># The verbosity level of the log messages. Values: Verbose, Info, Warning, Error, Off</span>
<span class="na">title</span><span class="pi">:</span> <span class="s2">"</span><span class="s">Code</span><span class="nv"> </span><span class="s">Coverage"</span> <span class="c1"># Optional title.</span>
<span class="na">tag</span><span class="pi">:</span> <span class="s2">"</span><span class="s">$_$"</span> <span class="c1"># Optional tag or build version.</span>
<span class="na">customSettings</span><span class="pi">:</span> <span class="s2">"</span><span class="s">"</span> <span class="c1"># Optional custom settings (separated by semicolon). See: https://github.com/danielpalme/ReportGenerator/wiki/Settings.</span>
<span class="na">toolpath</span><span class="pi">:</span> <span class="s2">"</span><span class="s">reportgeneratortool"</span> <span class="c1"># Default directory for installing the dotnet tool.</span>
</code></pre></div></div>
<p>I then choose to upload the combined coverage report to our build’s artifacts:</p>
<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Upload Combined Coverage XML</span>
<span class="na">uses</span><span class="pi">:</span> <span class="s">actions/upload-artifact@v4</span>
<span class="na">with</span><span class="pi">:</span>
<span class="na">name</span><span class="pi">:</span> <span class="s">coverage</span>
<span class="na">path</span><span class="pi">:</span> <span class="s">$/Cobertura.xml</span>
<span class="na">retention-days</span><span class="pi">:</span> <span class="m">5</span>
</code></pre></div></div>
<p>Next up, we publish the coverage report – this takes the <code class="language-plaintext highlighter-rouge">Cobertura.xml</code> file and turns it into <code class="language-plaintext highlighter-rouge">code-coverage-results.md</code>, a nice Markdown file.</p>
<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Publish Code Coverage Report</span>
<span class="na">uses</span><span class="pi">:</span> <span class="s">irongut/CodeCoverageSummary@v1.3.0</span>
<span class="na">with</span><span class="pi">:</span>
<span class="na">filename</span><span class="pi">:</span> <span class="s2">"</span><span class="s">Cobertura.xml"</span>
<span class="na">badge</span><span class="pi">:</span> <span class="no">true</span>
<span class="na">fail_below_min</span><span class="pi">:</span> <span class="no">false</span> <span class="c1"># just informative for now</span>
<span class="na">format</span><span class="pi">:</span> <span class="s">markdown</span>
<span class="na">hide_branch_rate</span><span class="pi">:</span> <span class="no">false</span>
<span class="na">hide_complexity</span><span class="pi">:</span> <span class="no">false</span>
<span class="na">indicators</span><span class="pi">:</span> <span class="no">true</span>
<span class="na">output</span><span class="pi">:</span> <span class="s">both</span>
<span class="na">thresholds</span><span class="pi">:</span> <span class="s2">"</span><span class="s">10</span><span class="nv"> </span><span class="s">30"</span>
</code></pre></div></div>
<p>A few things to note here:</p>
<ul>
<li>We can choose to fail the build if it falls below a minimum threshold. I set this to <code class="language-plaintext highlighter-rouge">false</code> since the purpose of this demo is just informative.</li>
<li>We can set the thresholds for failure and warning. Here, they are 10% and 30% respectively.</li>
<li>I set <code class="language-plaintext highlighter-rouge">indicators</code> to true to show markdown emoji indicators for easier visuals.</li>
</ul>
<p>Lastly, I surface the code coverage statistics in a PR comment:</p>
<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Add Coverage PR Comment</span>
<span class="na">uses</span><span class="pi">:</span> <span class="s">marocchino/sticky-pull-request-comment@v2</span>
<span class="na">if</span><span class="pi">:</span> <span class="s">github.event_name == 'pull_request'</span>
<span class="na">with</span><span class="pi">:</span>
<span class="na">recreate</span><span class="pi">:</span> <span class="no">true</span>
<span class="na">path</span><span class="pi">:</span> <span class="s">code-coverage-results.md</span>
</code></pre></div></div>
<h2 id="reporting-on-test-outcomes">Reporting on Test Outcomes</h2>
<p>Coverage is one thing, but knowing whether our tests have passed or failed is the key. We don’t just want to see a failed build, we want a test summary, and we want to be able to go directly to any failing tests.</p>
<p>I choose to upload the test results to my build’s artifacts:</p>
<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Upload Test Result Files</span>
<span class="na">uses</span><span class="pi">:</span> <span class="s">actions/upload-artifact@v4</span>
<span class="na">with</span><span class="pi">:</span>
<span class="na">name</span><span class="pi">:</span> <span class="s">test-results</span>
<span class="na">path</span><span class="pi">:</span> <span class="s">$/**/TestResults/**/*</span>
<span class="na">retention-days</span><span class="pi">:</span> <span class="m">5</span>
</code></pre></div></div>
<p>And then I use another great GitHub Action to publish those results:</p>
<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Publish Test Results</span>
<span class="na">uses</span><span class="pi">:</span> <span class="s">EnricoMi/publish-unit-test-result-action@v2.16.1</span>
<span class="na">if</span><span class="pi">:</span> <span class="s">always()</span>
<span class="na">with</span><span class="pi">:</span>
<span class="na">trx_files</span><span class="pi">:</span> <span class="s2">"</span><span class="s">$/**/*.trx"</span>
</code></pre></div></div>
<p>Notes:</p>
<ul>
<li>I specify the TRX files that we previously set our <code class="language-plaintext highlighter-rouge">dotnet test</code> to produce in our earlier action</li>
<li>The <code class="language-plaintext highlighter-rouge">if: always()</code> ensures that this step will run even if prior steps fail. This is key, because if my tests fail, the build will fail, but I still want to produce this report so that I’ll know <em>what</em> failed.</li>
</ul>
<h2 id="lets-see-the-results">Let’s See the Results!</h2>
<p>In a PR where I add a test, I see the results and the coverage report in GitHub comments. The coverage report doesn’t show a change, because it was already at 100% previously, but I do see 3 additional test cases, the total number of test cases, and what the current coverage is.</p>
<blockquote>
<p><img alt="Screenshot of results and coverage" src="https://seankilleen.com/images/post-images/2024-github-test-summaries/ResultsAndCoverage.png" /></p>
</blockquote>
<p>Let’s try with a failed test. If I take those same passing tests from above and mess them up and push the changes to the pull request, then I see the indicator in the PR comment:</p>
<blockquote>
<p><img alt="Screenshot of results and coverage" src="https://seankilleen.com/images/post-images/2024-github-test-summaries/FailedTestPRComment.png" /></p>
</blockquote>
<p>When I can click into the link in the comment for more details, I see a great screen that shows me which tests failed, and includes the failed assertion text and the location in the code.</p>
<blockquote>
<p><img alt="Screenshot of results and coverage" src="https://seankilleen.com/images/post-images/2024-github-test-summaries/FailedTestSummary.png" /></p>
</blockquote>
<h2 id="so-have-we-accomplished-our-goals">So, Have We Accomplished Our Goals?</h2>
<ul>
<li>:white_check_mark: Work entirely within GitHub Actions</li>
<li>:white_check_mark: Show test results within a pull request</li>
<li>:white_check_mark: Show difference in number of tests</li>
<li>:white_check_mark: When tests fail, be able to quickly see which tests failed, and the failure/trace</li>
<li>:white_check_mark: Understand test coverage</li>
</ul>
<p>Voila!</p>
<h2 id="roll-the-credits">Roll the Credits</h2>
<p>I am continually amazed at what can be accomplished by GitHub Actions thanks to creative and talented people who have chosen to share with the community. A reminder that I didn’t use a single custom piece of code in this example; it was all GitHub Actions provided by others. That blows my mind.</p>
<ul>
<li><a href="https://github.com/danielpalme/ReportGenerator-GitHub-Action">ReportGenerator-GitHub-Action</a> by <a href="https://github.com/sponsors/danielpalme">Daniel Palme</a> allows us to combine our coverage reports into a lovely Cobertura report file.</li>
<li><a href="https://github.com/irongut/CodeCoverageSummary">CodeCoverageSummary</a> by <a href="https://github.com/sponsors/irongut">irongut</a> generates the great markdown from our coverage files</li>
<li><a href="https://github.com/marocchino/sticky-pull-request-comment">sticky-pull-request-comment</a> by <a href="https://github.com/marocchino">GitHub user <code class="language-plaintext highlighter-rouge">@marocchino</code></a> allows us to hand-roll our own comment from Markdown</li>
<li>The phenomenal <a href="https://github.com/EnricoMi/publish-unit-test-result-action">publish-unit-test-result-action</a> by <a href="https://github.com/sponsors/EnricoMi">Enrico Minack</a> puts our test results into an easily accessible format within GitHub.</li>
</ul>
<p>All of these authors deserve our respect, appreciation, and sponsorship.</p>
<h2 id="id-love-your-thoughts">I’d Love Your Thoughts!</h2>
<p>How are you currently accomplishing this within GitHub Actions?</p>
<p>Until next time – happy building!</p>A Guide to the Manayunk StrEAT Food Festival in Philadelphia2024-03-27T21:03:51.866000ZVisit Phillyhttps://www.visitphilly.com/things-to-do/events/manayunk-streat-food-festival/<table style="border: 1px solid #E0E0E0; margin: 0; padding: 0; background-color: #F0F0F0" valign="top" align="left" cellpadding="0" width="100%">
<tr>
<td rowspan="2" style="padding: 6px;width: 36px;white-space:nowrap" width="36" valign="top"><img src="https://www.gravatar.com/avatar/19ac6a9d902c1d6ae33f41405e47b385" style="width: 36px; height: 36px; border-radius: 4px;"></td>
<td width="100%" style="padding-top: 6px;">
<b>
alvinashcraft
<a href="https://alvinashcraft.newsblur.com/story/a-guide-to-the-manay/159884:af2f49">shared this story</a>
from <img src="https://www.newsblur.com/rss_feeds/icon/159884" style="vertical-align: middle;width:16px;height:16px;"> Uwishunu | Visit Philadelphia.</b>
</td>
</tr>
</table>
<hr style="clear: both; margin: 0 0 24px;">
<p><strong>Date</strong>: <br />StrEAT Food Festival: September 14, 2017<br />Manayunk Restaurant Week: September 15-28, 2017</p>
<h2 class="beta">Overview</h2>
<p>Manayunk celebrates its diverse dining scene during the biannual Manayunk StrEAT Food Festival & Restaurant Week. Held in the spring and the fall, the festival of food highlights neighborhood eateries, food trucks and entertainment.</p>
<p>The celebration kicks-off with the StrEAT Food Festival featuring dozens of the city’s top food trucks, local vendors and the shops and restaurants that line Main Street in Manayunk. </p>
<p>Main Street is closed to traffic for the day-long celebration, which also features special seasonal treats, sidewalk sales and live entertainment.</p>
<p>Bring your appetite and check the forecast, as the StrEAT Food Festival is rain or shine.</p>
<h2 class="beta">More Information about Manayunk StrEAT Food Festival</h2>
<p>For more information about the Manayunk StrEAT Food Festival, click the button below.</p>
<p><a class="button external" href="http://manayunk.com/news-and-events/events/fall-streat-food-festival.html">More about Manayunk StrEAT Food Festival</a></p>
<h2 class="beta">Manayunk Restaurant Week</h2>
<p>Lasting for two weeks following the StrEAT Food Festival, Manayunk Restaurant Week features three-course, prix fixe menus at a bunch of area restaurants. </p>
<p>Dining options range from $15-35 per person, making it a delicious and affordable night out in Manayunk. </p>
<h2 class="beta">More Information About Manayunk Restaurant Week</h2>
<p>For participating restaurants and more information, click the button below.</p>
<p><a class="button external" href="http://manayunk.com/news-and-events/events/spring-streat-food-festival.html">More about Manayunk Restaurant Week</a></p>Cursive Letters2024-03-27T21:03:38.993000Zhttps://xkcd.com/2912/<table style="border: 1px solid #E0E0E0; margin: 0; padding: 0; background-color: #F0F0F0" valign="top" align="left" cellpadding="0" width="100%">
<tr>
<td rowspan="2" style="padding: 6px;width: 36px;white-space:nowrap" width="36" valign="top"><img src="https://www.gravatar.com/avatar/19ac6a9d902c1d6ae33f41405e47b385" style="width: 36px; height: 36px; border-radius: 4px;"></td>
<td width="100%" style="padding-top: 6px;">
<b>
alvinashcraft
<a href="https://alvinashcraft.newsblur.com/story/cursive-letters/5994357:14cc97">shared this story</a>
from <img src="https://s3.amazonaws.com/icons.newsblur.com/5994357.png" style="vertical-align: middle;width:16px;height:16px;"> xkcd.com.</b>
</td>
</tr>
</table>
<hr style="clear: both; margin: 0 0 24px;">
<img alt="𝓘 𝓽𝓱𝓲𝓷𝓴 𝓬𝓪𝓹𝓲𝓽𝓪𝓵 𝓛 𝓲𝓼 𝓹𝓻𝓸𝓫𝓪𝓫𝓵𝔂 𝓽𝓱𝓮 𝓶𝓸𝓼𝓽 𝓯𝓾𝓷 𝓽𝓸 𝔀𝓻𝓲𝓽𝓮, 𝓽𝓱𝓸𝓾𝓰𝓱 𝓵𝓸𝔀𝓮𝓻𝓬𝓪𝓼𝓮 𝓺 𝓲𝓼 𝓪𝓵𝓼𝓸 𝓪 𝓼𝓽𝓻𝓸𝓷𝓰 𝓬𝓸𝓷𝓽𝓮𝓷𝓭𝓮𝓻." src="https://imgs.xkcd.com/comics/cursive_letters.png" title="𝓘 𝓽𝓱𝓲𝓷𝓴 𝓬𝓪𝓹𝓲𝓽𝓪𝓵 𝓛 𝓲𝓼 𝓹𝓻𝓸𝓫𝓪𝓫𝓵𝔂 𝓽𝓱𝓮 𝓶𝓸𝓼𝓽 𝓯𝓾𝓷 𝓽𝓸 𝔀𝓻𝓲𝓽𝓮, 𝓽𝓱𝓸𝓾𝓰𝓱 𝓵𝓸𝔀𝓮𝓻𝓬𝓪𝓼𝓮 𝓺 𝓲𝓼 𝓪𝓵𝓼𝓸 𝓪 𝓼𝓽𝓻𝓸𝓷𝓰 𝓬𝓸𝓷𝓽𝓮𝓷𝓭𝓮𝓻." />