Scott & Mark Learn To…Pilot Coding - Vibe Coding for Real


Summary

Neste episódio, Scott Hanselman e Mark Russinovich exploram o conceito de “vibe coding” (codificação assistida por IA) em projetos reais. Mark compartilha sua experiência tentando implementar comunicação via memória compartilhada para gRPC no projeto Dapr, uma tarefa complexa que envolveu alternar entre C++ e Go, enfrentando problemas de concorrência, até que o modelo Claude Opus conseguiu gerar uma solução funcional após múltiplas tentativas. O foco principal do episódio é a adição de um editor de vídeo (trimmer) ao ZoomIt, ferramenta clássica do Sysinternals. Mark demonstra como utilizou o GitHub Copilot com o modelo Sonnet para criar, em poucos prompts, uma interface completa em Win32/C++ com suporte a modo escuro, redimensionamento e controle de volume, algo que manualmente levaria muito mais tempo. Eles discutem como a IA acelera o desenvolvimento, mas também apresenta limitações como alucinações e excesso de confiança (“já está corrigido”), exigindo supervisão humana constante, especialmente em casos de borda como mudanças dinâmicas de DPI.


Recommendations

Tools / Software

  • ZoomIt — Ferramenta de zoom e anotação de tela do Sysinternals, agora com editor de vídeo integrado na versão 10.0
  • GitHub Copilot — Assistente de codificação por IA usado por Mark para desenvolver o trimmer de vídeo
  • Claude (Opus/Sonnet) — Modelos de IA da Anthropic utilizados para o projeto gRPC e para o desenvolvimento do ZoomIt
  • Dapr — Runtime de aplicações distribuídas que motivou o projeto de memória compartilhada em gRPC
  • gRPC — Framework de RPC de alto desempenho que Mark modificou para suportar comunicação via memória compartilhada
  • Playwright — Ferramenta de automação de testes mencionada para testes end-to-end
  • WinGet — Gerenciador de pacotes do Windows para instalação do Sysinternals/PowerToys
  • PowerToys — Conjunto de utilitários da Microsoft que inclui o ZoomIt
  • DebugView — Ferramenta do Sysinternals para visualização de saída de debug em tempo real
  • MCP Servers — Model Context Protocol, mencionado como forma de fornecer contexto adicional às IAs (como debug output)

Topic Timeline

  • [00:00:30] — Mark explica seu projeto de implementar comunicação via memória compartilhada em gRPC para o Dapr, começando em C++ e migrando para Go devido a limitações técnicas
  • [00:02:22] — Mark relata que retomou o projeto no fim de semana usando Claude Opus e que, após múltiplas tentativas frustradas, finalmente obteve uma implementação funcional que passa nos testes
  • [00:04:48] — Scott e Mark discutem o ZoomIt e a necessidade de um editor simples para cortar vídeos de gravação de tela antes de salvá-los
  • [00:05:49] — Mark descreve como usou GitHub Copilot com Sonnet 4 para criar o trimmer de vídeo em aproximadamente 10 interações, gerando código C++ para Win32
  • [00:07:23] — Discussão sobre os desafios de suportar DPIs fracionados (125%, 150%) na interface clássica do Windows, um problema que levou cerca de um dia para resolver com a IA
  • [00:08:14] — Mark explica como implementou o modo escuro (dark mode) na interface Win32 clássica, uma tarefa que normalmente exigiria subclassificação extensiva manual
  • [00:09:57] — Demonstração ao vivo do novo trimmer de vídeo do ZoomIt, mostrando controles de volume, botões de navegação e interface redimensionável
  • [00:17:00] — Mark mostra o prompt simples que usou para adicionar funcionalidades ao ZoomIt, demonstrando como prompts curtos podem ser eficazes
  • [00:21:30] — Durante a gravação, descobrem um bug no modo escuro e usam a IA para diagnosticar e corrigir o problema em tempo real (falta de chamada para refresh no estado do dark mode)
  • [00:23:25] — Scott explica o conceito de Git Work Trees (árvores de trabalho), permitindo trabalhar em múltiplas branches simultaneamente sem stashing
  • [00:25:58] — Mark compartilha exemplos de comportamentos curiosos da IA, como mensagens auto-congratulatórias (“good catch”) e afirmações incorretas de que o código estava funcionando
  • [00:32:36] — Anúncio do lançamento do ZoomIt 10.0, disponível via Sysinternals, Microsoft Store, WinGet e PowerToys

Episode Info

  • Podcast: Scott & Mark Learn To…
  • Author: Microsoft
  • Category: Technology / Education / How To / Business / Careers
  • Published: 2026-01-21
  • Duration: 0h33m

References


Podcast Info


Transcript

[00:00:00] What about my MCP for sys-internals thing?

[00:00:03] Is that a good idea?

[00:00:04] That is a good idea.

[00:00:05] Okay, we should do that.

[00:00:07] It requires more thought though.

[00:00:09] No, that’s, so the new stuff

[00:00:12] that people are talking about with Claude

[00:00:13] is like a formality,

[00:00:16] that could be another thing by the way,

[00:00:17] the formally Vibe coding.

[00:00:18] Are you doing a formal plan mode?

[00:00:21] Like you ever put your copilot into plan mode?

[00:00:24] Yeah.

[00:00:25] Right, and then you do a plan, write a spec, and then.

[00:00:27] So it’s rare.

[00:00:28] But like, by the way,

[00:00:30] for the GRPC shared memory thing

[00:00:33] that I started last spring.

[00:00:35] The one that it was so confident it was done?

[00:00:36] Yeah, well, summer, early summer.

[00:00:40] And I’ve had starts and stops on it.

[00:00:42] I started with GRPC C++,

[00:00:44] and that ended up running into concurrency issues

[00:00:48] that it just couldn’t figure out.

[00:00:49] And I was just like, I don’t have the time to go

[00:00:51] and babysit you through this.

[00:00:53] So then I met with the GRPC Go maintainer,

[00:00:57] and talked about the shared memory,

[00:00:59] and he was excited about shared memory coming in,

[00:01:05] but he’s like, I’m the GRPC Go maintainer,

[00:01:07] not the GRPC Core maintainer,

[00:01:08] which is the C++ version.

[00:01:11] But then I was thinking,

[00:01:12] why don’t I just switch over to GRPC Go?

[00:01:14] And there’s two reasons to switch over to it.

[00:01:16] One of them is the whole point.

[00:01:18] The only reason that I was interested in this

[00:01:21] is because of Dapr.

[00:01:23] And Dapr is written in Go.

[00:01:25] And Go doesn’t support DLLs.

[00:01:28] And also Dapr uses Sidecar communication,

[00:01:32] which is on the same machine.

[00:01:33] And so if shared memory would do two things,

[00:01:36] allow Dapr to have loadable modules that are efficient,

[00:01:40] because you could just do GRPC in-proc,

[00:01:42] and it would also allow,

[00:01:44] provide more efficiency for talking to

[00:01:47] the Dapr components from the app

[00:01:49] across the Sidecar boundary.

[00:01:51] And so I was like, let me just try Go,

[00:01:55] and do GRPC Go, shared memory.

[00:01:58] So I started that in the fall,

[00:01:59] and I ran into about the same,

[00:02:01] got about the same distance,

[00:02:04] and ended up running into the,

[00:02:08] yeah, I couldn’t figure it out,

[00:02:09] the concurrency issues.

[00:02:11] And it’s very complex,

[00:02:12] because you’ve got to do streaming,

[00:02:13] and cancellation, and metadata.

[00:02:16] So I stopped on working on that,

[00:02:19] and switched my attention to other things.

[00:02:22] Well, this weekend I’m like, let me try it again.

[00:02:24] And so I’ve tried again,

[00:02:26] maybe this is a jump in Opus,

[00:02:29] and I-

[00:02:30] So did you go where you’re doing it in Sonnet before?

[00:02:31] Yeah, but not to say that it wasn’t,

[00:02:34] that it didn’t run into problems.

[00:02:36] And this is premature,

[00:02:37] because I’ve not verified it independently,

[00:02:40] but I think it’s done.

[00:02:43] And you have a good enough test harness

[00:02:44] that you feel like the test harness

[00:02:45] can catch the concurrency?

[00:02:46] It’s running GRPC tests themselves.

[00:02:51] Now, modified to use shared memory instead of EP.

[00:02:56] And they all pass.

[00:02:57] And the example programs I can see,

[00:03:00] that use shared memory,

[00:03:01] they’re equivalent to the standard TCP examples,

[00:03:05] like client server, hello, world,

[00:03:07] and some streaming from the client to the server.

[00:03:10] Those work.

[00:03:11] I mean, I can see them,

[00:03:12] they appear to work, let me say.

[00:03:15] Like I need to make sure

[00:03:15] it’s actually using shared memory,

[00:03:17] that there’s no polling,

[00:03:18] which I told it not to use.

[00:03:19] I need to go do verification,

[00:03:22] but all the tests are passing,

[00:03:24] and all the examples work.

[00:03:27] And so this would truly be a mind blowing moment,

[00:03:32] if that’s the case.

[00:03:33] So given the complexity of the problem,

[00:03:37] and given you’ve taken two multiple runs at the thing,

[00:03:43] do you think that it’s worth,

[00:03:46] you and I have talked about

[00:03:47] when we’ve coded something

[00:03:48] and we have felt confident to not even look at the thing?

[00:03:52] Yeah.

[00:03:53] But this feels like time for code review time.

[00:03:55] This is time for code review, for sure.

[00:03:57] Something like this,

[00:03:58] because this is something

[00:04:00] that eventually I wanna do a PR into the gRPC Go project,

[00:04:04] and they’re gonna not tolerate crap, obviously.

[00:04:09] Because if they accept it,

[00:04:10] this is gonna end up going broadly,

[00:04:12] and potentially lots of companies

[00:04:16] are gonna be depending on it for production systems.

[00:04:19] So I need to actually look at it and review it.

[00:04:23] So that’s the next phase that I’m on.

[00:04:25] But for Zoomit,

[00:04:28] I think it’s kind of good enough

[00:04:30] that I can see the code is constrained

[00:04:32] to certain parts of the project.

[00:04:33] It’s not like infecting everything.

[00:04:35] And it works.

[00:04:38] UQ8 it, IQ8 it.

[00:04:39] So let’s explain the problem again

[00:04:48] for those who may have joined.

[00:04:50] What is Zoomit?

[00:04:51] We know it does zooming.

[00:04:52] We know it does screenshots.

[00:04:54] It does screen recording.

[00:04:56] You know, when you find a bug,

[00:04:58] you’re like, oh, man,

[00:04:59] I gotta show a recording of this bug to someone.

[00:05:00] You fire up Clipchamp.

[00:05:02] You fire up Camtasia.

[00:05:03] With Zoomit, you hit Control-5.

[00:05:06] It starts recording immediately.

[00:05:08] And then you hit Control-5 again.

[00:05:10] And it pops up a save dialog.

[00:05:12] And then you go off and give it to somebody.

[00:05:14] But very likely you’re gonna wanna trim that.

[00:05:17] You’re gonna wanna do a little bit of light editing.

[00:05:19] So you wanted a editor trimmer

[00:05:21] to just kind of pull the bumpers off and tidy up.

[00:05:24] That’s right.

[00:05:25] And that way, I mean,

[00:05:26] so many cases it’s like, you know,

[00:05:27] you’re setting up, you press play,

[00:05:29] and then you need to get in position.

[00:05:31] And then at the end,

[00:05:33] you might stop the recording

[00:05:35] after you’re moving things around.

[00:05:37] You don’t wanna have that part in the video.

[00:05:39] So I find it very common

[00:05:41] that the beginning and the end,

[00:05:42] I just wanna clip off.

[00:05:45] And so I thought,

[00:05:45] oh, this is a great vibe coding thing.

[00:05:49] And one of the reasons is

[00:05:50] I thought it would be ideal for vibe coding.

[00:05:51] First of all, I was just curious.

[00:05:54] Do these models know how to program

[00:05:56] Win32 classic Windows desktop UX

[00:06:01] and C++ coding

[00:06:03] and look at a project that’s relatively simple

[00:06:05] but still requires some integration.

[00:06:08] And then the second one was it’s self-contained.

[00:06:12] So it’s a feature that even if it’s poor quality,

[00:06:14] you know, not as good as my quality standards,

[00:06:17] it’s still isolated

[00:06:18] to just that part of the Zoomit experience.

[00:06:21] So I thought a good test case for it.

[00:06:24] And so I gave it to GitHub Copilot

[00:06:28] with at the time, Sonnet 4,

[00:06:32] and it produced a working

[00:06:36] with probably 10 interactions, 10 prompts.

[00:06:40] It produced a working clipper that looked decent.

[00:06:44] Now, since then, that was before the holidays,

[00:06:47] since then I’ve iterated

[00:06:49] because I’ve got high standards

[00:06:52] for how the thing should behave.

[00:06:54] And then you came and threw at me some more things

[00:06:56] and I had Mario from Sysinternals look at it

[00:06:59] and he’s like,

[00:07:00] you should add this and this.

[00:07:02] And so, you know, in the old days

[00:07:05] when somebody would say,

[00:07:06] hey, you should add a volume control to this playback.

[00:07:10] I’d think, oh crap, yeah, you’re probably right.

[00:07:13] And that’s probably another few hours of work

[00:07:16] to go lay out the volume control

[00:07:18] and figure out how to do the volume.

[00:07:20] And so last night, Mario was like,

[00:07:23] hey, you should add a volume control.

[00:07:24] I’m like, oh crap, wait, oh, wait a minute.

[00:07:26] I can just ask the AI to do it.

[00:07:29] I prompted the AI this morning

[00:07:31] and now there’s a working volume control,

[00:07:32] like with one prompt, right?

[00:07:35] And I haven’t seen this

[00:07:36] because you sent me the last one,

[00:07:37] yes, like late last night, like version six.

[00:07:41] Like we’ve done like a couple of turns on this

[00:07:42] because I’ve been giving you a hard time

[00:07:43] about some little tiny nits.

[00:07:45] Yeah, well, you use,

[00:07:47] so I run with 100% DPI on this monitor

[00:07:51] and you run at some 150?

[00:07:54] 125, so those are called fractional DPI’s

[00:07:57] and Windows and a lot of apps see weird behavior

[00:08:02] at these kind of like non even number, you know, DPI’s.

[00:08:06] 100, 150 are great,

[00:08:08] but 175 and 125 is a great way to mess up somebody’s UI.

[00:08:11] Yeah, and also you’re like, hey, where’s dark mode?

[00:08:14] Because I’m like, this is just an options dialogue

[00:08:16] and one dialogue, like big deal.

[00:08:18] And then-

[00:08:19] Well, but this is the other thing though.

[00:08:21] You know how we talk about

[00:08:22] how vibe coding might make crappy code?

[00:08:25] I’m actually finding that I’m catching

[00:08:26] and fixing more and coming up with a more polished thing

[00:08:30] because I can turn faster.

[00:08:31] So like my stupid edge light application

[00:08:34] could have just been shipped in 10 minutes,

[00:08:36] but the amount of time I would take to do it

[00:08:39] is now the same as if I had written it by myself,

[00:08:42] but it has more features and more polished

[00:08:43] because I can turn faster.

[00:08:45] Oh yeah, for sure.

[00:08:45] Well, and I’ll tell you, you said add dark mode.

[00:08:48] I told AI, go add dark mode

[00:08:52] and probably, you know,

[00:08:53] it didn’t get it 100% right the first time,

[00:08:55] but it got it 90% right.

[00:08:57] And after a few more turns, I got dark mode.

[00:09:00] So a few more turns in terms of total elapsed time,

[00:09:02] it was less than a half an hour

[00:09:03] and I was doing other things while it was working.

[00:09:06] Right, right.

[00:09:07] So I mean, that alone would have,

[00:09:08] I would have been like, oh crap.

[00:09:10] You know, dark mode-ing this classic Win32 UX

[00:09:13] requires subclassing all over the place.

[00:09:16] Like all over the place.

[00:09:17] Well, that’s the definition of toil.

[00:09:19] Yeah.

[00:09:20] Right, and the other thing that’s worth noting

[00:09:21] is that with this DPI thing,

[00:09:24] so I’m at a weird fractional DPI,

[00:09:25] but I also didn’t realize that I was,

[00:09:28] I didn’t kind of internalize

[00:09:29] that I was opening up the display DPI changer

[00:09:33] and your dialogue at the same time,

[00:09:35] which is a different edge case.

[00:09:37] It’s one thing to have the DPI ready

[00:09:39] when the dialogue pops up on WM Create,

[00:09:42] but I was sending out a WM DPI changed

[00:09:46] while it was open and it was messing up the dialogue.

[00:09:48] Even that conversation is like,

[00:09:51] a lot of people don’t know that stuff

[00:09:52] because it’s like obscure and old.

[00:09:54] That’s an edge case.

[00:09:55] And then the question is, as an architect,

[00:09:57] well, it’s like, well,

[00:09:58] this is a thing that’s not even worth fixing.

[00:10:01] It’s not.

[00:10:01] I’ll just stick with the DPI that I get

[00:10:03] at the moment that it popped up

[00:10:05] and not listen to that message.

[00:10:07] That’s the kind of steering that you can give

[00:10:09] because you could fix the bug

[00:10:11] or you could just say works as designed

[00:10:14] and you have to know the underlying stuff

[00:10:17] to be able to make those decisions.

[00:10:18] Well, so on the DPI one,

[00:10:20] because you said, hey, it needs to work at DPI.

[00:10:23] That one actually took me about a day

[00:10:25] of back and forth with it

[00:10:27] to get it to support DPI changes fully

[00:10:30] because what it would do is,

[00:10:31] it needs to work on all the controls

[00:10:34] in a consistent way to resize,

[00:10:36] to fit the dialogue and the text.

[00:10:37] And you’re like, oh, this text is cut off.

[00:10:39] Well, you saw that after I was on iteration 20 with it

[00:10:43] of no, it still doesn’t work.

[00:10:44] No, still doesn’t work.

[00:10:46] And by the way, being able to give the AI screenshots

[00:10:48] where it can see that it’s not working

[00:10:50] is incredibly helpful because I didn’t have to describe.

[00:10:52] I could say, look, text is cut off

[00:10:53] and give it a screenshot.

[00:10:55] And it would be like, oh,

[00:10:55] I see that the right side text is cut off.

[00:10:58] I need to go resize it.

[00:10:59] But here’s one of the things that I ran into too

[00:11:03] is it would sit and go, it’s fixed now.

[00:11:06] It’s fixed now.

[00:11:06] It’s fixed now.

[00:11:07] And I’d be like, no, it’s not.

[00:11:08] No, it’s not.

[00:11:09] And give it screenshots.

[00:11:10] And then I’m like, add debug output

[00:11:12] so you can see what’s going on.

[00:11:14] And then it added debug output.

[00:11:16] It’s like, oh, I see what’s going on.

[00:11:17] Even then it required multiple turns

[00:11:19] and then adding more debug output

[00:11:21] for it to figure out how to fix it.

[00:11:23] But without the debug output,

[00:11:24] I think I would have been stuck in the, it’s fixed.

[00:11:26] No, it’s not.

[00:11:27] It’s fixed.

[00:11:28] No, it’s not.

[00:11:28] It’s not indefinitely.

[00:11:30] So that just, that’s a nudge to,

[00:11:33] and I had to do this, by the way, with Wordlebot.

[00:11:35] I don’t know if you remember that.

[00:11:37] When it was running into a performance issue

[00:11:39] where it was loading all of the games

[00:11:42] from the very start, every time I’m like,

[00:11:44] go add debug output so you can see what’s going on.

[00:11:46] And then it added the debug output

[00:11:47] because, oh, I’m loading all the games from the very start.

[00:11:50] I only need to load the new games.

[00:11:52] Okay.

[00:11:52] So you said having it be able to see the screenshot.

[00:11:56] That’s cool.

[00:11:58] That’s valid.

[00:11:58] That’s multimodal.

[00:11:59] Some models and some tools are like, they’ll OCR it.

[00:12:02] But in this case, it’s actually looking at pixels

[00:12:04] and it’s like really being a true multimodal model.

[00:12:06] But then you use the Wordlebot example where it’s like,

[00:12:09] well, it wants to see the console output.

[00:12:11] Letting it see, letting it see tightens the feedback.

[00:12:16] And the seeing isn’t necessarily pixels.

[00:12:18] It’s just, if you’re using an agent

[00:12:20] and you catch yourself copy pasting from somewhere,

[00:12:24] you got to stop and think to yourself,

[00:12:26] how can I let the agent see this

[00:12:28] so that the turns can be automated?

[00:12:29] And that’s where things get interesting.

[00:12:31] It could be setting up an MCP server

[00:12:33] for debug output to Windows.

[00:12:35] It could be doing regular screenshots.

[00:12:37] It could be hooking up cloud code

[00:12:39] or GitHub CLI to an MCP server like Playwright.

[00:12:43] I was finding myself regularly copy pasting debug output

[00:12:49] from like got here debugging, you know?

[00:12:51] Got here, got here, got here with the WPF app.

[00:12:54] And I was thinking, you know, Mark should make it

[00:12:56] so I could take debug view from this internal.

[00:12:58] I absolutely, that is absolutely going on.

[00:13:02] Right.

[00:13:03] So that seeing doesn’t necessarily have to be pixels.

[00:13:08] It can just be debug output.

[00:13:10] And having an MCP server for a debugger

[00:13:13] means that it can slam on that thing

[00:13:15] while you’re off doing other stuff.

[00:13:16] And that was a revelation, of course, as well

[00:13:19] that I came up with, you know, in my brain,

[00:13:20] like it not came up with.

[00:13:22] It clicked for me.

[00:13:23] Cause I was like, I think I’ve copy pasted

[00:13:25] like three times too many.

[00:13:27] Yeah.

[00:13:28] And I mean, I run into this too.

[00:13:29] There’s cases like in the Wordle bot one,

[00:13:31] I couldn’t get it to automate with Playwright

[00:13:33] because of the authentication issue with me.

[00:13:35] Yeah.

[00:13:36] Plus it’s an extension rather than a webpage.

[00:13:37] Yeah.

[00:13:38] So I’m the one, I’m, you know,

[00:13:41] the tool for the AI, you know,

[00:13:45] it’s like, I’ve made the changes.

[00:13:46] They should work now.

[00:13:47] Reload it.

[00:13:48] I’m like, okay, reload.

[00:13:49] Nope.

[00:13:50] You know, so the more you can have AI,

[00:13:53] just do it itself.

[00:13:54] The faster things are going to go for sure.

[00:13:57] And unfortunately there’s still cases

[00:13:58] where I’ve got to do it myself.

[00:14:00] Or trust, but verify.

[00:14:02] I still, I mean, the, I’m working on another thing

[00:14:06] at the same time, which is a Web UX for Ref Checker,

[00:14:09] the Academic Paper Reference Checker.

[00:14:12] Like it’ll be more accessible if it’s a Web UI.

[00:14:14] You can just drop in the URL

[00:14:16] and it’ll check the references.

[00:14:18] Well, even that it’s, I’m telling it,

[00:14:20] I’d say use Playwright and test this end to end.

[00:14:23] And so it tests this like everything’s working great.

[00:14:25] And then I go look at it and then no, it’s not.

[00:14:28] I’m not sure how it decided that things look great

[00:14:30] when it’s so obviously screwed up.

[00:14:32] So this is just kind of the state we’re in.

[00:14:35] It still needs a lot of babysitting and handholding,

[00:14:38] but it’s, you know, as we discussed,

[00:14:40] it’s surely 10X for me, Accelerant, all that stuff.

[00:14:44] And now, just in the last six months,

[00:14:46] we’re seeing skills and NCP servers.

[00:14:49] Are you using NCP servers for like documentation

[00:14:52] or context seven to like say-

[00:14:54] I haven’t really.

[00:14:56] Oh, so if you’re doing a UI,

[00:14:58] are you doing it in like React or TypeScript?

[00:15:00] Okay, so there are best practices skills

[00:15:03] that are like basically everyone’s got together and said,

[00:15:06] here are the things you need to pass to React.

[00:15:08] Or we have identified that models tend to use, you know,

[00:15:12] these instead of those or like events versus focuses

[00:15:15] or whatever as like the do’s and the do nots

[00:15:19] are packaged up for best practices.

[00:15:21] And you can rather than you should try to preamble it.

[00:15:24] I guess this is, so yeah, let me good tip on that one.

[00:15:28] And I guess we’re still in the phase

[00:15:30] of the tools are being built.

[00:15:32] So you’ve got to keep on top of what’s going on

[00:15:34] because in a few months,

[00:15:36] I’m sure that when you go into the GitHub copilot chat

[00:15:40] and say, build me a React UX,

[00:15:41] it’ll enable the React skill automatically.

[00:15:45] That’s the thing, right?

[00:15:46] The happy path is being very much paved right now.

[00:15:51] Yeah.

[00:15:52] Yeah.

[00:15:53] Do you want to see how, I mean,

[00:15:54] I’m kind of blown away by how, by the way,

[00:15:57] so this is the chat from this morning.

[00:16:01] So go ahead and share again.

[00:16:02] Hold on.

[00:16:04] It’s gone.

[00:16:06] What the hell?

[00:16:08] Is this going to be the opening?

[00:16:10] That’s the opening right there.

[00:16:12] It’s gone, what the hell?

[00:16:14] All right, let me share the screen.

[00:16:17] Control shift F5, which allows you to clip

[00:16:20] a certain part of the screen.

[00:16:22] Then I’m going to move control two

[00:16:23] to move into drawing mode and start one type R for red,

[00:16:29] two type Y for yellow, three.

[00:16:33] And then I’m done.

[00:16:34] And then now I can save to the desktop,

[00:16:38] escape and there’s my video.

[00:16:41] And now here it goes.

[00:16:47] And you see that there was a preamble there

[00:16:49] that I might want to trim.

[00:16:53] All right, so that’s the basic trim

[00:16:56] that has always existed.

[00:16:57] Now let’s say that I want to do that,

[00:17:00] but I want to trim part of the video.

[00:17:03] Let’s go look at the trim dialogue that we’ve got.

[00:17:06] So control shift F5.

[00:17:08] So you can only get into the trim at the moment of save.

[00:17:10] It’s basically a pre thing before save.

[00:17:12] I didn’t want to make a video editor.

[00:17:15] I just wanted to make it a quick and dirty.

[00:17:17] Yeah, I think making zoom it into a video editor

[00:17:21] is kind of like turning it into the everything app.

[00:17:24] So here’s trim.

[00:17:25] Okay.

[00:17:27] Wow.

[00:17:29] So a few things.

[00:17:31] So Mario said, hey, it should be resizable

[00:17:33] because there were a lot.

[00:17:34] And there it is.

[00:17:35] I thought that too, but I was afraid of you.

[00:17:37] Yeah.

[00:17:38] So there it is resizable.

[00:17:39] Do you see that flash?

[00:17:40] Yeah.

[00:17:41] Well, okay.

[00:17:42] You know what?

[00:17:43] Sorry.

[00:17:48] Wait, wait.

[00:17:49] I’ll just ask Gai to get rid of it.

[00:17:51] We can do that while we’re doing the show.

[00:17:53] Okay.

[00:17:54] Just wanted to make it a quick.

[00:17:55] Can you hear it?

[00:17:56] So I don’t know if you can hear that.

[00:17:58] I can’t hear it because it’s not being re-piped around

[00:17:59] as a loop pack, but yeah, I see that.

[00:18:01] So here, let’s just say I want to start.

[00:18:04] I want to clip it to right here

[00:18:06] where I start drawing the one.

[00:18:12] And then.

[00:18:13] And now, okay, so this is worth pointing out.

[00:18:15] That control, how is that implemented?

[00:18:18] Because this is a big C application,

[00:18:19] big C plus plus application.

[00:18:21] That’s not a control, right?

[00:18:22] Is it owner draw?

[00:18:24] This is old style, classic Win32 programming.

[00:18:27] Old style.

[00:18:30] So it’s doing mouse down messages.

[00:18:31] It’s capturing that, the buttons are owner draw.

[00:18:34] This button is brand new.

[00:18:35] I told it to just add it right now,

[00:18:37] which is the go to beginning.

[00:18:39] It also added a go to end,

[00:18:40] even though I told it only,

[00:18:41] I only told it add a go to beginning,

[00:18:43] but it added both.

[00:18:44] Well, it’s very enthusiastic.

[00:18:46] And I can show you the prompt for that.

[00:18:47] And then here’s the volume control, which is brand new.

[00:18:51] So that’s the embedded volume control.

[00:18:52] You’re changing the level of the resulting.

[00:18:54] Yeah.

[00:18:55] Of the video playback.

[00:18:57] Wow.

[00:18:58] No, it’s just for the playback.

[00:18:59] Oh, just for the playback.

[00:19:00] Yeah.

[00:19:01] Okay.

[00:19:01] So, and this is one, this, these two buttons

[00:19:06] and this volume control is one prompt.

[00:19:09] Wow.

[00:19:10] That I can show you in here in a second.

[00:19:11] So now that you got the trim, you just say, okay.

[00:19:16] And if you open it up again,

[00:19:18] you can go back and read it.

[00:19:19] Oh, maintain state.

[00:19:20] Nice.

[00:19:20] Maintain state.

[00:19:22] And then.

[00:19:22] Yep.

[00:19:23] Yeah, and you had no interest in doing dark mode.

[00:19:25] I was just giving you a hard time.

[00:19:27] And here’s dark mode on the dialogue too.

[00:19:32] This was all.

[00:19:32] People are going to celebrate that.

[00:19:33] That made it version 10, by the way.

[00:19:34] Yeah.

[00:19:35] Wasn’t the trim, it was the dark mode.

[00:19:37] Exactly.

[00:19:38] Bumped it up to 10.

[00:19:39] So, I mean, this would have taken forever.

[00:19:45] How does it feel like Zoomit is really

[00:19:48] the last maybe 18 months, really turbocharged

[00:19:52] what it can do.

[00:19:53] So show us the prompt.

[00:19:55] So here’s the prompt for, that I gave it this morning.

[00:19:59] Add a seek to dark button on the left of the jump.

[00:20:03] By the way, can you, if I zoom.

[00:20:04] Yeah, I can see that.

[00:20:05] I’m just kind of interested.

[00:20:06] I kind of thought, given what I know of you,

[00:20:08] that it would be just like long

[00:20:10] and incredibly detailed spec.

[00:20:11] That’s a pretty smart.

[00:20:12] No, I’m lazy.

[00:20:14] I’m lazy.

[00:20:15] And I’m like, I think it can probably figure out

[00:20:16] what I’m asking for just based on this.

[00:20:19] Yeah.

[00:20:20] So this is Opus four five.

[00:20:22] And it’s like, let me look at this

[00:20:24] for the dialogue layout.

[00:20:26] Seek to start button.

[00:20:28] Yeah.

[00:20:29] There’s the owner draw controls.

[00:20:31] And you can see all the classic Win32.

[00:20:33] And you had already done dark mode.

[00:20:35] So these controls are, it knows that dark mode is there.

[00:20:39] Actually, that’s a good idea.

[00:20:39] Let’s go check.

[00:20:40] Cause I was like, I’m not going to add a,

[00:20:43] select dark mode or bright mode.

[00:20:46] There we go.

[00:20:47] So what are we doing in here?

[00:20:49] So there’s a theme.

[00:20:50] I had to add a registry key

[00:20:51] that I could override dark mode.

[00:20:54] Oh, okay.

[00:20:55] For testing.

[00:20:56] For testing, yeah.

[00:20:57] So zero.

[00:20:59] Okay.

[00:20:59] And now when we open this again,

[00:21:02] and we run it again.

[00:21:03] Oh, okay.

[00:21:04] On startup.

[00:21:05] Yeah.

[00:21:06] Oops.

[00:21:07] Wait, what happened?

[00:21:08] Hmm.

[00:21:10] Please stand by.

[00:21:11] I think we might’ve introduced a bug

[00:21:14] where it’s not honoring the registry key anymore.

[00:21:17] Well, there’s two ways to do it.

[00:21:19] We could use the rest of the show to fix it

[00:21:20] and see how it works.

[00:21:21] Unless there’s some error

[00:21:23] between the chair and the keyboard.

[00:21:25] You’re sure.

[00:21:26] Okay.

[00:21:27] I’m trying to think about this.

[00:21:28] Why would it not honor that though?

[00:21:31] Why would it regress?

[00:21:33] All right.

[00:21:33] So I just said, it looks like the registry value

[00:21:35] overriding system dark mode is broken.

[00:21:36] Investigate and fix.

[00:21:37] Let’s see what it says.

[00:21:39] Mm-hmm.

[00:21:40] Hit control plus a couple of times.

[00:21:42] Give us a little font.

[00:21:43] All right.

[00:21:44] Yolo mode.

[00:21:45] I mean, there’s no way to operate other than Yolo.

[00:21:48] Yeah.

[00:21:50] You’re like, yes, yes, yes, yes, yes.

[00:21:53] But it makes me feel productive.

[00:21:55] Well, I guess you need that.

[00:22:00] Now I understand the issue.

[00:22:01] But you know what?

[00:22:03] Do you really?

[00:22:03] Do you really?

[00:22:05] It has no idea.

[00:22:05] It says that a lot of times.

[00:22:07] You’re absolutely right.

[00:22:08] Yeah.

[00:22:09] By the way, I was looking at output.

[00:22:12] So you can put,

[00:22:13] you can use auto mode for like co-pilot agents

[00:22:17] or co-pilot chat.

[00:22:19] And a dead tell for if it’s using an anthropic model is

[00:22:25] it’s now production ready.

[00:22:27] Yeah.

[00:22:28] With the little rocket ship.

[00:22:29] Yeah.

[00:22:30] Okay.

[00:22:31] Let’s see if it’s true here.

[00:22:32] Cause this is where, you know,

[00:22:33] I feel like you’re working with an intern.

[00:22:35] Now I see the issue more clearly.

[00:22:36] It’s always confirming.

[00:22:37] It’s like patting itself on the back.

[00:22:39] It’s trying to trace more carefully.

[00:22:41] Wait.

[00:22:42] There’s no call to refresh.

[00:22:43] By the way, I often see this where it’s like,

[00:22:45] oh, I got to understand the issue.

[00:22:46] And I was like, no, wait, no, I don’t actually.

[00:22:48] Hey, look.

[00:22:49] Now I do.

[00:22:50] Now let me understand the actual issue.

[00:22:51] Yeah.

[00:22:52] Yeah.

[00:22:53] Well, this is thinking models, right?

[00:22:56] This looks correct.

[00:22:58] The issue is that the function

[00:23:00] is being called for.

[00:23:01] Now I understand the issue.

[00:23:02] Registry keys are loaded.

[00:23:03] But you know what?

[00:23:04] It had fixed this bug a few days ago.

[00:23:07] So I don’t know how this crept back in.

[00:23:09] Well, so sometimes,

[00:23:11] right now you told it to fix the bug,

[00:23:12] which gets into whack-a-mole, you know, chasing stuff.

[00:23:17] Sometimes I’ll tell it to go and do a get bisect

[00:23:19] and go and look at what it was before.

[00:23:22] I did, too.

[00:23:23] I did, yeah.

[00:23:25] Have you started using work trees?

[00:23:27] No, I haven’t.

[00:23:30] I see that a lot of people

[00:23:31] are talking about it all of a sudden.

[00:23:32] Yeah, yeah, yeah.

[00:23:34] We should do a whole thing on work trees.

[00:23:36] What is it?

[00:23:37] So you know how switching,

[00:23:39] when you switch branches,

[00:23:40] you have to usually stash, switch the branch,

[00:23:43] and then decide what to do with your stash.

[00:23:46] A work tree is another folder on a totally different branch,

[00:23:49] but it knows,

[00:23:50] Git knows that it’s connected back to the main.

[00:23:53] So you can have work trees spread all over your disk,

[00:23:56] like junction points.

[00:23:58] They’re not actual junction points.

[00:24:00] But in the database, the Git database,

[00:24:02] it knows that you’re in those work trees.

[00:24:04] So if you want to get three, four agents

[00:24:07] working on three or four different problems

[00:24:08] at the same time,

[00:24:09] for example, you could have three different things

[00:24:12] that are unrelated in totally different parts

[00:24:14] of the Zoomit source,

[00:24:16] open up three different versions of Zoomit

[00:24:18] in three different folders

[00:24:19] and have three different agents running on it,

[00:24:21] and then merge at the end.

[00:24:23] So you’re on different branches

[00:24:24] in totally different separate physical locations.

[00:24:28] That is cool.

[00:24:30] That is the unlock, that is the unlock.

[00:24:32] Not just for not having to deal with that stash crap,

[00:24:36] because I always forget what I’ve stashed.

[00:24:38] Yep, totally.

[00:24:39] Yeah, and there’s a little command line app

[00:24:42] called Work Trunk

[00:24:44] that takes the five or six commands you need to run

[00:24:47] and then makes it as easy as switching branches.

[00:24:51] There’s just like WT and then the name of the bug.

[00:24:54] So I’ll go and take two or three PRs,

[00:24:58] have them running all simultaneously.

[00:24:59] Ah, look.

[00:25:01] So it’s figured it out like 10 times now,

[00:25:05] but I think this might be it.

[00:25:07] Apply dark mode, only apply-

[00:25:09] That’s what I’m trying to do is-

[00:25:11] Oh yeah, that makes sense.

[00:25:13] But I wonder how, the problem is though,

[00:25:15] it’s like, you can get it to fix it,

[00:25:17] but you still don’t understand why it regressed.

[00:25:19] Well, actually now it’s decided

[00:25:21] that that’s not the problem.

[00:25:22] I feel like it might be in a loop.

[00:25:25] Well, let’s let it go.

[00:25:26] Anyway, I’ve been collecting examples here,

[00:25:30] and some of them I’ve shared in presentations

[00:25:33] that people have seen

[00:25:35] of AI doing ridiculous things.

[00:25:41] And I’ve got a bunch of projects here,

[00:25:42] like here’s the Wordle bot,

[00:25:45] where it does everything works

[00:25:46] and the project doesn’t build.

[00:25:48] This is after I used a spec kit, by the way.

[00:25:51] And it’s like going through and saying,

[00:25:53] I’ve done with all the tasks

[00:25:55] and some of the tasks aren’t even done.

[00:25:56] Okay, so this is worth noting here though,

[00:25:58] like you’re keeping notes.

[00:26:02] I know you’ve always had a very extensive note.

[00:26:07] Do you just see a moment

[00:26:09] and that like, this is significant,

[00:26:10] I’m gonna save this moment

[00:26:11] so that I can track it later.

[00:26:14] Yep.

[00:26:15] Like here, oh, speaking of the DPI problems,

[00:26:17] here’s an example of it’s fixed.

[00:26:19] Look, if you can.

[00:26:21] So I made it wait and I’m like, nope.

[00:26:26] By the way, the gentleman, Kutta that we talked about,

[00:26:31] he is working on a OneNote tool

[00:26:35] to be able to extract Markdown from your OneNotes.

[00:26:39] You have such an extensive OneNote thing,

[00:26:41] he wanted to be able to grab all of OneNote

[00:26:43] and then go and expand it

[00:26:45] and turn it into Markdown files.

[00:26:47] Yeah.

[00:26:48] So he’s working on that

[00:26:50] and he’s gonna have a tool to be able to do that.

[00:26:52] Oh, root cause.

[00:26:54] Root cause, in WNU’s reload session,

[00:26:56] the message handler was missing a call

[00:26:58] to refresh dark mode state.

[00:27:00] Okay, that seems plausible.

[00:27:02] Because I think that’s saying for dynamic changing.

[00:27:08] Well, the obvious thing is that

[00:27:10] there’s a zoom it lying around somewhere

[00:27:13] but it doesn’t make any sense

[00:27:14] because you’re in debug mode

[00:27:15] and it should have closed it.

[00:27:17] Okay.

[00:27:18] There it is.

[00:27:19] That was it.

[00:27:20] Okay, do me a favor.

[00:27:21] Well, this is the thing that you didn’t check

[00:27:22] in the commit, so I wanted to do a diff.

[00:27:24] Can we see what it actually changed?

[00:27:27] Yeah.

[00:27:28] I feel like 158 lines is excessive.

[00:27:32] Yeah.

[00:27:34] Yeah, see that choose font hook proc

[00:27:36] is probably not related, yeah.

[00:27:38] I don’t know what it’s doing there.

[00:27:40] That’s a pretty big change.

[00:27:41] The init dialogue makes sense though.

[00:27:43] The WNIT dialogue would have existed before.

[00:27:47] So this is the hook, the choose.

[00:27:49] Oh, this is, oh no, this is older changes

[00:27:53] cause I had it theme the font dialogue.

[00:27:56] Right, this is the session going live.

[00:28:01] Yeah, this is stuff that I’d done before.

[00:28:06] So when do you decide to commit?

[00:28:07] I commit often and then squash later.

[00:28:10] I thought I’d committed this already.

[00:28:12] That’s why we can’t tell the difference between.

[00:28:13] Well, actually, no, I did commit it.

[00:28:15] It’s the keep isn’t synced with commit is the problem.

[00:28:18] Yeah, that’s true.

[00:28:19] I find that a little frustrating.

[00:28:20] Yeah, I mean, I really wish if you said commit

[00:28:22] it would keep.

[00:28:24] It’s kind of like two source controls.

[00:28:27] So that’s what’s going on here.

[00:28:29] So that’s just.

[00:28:30] That’s old.

[00:28:31] Old, old, old.

[00:28:33] So that, actually, if I could do a get diff,

[00:28:36] why don’t I do that?

[00:28:38] Oh, that was.

[00:28:40] Oh, you don’t think,

[00:28:41] I don’t think you have this folder open.

[00:28:42] Yeah, actually, I could look at it in here.

[00:28:45] The get menu at the top or there.

[00:28:48] So it’s in, so it’s not,

[00:28:51] I don’t know how to look at the sub module here

[00:28:54] cause that’s where the change is.

[00:28:55] Cause you’re editing in PowerTorch now.

[00:28:56] In VS code, it’ll show you the sub modules.

[00:28:59] If you go to get at the top between view and project,

[00:29:04] open and command prompt.

[00:29:05] I know what I mean.

[00:29:06] Yeah, here.

[00:29:08] Sorry.

[00:29:10] Yeah, you’re in module world now.

[00:29:12] Yeah.

[00:29:13] Oh, here we go.

[00:29:13] This is the volume changes.

[00:29:14] Right.

[00:29:17] That’s volume.

[00:29:17] Here’s the volume icon.

[00:29:18] Volume, volume level.

[00:29:22] There.

[00:29:23] There, yeah.

[00:29:25] Read registry settings.

[00:29:27] And then refresh.

[00:29:29] In the main window proc, okay.

[00:29:32] Wonder how it was before.

[00:29:33] How did it ever work?

[00:29:34] I don’t know.

[00:29:36] Good question.

[00:29:37] But that’s it.

[00:29:38] It’s just one line.

[00:29:39] But it took a while for it to figure that out.

[00:29:41] Yeah, that was weird.

[00:29:42] But let’s look at dark mode for the clipper

[00:29:45] to make sure.

[00:29:46] Well, first our light mode.

[00:29:49] So this looks all good.

[00:29:49] Oh, you want to see a DPI change?

[00:29:52] Sure, let’s do it.

[00:29:54] Okay, we’ll go to 150 just to see how capable it is.

[00:29:58] And here’s the options dialog.

[00:30:00] Too big to even fit on this resolution.

[00:30:04] Yeah, if you go to 200, it’s too much.

[00:30:07] 150 or 175 is fractional.

[00:30:09] There.

[00:30:11] This is 125.

[00:30:13] And it looks great.

[00:30:14] Yeah.

[00:30:15] Something cut off.

[00:30:16] It looks amazing.

[00:30:17] Something cut off.

[00:30:18] This is happens.

[00:30:19] Yeah.

[00:30:19] Close it and open it.

[00:30:20] This is the thing that I was saying

[00:30:22] is that you chose to not do this.

[00:30:24] Yeah, I did.

[00:30:25] It’s going to be very rare that someone has it open.

[00:30:27] No, this is a new issue.

[00:30:29] No?

[00:30:30] It’s this particular panel.

[00:30:31] Oh, it’s that one page.

[00:30:34] It’s because of these headers.

[00:30:34] Well, why would that one page be weird?

[00:30:35] These are headers that I have that are bolded.

[00:30:40] Good bug.

[00:30:41] So show the other ones.

[00:30:42] They’re fine.

[00:30:43] You know, that’s cut off too.

[00:30:45] All right, so I got more.

[00:30:46] Scandalous.

[00:30:47] DPI’s, man.

[00:30:48] It’s painful.

[00:30:49] Let’s take a look at that one.

[00:30:50] The exceptional DPI’s.

[00:30:51] 125 is the bug finder.

[00:30:54] Yeah, those are cut off at the bottom.

[00:30:56] Yeah.

[00:30:57] And then these are not.

[00:30:58] And your buttons are dark.

[00:30:59] Yeah.

[00:31:02] All right.

[00:31:02] So we found some bugs.

[00:31:04] Good.

[00:31:05] So that’s made this recording worth it.

[00:31:08] But that’s how I’m glad that the time spent

[00:31:11] with me was not wasted.

[00:31:15] Yeah, but I’ve got,

[00:31:17] I like some of the cases where it’s

[00:31:19] just some funny ones.

[00:31:20] And you came up with some funny ones.

[00:31:22] How about this one?

[00:31:24] It tells itself good catch,

[00:31:26] which I thought was kind of humorous.

[00:31:28] Patting itself.

[00:31:29] Yeah, the self-congratulatory sick of fancy

[00:31:32] is stressful.

[00:31:33] Yeah, this is blaming a test.

[00:31:35] Yeah, I love it when it gives itself,

[00:31:37] not just a pat on the back,

[00:31:39] but an entire table of pats on the back.

[00:31:42] Well, this is saying stuff has passed,

[00:31:43] but then it’s like.

[00:31:44] This conclusively proves.

[00:31:46] The issue is not mine.

[00:31:47] Basically, that’s what it’s saying here.

[00:31:49] Even though it is.

[00:31:50] Yeah.

[00:31:51] Yeah.

[00:31:52] Not my fault.

[00:31:53] And here’s a checkbox that explains why.

[00:31:55] And I’ve got.

[00:31:56] You gotta, the human judgment,

[00:31:58] it cannot be overstated how important this is.

[00:32:01] Yeah, I mean, but you can see

[00:32:02] I’ve just examples all over the place.

[00:32:04] It’s still an unlock though.

[00:32:06] It really is.

[00:32:08] I’m having fun, but we can’t overstate.

[00:32:11] Apparently.

[00:32:13] The issue wasn’t a hang.

[00:32:14] It was working too well.

[00:32:19] This is the interviews.

[00:32:21] You know when you go and you have a job interview

[00:32:23] and they say, what’s your weakness, Mark Krasinovich?

[00:32:26] I care too much.

[00:32:28] I create too many processes.

[00:32:29] Yes, I’m too good.

[00:32:31] Yeah.

[00:32:32] Too empathetic.

[00:32:33] All right, well, that Zoom It stuff was amazing.

[00:32:36] People are gonna be able to get that soon.

[00:32:37] Are you gonna release that right away?

[00:32:39] Probably before this show is out.

[00:32:41] Cool, so hopefully Zoom It 10.0 is out.

[00:32:43] You can check that out.

[00:32:44] Does sysinternals.com still redirect

[00:32:46] where people wanna go?

[00:32:47] Yep.

[00:32:48] Do WinGet install sysinternals

[00:32:49] or WinGet update sysinternals?

[00:32:51] Or go to the Microsoft Store and get it.

[00:32:53] Oh, I apologize.

[00:32:54] You don’t do WinGet sysinternals anymore

[00:32:55] because it’s in Power Toys.

[00:32:57] Which means if you get Power Toys in the stores,

[00:32:59] you get to do it for free.

[00:33:00] Or you can get the standalone version

[00:33:01] in sysinternals through the Microsoft App Store

[00:33:03] or WinGet.

[00:33:05] So many places.

[00:33:06] Or you can get it through WebDAV

[00:33:07] and just launch it right off the website.

[00:33:09] Yeah, there’s like three people who do that.

[00:33:11] They’re my people.

[00:33:13] More than three.

[00:33:14] They’re my people.

[00:33:14] Yeah, the WebDAV people.

[00:33:16] All right.

[00:33:17] So if you’ve made it this far in this episode

[00:33:19] of Mark and Scott,

[00:33:20] like and subscribe,

[00:33:21] smash that bell,

[00:33:23] tell Mr. Beast about the show

[00:33:25] and make sure to leave a comment

[00:33:26] because the comments keep Mark going.

[00:33:28] Without the comment, there is no show.

[00:33:30] Fair?

[00:33:31] Fair.

[00:33:32] All right.