Polis Pandit$Why You Should Care About the MyLife.com Settlement
- This post includes paid content that is not available publicly. See the original source.
The host builds two FreePBX call queues, sales (5050) and customer service (5051), and finishes with BLF buttons on the phone for logging agents in and out and pausing them, so that no call is ever stranded and calls reach agents as efficiently as possible. His rule: queues are for when calls outnumber agents, and ring groups are for when agents outnumber calls.
General settings. A caller ID prefix ("Sales:", "CS:") and alert info tell agents which queue a call came from. He uses round robin with memory, turns autofill on so waiting callers ring agents in parallel instead of in line behind the first call, and skips busy agents only when they are on queue calls. Calls are recorded, and failover goes to the department voicemail.
Agents. Static agents always ring. Dynamic agents log in and out, and priority values hold back higher-numbered agents until all priority 0 agents are unavailable.
Timing and capacity. Max wait time (strict or loose), a 10-second agent timeout with 5-second retry, wrap-up time for CRM notes, and auto-pause for agents who walk away. Max callers, plus join-when-empty no and leave-when-empty yes, send calls to failover when no one can take them. Position and hold-time announcements, an IVR breakout, and an SLA service level for reporting are optional. He passes over iSymphony because he dislikes its licensing.
Agent controls. Feature code *45 logs an agent in or out and *46 pauses, either across all queues or with extension and queue variables. These are hard to teach, so he adds BLF keys using the __SIP_USER_1__ template variable, which turn red when logged in or paused. He says only Crosstalk/Clearly IP phones, which his firm sells, support this, not Yealink. A test call shows auto-pause triggering on an unanswered call.
__SIP_USER_1__ template variable shows status by colour. The host, whose firm sells them, says this variable works only on Crosstalk/Clearly IP phones, not Yealink, and cites it as why he promotes them.usbipd wsl list showed it at
bus ID 9-4, and usbipd wsl attach asked for a sudo password and handed it
to Ubuntu, where lsusb saw it. meadow flash os then succeeded once it was
run under sudo with its full path. He says the setup took him about five
minutes.Hanselman and Edwards set out to repair azurefriday.com, and by the end they have a .NET 6 console app. It calls the new paged episode API, deserializes each episode into a small C# record and prints the titles. Fanning out across pages and making the batch media call are left for a follow-up. Along the way the session argues that analysis and explicit trade-offs come before code, that early-career engineers should not be put off by having only one of many valid answers, and that iteration rather than first-time correctness is how code gets written.
The broken feed. Hanselman's site held every Azure Friday episode, about 700 of them and "like a meg", in memory for instant client-side search. The data came from one Channel 9 API call that the Channel 9 team had extended to skip paging. Since Channel 9 joined Microsoft Learn, that URL redirects. The replacement docs hierarchy service pages results at no more than 30 and returns no media, so thumbnails need a second batch call keyed on entry IDs. One GET has become what Edwards calls "cascading calls".
Probing the API. Before writing code they tested the API in the browser. Counting "uid" in VS Code confirmed 30 entries a page. An oversized page size returned a clear error, and a page past the end returned an empty array, which gives them the loop's stop condition. Edwards noted that there were no hypermedia-style next-page links. The batch endpoint gave good validation errors, did not remove duplicate IDs, and accepted 30 and then 31 IDs. Around 300 drew an HTML bad request, then a 404, and Hanselman suspects Azure Front Door blocked him for what looked like an attack. They settled on 30 a page. The API reported 351 episodes rather than 700.
Choosing an architecture. Edwards frames the first choice as fanning out on each request versus building the data periodically. The periodic route brings in cache invalidation and the question of what runs the job. Hanselman proposed an ASP.NET background worker that caches to local disk at startup. Edwards listed what can go wrong with that: write access, containers, redeploys, concurrent writes and scale-out. He describes "step functions": going from one instance to two changes far more than going from two to ten. Hanselman answers growth to 200 with "that's a great problem to have" and YAGNI. His plan is a console app now, later an Azure Function or cron job that drops a JSON file into storage.
Experience and failure. Hanselman says the difference between early- and late-career engineers is suffering, such as having been rate limited before. Edwards puts it as learning from failure over time: what you need to remember is the failure modes, not the APIs. Hanselman worries that "you poser" comments chase newcomers out of tech. Edwards says published content hides the iteration everyone relies on, and that code which is right today can be wrong after a 10x traffic promotion.
Writing the code. Edwards says HttpClient is still the default, with lifetime management and DNS caching as the server-side complications. An interpolated string is evaluated when it is created, so they used a string.Format placeholder for the page number. Hanselman reached for System.Text.Json.Nodes and walked the response node by node, and the total count came out through an explicit operator cast to int. Edwards said he would have started with JsonDocument, and that JSON path is supported in Json.NET but not yet in System.Text.Json. They finished by passing each episode node to JsonSerializer.Deserialize into a Show record with matching property names. The code is not yet defensive about nulls.
string.Format
placeholder suited the page number. They walked the response with
System.Text.Json.Nodes and an explicit cast to int, then handed each episode
to JsonSerializer.Deserialize into a Show record whose property names
match the JSON. Edwards would have started from JsonDocument or a typed
response instead. The run printed titles; the paging fan-out and the batch
call were left for a follow-up, and the code is not yet defensive about
nulls.Over a little more than two hours, Hanselman and Oh My Posh creator Jan De Dobbeleer build a working Nightscout segment in Go that shows Hanselman's live blood sugar and its trend arrow in his prompt, coloured by thresholds he sets in his theme, and cached so it costs nothing on most renders. The segment runs and caches by the end; units, staleness handling, tests, documentation and the pull request are left for Hanselman to finish.
The problem. Hanselman is diabetic and runs a personal instance of Nightscout, the open-source, non-profit project he has long been involved with: a sensor sends readings to his phone, the phone to the cloud, and a REST API returns them. One reading is a serum glucose value (139 at the start, after an apple he ate on purpose to show the number move) and a direction string. His earlier prompt integration, built with a friend, had a Windows service or cron job write to a text file the prompt read, which broke whenever he forgot to run it. De Dobbeleer says the weather segment already does what is needed: call an API, cache, display.
Latency first. De Dobbeleer's first question is how often to fetch, since nobody wants a slow prompt. Hanselman says a short pause once every five minutes is fine, and five minutes is also the most often the sensor reports. De Dobbeleer says the git segment is usually the slow one.
Setting up. Hanselman forked the repository and opened it in the project's VS Code dev container, which a contributor added to lower the barrier to contributing. It installs Go and the extensions, sets up every supported shell so a change can be checked in all of them, and also works on github.dev. De Dobbeleer joins via Live Share from Belgium, midnight for Hanselman and 7 a.m. for him. Hanselman repeatedly pitches this as an underused way to work, "Google Docs for code", and De Dobbeleer says he has considered using it for contributor help, since asynchronous reviews can be slow and daunting.
Copying the weather segment. They copy the OpenWeatherMap segment and take it apart. De Dobbeleer walks through its shape: an enabled function deciding whether the segment shows, a string function returning only text, and an init that receives the user's properties and an environment interface through which all I/O passes, so tests can mock everything. Colouring used to live in segment code; he has recently moved it into templates, with background and foreground templates that can branch on any exposed value, because adding colour properties for every API field does not scale. Hanselman wants only the full Nightscout URL, token included, as the one property, so the segment is not "in the business of building URLs". De Dobbeleer agrees and names the property simply url, since properties are scoped to the segment. Hanselman had assumed the cache was shared across segments; De Dobbeleer corrects him that keys are per-segment.
The array envelope. The API returns an array even with count=1. They debate caching the raw response against extracting the first element, and settle on parsing the array, taking element zero and copying its values onto the segment struct so templates can use .Sgv and .Direction. Doing it this way also tolerates a user leaving count off the URL. Hanselman notes the result deserializes and reserializes JSON on the way to the cache and calls it an optimization for later. Asides along the way: Go's implicit interfaces, which De Dobbeleer says are powerful once you get used to them, especially for mocking, and Copilot completing his enabled function.
Wiring and the first failure. They register the segment type and its mapping per the contributing guide, rebuild, and get nothing. The binary was the old one: the PowerShell profile in the container loads the module's executable, and the build task's readlink step failed, so they rebuilt into the module path by hand rather than rebuild the container and lose Live Share. Write-PoshDebug then showed the 20 ms default HTTP timeout being hit; raising it in the theme brought the number up.
Trend icons. For the seven direction values Hanselman lays out three options: hard-code them, write a large template, or add icon properties with defaults. De Dobbeleer picks the third as fastest and readable, following the git segment's upstream icons, with a Go switch returning each property or its default. His rule is that a default right 99% of the time should ship. Hanselman worries that double arrows will change the segment's width; De Dobbeleer notes git already varies.
Colour and caching. Background templates turn the segment yellow above 150 and red below 60; Hanselman, colour-blind, adds a black foreground template. Testing with hard-coded values exposes that the cache never worked: get and set used different keys, which they fix while hard-coding the timeout to five minutes. A lingering 1,200–1,500 ms lag proves in the debug timings to be the git segment over the container's volume mount, with Nightscout at zero.
What is left. Glucose units (mg/dL against mmol/L) are not in the API response and need a property or discovery. Hanselman wants to show readings as stale after an hour, and tests, segment documentation with a sample config, and the PR remain. De Dobbeleer says a segment normally takes him about 20 minutes plus tests; Hanselman, having estimated 30, says he could now do one in an hour.
Weston's position is that Windows 11's hardware bar is a data-driven line for a guaranteed experience — security, performance and reliability together — and that its security half rests on turning on by default a trusted-computing stack Windows 10 already had: measured boot, virtualization-based security and DMA protection. Older machines, he says, are not left behind; they can stay on a supported Windows 10 and enable most of it by hand.
Why a fast PC fails the check. Hanselman opens with his own 7th-gen Intel machine. Weston says the bar weighs drivers and reliability statistics from millions of machines, agreed with silicon vendors, alongside security features, and that speed alone does not clear it. Hanselman adds his own experience: enabling VBS meant converting from MBR to GPT and removing nine unsigned drivers.
Optional security is exclusive security. Weston compares optional features to overclocking: enthusiasts tweak, most people never touch them. TPM requirements date to Windows 10 logo systems in 2015, so the chips were mostly already there.
Boot first, then everything else. Secure boot validates signatures; trusted boot adds TPM measurements that unseal BitLocker. Attackers take the easy path, Weston says, but go to firmware for stealth, since whoever runs first wins. He frames this as building a foundation rather than chasing individual malware.
Ring minus one. VBS uses the hypervisor to own page tables and other critical state, creating a secure kernel with its own "trustlets" for credentials and attestation. He credits the cloud hypervisor team: the same multi-tenancy code, brought to the client because everyone runs as admin.
Physical attacks. Sub-$100 DMA devices let an attacker patch memory; the IOMMU blocks new DMA devices while the machine is locked, and biometric matching moves inside VBS.
Advice. Asked about unsupported installs, Weston calls it a support question outside his area but advises against it: turn the features on in Windows 10 instead.
The host builds three outbound routes on FreePBX 15: a default route, an emergency route that sends each extension's own E911 number, and a dial-8 route that sends a second caller ID.
Default route. The route's caller ID overrides the trunk's, but an extension's own caller ID overrides the route's. Trunks are tried in sequence. The dial pattern wizard produces 7-, 10- and 11-digit patterns, and the host prepends digits so that every call goes out with 11. He adds a +1 pattern for older Yealink phones, which redial with a plus.
Toll-free. A toll-free number cannot call another toll-free number. A company whose outbound ID is toll-free therefore needs a separate toll-free route with a local ID, placed above the default because the first match wins.
Emergency. The host says Kari's Law and RAY BAUM'S Act require every extension to reach 911. Once a route is flagged as emergency, each extension's own emergency caller ID takes over, so home workers send their home address. The route matches 911 variants, plus 933 for address testing and 988. It goes at the top, sends email alerts and forces call recording.
Prefix and testing. A dial-8 route strips the 8 and sends a different caller ID, which he suggests for two organizations sharing one system. Calls to 933 read back the provisioned address, and a test call shows a caller ID ending 2040 normally and 0266 when 8 is dialed first.
dotnet watch run exits,
recompiles and relaunches on save, which Hanselman shows by printing the
process ID and watching it change; under .NET 6 the same command reports
"hot reload enabled" and the PID stays the same across edits.Main and add implicit usings (no
using System.Threading needed), but that entry point still exists and
cannot be rewritten live; he moves the output into a separate Utils
class so changes to it reload. Ctrl+R restarts the app when a full restart
is needed.dotnet watch run, edits to both the .cshtml markup and
the C# code-behind (a logger call) appear immediately; view source shows
an ASP.NET Core browser-refresh script injected at development time doing
it. He dates .NET 6's release to "next week or this week", with .NET Conf
running November 9–11.asterisk -rvvv and pjsip show endpoints, or in Reports > Asterisk Info > Peers.Tara Walker, a Microsoft engineer who works on Azure IoT, takes Hanselman from "what counts as a device" to a working model of IoT hardware. Where she ends up: start by blinking an LED on a Raspberry Pi, but build real single-purpose devices on microcontrollers running a real-time OS, then connect them to the cloud.
What makes it IoT. Hanselman's USB-powered Tony Stark heart only lights up, so Walker says it is not an IoT device because it has no brain. Blinking an LED is the hello world.
Microprocessor or microcontroller. In Walker's account, microprocessors run a full operating system, embedded Linux or Windows, with external storage and real multitasking. Microcontrollers keep RAM, flash and peripherals on one chip, usually 8- or 32-bit, and run an RTOS that switches tasks quickly. A desk quiz makes the point: boards with screens and ports were still microcontrollers, and a RISC-V board running Linux was not. A thermostat, she says, belongs on a microcontroller. She concedes the Pi is a fine learning tool, since RTOS work demands C/C++ or Rust, but calls Hanselman's Pi-and-Twilio garage-door alarm overkill.
Sensors and actuators. Sensors sense the world and report voltage patterns that code turns into values, and actuators act on it. Her plant waterer pairs a soil-moisture sensor with a relay-driven pump.
The cloud. The next step is connecting thousands of devices. They propose a later episode where a button in Atlanta lights an LED in Hanselman's house.
.git directory stores commits, trees and blobs, and each SHA is a hash of a snapshot's content that serves as its address. He says Git is fast because it stores snapshots rather than deltas and because everything is local except interaction with remotes.