Sr. Content Developer at Microsoft, working remotely in PA, TechBash conference organizer, former Microsoft MVP, Husband, Dad and Geek.
158816 stories
·
33 followers

How comics are made, with Glenn Fleishman

1 Share

1209. Glenn Fleishman discusses the mechanical journey of a comic strip, from the cartoonist’s ink to the final newspaper page. We look at why drawing close to size helped “Calvin and Hobbes” creator Bill Watterson save money, and how a political resignation in 1973 led to a week of "Doonesbury" strips that never officially ran. This episode originally ran back in February for the Grammarpaloozians who support the show. To hear these episodes when they first come out, and get much more bonus content, visit http://patreon.com/grammargirl.

Find Glenn at https://glennf.com/.


đź”— Join the Grammar Girl Patreon.

đź”— Share your familect recording in Speakpipe or by leaving a voicemail at 833-214-GIRL (833-214-4475)

đź”— Watch my LinkedIn Learning writing courses.

đź”— Subscribe to the newsletter.

đź”— Find an edited transcript.

đź”— Get Grammar Girl books.

| HOST: Mignon Fogarty

| Grammar Girl is part of the Quick and Dirty Tips podcast network.

  • Audio Engineer: Dan Feierabend
  • Director of Podcast: Holly Hutchings
  • Advertising Operations Specialist: Morgan Christianson
  • Marketing and Video: Nat Hoopes, Rebekah Sebastian
  • Podcast Associate: Maram Elnagheeb

| Theme music by Catherine Rannus.

| Grammar Girl Social Media: YouTubeTikTokFacebookThreadsInstagramLinkedInMastodonBluesky.


Hosted on Acast. See acast.com/privacy for more information.





Download audio: https://sphinx.acast.com/p/open/s/69c1476c007cdcf83fc0964b/e/6a6b99bc8effb6fbbefe0125/media.mp3
Read the whole story
alvinashcraft
2 hours ago
reply
Pennsylvania, USA
Share this story
Delete

Models, Harnesses, and Multi-Agent Systems

1 Share

AI has moved far beyond chatbots, but what exactly are AI models, agents, agent harnesses, and multi-agent systems, and why do they matter?

In this episode, Daniel and Chris break down the terminology behind today's AI landscape, explain the differences between AI features and autonomous agents, and explore why organizations are shifting toward fleets of AI agents powered by multiple models. They also discuss open vs. closed models, enterprise AI architectures, vendor lock-in, and practical ways to begin adopting agentic AI in your own organization.

If you feel left behind by this ongoing agentic AI revolution that has rapidly accelerated to warp speed, then this episode is the catch-up primer you've been waiting for!

Featuring:

Sponsors:

  • Framer: The enterprise-grade website builder that lets your team ship faster. Get 30% off at framer.com/practicalai
  • Midwest AI Summit: Join AI practitioners on October 15 in Indianapolis for practical sessions, hands-on discussions, and real-world AI solutions. Use code PracticalAI20 to save 20% on your registration. https://midwestaisummit.com/#tickets
  • Prediction Guard: A self-hosted AI control plane for running agents in high impact environments. predictionguard.com/practicalai

Resources and Events:





Download audio: https://pscrb.fm/rss/p/dts.podtrac.com/redirect.mp3/media.transistor.fm/063cfaad/23dc320d.mp3
Read the whole story
alvinashcraft
2 hours ago
reply
Pennsylvania, USA
Share this story
Delete

How to Stream Octopus Audit Logs to Grafana Cloud With OpenTelemetry

1 Share

Your continuous deployment platform already knows exactly who changed what, and when. If someone edited a variable or deleted an environment, Octopus records all of it.

For most teams, centralizing audit logs in the same SIEM tool they already watch is more than an added advantage, it is a compliance requirement, and "audit log to SIEM" stays a busy search term precisely because so many tools make it harder than it should be.

In this guide you will stream Octopus audit events into Grafana Cloud over OpenTelemetry, query them with LogQL, and fire a Slack alert the moment something is deleted.

Because the transport is OpenTelemetry, you can take what you learn here and stream the same events to any OpenTelemetry destination, whether that is Datadog, Honeycomb, Elastic, or a self-hosted collector."

Where Octopus audit data lives

Octopus gives you three ways to reach audit data, and it helps to know which one you are reaching for.

  • The Audit tab (Configuration, then Audit) is the in-product view. It is great for browsing individual events, filtering by user or date, and expanding a single change to see exactly what was modified.
  • The Audit Stream pushes those same events out to an external system as they happen. This is the path this article covers. It supports OpenTelemetry (OTLP) alongside direct integrations for Splunk and Sumo Logic.
  • Compliance Reports, also in Platform Hub, are the purpose-built path for Governance, Risk, and Compliance (GRC) reporting. If your primary need is producing GRC evidence rather than raw log search, that is where to look. It complements the streaming setup here rather than replacing it.

In other words, the Audit tab and Audit Stream give you the raw events, and Compliance Reports streamline the reporting on top.

Architectural overview

Before we hop into a demo, It is worth getting a grasp on how this will all work.

Fundamentally, Octopus emits audit events over OTLP. A collector receives them and forwards them to Grafana Cloud, where they land in Loki and become queryable in Explore. From there, an alert rule watches for events and notifies Slack.

:::figure

:img{ src="/blog/img/stream-audit-logs-to-grafana-cloud/architecture-diagram.png" alt="A diagram showing Octopus using OLTP to ngrok, which fronts Grafana Alloy and Grafana Cloud." loading="lazy" }

::figcaption[Octopus streams over OTLP, Grafana Alloy forwards to Grafana Cloud, and Loki becomes the searchable, alertable home for your audit trail.]

:::

Prerequisites

  • An Octopus instance with the Audit Stream available.
  • A free Grafana Cloud account.
  • Grafana Alloy, the OpenTelemetry Collector distribution Grafana recommends, running as the receiver and forwarder.

You might ask, "why put a collector in the middle instead of pointing Octopus straight at Grafana Cloud?" Simple. For reliability and control.

The collector batches records, holds the Grafana Cloud credentials in one place, and gives you a single spot to add processing or route to a second backend later. It also keeps Octopus configuration simple: Octopus only ever talks to the collector.

Step 1: Set up the Grafana Cloud destination

A free tier Grafana Cloud account includes 50 GB of log ingestion per month with 14 days of retention, which is plenty for an audit trail demo.

Once your stack exists, open the connection details for the OTLP endpoint. In the Grafana Cloud portal, go to your stack and find the OpenTelemetry tile, or open the stack's OTLP connection page directly.

:::figure

:img{ src="/blog/img/stream-audit-logs-to-grafana-cloud/grafana-otlp-connection-details.png" alt="Grafana OLTP connection details page" loading="lazy" }

::figcaption[The OTLP connection page gives you the gateway endpoint and your instance ID. Generate an API token here to get the third value.]

:::

You are after the following three values:

  • OTLP Endpoint, something like https://otlp-gateway-prod-us-west-0.grafana.net/otlp. The region in that hostname will match your stack.
  • Instance ID, a numeric value such as 1714216. This is the username half of the credentials.
  • API Token. Click Generate now, give the token a name like octopus-audit-stream, keep the default scopes (which include logs:write), and create it. Copy the token, it is shown only once. This is the password half.

Logs sent over OTLP land in Loki. Grafana Cloud promotes the OpenTelemetry service.name resource attribute to the Loki stream label service_name, which is how you will find the data later. Octopus sets this to Octopus Deploy, so your query will start with {service_name="Octopus Deploy"}.

Step 2: Configure the OpenTelemetry collector (Grafana Alloy)

In Grafana Alloy, create the configuration file. It does three jobs: receive OTLP from Octopus, batch the records, and export them to Grafana Cloud with basic authentication.

cat > config.alloy <<'EOF'
// 1. Receive OTLP over HTTP (Octopus sends http/protobuf) and gRPC.
otelcol.receiver.otlp "octopus" {
  http {
    endpoint = "127.0.0.1:4318"
  }

  grpc {
    endpoint = "127.0.0.1:4317"
  }

  output {
    logs = [otelcol.processor.batch.default.input]
  }
}

// 2. Batch records before export to reduce request volume.
otelcol.processor.batch "default" {
  output {
    logs = [otelcol.exporter.otlphttp.grafana_cloud.input]
  }
}

// 3. Authenticate to Grafana Cloud with the stack instance ID and API token.
otelcol.auth.basic "grafana_cloud" {
  username = "YOUR_INSTANCE_ID"
  password = sys.env("GRAFANA_CLOUD_API_TOKEN")
}

// 4. Export to the Grafana Cloud OTLP gateway. Logs land in Loki.
otelcol.exporter.otlphttp "grafana_cloud" {
  client {
    endpoint = "https://otlp-gateway-prod-us-west-0.grafana.net/otlp"
    auth     = otelcol.auth.basic.grafana_cloud.handler
  }
}
EOF

Walking through the two values that matter most:

  • The exporter endpoint is the OTLP gateway from your connection details
  • The otelcol.auth.basic block is the authentication. Grafana Cloud expects HTTP Basic auth where the username is your instance ID and the password is the API token. Replace YOUR_INSTANCE_ID with the numeric instance ID, and keep the token out of the file by reading it from an environment variable.

Start Alloy with the token in the environment:

export GRAFANA_CLOUD_API_TOKEN='glc_your_token_here'
alloy run config.alloy --storage.path=./alloy-data

Alloy logs that it is listening. You should see the OTLP servers come up:

level=info msg="Starting GRPC server" component_id=otelcol.receiver.otlp.octopus endpoint=127.0.0.1:4317
level=info msg="Starting HTTP server" component_id=otelcol.receiver.otlp.octopus endpoint=127.0.0.1:4318

Confirm the receiver accepts data before wiring up Octopus:

curl -sw "\nHTTP %{http_code}\n" -X POST http://127.0.0.1:4318/v1/logs \
  -H "Content-Type: application/json" \
  -d '{"resourceLogs":[{"scopeLogs":[{"logRecords":[{"body":{"stringValue":"hello"}}]}]}]}'

A HTTP 200 means Alloy took the record. If it also reached Grafana Cloud, you will see it in Explore in a moment.

Expose the collector so Octopus can reach it

Octopus Cloud needs a public URL to send to. For a local test, ngrok is the quickest way to expose the Alloy HTTP receiver, the same technique the Octopus and Elastic walkthrough uses:

ngrok http 4318

ngrok prints a public HTTPS URL such as https://4202-12-17-71-220.ngrok-free.app. That, with /v1/logs appended, is what Octopus will target. In a permanent deployment you would run Alloy on a host Octopus can reach directly and skip the tunnel.

Step 3: Point Octopus at the collector

In Octopus, go to Configuration > Audit, and click Stream Audit Log. Choose OpenTelemetry as the provider.

:::figure

:img{ src="/blog/img/stream-audit-logs-to-grafana-cloud/octopus-audit-stream-providers.png" alt="Octopus audit stream providers" loading="lazy" }

::figcaption[Octopus supports OpenTelemetry, Splunk, and Sumo Logic out of the box. OpenTelemetry is the one that keeps you vendor-neutral.]

:::

Fill in the OpenTelemetry fields:

  • OpenTelemetry Endpoint URL: Your collector's log endpoint, which is the ngrok URL with /v1/logs on the end, for example https://4202-12-17-71-220.ngrok-free.app/v1/logs.
  • OTLP Protocol: HTTP/protobuf.
  • Secret: Leave this empty. Authentication to Grafana Cloud is handled by the collector, so Octopus does not need to send any token. This is exactly why the collector sits in the middle.

:::figure

:img{ src="/blog/img/stream-audit-logs-to-grafana-cloud/octopus-audit-stream-otel-config.png" alt="Octopus audit stream OTel config" loading="lazy" }

::figcaption[The endpoint points at the collector, the protocol is HTTP/protobuf, and no secret is needed because the collector authenticates to Grafana Cloud.]

:::

Click Save.

The Stream Audit Log button now shows a green check, which means the stream is active and new events will flow. Historical events are not backfilled, only events from this point forward are streamed.

:::figure

:img{ src="/blog/img/stream-audit-logs-to-grafana-cloud/octopus-audit-stream-active.png" alt="Octopus audit stream active" loading="lazy" }

::figcaption[A green check confirms the stream is live.]

:::

Step 4: Generate events and verify in Grafana Cloud

Trigger a few audited actions so there is something to see. Anything that creates, modifies, or deletes a resource works. For this walkthrough, create an environment, edit it, then delete it. Each of those is a separate audit event.

Now open Explore in Grafana Cloud, select your logs data source, and run:

{service_name="Octopus Deploy"}

The events arrive within seconds.

:::figure

:img{ src="/blog/img/stream-audit-logs-to-grafana-cloud/grafana-explore-audit-events.png" alt="Explore audit events in Grafana" loading="lazy" }

::figcaption[Octopus audit events in Grafana Cloud. The expanded record shows a deleted environment, the Category label, and the exact field-level differences.]

:::

Expand a record and you will see the labels Octopus attaches to every event. These are what make the data useful:

  • service_name = Octopus Deploy
  • event_name = octopus.audit
  • Category = Created, Modified, or Deleted
  • Username = the account that made the change
  • IpAddress = where the request came from
  • SpaceId and the resource ID, such as EnvironmentId
  • severity_text = Information

Those labels let you slice the audit trail without parsing message text. If you want every change a specific person made? Filter on Username. And if you want only deletions? Filter on Category:

{service_name="Octopus Deploy"} | Category=`Deleted`

That single query is the foundation of the alert you are about to build.

Step 5: Sending Slack alerts

A searchable audit trail is useful but an audit trail that pages you when something sensitive happens is better. Grafana Alerting has a native Slack integration, so no extra service is needed.

First, create the Slack contact point. In Slack, add an Incoming Webhook for the channel you want, a channel like #grc is a natural home for this.

In Grafana, go to Alerts & IRM > Alerting > Contact points then add a contact point, choose Slack, and paste the webhook URL. Keep that URL secret, anyone who has it can post to your channel.

:::figure

:img{ src="/blog/img/stream-audit-logs-to-grafana-cloud/grafana-slack-contact-point.png" alt="Grafana Slack contact point" loading="lazy" }

::figcaption[Creating the Slack contact point. With a webhook URL, you can leave the recipient and token fields empty.]

:::

Next, create the alert rule. Point it at your logs data source and use a query that counts delete events over a short window. Group the count by the labels you want in the alert, so they survive the aggregation and can be used in the message:

sum by (Category, Username, IpAddress, SpaceId, EnvironmentId) (
  count_over_time({service_name="Octopus Deploy"} | Category=`Deleted` [5m])
)

Add a threshold condition of is above 0, so the rule fires whenever a deletion shows up. Give the rule a label like team = grc and route that label to your Slack contact point in the notification policy.

Set the rule's summary annotation to reference those labels, so the Slack message names the event rather than showing [no value]. Grafana exposes the query's labels as $labels:

Octopus audit alert: {{ $labels.Category }} event by {{ $labels.Username }} from {{ $labels.IpAddress }}

:::figure

:img{ src="/blog/img/stream-audit-logs-to-grafana-cloud/grafana-alert-rule-detail.png" alt="Grafana alert rule detail" loading="lazy" }

::figcaption[The alert rule counts Octopus delete events and fires when the count goes above zero.]

:::

Delete an environment to test it. Within an evaluation cycle the rule moves to Firing, and the instance shows its destination is the Slack contact point.

:::figure

:img{ src="/blog/img/stream-audit-logs-to-grafana-cloud/grafana-alert-instances.png" alt="Grafana alert instances" loading="lazy" }

::figcaption[One firing instance, labelled team=grc, routed to the Slack contact point.]

:::

A message lands in your channel naming the event, the user, and the source IP.

:::figure

:img{ src="/blog/img/stream-audit-logs-to-grafana-cloud/slack-grc-alert.png" alt="Slack GRC alert" loading="lazy" }

:::

Use any backend

The reason to do this over OpenTelemetry rather than a proprietary integration is portability. Nothing in the Octopus configuration is Grafana-specific. Octopus speaks OTLP to a collector, full stop.

To send the same audit stream to Datadog, Honeycomb, Elastic, or a self-hosted backend, you change the collector's exporter and leave everything else alone. The receiver stays the same, the Octopus Audit Stream config stays the same, additionally you can fan out to two destinations at once by listing two exporters.

That is the whole point of standardizing on OpenTelemetry.

Your audit trail, wherever you watch it

Octopus has been recording who did what since long before you turned this on. The work here was not generating the data, but moving it to where your team looks. Because the transport is OpenTelemetry, that move is a single endpoint away from any SIEM tool you run.

If you want to try it, spin up a free Grafana Cloud account and read the Audit Stream documentation for the exact fields.

If your focus is governance and compliance reporting, look at Compliance Reports.

Happy deployments!

Read the whole story
alvinashcraft
2 hours ago
reply
Pennsylvania, USA
Share this story
Delete

You can now use the Azure DevOps Service Connection instead of a PAT or Build Session token

1 Share

We’re excited to announce the Azure DevOps service connection, a new way to access Azure DevOps from your pipelines using a Microsoft Entra workload identity (a service principal or managed identity) instead of a Personal Access Token (PAT) or session token. This post walks through what it is, how to set it up, and the many places you can use it, including several capabilities we’ve added based on your feedback.

Why use an Azure DevOps service connection?

Using an Azure DevOps service connection improves the security of your pipelines in several ways:

  • PAT-free authentication: Eliminate the need to create, store, and rotate Personal Access Tokens
  • Least privilege: Use per-pipeline or even task-level permissions instead of shared build service account permissions
  • No persistent secrets: Use Microsoft Entra federated credentials instead of passwords
  • Audit trail: All authentication attempts are logged in the Azure DevOps audit log

Because the connection authenticates as a Microsoft Entra identity, you can also use it to reach resources in another Azure DevOps organization that’s joined to the same Entra ID tenant.

Configuring an Azure DevOps service connection

Important pre-requisite The service connection creation experience does not create an identity in Entra or user in Azure DevOps. Both are a pre-requisite to creating the new Azure DevOps service connection. Before you create a service connection, first add a service principal or managed identity as a user in the organization and assign it the permissions it needs.

After you added a service principal or managed identity as a user in the organization and assigned it the permissions, you can create a the new service connection and choose Azure DevOps (preview):

new azdo sc1 image

Select the service principal or managed identity you created as the identity to use:

new azdo sc2 image

You should assign the identity the permissions to the organization it needs. You can do this by following the View access in the current organization link and e.g. adding it to the Readers group of the current project.

new azdo sc3 image

Manual configuration as fallback

In some cases the signed-in user can’t create the federated identity credential (FIC) automatically. For example, when the user lacks Microsoft Graph permissions and sees. For these scenarios the experience will fall back and instruct you how to create the federated credential manually. The configuration UI surfaces the issuer and subject so an administrator with the right permissions can add the federated credential to the identity, then complete the connection.

Using the Azure DevOps service connection

Check out a repository from another organization

resources:
  repositories:
  - repository: external-repo
    type: git
    endpoint: my-azdo-connection
    name: 'external-project/external-repo'
    ref: 'refs/heads/main'

steps:
- checkout: self
- checkout: external-repo

Reference a YAML template from another organization

resources:
  repositories:
    - repository: templates
      type: git
      endpoint: my-azdo-connection
      name: 'external-project/external-repo'
      ref: "refs/heads/main"

steps:
- template: azdosc-template.yml@templates

You can now use runtime parameters to select the service connection used by a repository resource. This makes templates reusable across organizations and environments, the caller supplies the connection name.

parameters:
- name: serviceConnectionName
  type: string
  default: my-azdo-connection

resources:
  repositories:
  - repository: templates
    type: git
    endpoint: ${{ parameters.serviceConnectionName }}
    name: 'external-project/external-repo'
    ref: "refs/heads/main"

Access an artifacts feed

- task: NuGetAuthenticate@1
  inputs:
    nuGetServiceConnections: 'my-azdo-connection'

- task: DotNetCoreCLI@2
  inputs:
    command: 'restore'
    projects: '**/*.csproj'

Call Azure DevOps REST APIs from the Invoke REST API task

The Invoke REST API task (InvokeRESTAPI@1) now accepts an Azure DevOps service connection, so you can call Azure DevOps REST APIs without a custom generic connection and manual token handling. Set connectionType to connectedServiceNameAzureDevOps:

- task: InvokeRESTAPI@1
  inputs:
    connectionType: 'connectedServiceNameAzureDevOps'
    serviceConnection: 'my-azdo-connection'
    method: 'GET'
    urlSuffix: 'external-project/_apis/build/builds?api-version=7.1'

Using the connection in a script

The new AzureCLI@3 task can access Azure DevOps with Microsoft Entra authentication in several ways. In all cases, set connectionType: 'azureDevOps' and assign azureDevOpsServiceConnection to your Azure DevOps service connection:

- task: AzureCLI@3
  inputs:
    connectionType: 'azureDevOps'
    azureDevOpsServiceConnection: 'my-azdo-connection'

This creates a Microsoft Entra authenticated session with the Azure DevOps CLI:

- task: AzureCLI@3
  displayName: Secret-less
  inputs:
    connectionType: 'azureDevOps'
    azureDevOpsServiceConnection: 'my-azdo-connection'
    scriptType: 'pscore'
    scriptLocation: 'inlineScript'
    inlineScript: |
      az devops configure -l

      az devops project list --query "value[].{Name:name, Id:id}" `
                            -o table

      az pipelines pool list --query "[].{Id:id, Name:name}" `
                            -o table

      az rest --method get `
              --url "https://status.dev.azure.com/_apis/status/health?api-version=7.1-preview.1" `
              --resource 499b84ac-1321-427f-aa17-267ca6975798 `
              --query "sort_by(services[?id=='Pipelines'].geographies | [], &name)" `
              -o table

If you have an existing script that uses a PAT or System.AccessToken inline, you can instead obtain a Microsoft Entra access token to access Azure DevOps:

- task: AzureCLI@3
  displayName: Use Entra access token
  inputs:
    connectionType: 'azureDevOps'
    azureDevOpsServiceConnection: 'my-azdo-connection'
    scriptType: 'pscore'
    scriptLocation: 'inlineScript'
    inlineScript: |
      # Get access token for Azure DevOps
      $token = az account get-access-token --resource "499b84ac-1321-427f-aa17-267ca6975798" `
                                           --query "accessToken" `
                                           --output tsv

      # Use token in REST API call
      $headers = @{
        Authorization = "Bearer $token"
        "Content-Type" = "application/json"
      }

      $body = @{
        name = "Test Build"
      } | ConvertTo-Json

      Invoke-RestMethod -Uri "$(System.CollectionUri)$(System.TeamProject)/_apis/build/definitions?api-version=7.1" `
                        -Method POST `
                        -Headers $headers `
                        -Body $body

More information

For more information on configuring the Azure DevOps service connection, see the documentation. We’d love your feedback on the Azure DevOps Developer Community or through Azure DevOps Support.

The post You can now use the Azure DevOps Service Connection instead of a PAT or Build Session token appeared first on Azure DevOps Blog.

Read the whole story
alvinashcraft
2 hours ago
reply
Pennsylvania, USA
Share this story
Delete

Microsoft is burying Windows 11’s legacy UI one by one, and AutoPlay is next for WinUI 3

1 Share

AutoPlay, the pop-up that asks what to do when you plug in a USB drive or SD card, is next in line for a WinUI 3 rebuild. Microsoft confirmed it in a July 31 update on its Windows quality commitment.

So, the AutoPlay dialog is finally getting proper dark mode support, Fluent typography, and the rounded, consistent design language the rest of Windows 11 has had.

Windows 11 AutoPlay

Windows 11 still runs on a patchwork of code from wildly different eras, some dialogs redesigned for Fluent Design, others untouched since Windows 7 or earlier. It’s a running joke that the OS can look modern in one window and decades old if you go into deeper settings.

Considering the complexity and risk, rebuilding it all at once wasn’t realistic, so Microsoft has been working through it dialog by dialog.

UI inconsistency in Windows 11

Microsoft has already been chipping away at this. Windows Latest has covered the File Explorer Properties dialog getting rebuilt in WinUI, a growing list of other legacy dialogs headed the same way, and most recently, Print Management getting an early WinUI-based test build. AutoPlay is the next name on that list, and testing is already underway ahead of a planned drop into Windows Insider Preview Experimental builds.

AutoPlay settings in Control Panel

AutoPlay in Windows 11 is getting a WinUI 3 update

AutoPlay first showed up in Windows XP in 2001, and refined the older AutoRun feature so that inserting a disc or drive prompted you with choices instead of silently launching whatever program the media pointed to.

Vista tightened it for security, and from Windows 7 onward, AutoPlay has looked basically the same with a plain white background, basic Win32 controls, and a list of app icons to pick from. It’s one of the most-seen dialogs in Windows, and one of the least changed.

Windows 11 AutoPlay dialog box

Fortunately, this will be the last year that we have to see this, as Microsoft’s blog says:

“We’ve strengthened the fundamentals of WinUI 3 and extended it into more of the Windows shell, including Widgets and the new Run experience, with Autoplay dialog and more File/Folder Properties dialogs coming soon to Windows Insider Preview Experimental builds.”

Technically, that means AutoPlay is being rebuilt from scratch on WinUI 3. Win32 dialogs like AutoPlay don’t inherit Windows’ system-wide dark mode automatically; each one has to explicitly opt in and paint itself for it, which is why so many old dialogs flashed white even with dark mode switched on everywhere else.

WinUI 3 framework handles theming, scaling, and Fluent styling natively instead of requiring a manual patch. Marcus Ash, CVP Design and Research for Windows, while replying to a request for AutoPlay to get modernized back in May, said he was looking forward to the day he could confirm it was happening, instead of promising a quick dark mode fix.

Microsoft is making WinUI 3 even better

The Windows President’s blog post also mentions extending WinUI 3 into more of the Windows shell, the collective term for the interface layer users interact with directly, including the taskbar, Start menu, File Explorer, and system dialogs like this one.

Widgets and the new Run experience are already strengthened, with more File and Folder Properties dialogs coming next to Experimental builds.

New Windows 11 Run with history

Microsoft also mentions “substantial improvements in memory efficiency and latency” behind this work. WinUI 3 apps are tuned to use less memory by design, and the company has also confirmed a more efficient memory allocator and reduced overhead in the Chromium and WebView2 components still running inside parts of the OS.

That said, every dialog moved off legacy Win32 or WebView2 code and onto native WinUI is one less piece of inefficiency in Windows.

A lighter Windows 11 is Microsoft’s goal

Microsoft has previously admitted Windows 11 has become a memory hog and promised optimization work for PCs with 8GB of RAM and above by the end of 2026.

RAM usage in 8GB RAM variant of Dell XPS 13
RAM usage in 8GB RAM variant of Dell XPS 13. Source: Just Josh via YouTube

The company is also going back on their previous statements recommending 32GB RAM as a “no-worries upgrade” for serious gamers, as RAM prices climbed and 8GB machines became the reality Microsoft has to build for.

AutoPlay in Windows 11 is one more legacy dialog that stops carrying Win32’s dead weight, and with WinUI-based Widgets, Run, Properties, Print Management, and everything still left on Microsoft’s list, Windows 11 will finally stop feeling inconsistent.

The post Microsoft is burying Windows 11’s legacy UI one by one, and AutoPlay is next for WinUI 3 appeared first on Windows Latest

Read the whole story
alvinashcraft
4 hours ago
reply
Pennsylvania, USA
Share this story
Delete

AI-assisted Oracle-to-PostgreSQL schema conversion in Visual Studio Code

1 Share

By Aditya Duvuri, Anil Dogra, Pranay Lohia, AI Omar Rajawat, Gautam Juneja, Vikas Nimmagadda

We’re seeing significant interest in migrating database workloads from Oracle to Azure Database for PostgreSQL. Historically, schema conversion has been one of the most technically challenging and expensive steps in that journey, demanding specialist knowledge of both engines and stretching migration timelines before a single row of data moves. Recent advances in AI-assisted schema conversion are changing that, turning what used to be a long, manual effort into a faster, more accessible, and lower-cost proposition. This post looks at what that shift means in practice for teams moving to Azure Database for PostgreSQL flexible server.

Oracle schema conversion is where the complexity of translating schema and code objects to PostgreSQL becomes visible. Packages, procedures, triggers, custom types, and dependencies built up over years must be mapped to PostgreSQL-compatible definitions while preserving the relationships that make the schema work.

Generally available since May 2026, the feature is built into the PostgreSQL extension for Visual Studio Code, published by Microsoft. It helps teams convert Oracle schema and code objects — tables, views, constraints, packages, procedures, functions, and triggers — into PostgreSQL-compatible definitions for Azure Database for PostgreSQL flexible server, with no separate conversion utility to install and no disconnected workflow to manage.

It brings schema discovery, conversion, compile validation, and review into one project-based experience. Teams can connect to Oracle, select schemas, and configure a Microsoft Foundry connection in the same project. The extension then translates Oracle-specific constructs, compiles and syntax-checks converted DDL into scratch schemas on Azure Database for PostgreSQL flexible server and surfaces unresolved items as review tasks that teams can work through with GitHub Copilot agent mode.

Why schema conversion deserves a better workflow

Traditional conversion tools can produce a useful first pass, but the long tail of the process is rarely solved by generating replacement DDL alone. Teams still need clear answers to practical questions: What converted successfully? What needs attention? Which Oracle constructs require a PostgreSQL design decision? Which items should be reviewed first?

We designed the schema conversion experience around those questions. The goal is not to hide complexity behind a single score. It is to help teams make steady progress while keeping the work visible and reviewable.

What the schema conversion experience provides

The experience guides teams through a schema conversion project rather than a collection of separate scripts. It discovers the selected Oracle schemas and converts both the relational model and the code that runs on it: tables, indexes, sequences, primary key, unique, check and foreign key constraints, views and materialized views, synonyms, and Oracle object types — along with the PL/SQL that is usually the hardest part of the migration. Packages and package bodies, package-level state, standalone procedures and functions, and triggers are translated into PostgreSQL functions, procedures, and trigger functions.

Oracle-specific constructs are mapped to PostgreSQL equivalents rather than dropped or stubbed out. REF CURSOR and SYS_REFCURSOR become PostgreSQL refcursor; CLOB and BLOB columns become text and bytea ; and NUMBER and VARCHAR2 are mapped by precision and length to their closest PostgreSQL types. Oracle date functions such as ADD_MONTHS, LAST_DAY, MONTHS_BETWEEN, and TRUNC are resolved through the orafce extension, which the project detects and flags for you before deployment. Every converted definition is compiled against scratch schemas on Azure Database for PostgreSQL flexible server, so the deployment script you end up with is an organized, dependency-ordered set of PostgreSQL SQL artifacts that has already been proven to build.

Objects that still require human judgment are surfaced as review tasks. Teams can inspect the source and converted definitions side by side, work through the remaining items, and use GitHub Copilot agent mode for guided assistance — keeping automation and human review in the same workflow.

How it works: the system architecture

Under the hood, the conversion engine follows one principle — the language model is a single, bounded stage; it never has the first or the last word. Deterministic steps decide what the model sees and what it is allowed to produce.

  • Deterministic in. Rule-based extraction reads the Oracle DDL and metadata, then a dependency-graph decomposition splits the estate into bounded, dependency-ordered chunks — so every object is converted in the context that keeps it correct.
  • Bounded conversion. A tiered model strategy through the Microsoft Foundry connection translates each chunk with structured, contract-wrapped input and output. Even very large PL/SQL packages are split and converted member by member, so nothing is trusted as a monolith.
  • Deterministic out. Converted objects pass through review, then compile-and-verify against scratch schemas on Azure Database for PostgreSQL flexible server, and finally dependency-ordered deploy assembly. Unresolved items become review tasks, and every object carries a per-object audit trail.

A continuous-improvement loop closes the system: the engineering team maintains a versioned regression suite of supported conversion patterns, and an executable benchmark tracks regressions as the pipeline evolves.

Proven in production

The approach has been exercised on real enterprise estate. Across representative production runs totaling more than 60,000 schema objects; conversion reached roughly 98% overall — with several schemas converting at a full 100%. The hardest tail, PL/SQL package members, now compiles at 96% across more than 20,000 members thanks to targeted coverage and a resilient compile stage.

Conversion outcome and review status are separate measures. Objects that convert and compile cleanly are safe to deploy as they are; the rest are deliberately routed into a prioritized review queue rather than silently accepted. In a representative single-schema run, no object ended in a hard conversion failure, and a cleanly generated object can still involve a PostgreSQL design decision. That is the workflow operating as intended: automation absorbs the volume, and review tasks to keep the remaining judgment calls visible, ordered, and auditable.

Measured, not asserted: the SchemaBench eval

Quality is verified by running it. SchemaBench, the evaluation framework, deploys each converted schema to a live PostgreSQL database and probes real behavior — whether constraints still fire and whether objects still resolve — rather than comparing DDL text. It scores seven weighted dimensions: semantic fidelity, structure, constraints, completeness, performance, target idioms, and maintainability, behind hard gates. On the e-commerce benchmark, the strongest model scored 96.1 overall with 100% semantic fidelity and a ~98% behavioral-probe pass rate. Every failure a migration hits becomes a permanent regression test the next run has to pass.

Learn more: Oracle to Azure Database for PostgreSQL schema conversion overview

Read the whole story
alvinashcraft
4 hours ago
reply
Pennsylvania, USA
Share this story
Delete
Next Page of Stories