GCast

Unofficial, machine-generated summaries, as of 2026-11-09.

Creating an M365 Calendar Bookings Page [GCast 223]
  • A Microsoft 365 account includes a public booking page. Giard reaches it at bookings.cloud.microsoft or from the apps on his Microsoft 365 page; it lets customers, partners or friends reserve time with him online, and the first step is to create a meeting type.
  • Each meeting type sets title, category, location and visibility. Categories are the ones defined in the Outlook calendar; location defaults to a Teams meeting, which Giard keeps because he works remotely, or can be switched off for a physical place. A public type shows on the booking page; a private one is reachable only through a URL he hands out.
  • Bookable hours default to Outlook working hours, overridable per type. "Use my regular meeting hours" applies the working hours configured in Outlook, for Giard 9:00 a.m. to 5:00 p.m., Monday to Friday. Custom availability can add time outside them (a couple of hours on a Saturday afternoon) or block a day such as Thursday.
  • Advanced options control how and when people can book. These are buffer time before or after the meeting (he leaves it at zero), start times limited to 30-minute intervals, and a minimum lead time of an hour, eight hours, one day, two days or custom hours. He picks a custom 4 hours to give himself time "to actually read my email" and prepare, and caps booking at 30 days ahead. Optional email reminders (e.g. 15 minutes or two days before) and a follow-up email, such as a survey, can be added; he uses neither.
  • Requesters see only open slots, and bookings land in Outlook. Opening the shared URL, the page offers only the 30-minute slots his calendar has free. Playing the requester, Giard books a Monday 9 a.m. slot with name, email and a note, and can manage or cancel it afterwards; the booking then appears in his Outlook inbox and calendar.
Working With Copilot Rules in Excel [GCast 222]
  • A worksheet named "Rules" sets standing instructions for Copilot in Excel. Giard calls "rules" a "magical name": a sheet with that name tells Excel it holds rules Copilot should adhere to, standardizing how Copilot behaves in that workbook. You can add whatever rules you think are necessary.
  • Without rules, Copilot does what is asked but in default form. Giard runs a set of prompts in the Copilot chat: add a new worksheet (named Sheet2, Excel's default), add sample data with month, revenue, expense and profit columns, add a column for the last day of each month, and create a bar chart. It did exactly what he asked, he says, but the data is "not formatted very prettily" and the chart came out horizontal.
  • His rules sheet covers naming, number formats, styling and charts. Grouped under headings, the rules ask for three-letter month abbreviations, formulas for calculated columns, currency with commas and two decimal places, four-digit years, dark green headers with white bold text, descriptive chart titles, and vertical rather than horizontal bar charts. New sheets are to be named "report-" plus year and month (yy-mm) followed by a sequential number.
  • The same prompts with the rules sheet in place follow every rule. The new worksheet is named in the report-yy-mm format with sequential number 1, the sample data shows two-decimal currency, three-character months and bold white-on-green headers, the last-day column is built with a formula, and the chart is a vertical bar chart.
Adding Files to Ground a Microsoft Foundry Agent [GCast 221]
  • Retrieval Augmented Generation grounds an agent's answers in chosen sources. Giard lists documents, a website, a repository or a SharePoint site as possible sources, and here adds documents to the software-development question agent from episode 215, which already has web search enabled.
  • Uploading files now builds the search index automatically. Giard says he previously had to create an AI Search service, add the files and index them himself. Now browsing for files or dragging them onto the agent's page uploads them, creates the search service with its vector database, and runs the indexing behind the scenes, after which he clicks save. His verdict: "much easier than it used to be."
  • The agent then answered from the uploaded files as well as the web. He uploaded about 15 markdown files of book summaries for a made-up author, each giving author, publication year, pages, price and a rating out of five stars; Copilot wrote them, so none of it is on the web. Asked for the top-rated book by that author published on or after 2021, the agent named a 2025 title rated 4.9 out of 5 — showing only that the grounding ran.
Creating a Workflow in Microsoft Foundry [GCast 220]
  • Workflows chain agents and logic nodes in Foundry. Giard calls Workflows a feature "in preview right now", reached from the Workflows option on the project's Agents page, and he builds on the agent from episode 215. A new workflow starts blank (only a start node) or from a template. The nodes he lists are: invoke an agent (pick an existing one or create one on the spot), set, reset or parse a variable, conditional logic, loops and go-tos, send a message to the user, ask the user a question (which pauses for input), and end.
  • The human-in-the-loop template loops until the user's answers match. It stores the user's first input in a variable, asks them to confirm it, and uses a condition plus a go-to to keep asking until the reply matches the original. In the preview, which Giard likens to the agent sandbox, mismatched replies sent the flow back around the loop until a matching one confirmed it. A workflow's name must be unique within the project.
  • The sequential template passes each agent's output to the next. Giard calls it "one of the more interesting ones". Its marketing example runs three agents in order: an analyst lists key features, target audience and selling points; a copywriter turns these into English prose; an editor polishes the wording. His reason for using separate agents rather than one big prompt is that each part can be tweaked on its own, and one agent can be reused across several workflows. In the demo, a made-up kitchen gadget went from bullet points to rough prose to finished copy.
  • Each agent can use its own model, temperature and top P. Giard says temperature and top P do the same thing with different algorithms, and Microsoft recommends changing one but not both. Lower values give more consistent, deterministic output. Higher values give more creative output but a higher chance of hallucination, so the right setting depends on the use case. Tools, such as search over internal repositories, databases or SharePoint, and guardrails can also be added, but he skips them here.
  • Publishing a workflow as a workflow app exposes an endpoint. Giard says applications or a website can call that endpoint to use the workflow.
Working with Models in a Microsoft Foundry Agent [GCast 219]
  • An agent's model is swappable from a dropdown at the top. On the agent from episode 215, the default model is GPT-4.1; the dropdown also offers GPT-4o, a GPT-4.1 mini variant, o4-mini and others. "Browse more models" opens dozens more, searchable by name (he searches "Claude") or filtered by collections, features, inference or deployment SKU, and sortable by updated time.
  • The Discover tab's Models page gives detail, including pricing, before deploying. Models there are grouped by task, such as text-to-image, chat completion and fill mask, and Giard says the choice depends on your goals. Each model has quick facts and pricing, which he calls "one really good piece of information" to check before deploying, and a model can be deployed from that page to make it available to any agent in the project.
  • Selecting a new model in the agent deploys it to the project. Picking GPT-4o and saving both deployed it and assigned it to the agent; the Deployments list then showed GPT-4o alongside GPT-4.1 and the text-embedding model from an earlier episode.
  • Temperature and Top P trade consistency against creativity. Both sit behind an icon to the right of the model for chat-completion models, and do the same thing with different algorithms; Microsoft recommends changing one, but not both. Giard explains that a temperature near zero makes answers consistent and deterministic, while a high one gives more varied answers, useful when there are several right answers, at the risk of hallucination.
  • The playground is where to compare models and settings before release. Giard suggests asking the same question with different models or temperatures in the playground beside the agent before deploying it for others, calling it an inexpensive, safe and fast-to-iterate environment.
Analyzing Contracts and Other Legal Documents with Legal Agent [GCast 218]
  • Legal Agent is a gated preview inside M365 Copilot. According to Giard it needs an M365 Copilot license and an organization enrolled in the Frontier program, and during the preview it works only in the United States. You can tell you have access if Legal Agent appears under the plus icon after opening Copilot (bottom right) in a Word document.
  • It reads contracts with knowledge of their structure. Giard says this is what it adds over plain M365 Copilot. He ran it on an 11-page services agreement taken from the public internet. It answered the top five risks to the buyer (including broad IP assignment and late payment), the vendor's obligations grouped by category (such as service delivery, payment and fees, and intellectual property), and the indemnification clauses and their impact. Each finding linked to its section of the document.
  • It can draft and apply edits to the document. Two prompts asked it to add a termination-for-convenience clause in line with standard enterprise contracts, and to revise a clause to reduce a vendor obligation while keeping its intent. It proposed text that he scrolled to and applied with a click.
  • It produces executive summaries, including ones aimed at a specific audience. A one-page summary of risks, obligations and recommended actions came back with links into the document and could be pasted into an email or another document. A follow-up asking what a CFO should care most about returned bullets for that reader.
  • A playbook can stand in for individual prompts. A playbook is your own way of reviewing a legal document, loaded from SharePoint or your computer. Legal Agent turned his simple playbook into a list of topics to analyze, which can be extended before continuing. It then ran the whole analysis and suggested text to apply, for example on the change-management process.
Using Copilot Prompt Files in Visual Studio Code [GCast 217]
  • A prompt file is a Markdown prompt template run by a slash shortcut. Instead of writing out a whole prompt, you type the shortcut and it expands into the prompt, with optional parameters for the words that change each run. Giard says this suits prompts run repeatedly, especially ones slow to compose or type.
  • A plain prompt works once but must be edited every month. His use case is a social-media planning file: a prompt told Copilot to add text to social media.txt, repeating a template (a "July DD" date, an "I am grateful for" line with #gratitude, and #songoftheday) 31 times with DD replaced by a sequential number. It produced the entries in about 30 seconds, but each month he would have to change the month name and the day count by hand.
  • Typing /prompts and choosing "new prompt file" creates the template. The default location is the .github/prompts folder, which VS Code creates if missing; the file is the prompt's name followed by .prompt.md (his is add-dates.prompt.md), with a name and description at the top and the prompt below.
  • Parameters are dollar-sign input placeholders, each with a name and description. He replaced "31 times" with a number-of-days-in-the-month input and "July" with a month-name input. Running /add-dates then asked for each value in turn (July, 31) and produced July 1 through July 31 as before.
  • Editing the Markdown file changes every future run. He added a joke-of-the-day line to the template and ran /add-dates for September, chosen because it has 30 days; the output used September, included the new line, and stopped at 30 entries, showing the parameters are dynamic.
Adding Guardrails to a Microsoft Foundry Agent [GCast 216]
  • Foundry agents ship with default guardrails that block or log. Working on the agent from episode 215, Giard shows two built-in guardrail versions, which he says do much the same thing, with version 2 doing a little more. They cover categories such as hate speech, self-harm and sexual content, on user input (prompts), on output (responses), or both. Each one either blocks the content outright with a refusal message, or only logs that it happened.
  • A custom guardrail can be built once and reused across agents and models. Under the project's guardrails section, the options Giard lists are a jailbreak check that applies to user input only, a protected-material check for code or text that applies to output, which he says is "so that you're not revealing secrets", and categories such as hate, self-harm, sexual and violence that apply to both. Each risk has a severity level that sets how severe content must be before the guardrail kicks in. He attaches the guardrail to his one agent and to both models he has deployed, then names it.
  • The demo hate-speech guardrail blocked a threatening prompt. After he assigned the guardrail to the agent, the test prompt "I will kill you" got a refusal saying the request was blocked by guardrails.
  • Block lists forbid specific terms in prompts or responses. Foundry includes a built-in profanity block list, which Giard says rejects prompts containing swear words and filters them out of responses. A custom list can be loaded from a CSV file for long lists of terms, or entered one term at a time. Each term is matched either exactly, ignoring case, or by a regular expression.
  • A block list takes effect only through a block-list guardrail. Giard builds a block list containing "rosebud", then creates a guardrail of type block list that uses both it and the built-in profanity list, on input and output. Annotations are not supported for this type, so it can only block. Once it was applied to the agent and its models, a prompt asking about "rosebud" was refused because the block list forbids the term.
Creating an AI Agent in Microsoft Foundry [GCast 215]
  • The Foundry portal changed enough to warrant a fresh walkthrough. Giard says his previous Foundry video is a little over a year old. From ai.azure.com he chooses "view all resources" to create a new Foundry resource and project (named GCAST and GCAST-resource), picks a subscription, creates a new resource group (GCAST-RG) and keeps the default East US 2 region; creation took about 30 seconds against the 30–60 he estimated.
  • The default model can be swapped for one from another vendor. After "create agent", the agents tab defaults to the latest version of GPT; "browse other models" lists models from other companies, open-source models and, in Giard's words, "even some of our competitors".
  • Instructions are the agent's operating manual. Giard calls them the most important part: they set the persona, the topics it knows, how answers are structured, the tone, and what not to answer. His sample makes it a friendly technical mentor for developers learning Microsoft AI and data tools, with short code samples in C#, Python or JavaScript, a short answer first, then steps and pitfalls, and steering back to technology on off-topic questions.
  • The built-in chat pane tests the agent before anyone else uses it. Giard's test prompts got answers in the structure the instructions asked for: bulleted lists, key points, a link, and step-by-step guidance. They got more code only when a prompt explicitly asked for a Python example.
  • Editing the instructions changes the agent's behaviour straight away. Giard adds one sentence telling it to always end with a short numbered "next steps" checklist, saves, and the repeated prompt then ends with that list. His point is that the behaviour is "not magic"; it is designed in natural-language instructions, and he says the whole agent took under 10 minutes.
Using M365 Copilot to Edit a PowerPoint Image [GCast 214]
  • Copilot now edits images inside PowerPoint without an outside editor. Giard calls it a new feature, replacing the round trip out to software such as Photoshop or Lightroom and back. The editor opens either by right-clicking the image and choosing Edit Picture or from the Picture Format ribbon's Edit Image. A toolbar shortcut such as remove background exists, but he says the full editor gives more control.
  • The Background tab removes or recolours the background automatically. Removal took a few seconds and found the background itself. The colour can instead be set from a picker, a shade slider or a hex value, with an alpha setting to lighten it.
  • Upscale uses AI to raise a poor image's resolution. Giard's test was an old, grainy photo shot on film (about ISO 1000, he guesses) and then scanned. It took about a minute, and he says it "did a really good job": his face, unclear before, came out clear. The Enhance options also include auto-enhance and effects such as glass, pixelate and scatter, applied to part or all of the image by resizing the selection window.
  • Selected objects can be erased with the gap filled in, or moved. An object is selected by drawing a box, by automatic selection, or by painting over it with a brush. Erase removed a rock and filled in what was behind it "intelligently"; Move relocated another and allowed tilting it.
  • Text overlays start from a preset style, then take full formatting. After picking one of the default styles, Giard replaces its word and changes size, underline, shadow, font and colour. Alignment matters only when the text box is bigger than the text. Save writes the edited image back into the presentation.
Creating a Video Using M365 Copilot [GCast 213]
  • M365 Copilot turns a PowerPoint deck into a narrated video. Giard calls it "a pretty new feature", reached from Create, then "Create a video", in full-screen Copilot or at m365.cloud.microsoft. It reads each slide's pictures, text and notes, uses AI to write a script, and then generates a voiceover for it. His short deck took about 30 seconds; he says a longer one might take minutes.
  • You can edit the generated script, voice and music, then re-render. The narrator mispronounced Tufte, and adding a letter to the name in the transcript and clicking update fixed it. He also rewrote a line the same way. Music is off by default. The default voice was "Fable", and there are five voices, male and female, in styles such as "soothing and calm", measured, spirited and quick. The whole script can also be regenerated in another tone, such as more confident, casual or playful.
  • The source must be in OneDrive and shareable for export. Export and share renders an MP4 and uploads it to OneDrive, where you can copy a link, watch it or download it; it can also be opened in Clipchamp, which he skips in favour of his Adobe tools. Giard says a file with locked-down privacy settings won't be turned into a shared video, so the feature can't be used to get around those settings.
  • A Word document works too, but the narration paraphrases it. His blog post with images took about 45 seconds. The same transcript, music and voice controls apply, and this version adds a choice of colours and image branding. He thinks the deck version just used the deck's own colours.
  • A text prompt can generate a video or a short clip. "Create a video" from his panda prompt produced a narrated piece that "didn't do exactly what I was expecting". The separate clip option took about two and a half minutes and produced an 8-second clip, which he says is higher quality and closer to the request; he thinks the maximum is 7 or 10 seconds. Both refused a named copyrighted song. The clip tool ran for minutes before failing without a reason, which he believes was copyright. He guesses violence or a real person might also be blocked, but says he hasn't tried.
Scheduling a Microsoft Copilot Prompt [GCast 212]
  • Copilot can re-run a prompt on a recurring schedule. Giard's example asks for tomorrow's accepted meetings and how to prepare for each one. He runs it with the Work tab selected, which gives Copilot access to whatever he has permission to see: email, calendar, Teams messages and OneDrive.
  • The "schedule this prompt" icon under a response sets the schedule. You choose a start date and time (he picks 4:30 that day) and the days of the week (he picks Monday to Thursday). You also set the number of runs: a run can't repeat forever, and 15 is the maximum. An option sends an email with a link to the response when it is ready.
  • Scheduled prompts are managed from the three-dot menu. Under "Scheduled prompts" you can run one now, edit its time, days and email setting, or turn it off. Turning it off only makes it inactive, for example while on vacation. Deleting removes it for good. A debug panel shows exactly what is being sent to Copilot, to pass to tech support if something goes wrong.
Creating and Managing a SharePoint Agent [GCast 211]
  • These agents answer natural-language questions about a site's content, within the asker's permissions. Giard says a SharePoint agent works over a site's documents, libraries and lists, and won't answer from documents the person asking can't access. Creating one requires site editing permissions and an M365 Copilot license; he notes a pay-as-you-go pricing model is also available.
  • Every site already has a built-in agent that needs no setup. It opens from an icon at the top right of the site and offers suggested prompts. In the demo, "Summarize Recent Files" listed the most recently uploaded or edited files with a short description of each. Giard calls it "pretty useful right out of the box."
  • A custom agent's purpose prompt sets its scope, structure and tone. The agent is created from "Create an Agent" in the same pane, with a name, an icon (the default can be replaced) and a purpose. Giard swaps the default purpose text for one that describes what each folder holds (books, concerts and theater reviews, as PDF drafts), tells the agent to answer only from those files, and asks for a formal tone that calls everyone "sir or ma'am". In the demo it used that form of address, tolerated a typo, kept context for follow-up questions, and linked each answer to its source PDF. Asked for three novels, it found only two reviews that were clearly novels.
  • The agent is saved as a file you can edit later. It is stored in the site's Documents folder, and opening it always launches the chat in M365 Copilot. From the file's ellipsis menu you can edit the name, picture and prompt. When Giard changed the tone to casual ("call everyone buddy or pal"), the next answer called him "buddy". The agent also has an option to delete all Copilot history so it forgets earlier conversations.
  • Share the agent by link; deleting it removes it permanently. Giard says the simplest way to share is to copy a link from the Share option, which gives the recipient access to the same chatbot. You can set the link's access settings or email it from there. The same menu deletes the agent, and he says it is then "gone forever".
Incorporating Playwright Tests into a GitHub Action [GCast 210]
  • The local test repo must first get a GitHub remote. Building on the Playwright test and Azure Playwright workspace from the series' first two videos, Giard creates an empty GitHub repository with the same name as the local one, links it with git remote add origin plus the repository URL ending in .git, and pushes with git push -u origin main.
  • Repository secrets keep workspace and identity details out of the YAML. Under Settings > Secrets and variables, Giard creates four Actions secrets: the Playwright service URL (copied from the workspace's Get Started page), the Azure client ID, the Azure tenant ID and the Azure subscription ID. He first fills them with an "X" as placeholders, because each value comes from a different place.
  • An Entra app registration supplies the identity the tests run under. Giard registers an app limited to accounts in his own organization's directory, with a Web redirect left blank. Its application (client) ID and directory (tenant) ID become two of the secrets; the subscription ID comes from Subscriptions in portal.azure.com. He then assigns the app the Contributor role on that subscription through Access control (IAM), noting that Contributor is listed among the privileged administrator roles.
  • A federated credential ties that identity to one repository branch. In the app registration, under Certificates & secrets > Federated credentials, Giard adds a credential using the "GitHub Actions deploying Azure resources" scenario, giving his GitHub account as the organization, the repository name (he notes it is case-sensitive), entity type branch, and the main branch.
  • The workflow YAML runs the tests in Azure and keeps the report. Giard's replacement YAML triggers on a push or pull request to main, requests ID-token write and contents read permissions for Entra, and runs one test job on the latest Ubuntu with a 60-minute timeout. Its steps are checkout, Azure login using the three ID secrets, installing dependencies with npm, npx playwright test against the service config file from the previous video with a set maximum of workers and a report format, and an always-run upload of the Playwright report folder as an artifact, its retention changed from 5 to 10 days. A commit and push started the run, which took about a minute and a half, and the report downloads from the run page as a zip file.
Running Tests in an Azure Playwright Workspace [GCast 209]
  • An Azure Playwright workspace runs existing Playwright tests in the cloud. It is created in the Azure portal by searching resources for "Playwright workspaces" and giving a resource group, subscription, name, region (only a few regions offer it) and optional tags; creation takes about 30 seconds, and the workspace's Get Started tab lists the steps for wiring up a test project. The project is the one from the previous episode.
  • npm init @azure/playwright@latest adds the cloud config to the project. Run from bash, it created a playwright.service.config file (running on Linux with default Azure credentials) and added authentication settings to existing files; the recommended identity is Entra ID, so Giard signs in with az login and picks the tenant holding the workspace.
  • Tests reach the workspace through an environment variable and the service config. PLAYWRIGHT_SERVICE_URL is set to the workspace endpoint, then npx playwright test runs all tests or a named file such as example.spec.js, with --config pointing at the service config — renamed from .ts to .js because the project uses JavaScript. A maximum worker count is optional and lets many tests run simultaneously; his three tests passed in the cloud on one worker.
  • Persist the endpoint in a .env file instead of in memory. Installing dotenv with npm i --save-dev and adding require('dotenv').config() to the config file makes it read the PLAYWRIGHT_SERVICE_URL= name-value pair (without export) from .env; Giard notes a store such as Key Vault might be more secure. Rerun this way, the three tests passed again.
Creating UI Tests with Playwright [GCast 208]
  • Playwright is installed by an interactive npm initializer. With Node.js and an IDE (his is Visual Studio Code) as prerequisites, npm init playwright@latest asks for TypeScript or JavaScript (he picks JavaScript), a folder for end-to-end tests (default tests), whether to add a GitHub Actions workflow (yes), and whether to install the Playwright browsers now.
  • By default every test runs once in each of three browser engines. The config installs Chromium (the engine under Chrome and Edge), Firefox and WebKit (the engine under desktop Safari), and engines can be added or removed later; so the two generated sample tests ran as six under npx playwright test, and npx playwright show-report serves the per-browser results from a local web server.
  • A test is an awaited sequence of page actions followed by assertions. The samples await page.goto the playwright.dev URL and expect the title "Playwright", or click the link with role and name "Get started" and expect a heading named "Installation" to be visible; the test passes only if the assertion holds.
  • Codegen records clicks and keystrokes in a browser as test code. npx playwright codegen <URL> opens an emulated browser beside a code window that writes a line per action; toolbar buttons add assertions (assert visibility, assert text), and the output can be switched from Node to Python, .NET with MSTest or NUnit, or Java with JUnit. Giard pasted a recorded run of a simple form into the spec file as a third test.
  • The recorded test failed only in WebKit, which he left unresolved. Three tests across three browsers made nine runs; the new one passed in Chromium and Firefox but in WebKit hit the 30-second timeout because it could not find and check a radio button. Giard guesses it may relate to Safari not being supported on Windows and calls it something to explore.
Mastering GitHub Copilot course, Using GitHub Copilot with Python, Part 2 [GCast 207]
  • Agent mode trades Ask mode's safety for the power to edit files. Continuing from Part 1 of the Python module of Microsoft's "Mastering GitHub Copilot for Paired Programming" course, Giard works in its prebuilt GitHub Codespace, where the Copilot chat window has a drop-down for Agent, Ask or Edit mode. Ask mode, used in sections 1 and 2, by default creates and modifies nothing. Agent mode can change your files, so he says you want to keep an eye on what it is doing.
  • Files in the chat's context get Copilot's constant attention. Files open in the editor are added by default, and others can be added with the plus button or by dragging them from the File Explorer. With no file in context it should look at the whole repository, so Giard advises adding the files most important to a prompt to scope it.
  • Agent mode turns a multi-step prompt into a to-do list. Asked to fix code structure and comments, add consistent error handling, input validation and API versioning, write unit and integration tests, document the project, and make it deployment-ready, secure and faster, it drew up six to-dos and worked through them in turn. Proposed changes show as green (added) and red (deleted) lines until accepted with "keep". The demo added validation code, a tests folder and more documentation, and the API page still ran on port 8000. Giard says he would not send all of this as one prompt in production, but would run the prompts one at a time.
  • Agent output is non-deterministic and still needs a human check. Giard says this was his fourth run of the section and each gave different results; the day before it ran for about half an hour and made much bigger changes. His view is that it is not necessarily correct, so you should run, compile and read the code and understand it before accepting it, even when using it to learn Python, and that AI is not going to take your job yet.
  • Instruction files set the standards Copilot applies when generating code. A Copilot instructions markdown file in the project's .github folder sets guidelines such as project purpose, technologies, coding style, naming conventions, the PyTest testing framework and the mocking framework, and applies to every file in the project. For rules that cover only some files, a file such as apiroutes.instructions.md in a .github/instructions folder carries an "apply to" pattern at the top. In the demo it limits the rules to Python files in the webapp folder, for type hints, docstring format, parameter names and accessibility.
Mastering GitHub Copilot course, Using GitHub Copilot with Python, Part 1 [GCast 206]
  • A GitHub Codespaces environment comes ready to run the exercise. Giard opens it from a button in the course instructions (github.com/microsoft, the "Mastering GitHub Copilot for Paired Programming" course); it runs in the browser with the repository's code, VS Code, Python, the VS Code extensions and GitHub Copilot already installed. This episode covers sections one and two of the Python lesson's four.
  • Ask mode is the least powerful and safest of Copilot's three modes. Of ask, edit and agent, ask only answers questions or suggests code changes and makes no changes itself; Giard advises staying in it until you need edit or agent mode.
  • Copilot chat can explain a project and diagram its workflow. Typing "/" lists built-in commands and "/help" describes them; "/explain" with @workspace, an agent that understands the whole project, described the two endpoints in main.py. Asked in plain English for a workflow diagram, it laid out the browser-to-endpoint flow, which Giard calls useful for inherited code or for explaining code to management or a customer.
  • A code comment prompts Copilot to write the code as ghost text. Lighter-coloured suggested code with no line numbers appears under the comment; Tab accepts it and Escape dismisses it. From two comments he got a Pydantic model and a FastAPI POST endpoint, /checksum, deleting extra code Copilot had anticipated but he had not asked for.
  • Ctrl+I opens chat that acts only on the highlighted code. It is Cmd+I on a Mac. "/improve" reworked the endpoint and added an import of hashlib, with accept, regenerate or close as the options; explicit instructions then added a hash-type parameter (MD5, SHA1 or SHA-256), a check that the text is not empty with a 1,000-character limit, and a fuller docstring.
Mastering GitHub Copilot course, Integrating MCP with Copilot [GCast 205]
  • MCP gives AI applications a standard way to connect to services. The lesson calls the model context protocol "USB-C for AI": an AI application such as GitHub Copilot can call any service that follows the standard. This episode uses an MCP server that already runs inside GitHub rather than building one.
  • An mcp.json file in the .vscode folder connects the server. Giard pastes the lesson's JSON into it. Because the format is standard, VS Code recognizes it and adds a start button that launches the server. In Copilot Chat in agent mode, the tools button then lists the server's capabilities next to the built-in ones, including adding comments, creating issues and sub-issues, and assigning them.
  • Copilot calls the MCP server for what its own tools cannot do. Asked to find other repositories for organizing extracurricular activities, it searched public GitHub repositories in about a minute. It then described one project's features and compared them with the demo app. Giard had it open issues for the seven missing features, approving each call or allowing them all for the session.
  • Agent mode carries an issue from triage through to a pull request. Copilot found 14 open issues (Giard thinks he ran the step twice) and picked the top three, starting with a persistent database and security. Told to create a branch, make the changes, confirm with him, then push and open a pull request, it created the branch and installed SQLAlchemy. It then made 10 changes to app.py, each of which can be kept or undone, and installed a newer Python to run the app. Copilot also generated the commit message.
  • The lesson ends with a merge and a closing comment on the issue. Giard merges the pull request into main and has Copilot post a one-sentence description of the fix, thanking the commenters. The lesson also has learners commit straight to main, which Giard says he doesn't think is always a good idea. A GitHub agent in the course repository detects each finished step within seconds and posts the next one.
Mastering GitHub Copilot course, Using GitHub Copilot with JavaScript [GCast 204]
  • Copilot Chat's three modes each add power to the one before. Giard says Ask mode only answers questions and leaves code alone, Edit mode changes code, and Agent mode can also run commands for you. He works the intermediate JavaScript lesson of the Mastering GitHub Copilot course from GitHub and Microsoft Learn in its prebuilt Codespace, browser-based Visual Studio Code with the recipe app already installed. Typing a slash lists the built-in commands: /doc wrote documentation for every get and post method in the open routes.js, and /help explains the rest.
  • A plain code comment is enough to generate a new route. Typing a // comment asking for a route that gets a random recipe made Copilot propose code in lighter italic text, and Tab accepted it. The result was a recipe/random route that connects to the database and runs select * from recipes order by random limit 1. Copilot then suggested a delete-recipe route he had not asked for, and Escape turned it down.
  • Inline chat edits only the code you highlight. With a route highlighted, Ctrl-I (Command-I on a Mac) opens a small chat in the editor. "Sort by title" added order by title to the query and showed the change in green. From there you can accept it, regenerate it for another attempt, or close it to throw it away.
  • Agent mode carried out a multi-file feature, tests included. His prompt asked it to delete recipes through an HTML form and a new POST route on the recipe ID, put buttons on the view and edit pages, and write tests. Giard calls it a good prompt because it gives everything he knows without saying how to do it. In under a minute it changed routes.js, added a test, and added a delete button to a page. He kept each change after reviewing it one at a time, then allowed it to run the tests, and three tests passed.
  • Instruction files make Copilot follow your project's conventions. Copilot already tries to match the style of the existing files, but copilot-instructions.md in the .github folder states it outright for the whole project: here Node.js with Express, SQL.js, Handlebars, Jest, folder locations for queries and views, and coding patterns. Files named *.instructions.md in an instructions folder cover only part of the project; the styling file's header limits it to the CSS files in public. To test it he asked for a new FAQ view, and Copilot created a Handlebars .hbs file in the views folder, as the instructions specify.
Mastering GitHub Copilot course: Getting Started with GitHub Copilot, Step 3 [GCast 203]
  • Edit mode changes code across several files at once. Ask mode, used in steps 1 and 2, only answered questions. In edit mode Copilot shows its changes inline, and nothing is applied until you keep it. Giard says working across files is the advantage because a change often touches more than one.
  • Adding files to the context tells Copilot where to look. You can pick files and folders with the Add Context button in Copilot Chat. Giard finds it simpler to drag them into the chat window, here the JS, HTML and CSS files.
  • One prompt added participant lists to the activity cards. The activity data already held an array of participants, such as two for the chess club, but the cards did not show it. Giard asked Copilot to add a participants section as a bulleted list and "make it pretty". It built the list's HTML in app.js, appended it to the card, and added styles in styles.css. Each of the four changes could be kept or undone. After he kept them, the cards listed participants inside a border with an offset colour.
Mastering GitHub Copilot course: Getting Started with GitHub Copilot, Step 2 [GCast 202]
  • Ask mode with @workspace traced a bug without touching code. The bug was that a student could sign up twice for the same activity, or for more than one; Giard wants one activity per student. Copilot searched all 24 files in the repository and placed the bug in the signup function in app.py. It recommended checking whether the email is already in the activity's participants.
  • A plain-language comment got Copilot to write the fix. Giard typed the comment "validate student is not already signed up" and accepted the greyed-out suggestions with Tab. The new code checks every activity for the email and raises an exception if it is there. On retest, a second signup was refused with "Student already signed up for an activity".
  • Inline chat (Ctrl+I) works on the code under the cursor. On Mac it is Cmd+I. With the cursor on the activities collection, Giard asked for two more sports, two more artistic and two more intellectual activities, and Copilot extended the list. You can accept, close to reject, or regenerate for a different version. The new activities appeared both in the cards and in the drop-down.
  • Copilot drafts the commit message from the staged changes. Giard says a relevant message lets a later reader see when a change happened. Writing one used to mean reviewing the diff himself. The sparkle button above the commit button in Source Control writes a message from the changes, which he says you should still read and check. Committing first asked to stage the changed file.
Mastering GitHub Copilot course: Getting Started with GitHub Copilot, Step 1 [GCast 201]
  • GitHub and Microsoft Learn's course comes as hands-on exercise repositories. The course is in GitHub's Microsoft organization, as "mastering GitHub Copilot for paired programming". Its lessons are grouped as beginner, intermediate and advanced. Giard recommends forking the repository. Copy Exercise then puts a lesson's source and instructions in your own repository. There, a GitHub agent called "Professor Cat" watches your progress and gives tips.
  • Codespaces runs VS Code and its extensions in the browser. This avoids installing an IDE, Python and extensions locally, and having to remove them afterwards; any IDE with the right extensions also works. The lesson needs the GitHub Copilot and Python extensions. Giard recommends VS Code itself: free, cross-platform, open source and lightweight. He flags an error in the instructions: his environment had no Copilot icon, but View > Chat in the hamburger menu reaches Copilot Chat.
  • Ask mode with @workspace explains an unfamiliar codebase. Of the three modes (ask, agent, edit), ask answers without changing code. @workspace understands the whole repository. Asked to explain the structure, it read 24 files and described the folders, configuration and key files. Giard says that as a consultant who inherited other people's code, this would have got him up to speed quickly.
  • Copilot supplies setup commands you can send straight to the terminal. A follow-up, "how do I run it?", kept the context. Copilot gave commands to create a Python virtual environment, upgrade pip, install from requirements.txt, and start the app with uvicorn on port 8000. Each answer can be copied, inserted at the cursor, or inserted into the terminal. The app lets a student sign up by email for one of three activities.
  • General Git questions get the commands, too. Asked how to create and publish a new branch, Copilot gave a checkout command to create the branch and a push. Giard ran them from the chat and the new branch appeared. He pitches this for tools you use too rarely to remember the syntax, instead of a search engine.
Recording and Editing a Screencast [GCast 200]
  • Giard records GCast as a one-person Microsoft Teams meeting. He uses Teams because it is already installed; he used to use TechSmith's Camtasia, but doesn't have the latest version on this machine. He starts a Meet Now meeting with the camera off and shares a single monitor, keeping his notes on another. He then starts "record and transcribe", and when done stops recording and ends the meeting.
  • The recording downloads from the browser, not from Teams. The meeting recap in Teams holds the recording and transcript. Giard found no download option there, so he uses "watch in browser", where a download button saves an MP4.
  • Each episode starts as a copy of the last Premiere project. He edits in Adobe Premiere Pro because he has it and wants to get better at it. Copying the last project keeps the intro, outro and music. He saves it under the new episode number and title, deletes the old screencast, and updates the episode number, title and recording date. The raw MP4 goes in a per-year raw-videos folder under a GCast videos folder on his C drive. From there he imports it with the Media Browser and drags it onto the timeline. He trims the start to where the audio begins, using Ctrl+K and Delete.
  • Zooming the clip hides the Teams self-view thumbnail. He knows no way to remove the thumbnail itself. In Effect Controls he sets X position 1155, Y position 562 and scale 120, numbers he found by experiment, which fills the frame with a little cropping.
  • He exports to a final-output folder, then uploads to YouTube. The file is named "GCast" plus the episode number and a description. For a project without a template, assets are imported through the Media Browser and dragged onto the timeline. These include the intro animation he made in PowerPoint a couple of years ago and Creative Commons music credited at the end. A text tool adds titles. Giard says the template takes out the tedious, repetitive part. The fun part is building the demos.
Getting Started with Draw.io [GCast 199]
  • Draw.io is a free, browser-based diagramming tool. Typing draw.io in the address bar redirects to a diagrams.net address; Giard uses the draw.io name because it is easier to remember. The blank canvas has grid lines (which can be turned off or resized) and a page outline showing page size and portrait or landscape, useful for printing and something he suggests turning off if you never print.
  • Shapes drag onto the canvas and connectors stay attached. Shapes from the left panel can be moved, resized (some keep their proportions when dragged by the corner) and given text by double-clicking. Hovering over a shape shows arrows to drag to another shape and dots called connection points; a connected arrow follows when a shape is moved. Giard says it looks a lot like Visio, which he has used for a long time.
  • Selected shapes can be aligned from Arrange or right-click. With two or more shapes selected, Arrange > Align (also on the right-click menu) aligns them by top, middle or bottom, or vertically by center.
  • More Shapes adds extra shape libraries. Beyond the default categories such as Miscellaneous and Advanced, More Shapes lets you toggle on others; Giard shows Microsoft Azure shapes and UML.
  • XML saves keep the diagram editable; image formats travel further. XML is the default save type and records each shape's position, size, text, connections and background, so draw.io can reopen it; PNG, vector and HTML are also offered. Saving as PNG loses the editing features but, Giard says, can go into a Word document, web page or markdown file for people who don't know draw.io. Files can be saved to Google Drive, OneDrive, Dropbox or GitHub, or downloaded.
Automatically Importing Meeting Notes into OneNote [GCast 198]
  • OneNote can import a Teams meeting's details with one click. On a OneNote page Giard clicks Meeting Details, picks the Microsoft account that attended, navigates to the meeting's date and selects the meeting. He credits a coworker, who showed it at an internal "Teach Me in 10" session.
  • The import brings in what he used to type by hand, plus Copilot's AI summary. The page fills with a link to the meeting, its recording, the original Outlook invitation, the participants, the meeting collateral (files and PowerPoints added to it), a Copilot-written summary, suggested tasks, and a notes section at the bottom where he can keep typing as on any OneNote page.
  • Giard values it because note-taking pulls attention from the meeting. He says the summary "may or may not be as detailed" as his own notes but saves him a lot of work, and calls finding the feature "game changing".
Forking a GitHub Repository and Creating a Pull Request [GCast 197]
  • Fork a shared repository rather than editing it directly. Giard presents forking — copying someone else's repository into your own GitHub account — as a safer way to collaborate, since changes in the fork do not affect the original. His example is Microsoft's open-source NLWeb project, which accepts contributions; he recommends it as a tool for adding natural-language chat to a website.
  • The Fork dialog sets owner, name, description and branches copied. The owner defaults to the signed-in account; the name defaults to the original's, which he keeps as a reminder of where it came from, and must be unique within the account. The description is pre-filled, and an option copies only the main branch (his choice) or every branch. Create Fork copies the repository and opens it.
  • A pull request asks to merge the fork's changes back into the original. After a one-line README edit committed in his fork, he opens Pull requests, creates a new one, reviews the diff, and adds a title and description.
  • Repository rules can hold the pull request for review. NLWeb requires a review from someone other than the last pusher, so his request goes into a queue for the maintainers to approve rather than merging automatically. Giard notes that not every repository has such rules.
Deleting a GitHub Repository [GCast 196]
  • Deleting a repository is deliberately hidden in its Settings. From the repo's Settings button, the option sits at the very bottom in the "Danger Zone", where irreversible actions are outlined in red with red buttons. Giard says he made the video because the feature is not at all obvious, and judges it hidden by design so nobody deletes a repository by accident.
  • GitHub stacks several confirmations before the delete goes through. After "Delete this repository", it asks him to confirm the repository, then warns that deletion is permanent with no undelete option, then asks him to type the owner/repository name. He shows that the name can be copied and pasted rather than typed.
  • With two-factor authentication on, a final approval comes from the phone. Because his account uses two-factor authentication, GitHub asks him to approve in the GitHub Mobile app using a number shown on screen, which changes every time; entering a password is offered as an alternative. Once he approves, the portal shows a message that the repository was deleted.
Creating a GitHub Repository [GCast 195]
  • A new repository needs an owner and a name unique to that owner. Giard clicks the green New button at the top right of the GitHub portal. He skips the available templates, picks himself as owner from the accounts he has permissions on, and GitHub reports whether the name is available. A description is optional.
  • Public repositories are visible to anyone; private ones need granted permission. He makes his demo repository public because it contains nothing secret, and says a public repository should probably also get a license.
  • README, .gitignore and license files can be generated at creation. The README is a Markdown file explaining the repository's purpose, contents and how to install and use any code. The .gitignore keeps out files that should not be checked in — binaries, files specific to your own IDE, and files holding passwords or connection strings — and can come from a language template; he picks Python. Licenses range from "100% belongs to me" to free use; he picks MIT.
  • The generated files can be edited directly in the portal. He edits the README in the browser and commits it with a commit message, and the change shows on the repository page. He calls the result a starter that you would normally bring down to your own computer to build on and collaborate.
Creating a Chatbot with the Question Answering feature of Azure Language Service [GCast 194]
  • Question Answering builds a no-code Q&A chatbot from a document. Giard presents it as the tool for letting users ask natural-language questions and get answers drawn from a list of questions and answers, such as an FAQ, without writing code. It is not on by default: it is one of the Language Service's optional "custom features", selected as custom question answering when the resource is created.
  • The feature requires an Azure search service, created alongside it. The creation blade asks for the search service's region and tier; Giard takes the S pricing tier for the language service and the standard tier for search, both in East US. Deployment took about two minutes, and the resource group then held both the language service and an Azure AI search service.
  • Configuration happens in Language Studio, under a project per resource. He opens language.azure.com, which redirects to language.cognitive.azure.com; with several language services deployed, he first picks the right one under the settings gear's resources tab. Creating a custom question answering project sets one language for all projects in the resource (English here) and a default answer for unmatched questions, which he changes from "no answer found" to an apology.
  • Sources can be a URL, chit-chat or an uploaded file. Giard uploads a document of movie-quote questions and answers, each pair separated by a blank line, and the service parses it into pairs. In the editor he adds a pair of his own ("hello" answered with "hi, how can I help you?"), notes alternate phrasings can be attached to a question, and says follow-up prompts can be added.
  • A test pane checks matching before a one-click deploy. A paraphrase ("you look short") still returned the answer stored for the stormtrooper question, and the alternate phrasing returned the same greeting. An "include short answer response" checkbox allows a short and a long answer, which he suggests pairing with a "more details" button; deployment took about 30 seconds and makes the knowledge base callable from a chatbot.
Using the Sentiment Analysis Feature of the Azure Language Service [GCast 193]
  • The Language Service can be created without the full AI services set. Giard creates it alone in the Azure portal for when only a subset of Azure AI services (formerly Cognitive Services) is needed; sentiment analysis is among its standard features. He skips the optional custom features, such as custom question answering and custom text classification, because they add resources like a storage account and Azure AI search.
  • Setup choices are a Free or S tier plus optional tabs. He takes the S tier, in East US, for more calls and higher capacity, and leaves the optional tabs at their defaults: network restrictions, the identity the service runs under, and tags (name-value pairs for sorting or filtering in reports). Creation took about a minute.
  • Two keys exist so one can be regenerated without downtime. The endpoint and keys, under Manage keys, are what Giard says matter most. Only one key is needed; if one is compromised, callers switch to the other while it is regenerated.
  • Sentiment analysis is a plain REST POST with a JSON body. He runs curl in a bash Cloud Shell, posting to the service's endpoint plus text/analytics/v3.0/sentiment, with the subscription key and a content type of application/json in the header. The body is a "documents" array; his one document carries a language (English), an id of 1 and the text.
  • The response gives an overall label and three confidence scores. "Your product is great" came back positive with scores of 1.0 positive, 0.0 neutral and 0.0 negative, and "your product is terrible" negative at 0, 0 and 1.0. A mixed sentence ("not too bad… has some OK features") came back positive but at 0.92 positive, 0.07 neutral and 0.01 negative, which Giard reads as somewhere in between.
Using the Vision + Document capabilities of Azure AI Services in Azure AI Foundry [GCast 192]
  • AI services are Cognitive Services under a new name. Giard opens the project created in the previous episode at ai.azure.com and finds AI services in its left-hand menu, in four categories: speech, language and translator, vision and document, and content safety. Vision and document has three tabs: document, face and image. Every service he shows returns JSON over REST calls, and most have an SDK, sample code in Python, C# or JavaScript, documentation and a quick start.
  • Document templates parse receipts into structured fields. The document tab has templates for invoices, receipts, ID documents and credit cards, plus a generic optical character recognition "read". Run on a sample receipt, it found the address and split it into house number, road and postal code, and listed the line items. It also parsed a hotel receipt of Giard's own.
  • Face detection returns mask status and facial landmarks as JSON. For each face it reports whether a mask is worn and whether it covers the nose and mouth, the face rectangle, and landmark positions such as the pupils, nose tip, mouth ends and eyebrows. A photo with three faces came back as an array of three. Giard notes that the bounding box and landmark dots are drawn by the sample app's JavaScript; the service itself returns only the JSON.
  • Object detection and captioning label image contents with confidence scores. Object detection returns each object with a bounding box and a confidence, e.g. 98% for a skateboard and 95.5% for a person in a sample, and 57% for a bird in Giard's own photo of a guitarist. Image captioning gave one caption for his bird photo, "a green bird on a branch", which he calls "pretty darn accurate". Dense captioning adds captions for different regions of the same photo.
  • OCR returns text by line and word, each with its bounding box. On an image of a poem it split the text into lines, and each line into words, with the X, Y coordinates of the four corners of each box. Common tag extraction returns a list of tags with relevance scores, e.g. 96% for a picture frame and 95.5% for a gallery in a photo of a painter in an art gallery.
Creating an Azure AI Foundry Project and Hub [GCast 191]
  • A hub is the top-level resource; projects are containers inside it. Giard describes Azure AI Foundry as a unified platform to explore, build, test and deploy AI applications. The hub is its primary top-level Azure resource, a project is a container for your AI work, and one hub can hold several projects.
  • Creating a project also creates or selects its hub. At ai.azure.com, the Create Project button asks for a project name and a hub, either an existing one or a new one. A new hub name must be unique and between 3 and 33 characters.
  • The hub step provisions the supporting Azure resources. Giard sets the subscription and creates a new resource group, keeps East US as the location, creates a new Azure AI service or OpenAI service, and also creates an Azure AI Search resource, which is optional. Validation checks for problems such as a region where the services are not available, and the Create button is enabled only when there are none.
  • Provisioning took about three minutes in the demo. Status icons show each resource, including the project, a storage account and the AI Search account, as queued, in progress or created. The finished project shows an API key and a left-hand menu with model catalog, playgrounds and AI services. Giard notes that a few of the items are in preview.
Organizing Your Day Using Microsoft 365 Copilot [GCast 190 ]
  • Copilot's work mode can plan your day; web mode cannot. Giard says web mode is a natural-language interface for searching the web, while work mode has access to your email, Teams, OneDrive and other organizational data, so it knows your appointments, emails and chats. He reaches it through the Copilot icon on Bing.com, or directly at m365.cloud.microsoft.com/chat.
  • One prompt turns recent mentions into tomorrow's priorities. Giard's prompt asks Copilot to list items that explicitly mentioned him in the last 24 hours across his email inbox, Teams chats and Teams channels, and to use them to determine his top three action items for tomorrow. He suggests running it at the end of the day. He says his prompts are ones he collected from the web and tweaked, and he no longer remembers their sources.
  • A "personal assistant" prompt builds a three-section daily report. The prompt casts Copilot as his personal assistant and asks for sections headed today (a short paragraph on his work, tasks from meetings, important email items), tomorrow (a table of meetings, organizers and details, each tagged personal, internal, external or traveling, with the percent of time per category) and preparation (what he needs to know, and suggested times for breaks). In the demo Copilot categorized each meeting from his calendar, computed the time split and proposed break slots from gaps in the schedule.
  • Follow-up prompts look ahead to next week. Giard asks for follow-up actions from this week's meetings to address next week, which he says can run after the report or on its own. A newer prompt of his asks for time slots for personal development such as training next week; Copilot found free gaps, but he notes it has no button to schedule them yet and says that would be nice if it comes.
Automating Microsoft Excel with VBA [GCast 189]
  • Excel's VBA tools sit on a ribbon hidden by default. Giard enables the Developer ribbon under File, Options, Customize Ribbon, which gives access to the Visual Basic Editor; he says this is part of why he had forgotten about VBA after using it a lot years ago.
  • Hand-written VBA works but demands knowing the language and object model. He writes a short sub that sets cells A1 and A2 to text values and then selects A3, with IntelliSense listing an object's properties and methods after a dot and Ctrl+Space auto-completing. His judgment is that it is very flexible, but without good knowledge of VBA and Excel's object model you are constantly looking things up.
  • The macro recorder writes the code for you, then you fix it. Recording requires saving as a macro-enabled workbook; he records copying a data block to a new worksheet, pasting values only (no formulas), and formatting one column as a date and another as currency. The generated code lands under Modules in the editor, but it hard-codes the range A1:D15, assumes the right sheet is active, and refers to the new sheet by the name it happened to get during recording.
  • Generalize recorded code with named ranges, sheet indexes and unique names. He selects the first sheet explicitly, swaps the fixed range for a named range so added rows are not missed, and refers to the new sheet by index 2 since it is created after the first (VBA arrays start at 1, unlike most languages). To avoid a name clash on reruns he builds the sheet name from "Gcast-" plus a random number times 10,000, converted to an integer, then a string, then trimmed; he notes a repeat could still eventually cause an error and suggests conditional logic to guard against it.
  • View, Macros runs, debugs, edits and assigns shortcuts without the Developer ribbon. From the View menu, which he notes everyone has access to, a macro can be run, deleted, edited, or stepped into line by line with F8 in the editor. Under Options a description (documentation only) and a shortcut key can be set; he assigns Ctrl+Shift+B and runs the macro with it.
Creating a Copilot Agent with Copilot Studio [GCast 188]
  • Copilot Studio builds an agent through a natural-language dialogue, without code. At copilotstudio.microsoft.com, Create offers templates (travel, finance, weather, a website) or "New agent", where Copilot Studio's own copilot asks what to make. It then asks in turn for a name, what to emphasize or avoid, a tone, and a public website as data source. Giard describes a health-and-wellness chatbot, renames it "GCast Wellness", tells it not to answer medical questions to avoid giving bad medical advice, and picks a friendly tone.
  • A website data source must be two levels deep or less. Giard explains that a domain with two subfolders is accepted but a third level is not. He chooses none for now, and says the source can be changed later.
  • Topics are trigger-driven workflows, some created automatically as system topics. Conversation Start shows a greeting built from the bot.name variable as soon as the agent loads. Greeting fires on phrases like "good morning" or "hi", and Giard adds "good evening" to its list. Start Over asks a yes/no question: yes resets the conversation context that otherwise lets a follow-up like "tell me more about that" work, and no carries on. In the test panel, "let's start again" triggered it although that is not one of the listed phrases. Fallback asks the user to rephrase up to three times, then hands off to an Escalate topic ("talk to a person"), which he says is not yet configured beyond a message.
  • Uploaded knowledge replaces public-internet answers with your own content. By default the agent answers from the public internet. Knowledge can instead come from a public website, a SharePoint site, Dataverse or uploaded files. After Giard uploads a Word document of healthy-eating Q&A, which takes a few minutes to parse and index, the same question on eating out returns the document's answer with a link to the source.
  • Publishing to a website first requires changing authentication to none. The Channels tab warns that only Teams channels are available under the default Teams authentication. Giard switches it under Settings > Security > Authentication to no authentication, essentially anonymous. He then publishes to a demo website rather than a custom HTML page; at its URL the agent answers the greeting and returns the uploaded document's answer.
Creating Azure AI Services [GCast 187]
  • Azure AI Services is the renamed Cognitive Services. Giard says Microsoft rebranded Cognitive Services as Azure AI Services "not long ago"; the categories include speech, search, vision and language, among others.
  • A single-category service needs only the Basics tab. Giard creates a Speech service from the Azure portal's Create a Resource button, filling in a resource group, region (East US), name and the standard pricing tier; networking, identity and tags are optional. The Computer Vision service uses a near-identical dialog, plus a checkbox acknowledging the terms.
  • Each single service gives a REST endpoint and its own studio. The resource exposes a REST API endpoint called with one of its keys, and a link to Speech Studio or Vision Studio, with playgrounds and low-code or no-code tools such as real-time speech-to-text.
  • One "Azure AI services" resource covers all the categories. Searching for Azure AI services turns up several similarly named entries, and Giard points to the one with a specific icon; creation took about 35 seconds. Its overview blade has a tab per service (Speech, Content Safety, Computer Vision, Language, Translator and more), each with its own endpoints. Speech has three endpoints: speech-to-text, text-to-speech and custom voice. A link opens Azure AI Studio, which has the same playground tools.
  • Giard's rule: one service individually, several through the combined resource. He says the combined service makes the most sense when an application calls several services, and a single individual service when only one is needed.
Using M365 Copilot with Microsoft OneDrive [GCast 186]
  • A Copilot icon beside each OneDrive file summarizes it unopened. Giard presents this as a new M365 Copilot feature. Clicking the icon next to a file in a OneDrive folder gives a quick overview of the document; he can then ask a follow-up question about it, or copy the result into another document or an email.
  • Create FAQ turns a document into questions and answers. On the same file the Create FAQ option gives a Q&A-format summary, and a direct question ("what did I do last week?") is answered from the document. Giard says this is especially useful for long documents.
  • Selecting several files lets Copilot summarize and question them together. With four status reports checked, the Copilot button gives one summary per document, and a question asked across them ("did I have any issues?") picked out the one report that listed an issue.
  • Compare files shows the differences between selected documents. Again without opening them, Copilot laid out how the four reports differed; Giard chose files with the same structure for the demo, and calls this "really useful". The comparison can be copied out or questioned further.
Using Copilot Pages [GCast 185]
  • Copilot Pages keeps responses that otherwise vanish when Copilot closes. Giard presents Pages as a new feature of Copilot for work. The Edit in Pages button moves a response into a new window where it can be edited, and a Page Link saved from it lets him return later to the same page.
  • Pages runs on Microsoft Loop and embeds in other apps. Giard notes that Pages uses Microsoft Loop under the hood. The Copy Components option gives a link for supported applications such as Microsoft Teams, and edits made in Teams and in a browser show up immediately in the other, because they are the same page.
  • A shared Page Link carries audience and permission settings. Before copying the link he can share with people in his company, only those who already have access, or specific people, and choose between edit and view-only access. He picks company-wide view and edit.
  • Collaborators edit the same page in real time. A colleague who opened the shared link edited the page, and Giard saw those changes appear in his own view as they were made.
Using M365 Copilot with Excel [GCast 184]
  • Copilot in Excel requires AutoSave and the Copilot service. AutoSave means the workbook has to be stored in OneDrive. With both in place, a Copilot button appears on the Home ribbon and opens a pane that takes plain-English questions and instructions as a second way of working the sheet, alongside formulas.
  • Copilot turns a plain-English rule into conditional formatting. Giard asks it to highlight each player's name where dribbles per 90 minutes beat either interceptions or tackles per 90. Copilot first says what it will do and applies it only when he clicks Apply. The formula it wrote is visible under the conditional formatting rules. Giard says he could have built it himself, but it saved him the trouble and is a head start if he wants to change it.
  • Advanced analysis writes the Python for you. "Start advanced analysis" adds a new worksheet holding a data frame that previews the data it will work on. Asked for each region's monthly total value as a line chart, it produced one covering January 2022 to the end of 2023, about 24 months, with east and west regions. The generated Python code is shown and can be edited and rerun, which Giard calls a good starting point.
  • Follow-up prompts add a forecast and restyle the chart. Asked to forecast each region's total value for the first six months of 2024 on the same chart, Copilot drew the forecast as a dashed line without being told to, but in a different colour from the historical line. A further prompt (label the forecast explicitly, use the same colour for actual and forecast, and make forecast lines dashed and four times as thick) regenerated the chart as asked.
Using Copilot for M365 with Microsoft OneDrive [GCast 183]
  • Copilot in OneDrive summarizes selected files without opening them. In OneDrive on the web, Giard selects one or more files under My Files and chooses Summarize from the Copilot menu, which returns a summary of each file after a few seconds. He shows that follow-up questions can then ask for more detail or about something specific in the files.
  • A Compare option builds a side-by-side table across up to five files. Again without opening them, Copilot lays out differences as a table. In his demo of a Word document and a PowerPoint deck it gave the title, creator, purpose, target audience, methodology and expected outcome, and it took follow-up questions.
  • Files that share a format give a more useful comparison. Giard says the Word-and-PowerPoint pair worked only because the topic matched. Three of his old status reports from 2015, all with the same sections (past two weeks, next two weeks, upcoming, issues), came back as a table set out by those sections. He calls it a "very simple interface" for analyzing and comparing files quickly, which he says works because Copilot integrates directly with OneDrive.
Using Azure AI Document Intelligence Studio Custom Classification Model [GCast 182]
  • Classify mixed documents first, then run the matching extraction model. Giard's reason: invoices, order forms, agendas, or invoices from different companies put fields like the company name in different places. Classifying a document first tells you which layout-specific custom extraction model to use. He covered that model in episode 176.
  • A classification project needs an Azure AI service and blob storage. In Document Intelligence Studio (documentintelligence.ai.azure.com, which redirects to /studio), he picks "custom classification model" and creates a project. He creates a new resource group, a new AI service (formerly called Cognitive Services) in East US on the standard pricing tier with the default API version, and a new storage account and blob container. Storage account names must be all lowercase, and he took the cheapest tier. Setup took about 55 seconds, mostly spent creating the storage account.
  • Each document type needs at least five labelled samples. Files can be dragged into the studio or put straight into the blob container. Giard used five each of agendas, invoices and memos, each type sharing one layout. A type can be created with "add a type" or while labelling a document, which creates and assigns it in one step. A check mark shows when a type has enough samples to train.
  • Training is quick, but the models list must be refreshed by hand. Training started in a few seconds. Giard says it can take about a minute depending on how many documents there are. The status read "not started" until he clicked refresh, then went to running and then succeeded.
  • In the test tab, the model classified one document of each type correctly. One agenda, one invoice and one memo were each recognised as the right type. Giard says an API exposes the same classification to applications. His suggested flow is to put documents in blob storage, classify them, then run the custom extraction model for that type.
Using the .NET SDK to Create and Manage .NET projects [GCast 181]
  • Typing the bare command shows whether the SDK is installed. Giard runs dotnet in a terminal: if it prints help options the SDK is present; if the command is not recognized, the installer is at dotnet.microsoft.com/download.
  • A new project takes its name from the folder unless overridden. dotnet new console in a folder called ConsoleTest1 scaffolded a one-line Hello World program as ConsoleTest1.csproj; adding --name (he used "GCast Console") produced a project with that name instead, otherwise identical.
  • Build, clean and run are separate commands; run builds implicitly. dotnet build compiles and dotnet run runs the project in the current folder, building first if it is unbuilt or changed since the last build. Giard says dotnet clean is for when leftover artifacts, such as an old NuGet package after references are added or removed, confuse the compiler; it makes the next build slower but clean.
  • Templates go beyond console apps, and C# is only the default. dotnet new mvc scaffolded a web app with models, views and controllers, which dotnet run served at localhost:5069 with a home and a privacy page; an edit to the home view showed on refresh. Adding a language argument set to F#, with --name, produced the same MVC project written in F#.
  • The CLI documents itself, with fuller reference online. dotnet help lists every command (he points to dotnet test, which runs a solution's automated tests), dotnet help test opens that command's switches and arguments, and a page on learn.microsoft.com covers all of the commands.
Using M365 Copilot with Microsoft Outlook Emails [GCast 180]
  • Copilot summarizes a long Outlook email thread in one click. Clicking Summarize on an open thread produced highlight bullet points covering weeks of back-and-forth. In the demo they came out in reverse chronological order, which Giard says is the order the thread itself is in. He pitches it for threads forwarded to you that you would otherwise read end to end for context.
  • Draft with Copilot writes a new email from a prompt. On a new message, the Copilot button on the message ribbon has a Draft with Copilot option, available if Copilot is installed and you subscribe to it. You describe the email, including the tone and what not to promise, then click Generate. Giard says the more specific the prompt, the better the draft.
  • Drafts can be regenerated, adjusted, then kept or discarded. Regenerate reruns the same prompt and lets you flip between versions. Adjust changes the criteria: longer, shorter, more formal, more direct, more casual, or even a poem. Keep copies the chosen draft into the email without sending it. Discard throws it away.
  • The sender, not Copilot, stays responsible for what is sent. Giard's point is that it is "a co-pilot", not an autopilot: you can still edit the draft, you should read it before sending, and you cannot blame Copilot for a bad email.
  • Coaching by Copilot critiques a draft under three headings. Also on the ribbon's Copilot button, it gave feedback under tone, reader sentiment and clarity, with suggested rewrites that were mostly more direct or more concise wording. Giard says the thumbs-up and thumbs-down buttons feed back into the engine, which refines its responses if many users rate them down.
Using Copilot for M365 and MS Graph [GCast 179]
  • Graph-grounded chat queries your own meetings, emails and documents. Copilot for Microsoft 365 uses Microsoft Graph to answer questions about items in your organization. Giard says it respects their permissions and won't return anything you don't have access to. It lives at the Copilot link on Microsoft365.com, which goes to Microsoft365.com/chat.
  • Built-in prompts handle common tasks such as recapping a meeting. View prompts brings up suggestions. The recap-meeting prompt lists recent meetings, then summarizes key takeaways and actions in separate sections, including who is responsible for each. In the demo it also linked a PowerPoint deck and documents mentioned in the meeting, which Giard had not attended.
  • Free-form prompts keep context across follow-ups until New Chat. Giard asked for a summary of emails and Teams chats and channels that mentioned him in the past 14 days, then asked it to go back a week, and again a week, and it understood each follow-up. Clicking New Chat clears the history so a different topic starts fresh.
  • Typing a slash lets you pick a specific meeting. Giard used it to choose an upcoming meeting and ask how to prepare for it. He got advice on what the meeting would cover and what to do beforehand.
  • Graph supplies facts the prompt leaves out, such as reporting lines. Asked to write an email to "my boss's boss", declining a Tuesday 1 p.m. meeting, offering to watch the recording and asking how to help, Copilot identified the person through Graph without being told. It drafted a professional email drawing on that person's information. Giard advises being as specific as possible about the tone you want.
Administrative Setup for Microsoft Dev Box [GCast 178]
  • An administrator builds five pieces before anyone gets a workstation. In the Azure portal under Microsoft Dev Box, Giard creates a Dev Center (about 12 minutes this time, 10–15 before), then a project inside it (under five minutes), a Dev Box definition, a Dev Box pool, and finally access control on the project. The project's optional Dev Box limits cap how many developers can use it at once, for cost or practical reasons; he leaves it off, and says tags only add name-value pairs for sorting and filtering reports.
  • The definition fixes the image and hardware, and hardware sets the price. Created under Dev Box Configuration in the Dev Center, it takes an image (he picks Visual Studio 2022 on Windows 11 Enterprise) pinned to a version or to "latest". More CPUs and RAM cost more per running hour; he takes the cheapest, 8 vCPUs and 32 GB RAM, with 256 GB of SSD storage, and turns on hibernation to save money after inactivity. Custom image templates are deferred to another video.
  • The pool ties a definition to a network and a shutdown schedule. Created under the project's Manage section, it uses a Microsoft-hosted network by default, which Giard says usually makes sense, with your own network as an option for specific configuration. He enables auto-stop at 7:00 p.m. US Central as a cost-saving measure, leaves single sign-on off, and must confirm he holds the licences for the Windows and Visual Studio software; creation took about seven minutes.
  • Two roles on the project's Access Control (IAM) tab grant access. DevCenter Dev Box User lets someone create dev boxes from the definition; DevCenter Project Admin suits someone taking over administration, for example while you are on vacation. Assigning a role to a user took about a second.
  • Users create boxes at devbox.microsoft.com and connect by browser or RDP. The portal warns creation averages 25 minutes and can take up to 65, with an email when ready; his took about half an hour and arrived with Visual Studio and PowerShell installed. The browser needs nothing extra, but without single sign-on it asks for a password; Giard recommends the RDP desktop client where you have it, keeping the browser for a borrowed machine.
Getting Started with .NET Aspire [GCast 177]
  • .NET Aspire builds telemetry, health checks and resiliency into distributed apps by default. Giard calls it an opinionated tech stack for distributed cloud applications. It had just reached general release at Microsoft Build in late May 2024. It needs the latest Visual Studio 2022 tooling and a running Docker Desktop, because Aspire runs some services, such as the Redis cache, in local containers. The ".NET Aspire Starter Application" template creates a web front end that calls an API service. It offers HTTPS, Redis caching and a test project as options, and adds two Aspire projects: AppHost and ServiceDefaults.
  • The AppHost project wires up and starts every service. Its Program.cs uses a distributed application builder rather than a web application builder. AddRedis registers a cache named "cache", and that name is how the connection string is looked up later, so it can sit in configuration and change between environments instead of living in code. AddProject registers the API service and the web front end by name. WithExternalHttpEndpoints exposes the front end to the public internet, and WithReference links the front end to the cache and the API and starts them. Giard says this saves setting multiple startup projects in Visual Studio, a setting that isn't checked into source control, so people pulling the code skip a step.
  • ServiceDefaults adds OpenTelemetry, health checks, service discovery and retry logic in one call. AddServiceDefaults is an extension method on the host application builder, and the web and API projects each call it at startup; the web project also adds the Redis output cache by its "cache" name. The code can be modified or stepped through, and it ships with commented-out suggestions for changes. Giard's point is that Microsoft provided these features long ago but left developers to add them, whereas Aspire adds them automatically.
  • Running AppHost opens a dashboard showing the app's current health. The dashboard lists endpoints and shows console output, structured logs, traces with call timing and parallelism, and per-resource metrics such as active requests over time. The sample front end has a counter that keeps its state in the cache and a weather page that calls the API. Giard stresses this is a quick snapshot, not a substitute for Application Insights. Long-term logging and analysis still need setting up in Azure Monitor.
  • Giard recommends copying the template's patterns rather than retrofitting an existing app. Right-clicking an existing web project offers "Add .NET Aspire Orchestrator Support", which creates the AppHost and ServiceDefaults projects. He advises stepping through the starter template to understand it first, then building your own project the same way.
Using Azure AI Document Intelligence Studio Custom Extraction Model [GCast 176]
  • A custom extraction model reads fields from same-format documents. Giard says Document Intelligence Studio, at documentintelligence.ai.azure.com, is the rebranded Forms Recognizer with new features added. It offers prebuilt models for invoices, receipts, health insurance cards and tax forms. He uses a custom extraction model instead, for a set of five PDF invoices that share one layout but carry different text. He says it also accepts JPEGs, Office documents and images.
  • Creating a project provisions the service and its storage. You don't have to set anything up in the Azure portal first. The project wizard asks for a subscription and resource group, a service name, a region (he picks East US) and a pricing tier. He says the free tier limits calls per minute and document size, and calls standard "pretty cheap" for a small sample. The API version defaults to the most recent. The wizard then creates an Azure storage account (he takes the cheapest tier) and a blob container for the documents. He expected about 60 seconds and says it took about a minute and a half.
  • Label one document by hand, skipping auto-label. After the upload he picks "run layout", which skips auto-labelling, because auto-label needs an existing model that matches the form. He clicks words to highlight a span, then names it as a field. The type options are field (static text), selection mark (a true/false checkbox) or signature (handwriting). A table icon detected the column names on its own. He makes the table dynamic rather than fixed so it can handle invoices with more than one row. He labels only one of the five documents.
  • Neural training fits this case; template suits handwriting. Giard says the template option needs more than one labelled document, takes longer and is better for handwritten notes. He trains a neural model on the single labelled invoice and says labelling more documents would probably raise accuracy. Training on five documents took about 15–17 minutes.
  • The test pulled the right fields, with uneven confidence. On a test document the model found the invoice number and date correctly, with about 96.8% confidence on the vendor address and 98% on the customer address. Other fields came in as low as 36% and 29.5%. Giard says real use would call the model from an application through its API. The studio shows the endpoint, API version, service resource and container, and he says he will cover the API calls in a future video.
Getting Started with Azure OpenAI and Azure OpenAI Studio [GCast 175]
  • An Azure OpenAI resource is created from the portal's Create a resource. Giard searches for "OpenAI", then sets a resource group, a region (East US for him, chosen for proximity) and a globally unique name. Standard S0 was the only pricing tier offered. Network restrictions and tags are optional, and the deployment took about 30 seconds.
  • Models are deployed and tested in Azure OpenAI Studio, outside the portal. Its Models page lists the available OpenAI models and their dated versions, and which ones can be deployed depends on your region. Giard deploys GPT-3.5 Turbo and raises the tokens-per-minute limit to the maximum so a demo won't run out. He thinks the default was about 4,000.
  • The chat playground keeps conversational context across prompts. By default it includes the past 10 messages. Giard asks for a 10-slide outline on Azure OpenAI, then asks to "expand slide 3" without saying what it was about, and it wrote about key features. "Shorten this to one paragraph" acted on the previous answer. He says GPT-3.5's knowledge stops at 2021, so it would not know about the NCAA tournament under way when he recorded, and he advises checking answers before deploying a bot publicly.
  • The DALL-E playground generates images from a text description. Opening it deploys a DALL-E 3 model (DALL-E 2 was also offered), which Giard says can take about five minutes. A prompt for a polar bear eating ice cream in a top hat produced an image. The prompt can be regenerated as-is, or extended with a style ("in the style of Van Gogh") to restyle it.
Using M365 Copilot with Microsoft Teams [GCast 174]
  • Copilot in a Teams meeting needs only transcription turned on. Giard says recording is not required: "record and transcribe" or transcribe alone is enough, and the transcript then appears alongside the meeting.
  • Mid-meeting, Copilot can catch up a late joiner. He types "I just joined. What did I miss?" during a live meeting, pitching it as a way to catch up after arriving 15 minutes late without asking anyone or reading the transcript; Copilot returns a summary of the meeting so far.
  • After a meeting, Copilot summarizes the recording with timestamped links. On a recorded mock conference-planning call with two colleagues, he clicks the suggested "summarize the video" prompt beside the recording; each summary point links to its spot in the recording, and clicking one jumps playback to the 6-minute 10-second mark.
  • Copilot can narrow the summary to a single topic. Asking "what did we decide about food?" returns only that discussion, again with a link to where it occurs (stated as 3:29, then 3:20).
  • Copilot can answer questions the meeting did not explicitly address. Giard offers "what are the next steps?" as an example (while noting the phrase was in fact used in this meeting); it returned action items grouped by person, plus a team meeting the following Tuesday, each linked to its spot in the recording. He calls it a powerful productivity tool.
Creating an AI Solution with Copilot Studio [GCast 173]
  • Copilot Studio builds chat apps with little or no code. Giard describes it as a low-code tool for publishing a chatbot that answers in natural language, runs workflows (follow-up questions, conditional logic, multiple-choice answers), and answers questions from your own websites or documents. It was in preview as of March 2024. It is reached at aka.ms/copilotstudio, and "Try Free" walks you through creating an account.
  • A new copilot takes a name, a language and a website to index. Five languages were offered. Giard points it at his own blog, which he says holds hundreds or thousands of articles from almost 20 years. Creating it generated seven topics, from a simple greeting (replying to "hi" or "hello") to a sample ordering workflow.
  • The sample ordering topic shows branching on the user's answers. It asks for the shipping state. California, Washington or Oregon go straight to product selection, and any other state gets a yes/no question about additional shipping charges, $27.50 in the test. "No" ends the conversation. Product choice is multiple-choice, and the flow ends by asking for a rating.
  • Questions that match no topic fall through to generative answers. A system topic searches the given data sources, up to four public websites, and shows an answer if it finds a decent one. Asked about data visualization, the test bot summarized Giard's own article series on it (one part dated 2011), with links to the articles. He suggests pointing it at your own site to answer questions about products, HR policy or success stories.
  • The test pane's tracking shows which topic and step is running. With tracking on, Giard's "hi" visibly triggered the greeting topic. "Purchase item" triggered the ordering topic even though it was not one of that topic's listed phrases, which Giard calls smart enough to understand.
Using M365 Copilot with Microsoft Word and PowerPoint [GCast 172]
  • Draft with Copilot writes and then refines a Word document. It opens from a toolbar icon or Alt-I, or sometimes pops up on its own in a new document. Giard asks for a three-paragraph article on AI tools in Azure. He could keep the result, regenerate it or delete it. Instead he follows up with "expand this article to six paragraphs" before keeping it.
  • Copilot in PowerPoint can build a deck from a Word file's link. Saving the document put it in OneDrive, so File > Share > Copy link gave a link. Copilot in PowerPoint offers to create a presentation on a topic, add a slide, or create a presentation from a file. Giard pastes the link into "create a presentation from a file", and it produced a slide deck with imagery based on the article.
Making GitHub Copilot Use Your Coding Standards [GCast 171]
  • Open a file in your preferred style and GitHub Copilot copies it. In a C# sample from an open-source "Copilot Playground" repository, comment prompts in one class first produced a bare check that threw an exception on any non-200 status and returned the content string. With a second class open that formats and logs an error message (ID and status code) to the console before throwing, and logs success before returning, the same prompts produced code following that logging pattern.
  • More explicit prompts give better Copilot suggestions. Giard replaces "handle the response" with "handle the case where the response is not HTTP OK", saying Copilot does better the more explicit the prompt, then accepts the suggestions with Tab.
  • An open unit test steers Copilot's code toward the expected behavior. With a test open that expects getOrder(-1) to throw "Negative values are not allowed", the comment "handle negative ID value" produced a check at the top of the method throwing an ArgumentException with that exact message, so the test passes. Giard calls this useful for test-driven development.
Getting Started with GitHub Copilot [GCast 170]
  • GitHub Copilot runs in VS Code as an extension. It needs a GitHub Copilot subscription and the extension published by github.com. Suggestions appear greyed out and Tab accepts them. In a PowerShell file, typing $jan = 1 and $feb = 2 was enough for it to suggest the remaining months. Giard picked PowerShell because he does not know it well.
  • Comments describe what you want, and Copilot writes the code. "Create a hash table with months and their corresponding numbers" produced the table. "Log into Azure" offered both az login and Connect-AzAccount, then went on to suggest creating a resource group, a VM, opening port 80 and getting the current subscription.
  • Copilot fills in assumptions unless the prompt states them. Asked for a resource group, it made up a name and picked East US. Naming the group and asking for West US made it use those values. Giard's caution: it is not always accurate, "you're still the pilot", so double-check its output.
  • The inline chat dialog rewrites code to a request. Giard asks it to create the resource group only if it does not already exist, which is safer, since creating it fails if the name is taken. The result can be accepted, discarded or regenerated.
  • Copilot Chat's slash commands generate tests, explanations, fixes and docs. With the code highlighted, /tests produced Pester tests that mock Azure. Copilot warned they were basic, and Giard calls them a good start. Right-click

    Copilot offers "explain this", which he finds useful for inherited code or a readme, plus "fix this" (it caught a misspelled az group create) and "generate docs". The same options are under / in the chat window.

Indexers and Indexes in Azure AI Search [GCast 169]
  • An indexer turns mixed documents into one queryable JSON index. Giard sets out the sequence: put documents in a data store, create an Azure AI Search service, add the store as a data source, then run an indexer that converts the content to JSON and builds an index, with optional post-processing such as OCR and image analysis. His inputs are nine coffee-shop reviews from Microsoft Learn, which he saved as Word, text, PDF and image files so the service has to read each format.
  • Setup is a blob container and a Basic-tier search service. He uploads the files to a blob container named "reviews" with anonymous access, which also has to be allowed on the storage account. He says real use needs more security than that. He picks the Basic tier, the cheapest paid one, at about $75 a month if it runs all month. He says everything shown also works on the free tier, and higher tiers buy scale at higher cost.
  • Built-in AI enrichments extract text, sentiment and image descriptions. On import he extracts content and metadata, keeps the default parsing mode because the files differ in structure, and attaches the free built-in Azure AI services (formerly Cognitive Services). He turns on OCR (merged into a merged-content field), page-level granularity at 5,000 characters, location names, key phrases, sentiment (the reviews carry no star rating), and image tags and captions. He skips people, organizations, language detection and PII because the data has none of them. The enrichments and image projections are saved to a knowledge store in the same storage account.
  • Index fields and the indexer schedule are set in the wizard. He marks the returned fields (content, locations, key phrases, sentiment, image tags and captions) as both retrievable and filterable. He runs the indexer once, but it can run hourly, daily or on a custom interval such as every 120 minutes from a later start date, which he suggests for a document store that changes. Among the advanced options he leaves on the encoding checkbox, whose main benefit he says is allowing spaces in key names.
  • Queries hit stored JSON, so the analysis runs only once. In the Query Explorer, a query for location Chicago returns JSON with a match score, the content, key phrases and a sentiment label for each review. Seattle reviews are excluded. A search for negative reviews returns repeats because the same text exists in several file formats. The indexer also writes a JSON file per document to blob storage holding the metadata and the OCR and image-analysis output. Giard says the index reads that file rather than re-processing the original document.
GitHub Action Triggers [GCast 168]
  • A workflow's triggers are whatever is listed under its on section. Giard extends the simple echo workflow from the previous episode, which had only workflow_dispatch (run manually by pushing a button). He points to the "events that trigger workflows" page in the GitHub Actions docs at docs.github.com, which lists the available events alphabetically with sample YAML to copy.
  • Issue events can be narrowed to specific activity types. He copies the docs' issues sample, keeps only the opened and edited types and drops the milestone ones; the docs list others such as pinned, unpinned and closed.
  • A push trigger can be filtered to a branch, folders or wildcards. He adds a push trigger limited to the main branch, noting the docs cover further filtering by folder and wildcard, and warns that indentation matters in the YAML. The result is three triggers, with the manual one kept so the workflow can still be run by hand.
  • Both new triggers fired in his test. A commit made in the GitHub web editor to main showed up in the Actions tab under its commit message, queued while a VM container spun up and then ran; creating a new issue likewise started a run identified by the issue's name. Giard says most of the short run time was spent spinning up the container.
GitHub Actions [GCast 167]
  • A GitHub Action runs jobs, made of steps, in response to triggers. Giard's examples of triggers are checking in code, creating an issue and clicking a button. The repository's Actions tab offers starter templates grouped by deployment, security, continuous integration and automation, made by GitHub, companies or the community. He starts from GitHub's "Simple workflow".
  • In YAML, indentation defines the structure and errors break it. He covers the basics: # starts a comment, settings are name-value pairs, and each level (jobs, then the job name, then steps) is indented two spaces further than its parent. Bad indentation produces syntax errors. He keeps only the workflow_dispatch trigger, which adds a manual "Run workflow" button, and leaves runs-on: ubuntu-latest, noting you would change it for Windows or a specific Linux version.
  • His demo workflow is two jobs that just echo text. Job one has a one-line script step and a multi-line script step; job two has one step. The file is committed under the .github/workflows folder, and he renames it from blank.yml to gcast-simple.yml. A manual run queues while an Ubuntu container spins up, and the run view shows each job, its steps and their output, which is also where errors would appear for troubleshooting.
  • needs makes one job wait for another instead of running alongside it. By default the two jobs ran at the same time. Adding needs: job1 to job two makes them run one after the other, which Giard says suits a case like one job creating a file the next one uses. The rerun took about five seconds longer, and the run graph shows the dependency. He edited the YAML straight into main in the browser and says this is "probably not great for application lifecycle" but fine for a demo.
GitHub Codespaces [GCast 166]
  • A codespace is a full development environment hosted in the cloud. Nothing has to be installed locally. Giard creates one from a repository's green Code button, on the Codespaces tab, with "Create codespace on main" (the main branch). It opens in the browser looking much like Visual Studio Code, with the Explorer showing the repository's files.
  • Edit, commit and sync all happen inside the browser. Giard edits a view file, which autosaves, then stages and commits it from the source control tab and syncs it back. The change then shows in the GitHub repository. He calls doing everything in the browser "really nice".
  • Codespaces get random adjective-noun names, which you can rename. His was called "musical waffle". The three-dots menu on the Codespaces tab lets you delete or rename a codespace. Giard says renaming makes one easier to find when a single repo has several codespaces.
  • Desktop Visual Studio Code can connect to the same cloud codespace. In the command palette (Ctrl+Shift+P on Windows, or View > Command Palette), typing "codespaces" offers to create a new codespace or connect to an existing one, but not to delete one. The files stay in the cloud rather than coming down to the machine. Giard says the stage, commit and sync workflow is the same as working locally. He adds that other people can open a codespace too, which lets settings be shared.
  • Creating with extra options sets branch, region and machine size. The options include the branch and a region, for example Western Europe for developers based there. The machine size runs from 2 cores up to 16 cores, and Giard notes that a larger machine costs more.
GitHub projects [GCast 165]
  • A GitHub project can be started from your profile menu. Giard opens the dropdown on his profile icon, picks "Your projects", then "New project", and chooses from three templates: a table (rows and columns), a board (a Kanban view of work as not started, in progress or done) and a roadmap. The board he creates has To do, In progress and Done columns. In the project's settings he renames it, adds a plain-text description and a readme that takes Markdown and can be previewed, and sets it public or private; the project can also be closed or deleted there.
  • New items start as drafts; issues must be tied to a repository. Items added to To do show up as drafts, and converting one to an issue means choosing a repository for it. Items move between columns by dragging, or by setting an item's status to Done, which closes it and moves it to the Done column; drafts can be handled this way too. Giard recommends converting items to issues first, though he says drafts may make more sense for work not connected to any repository.
  • One project can have several views, each with its own fields. Giard adds a table view to his board, which shows title, assignees and status columns. The plus button adds built-in fields such as labels and reviewers, hides ones you don't want (he gives status as an example), or creates a custom field of type text, number, date or single select. He adds an expected-completion date field, which uses a calendar picker, and a single-select "Difficulty" field with the options easy, moderate and difficult.
  • A project created from a repository's tab is linked to it. The repository's Projects tab can link an existing project or create a new one through the same template dialog. This time Giard uses the Team backlog template, which he calls a more complex version of the board, with New, Backlog, Ready and In progress columns. The repository then shows as linked in the project's settings, which save automatically.
  • Each issue carries assignee, label, priority and size fields. An issue can be assigned to any collaborator on the project; Giard is the only one, so he assigns it to himself. It can also get pre-built labels (bug, documentation, duplicate, enhancement and others), linked pull requests, a priority (urgent, high, medium and so on) and a size for estimating. Giard's rule of thumb for sizes is that each step doubles the effort: a small takes twice as long as a tiny, and a medium twice as long as a small.
Using Git and GitHub Together [GCast 164]
  • Git is distributed: work locally, and keep GitHub as the shared copy. Giard describes the cloud repository on GitHub as the place others can reach and the place to deploy from. You clone it down, test locally, push your working changes back, and pull other people's changes down. On a team, even of hundreds of people, he calls the GitHub repository the system of record.
  • Cloning a GitHub repository creates a local folder linked to it. Giard copies the repository's URL from its Code button and runs git clone <url> in a terminal. The new folder is named after the repository. He says any IDE or a plain command prompt will do. git --version checks whether Git is installed, and he calls the install simple and free. For content, he generates an MVC app with the .NET CLI (dotnet new mvc).
  • Saving in Git is two steps: add, then commit with a message. git add takes specific files or folders, . for everything, or -A. Giard prefers -A because it also picks up deleted and updated files. git commit -m "<message>" then records the change. He says the messages make the history readable later, for example a note that a commit fixed a given bug. git status shows files as untracked, then staged (in green), then committed.
  • Local commits reach GitHub only on git push; git pull brings changes back. After committing, the GitHub repository is still empty until Giard runs git push. Because the folder was cloned it already knows its remote, so pushing from local main goes to main in the cloud. When he edits a file on GitHub, git pull brings that change down. Naming a branch is optional when you are already on main.
Getting Started with GitHub [GCast 163]
  • A free GitHub account covers everything in the demo. Giard says there are paid accounts, but signing up at github.com is free. A new repository is created from "Your repositories" > New: pick an owner, give a name that only has to be unique among that owner's repositories, add an optional description, and choose public or private (private means only people you invite can see and use it). He makes his public.
  • A .gitignore file keeps files you shouldn't commit out of the repo. Giard's examples are compiled binaries, files that configure your development environment, and files holding secrets such as passwords and connection strings. The new-repository dialog offers .gitignore templates by language. He picks Node, and the generated file excludes things like log and coverage files. You can edit it afterwards.
  • A license file tells others what they may do with your code. Giard lists the questions it answers: whether they can use the code in their own work, use it as a starting point, or make money from it, and whether they must credit you. He picks MIT. The dialog can also create a README.md holding just the repo title, and by default creates a single branch named main, which can be renamed later.
  • Files can be edited and committed in the browser. The README is written in Markdown, a simple text-formatting language, and is displayed below the file list. Giard edits it with the pencil (edit) button and commits the change. He explains "commit" as saving the change so it becomes part of the repository.
  • Deleting a repository is deliberately hard, and Giard says it should be. The option sits at the bottom of Settings, in the "Danger Zone", next to changing visibility and transferring ownership. GitHub asks for confirmation twice, warns that the deletion is permanent, and then makes you type the repository's full name before it deletes it.
Managing Azure Subscriptions [GCast 162]
  • The free trial is for learning; pay-as-you-go is for long-term use. Giard says "Try Azure for free" at azure.com (which redirects to azure.microsoft.com) gives $200 of credit for many Azure services. When it runs out you either start paying or stop using Azure. You cannot keep creating free subscriptions: anyone who has already had one has to take pay-as-you-go, and that bills from the start.
  • Sign-up needs a credit card even for the free option. Giard says the card isn't charged, but you may see a $1 verification charge that is later reversed. His own sign-up was pushed onto pay-as-you-go because the card had been used before. He turned down the optional technical support plan at $100 a month.
  • A subscription's ID never changes, but its name can. The ID is unique and permanent. Giard renames the generic default to make it easier to find among many subscriptions. The portal said the rename was done, but that only meant the change had been submitted: the new name took about 10 minutes to show, even after refreshing.
  • Separate subscriptions under one account can split the billing. Adding another doesn't ask for card details again. It lets you choose a different billing profile and invoice section. Giard's example is one subscription per department, each with its own resources and charged separately, which makes billing reports easier. He notes reporting can also do this.
  • Cancelling a subscription asks for a reason and an auto-renew choice. Giard turns auto-renew off and confirms, and the cancellation finishes in a few seconds. He says a cancelled free subscription can't be replaced with another free one on the same email.
Sorting a Microsoft Word Document by Headers [GCast 161]
  • Word can sort a document by its headings, carrying body text along. The headings must use a built-in heading style. In Outline view (View, Outline) he collapses the document to level 1 with "Show Level", selects every heading (shift-click, or Ctrl+A), and clicks Sort. Sort is in the Paragraph section of the Home tab. He sorts by paragraphs, as text, in ascending order. Each heading's body text moves with it, as Print Layout shows afterwards. Giard says he only just learned of the feature after about 30 years of using Word, and does not know how long it has existed.
  • The same sort works on one section or on lower-level headings. He adds level-2 subheadings, made by pressing Tab in Outline view, under one level-1 entry. He then selects only those and sorts them alphabetically, leaving the rest of the document in its order.
Azure Monitor Diagnostic Settings [GCast160]
  • Diagnostic settings route monitoring data beyond the default retention. Giard says Azure Monitor and Application Insights keep data for 90 days by default; a diagnostic setting sends incoming data elsewhere to archive or query it. It lives under Monitoring > Diagnostic settings on the Application Insights resource, reached via "Add diagnostic setting".
  • Several settings can apply different rules to different data. Each setting is named and picks its own categories, either all logs or chosen ones, plus all metrics; Giard thinks the limit is five. The category list depends on the service — his app service showed availability results and browser timings — and some services break metrics out more finely.
  • Event hubs and partner tools take data for outside processing. Streaming to an event hub lets something else pick entries up and run a more complex workflow, and a registered third-party solution such as Splunk can receive the diagnostics. He did not demo either, having neither set up.
  • A Log Analytics workspace makes the data queryable with KQL. The workspace must exist beforehand; Giard says workspaces store data in Azure Data Explorer (ADX).
  • Archiving to a storage account keeps data past 90 days. The storage account must be set up in advance, and the data moves into blob storage. His example contrasts two settings: one category set archived and sent to a workspace, another sent only to the workspace.
Building and Editing an Azure Application Insights Dashboard [GCast 159]
  • Application Insights creates a default dashboard with each application. It opens from the Application Dashboard button on the resource; Giard says it may be all you need, or you can edit it or create a new one with Create, choosing a template close to what you want (Azure Inventory is his example) and naming it.
  • Edit mode lets you add, move, resize and delete tiles. Edit opens a tile gallery; the default dashboard has 11 tiles. He drags a clock tile on (options: time zone, 12- or 24-hour), drags tiles around, resizes through each tile's ellipsis menu (the clock offers only 1x1 or 2x1), refreshes stale tiles, and deletes with the trash can shown on hover. He suggests smaller tiles to fit more on screen, or bigger ones for vision-impaired users.
  • A markdown tile can tell viewers how to read the dashboard. The markdown can be typed in or pulled from a URL; his suggested use is instructions on what matters most and what to look for. Save takes a new name, Preview shows what a user will see, and Add tiles reopens a closed gallery. Giard calls dashboards a great way to give users a quick view of an application's health.
Azure Application Insights Alerts [GCast 158]
  • An alert is a signal, a condition and an action. The signal is a measurement such as a function's average CPU or a page's response time; the condition is a threshold such as CPU above 80%, or relative to what is typical; the action notifies someone or hands off to a workflow such as a Logic App. Alerts sit under Monitoring > Alerts on the Application Insights resource, alongside action groups and alert processing rules, which Giard describes as exceptions to or post-processing of rules.
  • Signals come from metrics or from editable log queries. Log search signals run a KQL query that can be modified, such as Page Views Trend; Giard instead picks the Server Response Time metric.
  • Conditions can be static thresholds or machine-learned dynamic ones. Static: he sets average server response time greater than 1,000 ms (one second), with average, maximum or minimum as the aggregation. Dynamic replaces the number with High, Medium or Low, which Azure sets from historical data to flag anomalies. Dimensions such as result code can narrow the condition, and an evaluation frequency (every minute, every five minutes) plus a look-back period complete it; each evaluation has a cost.
  • Action groups are defined once and reused across alert rules. Built-in groups exist, but Giard prefers creating his own: resource group, all regions or one region, a unique name and a display name. Notifications can be email, SMS (country code and number), mobile push or voice call, several at once depending on severity, as plain text or a well-known JSON schema. Actions go beyond notifying: an event hub, Logic App, webhook or Azure function. Tags only help with grouping and reporting.
  • Severity should match the alert, and action groups can be tested. Giard suggests a response time over one second is probably a warning rather than critical. Testing his action group delivered an email within seconds with a link to the Azure portal, a sample of what a triggered alert sends.
Using the Application Insights .NET SDK [GCast 157]
  • The SDK gives control that automatic service logging lacks. Configured Azure services log to Application Insights on their own, but Microsoft's SDKs let code decide what, when and what type of information gets logged. Giard lists SDKs for .NET, .NET Core, Java, Python, JavaScript and Node, and demonstrates .NET Core in an ASP.NET Core MVC app.
  • Setup needs the resource's instrumentation key and connection string. Both are copied from the Application Insights resource; the key is contained in the connection string. He runs dotnet add package Microsoft.Extensions.Logging.ApplicationInsights, adds an ApplicationInsights section with the instrumentation key to app settings, and has the builder in the program file (which replaced startup.cs) add Application Insights with the connection string.
  • The injected ILogger then writes to Application Insights. Without the setup, dependency injection supplies the default logger, which writes only to the console. His demo page calls LogInformation, LogWarning, LogError and LogCritical, and each message appears in the traces table with a severity level.
  • Logging is near real time, and works before deployment. Giard says queuing keeps the service scalable under heavy load, so entries arrive with a delay rather than instantly. Because the app knows where the resource is in Azure, it logs while running locally.
  • Don't hard-code the connection string. Giard flags his own demo as bad practice: it belongs in something like a key vault and should never be checked into source control.
Configuring Azure Monitoring for App Services, Functions, and VMs [GCast 156]
  • Web app creation turns Application Insights on by default. It is on its own tab of the creation wizard and can be toggled off; Giard thinks it needs at least the standard app service tier, which is likely why it shows disabled, though he has also seen a bug when clicking tabs out of order that a refresh fixes. You can create a new resource there (name, region, workspace) or select an existing one, whose region (East US in the demo) is then fixed.
  • Point related services at the same Application Insights resource. That is Giard's preference so everything goes to one place. A function app's Monitoring tab likewise defaults to yes with a new resource, and he swaps in the existing one.
  • A VM's Monitoring tab offers boot diagnostics, alerts and guest diagnostics. Boot diagnostics, enabled by default, log why a machine failed to boot. The alerts checkbox sets up rules such as CPU over 80%, emailing (by default) or pushing to a mobile app, with a name and severity so recipients know how fast to respond. Guest diagnostics store operating-system information in a storage account. Validation reported a failure on review that Giard calls a false negative.
Overview of Azure Monitor and Application Insights [GCast 155]
  • Monitoring exists to detect abnormal behaviour and improve the system. Working from a Microsoft documentation graphic, Giard says responses can be reactive (fix a failure) or proactive (low disk space, unusually high CPU), and only measurement gives a precise definition of the normal range and of which parts perform, underperform, or go unused.
  • SLAs, notification and retention should shape the monitoring plan. You cannot capture everything, and capture costs money; promised responsiveness and uptime (99.9% against 99.999%) set how thorough to be. Decide who is notified, how and when — a weekly report for minor issues, a middle-of-the-night call for critical ones — and whether logs stay queryable, move to cold storage or are deleted, weighing cost against any legal retention requirement.
  • Metrics flag that a problem occurred; logs explain why. A metric is a single number at a point in time (memory in use, page response time, CPU); a log is information persisted over time to query later, often used to find a cause that preceded the issue.
  • A trace ties together all the spans of one request. A span records one piece of workflow (a button click, a database call, an API method); a trace groups the spans of a single request, so two identical clicks are separate traces. He says this matters because an error can surface downstream of its root cause, such as a parameter passed wrongly upstream.
  • Azure Monitor unifies all monitoring for consistent access. Infrastructure, PaaS and SaaS services and custom code all feed it, so reports, visualizations, alerts and Logic App integration work the same way; it offers KQL log queries and metrics selected by resource scope. Creating an Application Insights resource takes a resource group, name, region and a new or existing Log Analytics workspace, with tags that only aid reporting. Giard recommends pointing related services (database, web app, function, APIs) at one resource.
Creating an ASP.NET MVC Application from the Command Line [GCast 154]
  • dotnet new mvc scaffolds a complete MVC project from a template. Giard runs it with a project name in the VS Code terminal (any command prompt works). The result has appsettings.json, a project file, a home controller with Index and Privacy methods and an injected ILogger that logs to the console by default, a rudimentary error handler with its own model and view, and views for each page.
  • Trust the local HTTPS certificate before running. The template is configured for HTTPS, which he says is awkward locally; dotnet dev-certs https --trust trusts the certificate, possibly after a confirmation dialog. dotnet run builds and runs (listening on localhost 5080 in the demo); dotnet build builds without running, which he says a view change does not need but a code change does.
  • dotnet publish prepares release assets for sharing. He publishes the release configuration rather than debug, to bin/publish, which he calls a logical place but optional.
  • VS Code can deploy the publish folder straight to an app service. Right-clicking it and choosing Deploy to Web App prompts for subscription and an existing app service (creating one is in episode 135), warns that it will overwrite, and reports progress in the output window before offering to browse the site. Giard frames this as useful for quick tests during development.
Transactable Containers Labs, Lab 3: Publishing the Container Offer [GCast 153]
  • This lab turns the earlier bundle into a Marketplace offer. Transactable Containers lets Microsoft partners put a container- and Kubernetes-based offering on the Azure Marketplace. Lab 3 takes the CNAB (Cloud Native Application Bundle) pushed to the Azure container registry in Lab 2, so Labs 1 and 2 come first, and the work needs a Microsoft partner login at partner.microsoft.com.
  • The offer is built in a tabbed Partner Center wizard. Under the Marketplace Offers tile, New Offer, Azure Container asks for an offer ID and alias; the lab suggests an ID starting "CW". Giard then works through the tabs, saving a draft on each. He checks "sell through Microsoft", picks the category Containers then Kubernetes app, and accepts Microsoft's standard contract. For the listing, the lab recommends putting "Kubernetes app" in the descriptions so the offer is easier to find, and supplies a 216 by 216 logo and a screenshot. A test offer can use Microsoft's privacy statement, but a real one needs its own. A video is optional, a screenshot caption is required, and the preview audience takes an Azure subscription ID for testing.
  • The plan sets market and price, then attaches the bundle. Giard creates a plan with a summary and description, limits the market to the United States, and sets a custom price of $0 per core per hour because it is a test. On technical configuration, "add CNAB bundle" lists the container registries in the Azure account tied to the partner account, then their repositories and bundles. He has only one of each. Twice a save appeared to fail, and both times refreshing the page cleared it.
  • Do not publish a test offer; publishing triggers manual certification. Giard stops at review and publish. He says he published a test offer before and sent feedback, and the lab now warns against it, because a person reviews each submission and would reject a test offer. For a real offer, he says the review takes about a day, after which Partner Center shows it as accepted or rejected, with the reasons for any rejection.
  • Missing screenshot captions get offers rejected, though the form allows them. Giard says one of his own submissions was rejected because a picture had no caption. Captions are required for accessibility, but the form does not enforce that.
Transactable Containers Labs, Lab 2: Creating a CNAB Bundle [GCast 152]
  • Lab two packages the containers with Microsoft's CNAB tooling image. CNAB stands for Cloud Native Application Bundle, which Giard describes as a standard for bundling, installing and managing container-native applications and their coupled services. The lab pulls Microsoft's container package app image (latest) from mcr.microsoft.com with docker pull.
  • The tooling container runs with the working folder mounted as a volume. The docker run command adds a -v volume pointing at the container-labs folder; on Windows the path is written Linux-style, with forward slashes and no "C:". The entry point is bash, so the command drops you inside the container, where the mounted folder appears under the data directory and the container package folder sits inside it.
  • The lab's ARM template failed verification on an outdated API version. cpa verify works as a what-if check; Giard says he hits this error only sometimes. It flagged the Kubernetes extensions resource in clusterdeployment.json as using the 2022-04-02 preview API version; he changed it to the newest listed version, 2022-11-01, and verify then reported zero failures. He presents this as his workaround and hopes the labs get corrected.
  • Building the bundle needs Azure and registry logins, plus one more fix. He runs az login through the device-login page (with two-factor approval in his case), logs into the registry with the admin credentials, then runs cpa buildbundle. That failed because a billing identifier "should not be present" in the to-do app's values file, an error he says he has hit before; commenting it out let the bundle build and push to the registry.
  • The portal shows a new bundle repository with a 1.0 tag. The last step verifies the new repository alongside Mongo and to-do JS, with its manifest and artifact reference. Giard notes an extra "-installer" entry he had not seen in earlier runs of the lab, which he says does not seem to cause problems.
Transactable Containers Labs, Lab 1, part 2: Deploying the Containers [GCast 151]
  • Both local images are pushed into the Azure Container Registry. Giard runs docker login against the registry with the admin user and password, which succeeds with a warning that a password is less secure than tokens, then docker push for each image. The registry then shows two repositories, Mongo (tag latest) and to-do JS (tag v1).
  • The Helm chart's values.yaml takes the registry and image digests. Giard calls Helm a package manager for Kubernetes that gives more control over managing a set of containers. The lab has you put the registry server on lines 10 and 14 (front end and back end) and each image's SHA256 repo digest on lines 8 and 12, add MongoDB key-value pairs, and set a namespace of your choosing on line 30. He finds the digests with docker inspect, redirecting its output to a text file because he finds it hard to read in the terminal.
  • Deployment and UI files pass the MongoDB admin credentials through. In deployments.yaml, which defines the Kubernetes deployment, lines 25 and 27 are uncommented and pointed at the MongoDB admin values. In createUiDefinition.json the lab's JSON goes into the elements array and the outputs section.
  • The ARM template gains parameters prompting for MongoDB admin credentials. Two parameters for the MongoDB admin username and password are added anywhere in the parameters section of clusterdeployment.json, which Giard describes as an ARM template for deploying to Azure. The lab also points to the Microsoft Kubernetes extensions resource type, which he says adds extra functionality to the template.
  • The manifest file closes lab one. In manifest.yaml the registry server is completed with the registry name and the namespace set to the one chosen for the Helm chart.
Transactable Containers Labs, Lab 1, part 1: Creating and running containers locally [GCast 150]
  • Transactable containers run a partner's solution in the customer's Azure tenant. A Microsoft partner bundles one or more containers into a complete solution, sold through the Azure Marketplace and based on Azure Kubernetes Service. The partner controls the containers' configuration and contents, but they are deployed to and run in the customer's tenant. Giard notes the offering was in preview when he recorded, so details may change. The labs need a Microsoft partner registration, which he says is free and takes a few minutes.
  • Download the labs as a zip and work in a copied folder. Giard downloads the lab repository from GitHub as a zip of about 26 MB instead of forking it, because nothing gets pushed back. He copies the lab's starting folder to a new location and renames it "container-labs", so the original stays untouched in case he needs to start over. He points out what looks like a typo in the folder path the lab gives.
  • Create an Azure Container Registry and record its credentials. He creates the registry in a new resource group in East US with the Basic SKU, the cheapest, since this is a demo. Availability zones are optional, for extra redundancy. Validation failed until he gave the registry a name, and creation takes about a minute. Under Access keys he enables the admin user, then records the login server, username and password for the later commands.
  • Build the app image and pull MongoDB, both tagged for the registry. He adds the lab's code to the Dockerfile without deleting its existing first line. Docker Desktop must be running. On Windows he runs the commands in an Ubuntu terminal under WSL rather than the default PowerShell. docker build -t with the registry's login server, the to-do image name and tag v1, and a trailing . builds the image locally. docker pull mongo:latest fetches MongoDB from Docker Hub, and docker tag points it at the same login server.
  • Both containers run on one Docker network as a working app. After docker network create makes a network for the app, one container runs MongoDB on port 27017, with an admin username and password the user chooses. The other runs the to-do web server pointed at it. The app at localhost:3000 adds, completes and deletes tasks. Giard says Lab 1 is much longer than the other labs, so it continues in the next video.
Having Fun with ChatGPT [GCast 149]
  • Borrow ChatGPT's ideas, but don't copy its text. Asked for a metaphor for a movie that starts poorly but ends well, it offered "a diamond in the rough". Giard says pasting that into a review and claiming it as his own raises ethical issues. Taking the concept and putting it in his own words is fine, the way you would paraphrase sources found through Bing or Google.
  • One sentence or premise is enough for a whole story. An unprompted opening line (an enterprise architect asked to code a solution to world hunger), a line about two characters debugging code, and a premise about a politician who insults everyone who disagrees with him each produced a full story or dialogue. Asked to grade its own story for a 12th-grade writing class, it refused to give a grade but listed strengths and no weaknesses. Giard suggests that is probably because it wrote the story, and says you could give it your own writing instead.
  • Everyday requests get usable starting points. He asked for movies like Tim Burton's Big Fish, an espresso machine within a stated budget, a birthday gift for a 15-year-old who loves basketball, and dinner from what is in the fridge. The recipe came with an ingredient list and step-by-step instructions. Giard calls the espresso list a good starting point for further research. He also ran a C# programming text adventure as "game master", which someone online suggested, and a movie trivia game that ended when he typed "stop".
  • It returns structured output in a format you name. Asked for NCAA Division I men's Final Four results as a table with set columns (champion, runner-up, final score, other teams, location, MVP), it built the table. It also wrote Mermaid diagram code for a family tree from Abraham to Jacob that rendered in mermaid.live. The tree was incomplete: it left out the wives.
  • Its bio of Giard mixed fact and error. It called him an independent consultant, though he is a Microsoft employee. It also said his bachelor's degree was in computer science from the University of Michigan, when it is in biochemistry from Michigan State. After he corrected it in the chat, it fixed some of the errors. Giard says he hopes the corrections will make their way into its knowledge base, which is his hope, not something the demo showed. Rewrites of the bio as a haiku and in the voice of Foghorn Leghorn worked, in his view.
Working with ChatGPT [GCast 148]
  • ChatGPT understands and answers in natural language, with stated limits. Giard describes it as built on a large natural-language model that handles colloquialisms, idioms and slang, works in several languages (he tested only English), and remembers earlier questions so follow-ups work. As of the recording he says the free version is GPT version 3, trained on internet data through 2021, text only, and liable to carry the internet's biases and false information; about $20 a month buys version 4 and higher priority when demand is heavy. He starts at chat.openai.com.
  • Generated code is a starting point even when it may be wrong. Asked how to delete a row in MongoDB using PHP, a stack Giard does not use, it returned connection and delete code with a copy button and a plain-language explanation of how the code works. He says he tested it and thinks it works, but argues that even flawed output beats starting from manuals, search results or books.
  • The more specific the request, the closer the answer. Asking for sample baseball statistics as CSV returned PHP code that would write a CSV file rather than the data itself; "regenerate response" gave much the same, though he says an earlier run output the data directly. His lesson is that a more precise question gets the expected answer.
  • Use its drafts as input, not as your own work. Giard calls pasting a generated blog post on the dangers of AI into your own blog unethical, and using it for homework clearly so, but treats a generated presentation outline as fair to expand and claim — the same mindset as combining search-engine results. A private email to a boss excusing a late project read as professional but invented a reason (a family member in hospital), and a job description for his own title, Cloud Solution Architect, needs proofreading since it knows only the title.
  • It explains a concept at whatever length and level you ask. "Explain autoscaling" gave a few paragraphs; "in one sentence" gave a one-line definition; "like I am five years old" gave a simplified version built on metaphors. Giard pitches this for catching up on an unfamiliar term mid-meeting, and notes it can also answer "like a pirate" for fun.
Creating and Deploying an Azure Spring App [GCast 147]
  • Azure Spring Apps hosts Java Spring applications without managing infrastructure. Giard describes it as a way to run Spring apps in Azure where Azure handles the hardware, networking, infrastructure and containers. Searching "Azure Spring Apps" under Create a resource turns up two versions, an enterprise one he describes as from a third party and the standard one from Microsoft; he uses the standard one.
  • The service is created first; apps are then added inside it. On the Basics tab he creates a new resource group, names the service and picks a region (East US, advising viewers to weigh where users and consumed resources are, to minimize latency). The default tier is Basic, which he keeps; Basic does not allow zone redundancy, which needs a higher tier. Deployment of the service took about six minutes. The service name must be unique across Azure; an app name only within its service, and may not contain spaces.
  • Each app takes either a container or a JAR artifact. Under Apps > Create app he chooses the artifact (JAR) route, then sets the runtime (several Java versions, and .NET Core, which he says he has not tried), full or half a virtual CPU, memory of half a gig, one gig or two gig, and an instance count. Raising instances to eight, he says, costs eight times as much per hour for eight times the scalability; he leaves it at one and the defaults elsewhere. Creating the app took about a minute.
  • A new app gets a test endpoint; production needs an assigned endpoint. The test URL, which contains the word "test", serves a placeholder getting-started page. Clicking Assign endpoint produces a friendlier URL built from the service name and app name on azuremicroservices.io, and a custom domain can be pointed at it through a DNS record.
  • One az spring app deploy command pushes the JAR to the app. Using a sample Spring Boot app cloned from GitHub (needing Git, Java, WSL on Windows, and an IDE such as VS Code), he runs from WSL az spring app deploy with the resource group, service, app name and artifact path to the JAR, copying the names from the portal. The deploy took about two minutes, after which the endpoint returned "Greetings from Spring Boot".
Granting YouTube Permissions to Other Users [GCast 146]
  • Channel access is granted per user from YouTube Studio's Permissions page. Giard goes from the profile icon to YouTube Studio, then Settings at the bottom left, then Permissions, where he is the only user, as owner. The Invite button takes the other user's email address and an access role. He says the invitee needs a Gmail account, because YouTube is owned by Google.
  • Six roles trade off power, chiefly permissions, deletion and revenue data. As he reads them: Manager is almost an owner; Editor can do everything a Manager can except manage permissions or delete content; Editor (limited) is the same minus viewing revenue data; Subtitle editor adds and removes subtitles; Viewer sees everything, including settings and private files; and Viewer (limited) the same without revenue data. He notes they are not quite in descending order of power, and picks Editor (limited) as the least control that still lets the user upload videos.
  • The invite stays pending until the owner saves and the invitee accepts. Clicking Save makes the owner re-enter a password (he has two-factor authentication on), and Google may also send a prompt to his phone. The invitee then gets an email inviting them to access the channel and must accept it. After that, playing the invitee, he uses Switch account to reach the shared channel and upload a video to it.
  • Access can be changed or revoked from the same Permissions page. The user's role dropdown lets the owner raise or lower their access, or choose Remove access, which asks for confirmation and may prompt for a password or two-factor check (it did not this time). Once removed, the user's Switch account list no longer includes the channel.
Azure Active Directory Bulk User Operations [GCast 145]
  • Bulk operations replace the one-at-a-time user form at scale. Under Azure Active Directory's Users blade, Bulk operations offers bulk create, bulk invite and bulk delete; Giard says the web form is fine for a few users but not practical for hundreds or thousands. All three work the same three steps: download a template, edit it (and save it, which the page does not say), then upload it.
  • The CSV template has a required version line and marked required columns. The create template ("user create template.csv") opens with "version:v1.0" on the first line, which must be present; the second row holds the column headers, and columns marked "required" (name, username, initial password, block sign-in yes/no) must be filled or the row fails. Optional fields such as first and last name, job title, department and location can be added later, though Giard notes they matter if you base conditional access on those properties.
  • Upload results are reported per row, with a failure reason. After submitting, a status link shows success and failure counts and, in each row's details, a failure reason beyond the unhelpful "bad request". His demo hit three errors: a username whose domain was not one of the tenant's verified domains (contoso.com and microsoft.com were rejected; only the tenant's initial domain was valid), a leading space before an email address, and a blank line at the end of the file. One row can succeed while another fails, so he removed the user already created before re-uploading.
  • Bulk invite and bulk delete need far fewer columns. The invite template uses the same version line and header format, with only the email address and redirection URL required. The delete template needs only the username, which Giard suggests for removing many accounts at once, such as after divesting a company or dropping a contractor firm.
  • Giard expects the CSV to come from an automated process. He suggests a nightly batch that exports from another system and transforms the data into the template, then checking the status report for rows that failed. He advises keeping the file as CSV rather than converting it to Excel, and renaming and archiving each file as a history of what was attempted.
Managing Azure Active Directory Groups [GCast 144]
  • Security groups carry permissions; Microsoft 365 groups carry messages. Created from Azure Active Directory > Groups > New group, a security group lets permissions assigned to the group flow automatically to its users or devices. Giard describes a Microsoft 365 group as what used to be a distribution list, so one message reaches everyone in it.
  • A group can optionally be made assignable to Azure AD roles. Answering yes reveals a roles section for picking which built-in roles the group gets; Giard leaves it at no for the demo.
  • Membership is either assigned explicitly or computed by a rule. Assigned, the default, lets you pick users and even other groups as members, plus an owner (Giard says only one owner can be added). Dynamic user and dynamic device membership instead use expressions joined with "and" (meet all criteria) or "or" (meet either), such as city equals Chicago and a given department, or device OS type equals iOS.
  • Members can be added after the group exists. Giard creates a security group with three assigned members, finds it by search in the groups list, and adds more people through its Members page.
Invite External Users to Azure Active Directory [GCast 143]
  • Inviting brings an outside account in, unlike creating an internal user. Building on creating a user in episode 136, Giard uses Azure Active Directory

    Users > New user > "Invite external user", filling in a name, email address and first and last name. An optional personal message goes into the invitation email, and the user can be pre-placed in groups or a role other than the default user role.

  • Block sign-in holds an invited user until they should start. Giard's example is a contractor who does not begin until the first of next month; he sets it to no so access starts immediately.
  • Optional profile fields pay off in conditional access policies. Location, job title, department, company name and manager are not required, but Giard says they let policies filter on things like users in the United States.
  • Accepting the emailed invitation grants sign-in, not permissions. The email carries an "Accept invitation" link and a consent page; afterwards he signs in at portal.azure.com with his own address but can see almost nothing until an administrator grants access to applications.
Security Defaults in Azure Active Directory [GCast 142]
  • Security defaults are a fast baseline, not complete security. Giard calls them "not perfect" but a good way to get started in a hurry. They are switched on under Azure Active Directory > Properties > "Manage security defaults" at the bottom of the blade, by choosing yes and saving.
  • Security defaults cannot coexist with conditional access policies. Any existing conditional access policies must be disabled first, and the security defaults dialog warns you if any remain.
  • The defaults force MFA registration and block legacy protocols. Every user must register for multi-factor authentication before using applications; older protocols such as SMTP and POP3 and certain proprietary ones are refused; and MFA is required for high-security areas, his examples being the Azure portal and the Azure CLI.
  • Turning them off asks only for a reason. Setting it to no prompts for why, then save. Giard expects people to do this when they want the extra flexibility of conditional access policies.
Conditional Access Policies in Azure Active Directory [GCast 141]
  • Conditional access policies cannot run alongside security defaults. Giard says security defaults must be deactivated before conditional access policies can be used. Policies are created in Azure Active Directory under the Security tab, Conditional access blade, by creating a new policy and giving it a name.
  • Assignments say which users and applications a policy covers. Users can be all users, specific users or groups, guests and external users, or directory roles; applications can be all cloud apps or selected ones, with a filter builder that requires custom attributes to be configured. Nearly every choice has include and exclude, so a policy can apply to a selection or to everyone except it, and Giard warns against a policy that locks yourself out.
  • Conditions narrow when the policy fires, by risk, device and location. User risk flags a user on a leaked-credential list or behaving strangely; sign-in risk flags unusual activity such as signing in from two distant locations at once, each set to high, medium or low. Other conditions are device platform (e.g. apply to Linux, or to everything except Windows), locations (trusted, selected, or a list of forbidden countries or hostile IP ranges), client app (browser versus mobile app) and a device filter built from expressions on attributes such as device ID or manufacturer.
  • Grant either blocks access or adds a required step first. Giard calls the required steps "speed bumps": multi-factor authentication, a password change, or accepting terms of service before access is allowed. The Session settings set how often the step repeats, for example a sign-in frequency of 4 hours, or not again within the same browser session, since he says repeating MFA on every page request would be an inconvenience.
  • A policy can be created on, off, or report-only. Off lets an administrator configure a policy ahead of time, such as for the start of a quarter, and switch it on later. Report-only, which Giard finds useful, records who would match the policy without enforcing it, to learn whether it is needed at all.
Using the Microsoft Graph API [GCast 140]
  • Graph API is one REST interface to everything in Microsoft 365. Giard describes it as a plain REST API called over HTTP or HTTPS that can read, create, update and delete user accounts, Active Directory information, email, OneDrive files and calendar data; he calls it simple to use and well documented, pointing to the "Microsoft Graph API v1.0 endpoint reference".
  • The call is easy; the prerequisites are the real work. Every call needs a bearer token saying which account it runs under, issued by a trusted authority such as Azure Active Directory from a tenant ID, an application ID and a client secret. That account must already hold the permission the call needs (user read access to read users, create permission to create email), and getting the ID, secret and permissions means registering the app with Azure Active Directory, steps he covers in episodes 137, 138 and 139.
  • Decoding the token shows exactly which permissions it carries. In the demo, an app registration in a sample Contoso tenant was granted User.Read.All, and a token generated in Postman by an HTTP POST to a URI containing the tenant ID, passing the client ID and secret, was pasted into jwt.ms, which showed User.Read.All as its only role.
  • A GET to the users endpoint returns the tenant's users. Sending an HTTP GET to https://graph.microsoft.com/v1.0/users with the token set as a bearer token under Authorization returned HTTP 200 and the list of users. Giard says a call lacking permission or using an invalid token gets an unauthorized response ("a 401, I think"), and that a valid token with the right permissions can be reused for as many calls as you like.
Creating a JWT Bearer Token with Azure Active Directory [GCast 139]
  • A bearer token identifies the account an API request runs under. Giard describes it as an OAuth standard issued by a trusted authority; Azure Active Directory issues it as a JSON web token (JWT) carrying claims about the account, including its permissions. The account must already hold permission for whatever the API does, such as reading OneDrive documents or sending email through Microsoft Graph.
  • Three values come from the app registration. These are the client ID, the tenant ID (on the overview page and the registration) and a client secret, plus Graph application permission User.Read.All with admin consent, as in episodes 137 and 138. He creates a new secret expiring in six months and repeats that its value is shown only once and works as a password, best kept in Azure Key Vault in production.
  • The token comes from one form-encoded POST to the tenant's endpoint. Using Postman (free at postman.com), Giard posts to https://login.microsoftonline.com/<tenant ID>/oauth2/v2.0/token as x-www-form-urlencoded data with four fields: client_id, client_secret, scope and grant_type. For Microsoft Graph the scope is https://graph.microsoft.com/.default and the grant type client_credentials, which he says are the same every time; the client ID and secret change.
  • The returned access token is encoded JSON that jwt.ms can decode. The request returned HTTP 200 and an access token. Decoded at jwt.ms, its aud claim names Microsoft Graph as the intended recipient and its roles claim lists User.Read.All.
  • Changing permissions does not update an already-issued token. Giard says that if you add a permission (his example is bookmark.read.all), the existing token will not carry it; you must send the POST again, from Postman or from code, to get a token that includes it.
Granting Azure Active Directory API Permissions to an App Registration [GCast 138]
  • Permissions are granted on the app registration's API permissions page. This builds on the registration from episode 137. By default a registration carries the delegated permission User.Read; Giard explains delegated permissions as continuing a context the caller is already running under.
  • Application permissions make calls run as the registration's own account. Giard chooses Add a permission, then Microsoft Graph, then Application permissions, so an API call is explicitly assigned the account tied to the registration. He advises being specific because Graph covers users, email, Teams, OneDrive and more, and he picks User.Read.All under User to read all user profiles without write access.
  • User.Read.All needs admin consent before it takes effect. The portal shows a warning that admin consent has not been granted; logged on as an administrator, Giard clicks Grant admin consent and confirms, and a check mark replaces the warning. He calls the process simple, with the catch that you must be an administrator.
Registering an Application with Azure Active Directory [GCast 137]
  • Registering an app is the first step to Azure AD authentication. In Azure Active Directory, choose App Registrations and then New Registration; Giard notes you need admin-level permissions on the account. Only two fields are required. The first is a name, and he advises one that is easy to identify and search for later, since the registrations list is found with a filter box.
  • The second required field sets who may authenticate. The options are this tenant only; multiple Active Directory tenants (customers, partners or acquired companies, which needs a trust relationship); multiple tenants plus Microsoft accounts such as Xbox, Skype, Outlook.com, Hotmail and Live; or personal accounts such as Gmail addresses that the directory trusts. Giard picks single tenant and later shows it can be switched to multi-tenant on the registration's details page.
  • The redirect URI is optional and can be set later. It names the page or screen a web, mobile or rich-client app sends the user to after a successful sign-in. Giard leaves it blank because not every app has a user interface: a registration may be for web service calls only.
  • A client secret acts as the registration's password. Giard says a bearer token for a web service call needs one. Under the registration's certificates and secrets, New client secret takes a name and an expiry, from soon to two years or a custom range with a future start date; he sets three months.
  • The secret's value can be copied only once. After a page refresh the value is gone and is not regenerated, so Giard says to copy it immediately to a safe place such as a key vault or a locked-down directory. Anyone holding it can create a token and impersonate the account.
Creating an Azure Active Directory User [GCast 136]
  • Only an administrator can add users, from the Users blade. Giard logs into the Azure portal as an admin of a Contoso sample directory. He notes Azure Active Directory's overview page has its own "add user" link, but he prefers going to Users in the left menu and choosing "new user".
  • New user offers two paths: create internally or invite externally. "Create new user" makes an account inside this Active Directory. Inviting an external user sends an email that lets someone from elsewhere join.
  • Only the user name and name are required. The user name becomes the sign-in address under the directory's onmicrosoft.com domain and must be unique within the directory. Giard says everything else on the form is optional and can be changed later. The other options he covers are an auto-generated password, which he shows and says to copy; assigning a group or a role, where the default role is User; "block sign in", for someone who starts next week; location; and job details such as title, department, company and manager.
  • Profile properties can be sent as claims in a token. Editing the user after creation shows many more fields the create form never asked for, such as city and address. Giard says this information, along with groups, roles, job title and manager, can be passed to another application in a token so it knows who the person is.
  • The same user page handles password resets and deletion. Giard shows resetting a password, for a user who has forgotten theirs, and deleting a user who has left the company. Deletion asks for a second confirmation.
Deploying a Web App to Azure from VS Code [GCast 135]
  • VS Code deploys to App Service through Microsoft's Azure extension. Giard installs the Azure App Service extension from Microsoft (about 60 seconds), which adds an Azure icon to the left toolbar; you pick the right subscription, expand App Services and right-click to create a new web app. His demo app is Node, but he says the method applies to any language App Service supports, such as C#, Java or Python.
  • The advanced create path asks more questions for more flexibility. Its six questions are a globally unique app name, a new or existing resource group, the runtime stack (he takes the most recent Node), Windows or Linux (both supported; he picks Linux), a region chosen for latency to users and to the resources the app calls (he takes East US), and a new App Service plan with a pricing tier of free, development/test or production. Application Insights is optional and, like much of this, can be changed later in the portal.
  • Creating the web app does not deploy the code. A separate Deploy button asks which folder to deploy and whether to always deploy it to this app service (he skips that); it uploads only the files needed to run, such as binaries and views, not all the source. In the demo it took about two minutes, after which "browse website" served the same page that had run locally on port 3000.
Managing Microsoft Edge Profiles [GCast 134]
  • Edge profiles keep separate settings and accounts in one browser. Giard keeps one for work and one for personal, each tied to a different email address; he says this suits defaulting to different sign-ins, or single sign-on with a customer's account.
  • A new profile is added from the profile icon and synced to an account. The icon sits at the top right; "Add profile" then asks you to sign in to sync data with an existing or new email account. Giard suggests giving each profile a different color theme so it is easy to tell which one you are in.
  • Rename, repicture or remove a profile under Settings, Profiles. The three dots next to a profile offer edit (a descriptive name in place of the default "Personal 2", and a picture in place of initials) and remove. Any profile but the first can be deleted; there must always be at least one.
Configuring an Azure App Service Identity Provider [GCast 133]
  • An App Service gets sign-in from its Authentication blade. "Add identity provider" offers Microsoft (Azure Active Directory and Microsoft accounts) and third parties such as Apple, Facebook and GitHub; Giard notes the third parties require you to register with them first.
  • The supported account types decide who can sign in. Choosing Microsoft and a new app registration, the options are a single tenant, multiple Azure tenants, personal Microsoft accounts (Outlook.com, Hotmail, Live.com), or both Azure AD and personal accounts, which he picks for flexibility. He requires authentication and sets the HTTP code returned when it fails.
  • Setup creates an app registration in Azure Active Directory. It appears under App registrations, easiest found by filtering to owned applications and sorting by created date. Giard is an owner of it, which is why he can still reach the now-protected site.
  • Other users get in through a Reader role assignment. On the app service's access control blade he adds a role assignment; he calls Reader the common choice for people who use the app, and Contributor for those who manage it. Members can include guest accounts in the directory, and a Hotmail guest he assigns could then open the site.
Managing Azure Key Vault Secrets from a .NET App [GCast 132 ]
  • The app needs its own Azure AD identity with a client secret. After creating the vault (episode 130), Giard registers an application under Azure Active Directory, App registrations, keeping the single-tenant default and no redirect URI, then adds a client secret under Certificates and Secrets set to renew every six months. He stresses that creation is the only chance to copy the secret's value, and also notes the client ID and tenant ID.
  • A vault access policy grants that registration's principal its permissions. The app runs as the registration's principal, not as the vault's creator, so he adds a policy using the Secret Management template (all secret permissions, no keys or certificates) plus purge. He warns it is easy to forget the final Save, without which the change is lost.
  • DefaultAzureCredential reads the identity from environment variables. He sets Azure client ID, client secret and tenant ID as environment variables, then restarts Visual Studio because they are read on startup.
  • SecretClient covers listing, setting, soft-deleting and purging secrets. Pointed at the vault's vault.azure.net URI, it lists non-deleted secrets via get-properties-of-secrets and sets them with SetSecretAsync. StartDeleteSecret only begins a deletion that may take about 30 seconds, so his code polls the returned operation until HasCompleted; the result is a soft delete, recoverable until purged (90 days by default), and PurgeDeletedSecret removes it for good. In the demo the soft-deleted secret showed under Manage deleted secrets and the purged one did not.
  • Giard publishes the demo code on his GitHub. It is in a repository named Azure Key Vault demo, with the code in program.cs; users must set the environment variables and change the vault name to their own.
Managing Secrets in an Azure Key Vault [GCast 131]
  • A secret is a name-value pair kept out of code and config. Giard suggests connection strings or passwords that should not be checked into source control or put in a config file; the app is told where the vault is and given permission to it. New secrets are created on the Secrets blade with Generate/Import, using the Manual option, since importing certificates has moved to its own blade and the certificate option there is deprecated.
  • Optional fields label secrets and limit when they are usable. Content type is free-form text and tags are metadata for reporting, such as by user or department. A secret can be set to enabled "no", or given an activation and expiration date, outside which applications and users cannot access it.
  • Saving a new value creates a version and keeps the history. "New version" replaced the demo value while the old version stayed listed alongside it.
  • Deleting a secret soft-deletes it, recoverable until purged. Deletion takes about 30 seconds to complete; under Manage deleted secrets you can recover the secret (it came back with its versions) or purge it permanently. By default it is purged automatically after 90 days, which is configurable when the vault is set up.
  • Missing buttons or errors usually mean missing access-policy permissions. The vault's creator appears under Access policies with eight secret permissions selected by default; Giard says an unchecked box, such as purge, is the likely cause if an action is unavailable.
Creating an Azure Key Vault [GCast 130]
  • Key Vault stores secure data only specified identities can reach. Giard lists certificates, encryption keys and secrets (name-value pairs such as a connection string or password), accessible only to the applications, user accounts and services you specify.
  • Only the Basics tab is required to create a vault. From Create resource, the dialog also has access policy, networking (public and private networks) and tags tabs, which he skips. Basics takes a resource group, a name and a region chosen to minimize latency for whoever reads the vault. The pricing tier is standard (the default and cheaper) or premium, whose main difference is support for HSM keys.
  • Deleted objects are soft-deleted and recoverable for a retention period. The default period is 90 days and can be changed (he cites 7 or 30 days); after it, items are purged permanently. Items can also be purged early by hand unless purge protection is enabled, which he leaves off.
  • Review and create validates before deploying. The button is enabled only when nothing is missing or inconsistent, and deployment took about 30 seconds in the demo.
Using the Microsoft Docker Extension for Visual Studio Code [GCast 129]
  • Microsoft's Docker extension adds a Docker panel to VS Code. Giard installs it from the Extensions view (he notes 16 million downloads and a five-star rating; VS Code itself is a free download from code.visualstudio.com). The new left-toolbar button lists containers, images, networks, volumes and connected registries; he is already connected to Docker Hub.
  • Dockerfiles get color coding and IntelliSense on image tags. On the base image line (the current Alpine version of Node), typing a colon and Ctrl+Space lists the available tags, and typing further filters the list.
  • Right-clicking the Dockerfile builds an image without typing commands. "Build image" asks for a name (he enters app1:1.0) and runs the docker build task in the terminal for you. From the panel he can then remove, inspect (JSON output), push or run the image; Run issues docker run in detached mode, and the new container's files, logs and an attached shell are available from its right-click menu.
  • Networks can be created in the panel; volumes, he believes, cannot. The plus button takes a network name and asks for a type (bridge, host, macvlan and others). For volumes Giard says there is no interactive way "as far as I know", so he runs docker volume create vol1 in the terminal, after which the volume appears in the panel to inspect and attach to a container from the command line.
  • "Connect registry" links Azure, Docker Hub, GitLab or generic registries. Docker Hub asks for a Docker ID and password; once connected, the registry's images can be browsed from the panel.
Maintaining State with Docker Volumes [GCast 128]
  • Containers lose anything written after creation when recreated. Giard says containers are stateless by default, which is part of why they start so fast. He shows it with the image and container from episodes 126 and 127. He opens a shell inside the container with docker exec -it app1 sh, writes stateless.txt, and leaves with Ctrl-P, Ctrl-Q. He then deletes the container with docker container rm <id> --force and recreates it. The file is gone, because only what was in the image comes back.
  • A named volume mounted into the container keeps state on the host. He creates one with docker volume create vol1, then runs the container in detached mode (-d) with -v mapping vol1 to /var/opt/project inside the container. A file written to that folder lands in the volume. On Windows he finds it on the host under the WSL Docker Desktop data share, in ...\docker\volumes\vol1\_data. It also shows in Docker Desktop's Volumes view.
  • The volume's data survives deleting and recreating the container. He force-removes the container and reruns the exact same command, which he calls a common move when something fails and you want the app back up. The file is still in /var/opt/project in the new container.
  • Several containers can share one volume. He starts app2 (host port 8001) and app3 from the same image, all pointing at vol1. A file written from app2 shows up in the other containers, in the host folder and in Docker Desktop.
  • A volume in use cannot be removed; prune clears unattached ones. docker volume ls lists the volumes. docker volume rm vol1 fails with "volume is in use" while any container is attached. Once he has force-removed the three containers, docker volume prune (after a warning) deletes every volume no container is using.
Building and Running a Docker Container [GCast 127]
  • Docker Desktop and a free Docker Hub account are the prerequisites. Docker Desktop installs Docker on Mac, Windows or Linux. Docker Hub is where Giard stores his repositories, under the account name "DGR". His demo app is a dependency-free Node web app (app.js, port 8081) that prints the current date and time and a list of the numbers one to five.
  • A Dockerfile lists the build steps. It is named Dockerfile with no extension by default; any other name has to be given to the build command. Giard walks through five instructions. FROM sets the base image; he uses node:current-alpine from the base images on hub.docker.com. LABEL is metadata only, commonly the author or an email address. WORKDIR sets the folder inside the container where later instructions run. COPY . . copies from the local build folder (left) into the working directory (right). ENTRYPOINT takes an array of a command and its arguments, here node and app.js.
  • docker build -t account/repo:tag . builds the image. He runs docker build -t dgr/app1:1.0 ., using the tag as a version number. docker image ls then shows the image's ID and size. He notes that most of the size comes from the Node base image, but it is still far smaller than a virtual machine with a whole operating system.
  • Pushing creates the repo; any machine with access can run it. docker image push dgr/app1:1.0 creates the repository on Docker Hub and uploads the image; if you are not logged in, it may ask you to. To show this, he deletes the local copy with docker image rm b02, where a unique ID prefix is enough. He then runs docker container run --name app1 with port mapping 3000:8081 and the image dgr/app1:1.0. Docker does not find the image locally, so it pulls it from Docker Hub, and the page loads at localhost:3000.
  • By default, docker container run holds the prompt; -d runs detached. Run without -d, the container ties up the terminal until Ctrl-C. docker container stop <id-prefix> stops a container. docker container ls then no longer lists it, which Giard finds "a little bit frustrating", though ls -a still shows it as exited. docker container rm deletes it for good. Rerun with -d, it returns the prompt at once; he points to how fast it starts.
Getting Started with Docker [GCast 126]
  • Containers are lighter than virtual machines because they abstract the operating system. Giard explains that a VM abstracts the physical hardware and holds an operating system plus applications, while a container sits on top of a VM and holds only the application and the data it needs. He says that makes containers smaller and faster, quick to restart, and able to be scaled and deployed independently.
  • Docker Desktop runs containers locally; Docker Hub hosts images for sharing. Docker Desktop has downloads for Windows, Linux and Mac, and Giard calls installing it pretty simple. He recommends a Docker Hub account too, so images can be shared with other people, other machines or VMs in the cloud. His own registry is named for his first initial and last name, and he says viewers can probably read from it but not write to it. To follow a demo that uses it, they should create their own registry and put its name in place of his.
  • docker run pulls the image, then creates and starts a container. His demo runs Docker's built-in "getting started" image, which anyone can use. -d runs it detached, handing back the command prompt. -it would run it interactively, inside the container. -p maps ports: the image serves a web app on port 80, which is not reachable from outside the container, so he maps local port 3000 to it. The image was not on his machine, so Docker pulled it from the registry first. The container came up in about a second.
  • Containers are listed, stopped and started by a short ID prefix. docker container ls shows the running containers with their ID, creation time and uptime. Adding -a also lists stopped ones, with the status "exited". docker container stop and docker start take the ID, and he says you only need to type enough of it to be unique among your containers.
  • The mapped page only answers while its container runs. With the container running, the tutorial page loaded at localhost:3000. After he stopped the container, a cache-bypassing refresh (Ctrl+F5) failed to find it. After he restarted the container, the page came back almost at once.
Creating a Simple node.js Application [GCast 125]
  • Install Node from nodejs.org, which detects your operating system. The site offers two downloads: the latest stable release, and the latest release, which may have bugs. Giard says he usually takes the stable one. A downloads tab lists every release.
  • A web server takes a handful of lines using Node's http library. In a new file in an empty folder in Visual Studio Code (the file can have any name ending in .js), he imports the http library into a variable named http. He then calls its create-server method with a function taking request and response arguments (req, res) and has it listen on port 8081. Whatever that function returns is what a user hitting the port receives. Inside it, res.writeHead sets a 200 OK status and a text/plain content type, res.write outputs "hello world", and res.end tells the browser that no more content is coming. He also logs a "server running" message, as a reminder of where to browse.
  • Run it from VS Code's debugger or the command line. Run and Debug printed "server running at localhost:8081", and the page loaded in a browser. Once he stopped it, the page just spun and timed out. VS Code is not required. The same thing runs as node.exe followed by the path to app.js, from PowerShell for example, or from a script. The full path to node.exe is only needed if Node is not on your PATH.
  • Leave a previous instance running and the port is already in use. His second run failed because the PowerShell copy was still running. Stopping it with Ctrl+C cleared the error.
  • The response can carry HTML and output generated by JavaScript. He added heading and paragraph tags to the output, then a for loop that writes the numbers 1 through 10 as list items inside a ul. The pasted loop at first failed because it used response rather than the argument's name, res. His advice: think about what you paste.
Customizing Spelling and Grammar Checks in Microsoft Word [GCast 124]
  • Word's checker can run on spelling alone or spelling and grammar. The choice is a dropdown on the Spelling and Grammar button on the Review ribbon; Giard always leaves it on both, and notes that F7, though not shown on the button, has long been the shortcut. The dialog that opens on the right suggests a correction or lets you Ignore or Ignore All (for example a proper name you don't want in your dictionary), and in his demo it flagged a verb that did not match its subject ("shows" where "show" was needed).
  • Proofing language sets which variant's spelling rules apply. Under Review, the Language button's dropdown has Set Proofing Language, which Giard says he has traditionally used to set English (United States). It lists regional variants, such as several dialects of Arabic and UK or Australian English, which decide whether a word like "flavor" ends in "-or" or "-our".
  • Marked sections can be excluded from spelling and grammar checks. Highlight the text, open Set Proofing Language, and tick "Do not check spelling or grammar"; Giard says he only recently learned of this option. He applies it to the code samples in a technical article (variable, table and function names that are not English words), and the check then skips them, not stopping on identifiers like "P1" or "pack_array". The setting is saved with the document and applies the next time it is opened and checked.