mergeconflict378 === [00:00:00] James: Welcome back everyone to Merge Conflict, your weekly developer podcast, where we like to debug things we shouldn't be debugging. I'm your friendly host, James Montemagno. And with me, my friendly cohost, Mr. Frank Krueger. How's it going? Mr. Frank Krueger. [00:00:14] Frank: Oh, it's going very well, and thanks for saying I'm friendly. I try to be, but I often times I'm not, so thank you, I appreciate it. Yeah, um, you know when I debug things that I shouldn't be? It's when I'm procrastinating. And I was doing some procrastination this morning, and ended up debugging code that wasn't mine, because anything's better than debugging your own code, that's why. [00:00:39] James: So, this, um, thread that you sent me... Kind of reminds me of a thread that we talked about before on the podcast, uh, which was that I have a little app called MyStreamTimer. I don't know if you remember, do you remember this? [00:00:52] Frank: Uh, I've heard of it and I use it literally every week. [00:00:56] James: And it's not Sherlocked yet. Now this little application, uh, has been out for a long time and someone wrote in and said, Hey, just want to let you know that whenever I run a timer and it's counting down the CPU seems to be. Inching up and does not seem to go down even though, you know, until I stop or what I like, it just continues. Yes. That's [00:01:17] Frank: a great bug. Track that down. Everyone go, go back in the merge conflict archives, find something with a search engine and find that episode. It was kind of fun. That was [00:01:26] James: great. We talked deep. We debugged it live. Like we found the issue, we solved it. It was happy and then people were right. But it was one of those things where I was like. Uh, like who cares? It's like a CPU percentage of 5%, 6%. Like, you know, I know it's just a timer, but they're like, it really shouldn't be this high. And I was like, all right, you're totally right. And I solved it. I mean, it was a really good fix. So, I mean, I get it, but actually how many people are looking. At their CPU usage of things that are under, you know, 40%, like you're only going into task manager or activity manager, like when something feels wrong on your computer, but now you, Frank, you're a special one, uh, lay down what happened, uh, over here, Mr. I'm going to debug Apple code. [00:02:10] Frank: Oh, well, hey, I, I live in Activity Monitor, man. I don't, you, you say you only go check your resources, uh, when you need to. No, I, I always want to know my resources. I don't put the resources in the menu bar. I've seen people put like a little CPU graphs in the menu bar. I you open Activity Monitor and then like minimize it, it's got a cute little icon in the dock and I'm always looking at that cause I'm always wondering what's my computer doing. What's it really doing? Also, I write apps that hog the CPU, so I like to know how much they're hogging the CPU, if they're hogging the CPU. Sometimes I want them to hog the CPU, so I'm always curious, like, what's using my CPU. So, like I said, I was procrastinating this morning. I was waiting for a build, and I was just kind of looking at, uh, times on my computer. And I just noticed, just because I've been spending so much time in Activity Monitor, which is your task manager if you're from Windows, Um, you get to know those processes, don't you? You get to know the top ones, especially if you're sorted by CPU. Like, oh yeah, Dropbox, always at the top. Some kind of Electron helper. Is at the top. [00:03:21] James: Some like, lemme, what do I have? I got a task manager when I opened it. Uh, obviously Edge. Yeah, I have like a bunch of, uh, Shena. Yeah, it's always OneDrive, this or that, like a office thing. Edge. Well, we're recording. Give edge a break, but yeah. . Yeah. Give it. No man, it's usually, I guess yeah, we're our recording. Well, [00:03:41] Frank: if, if we rewind a little bit, I, I'm very lucky in that I got to take, um, working at Microsoft, I got to take a lot of Windows internals. Internal lessons, like they actually teach Windows internals, and operating system theory, and how it all works. Um, if you've heard of Mark Russinovich, he's written a lot of excellent books on this kind of stuff, internal kind of stuff. And I got to take a course by him explaining how all this kind of stuff works, how processes work, how CPUs consume them, how does virtual memory actually work. But most importantly, I got good at just identifying processes that were just Bad. Just sit in there eating your CPU. Uh, if you're on Windows, I highly recommend you get a tool called Process Explorer, and I highly recommend you turn on a column. I'm not sure if it's on by default anymore or not, but the column you want is called the Context Switch Delta. And that is how many times the kernel has decided to execute the code. It's way better than percentage of CPU. Because if you see a process, process could use very little CPU, but if the kernel's always bringing it in, it's bad. It's bad. You're using energy. The computer can't go to sleep. Bad things. So I've always been just a freak about computers and systems. And are they running at their best? And are there background processes that are eating away at my precious, precious little CPU cores? It's just a neurosis, James. It's just there. I can't get rid of it. [00:05:14] James: I think it's good. You know, I, I often get upset when I see some sort of process that is like, you know, kind of clunking away. And I'm like, what is it doing? Like, why is it using 10%, 20 percent of my CPU? Like right now, when I open it up and I sort by CPU, You know, almost everything is kind of zero, which is really nice. Like a lot of zeros going on, a lot of things running, but not actually running because there's zero, but then a lot of things, 0. 2, this and that, you know, and anything over 1 percent windows is like, Hey, yeah, I just want to let you know, it's over 1%. So task manager, windows defender, you know, some systems stuff. Every once in a while you get some weird, like. I don't even know what that thing is. What is that thing? Right? It's like, what's going on there? Um, so interesting that you're really diving into it. And, uh, so much that there must have been something that stuck out to you that we're doing a whole podcast about it. I [00:06:05] Frank: assume. Somehow, somehow we're going to make a podcast out of this, James. Hi. Um, no, it was just that, like, like I said, there were the normal offenders. You expect a Dropbox up there. God knows what Dropbox is doing in the background. But Uh, the Control Center. was kept showing up in the graph, the Control Center. [00:06:25] James: The thing that like, you know, you go in and you say, I want the, um, you know, I want this brightness. I want, uh, you do not disturb mode on the Mac or the thing that, the thing on the top right basically, that thing, Control Center. [00:06:39] Frank: I mostly think of it as the Do Not Disturb button, but now it's you, you got to click that. Then you got to click Do Not Disturb. Then you got to click another option under Do Not Disturb. So it's actually three clicks to get to Do Not. Anyway, I think of it as the Do Not Disturb button. Anyway, um, and, and the only reason it caught my eye is because out of all the processes that usually end up at the top, it was the only one that had a nice icon. So you're like, Oh, what is this app with a nice icon? That's always at the top of my CPU list. And since we are going to talk about CPU. Percentage usage percentages. We should make it clear Mac and Windows report these very differently. Um, on Windows, let's say you have a 10 core machine on Windows. If you're using 1 percent CPU, you are using 1 percent of the total sum of 10 cores of power. If you're using 100 percent CPU, you are using 10 cores worth of power. 100 percent CPU, 100 percent core usage. That's not how they do it on Mac and not how they do it on Unix and Linux. They count each core as 0 100%. So if you have a 10 core machine, you can actually get to 1000 percent CPU usage. Yeah, just something to keep in mind when you're talking CPU percentages. Ask someone, are you talking Unix or Windows? Because they're different. Very different. Uh, so for what I was noticing is Mac. So let's be clear. This is a 10 core machine. It was using one percent. So it's using one percent of one. Tenth of the computing power of this machine. So it's kind of like 0. 01%. So I want to be clear here. I did not mean to like make fun of Apple or anything because they have a 1 percent using process that kept showing up on my thing. I was procrastinating. I was just avoiding work. And I'm like, I wonder, I'm just curious. Is it doing ? Like what does 1% , what does 1% of one 10th of my C P U do all the time? Um, any guesses? Well, and this is, [00:08:46] James: well, and this is like where the developer mind comes in, right? Because for most people, like they're gonna look at that and it's maybe not you sort sorted by cpu, it's gonna be by names. They're never gonna notice it. And I actually, surprisingly, I. I don't even know if I would know how to figure out like what it's doing. Like I'm looking at, you know, task manager. Like, I don't know how to profile task manager on my app. I could profile my own app, which is what we had to do. Right. Like I actually don't. No, cause I've never done it. I guess maybe, maybe I have a long time ago and just haven't had a need to do it. I don't even know where the place to start to, to figure out much less on a Mac because I'm more of a windows user, but in general, I can't imagine. Well, the thing with the control center is. It's hidden most of the time. So it shouldn't, nothing should be rendering on the screen, nor should anything be really running until you open that thing. I mean, I guess there's something hidden, some interactive thing, but like, it's not doing anything. So it's literally one frame rendered. And then should stop, right? If you understand how rendering works, like once the pixels are on the screen, it doesn't have to do anything anymore. It's done rendering into the buffer. So it shouldn't [00:09:59] Frank: be doing anything. The ideal computer, when you are not interface, when you are not interacting with it and it's not doing a job, a batch job. is doing nothing. But that, as we all know, that is not how computers work. They're always doing something. They love to do things. They love to index things and look for viruses and do all that good stuff. Uh, yeah, it's, it's, uh, let's talk about it real quick. Okay. So if you're on Windows, uh, I don't think Task Manager can do it. You want to go get the app I mentioned before, um, Process Explorer. It's from Microsoft. It's a legit product. Go get it. Um, if you double Click on a process, I think somewhere in there you can say threads and it will dump the stack traces for any thread. Now it's not a profile or it's actually going to show you that in real time so it's just going to kind of like hook on in and show you what each thread is doing. I, I, I love Mark. The hacker of all hackers. And it's just gorgeous what this app does. Now one sad thing about Windows is most executables do not contain symbols. They do not contain function names. So you often can't quite tell what a process is doing because it's off doing some, um, Some unnamed function. But if you are actually diagnosing a computer that's like stalling often, or an app is just taking longer than you think it should take, or the whole OS is chugging along, it will tell you if it's stuck in like operating system level functions, things it does have symbols for. And you can Oftentimes, guess what it's doing. If it's reading from a file, go check what files it has open, and you can see that's what the program's doing. So again, another shout out to Process Explorer Visual Studio. You can also use, open up Visual Studio, attach to a running process. All of a sudden, you'll just be attached to that running process, and debug also. And at any point, you can just hit stop and tell me what's going on. Now again, that's not a. Profiler, um, but it is a quick way. You can just imagine, you can say, Stop, run, stop, run, stop, run, just keep doing that and you'll see roughly, uh, where's the app spending all of its time. Just a random sampling of it. On Mac, thankfully, Unix has a much richer tradition of, uh, system tools. And, uh, in Activity Monitor, it's surprising how many developers don't know about this, but there is a small profiler built right into Activity Monitor. It's from an old tool called DTrace, if you're from the Unix background. And I've... No, you're not? And I think it's like... Surprise! Right click on a process and hit sample and blammo! You get all the stack traces. Uh, I don't know how many samples they take, but it's a real quick way to see what an app is doing. [00:12:59] James: I like that. Yeah. No, I didn't know about that. This does look, oh, I'm looking at your screenshots on your tweet, which we've added into the show notes. It does look relatively familiar, kind of like a profiler or something you might run from Xcode or something on an application. But, um, yeah, so it's just kind of built in. It's just good to go. Yeah, [00:13:22] Frank: it's a sampling profiler. So what it does is while the app is running, uh, it momentarily pauses it. Looks at every thread, looks at every stack of every thread, records that away, lets it run again, pauses it, repeats. I'm not sure if it's actually pausing, whatever. Unix is weird. Um, but it's just collecting all those stacks and then putting those together into a linear fashion to tell you, okay, it's spending most of its time in this stack. So, alternatively, on Mac, If you're not being lazy and just procrastinating, and this is actually your job, you could open a tool like Instruments from Xcode and attach to a running process. And then you'll get this same information, but much better, which is way better in every way, because it'll, it'll be nicely broken out in a linear time, uh, timeline. You know, it'll be like a movie. And then you'll get a nice trace out of it over time instead of this is like a snapshot when you use Activity [00:14:20] James: Monitor. So when you're running this and it's taking these snapshots and these samples per se, what am I looking for? What am I seeing here? I see a bunch of method calls, I guess, or some something [00:14:33] Frank: in it. Yeah, exactly. So, um. Usually what you're going to see is the majority of the threads in an app are doing nothing. I mean, we're all developers here. We know our apps spend the majority of their time ideally doing nothing. They should be waiting for user input or waiting for a network response or something like that. And so if you do have an app that's behaving poorly, uh, fortunately, the thread with the biggest stack is usually the one causing the problems. Not always. Problems can hide and things like that. But think of it like a programmer. It's, uh, you wrote a bunch of code to do a bunch of things. You're going to have these deep down stacks and things like that. And so if you take a sample of an app and you see that, oh, it's spending all of its time in this function called view draw view. Then, you know, probably the performance bottleneck of your app is the drawing function of the view. And so it's, it's actually kind of easy to, um, see problems like this. Anytime an IDE locks up, I just, what else are you going to do? Like sometimes you got to wait and sometimes I just hit the sample button on Activity Monitor just to see what it is exactly that it's giving me a beach ball of death [00:15:48] James: for. And then what did you find because you tweeted some photos and a half a million views later, which I believe Elon now needs to pay you if that, is that how that works? If you're a Twitter subscriber, I think he owes you a few thousand dollars for this tweet. [00:16:04] Frank: Yeah. Oh, is that how it works? I thought at the TikTok rates, um, it's like 0. 001 cents [00:16:10] James: or something like that. Yeah. It's like, it's like less, it's, it's, it's, it's like when you see a penny on the ground, you're like, should I even pick that up? I don't know. It's like how much. [00:16:19] Frank: Um, well, I'm sorry, actually, and I did, I forgot to answer your actual question, um, from, uh, what you asked. What, what are you looking for? Um, in the screenshot that I posted on Twitter, I'm showing the number of samples, so the number of times that ended up in a function without knowing the number of... So, it's, maybe, maybe it pauses your app a thousand times, and out of those thousand times, it saw you were in the draw function six times. Therefore, six divided by a thousand, whatever, 6 percent of your time is spent drawing. Got it. Uh, now, that was my fault, there's actually a nice box in the upper left you can hit and say, switch to percent, because who wants to know sample counts? And I was just... I'm so used to looking at these things, I don't even bother. I'm like, okay, I see what's going on. Uh, so anyway, um, I was curious, what in the world is Control Center doing? Because it's not on the screen. What is it doing? It turns out, it is constantly relaying out its user interface, even though there is absolutely no user interface on the screen. And I got the biggest chuckle because This happens. This happens to all of us. Um, my God, I have so much code in iCircuit to make sure that I stop drawing when the user actually, like, closes a circuit, because I have a lot of things going on. I have simulations running. I have drawing code running. I have other background processes that are serving the simulation running. And when someone closes a circuit, you have to make sure all that actually turns off. Otherwise, the next time they open a circuit, you're eating up more resources, eating up more resources, eating up, eating up, eating up. Anyway, so I'm like, okay, there's no UI on the screen, but this thing is just churning here, refreshing its UI. I got a big giggle out of it, so I decided to post it as a tweet, because again, I was procrastinating on what I should have been doing in the day. [00:18:23] James: Now. You said it's resizing. So the one thing about control center is that it is dynamic, right? Because based on what's happening, for example, it might be. Uh, connected to HomeKit. You might have a widget in there. That's like, I want to control a light or I want to move this or that. And in iOS 17, there's a whole bunch of things that you can add in control center. I have like a bajillion items inside of there, uh, now as well. So there's that, but I can see them being proactive too, which is like, Hey, we don't know when Frank is going to hit the button in control center, but what we do know is that he may. Hit the button that opens control center. So we want to be ready. We don't want Frank to know what we're doing behind the scenes. You, we don't want to show them how the sausage is made. So we're just gonna do it basically. And it's going to render on this loop, which is. Hiddenly vis it's it's it's. It's rendered, but off screen. [00:19:20] Frank: Yeah, and it's, it's, I'm not even sure if it's rendering. It's laying out. So like, again, 1 percent of 1 10th of my compute power here. Uh, yeah. And so that, that's a reasonable argument. Um, if I was, this was actually my job, I'd give the counter argument that layout takes under a millisecond to perform. Um, I mean, I have the numbers here. It takes roughly three milliseconds for it to do layout. And I believe the user can handle a three millisecond lag. So, uh, I, it's a valid argument. It's obvious. It's what I thought of too. Um, but it's probably more like what I thought of was, uh, they were subscribed to Wi Fi events, Bluetooth events, sleep states of the computer, all these kinds of events. But I did notice one funny thing on the stack trace. And the stack trace starts all the way up at this... You would think, okay, it's a UI app, so it's going to have, um, an application main, it's going to have a window, the window's going to have its run loop pump, and then there's going to be a view, and the view is going to be doing all the work. But, this isn't a normal app. It has an ant status item. Have you, have you, have you seen ant status item, James? Yes. [00:20:35] James: Yeah. They're the, yeah. Things up there. Yeah. Mm-hmm. . Yeah. [00:20:39] Frank: So this is the way that you get to put a little icon up on the Mac menu bar. You got a program against the NST status item. Uh, remember app stat? Go get it. It's on Gumroad . It's the coolest little coolest little mini bar app ever. . Uh, it's totally fun writing a little mini of our apps, but I'm, I'm sitting there. I'm like, wait a minute. I've written many of our apps. I've never felt any need to redraw the UI in any kind of like status item thing. So there was like this fun little mystery to me of like, what? Why, why would a, a little status item, which should just be a static icon. Why would that be? And I should say this is running a Swift UI, UI layout. Why is what should just be an icon running a full Swift UI layout? And it might be, it might be Apple can get fancy sometimes, like it, there could just be a whole view up in that, um, menu bar, because I noticed when my camera's on, there's a little orange dot there now, when your microphone is on. It's actually a nice new feature of the OS. So it's possible that there is an entire Swift UI view. Just running up in that little menu bar area. And I find that a little bit hilarious. [00:21:56] James: Yeah. Wow. That'd be, that's wild. I mean, this is also kind of cool that you got to not only sample it and got to see the depth of Swift UI that is now really deep in the OS because control center is, you know, in there as well. It's not just an app run. It is an app running, but it. Feels more integrated in a way, you know what I mean? It's not in the status bar or in the taskbar down below, for example. Uh, that is fascinating. Uh, if that is the case, or the other question is, uh, is there a bug? In this NSView, that is causing a render loop or a layout loop to happen, I should say. [00:22:34] Frank: Yeah, uh, very plausible. Um, some event is getting sent to the status item, the status, you know, programmers, we love to subscribe to events. Someone oversubscribed to some events, so every time the status item gets some event, it's redoing its UI or whatever. Uh, that is one of the trickier things of doing SwiftUI. I've been doing a little bit of it. And, um... Pretty well, you know, when the UI is going to update, but other times you're like, it's not updating when I want it to, or it's updating too often and things like that. And so there is a little bit of a question mark when it comes to SwiftUI of like, it is magical because it works and it's wonderful, but then it's also like, it's a little unpredictable sometimes on exactly how it's going to work. Anyway, I think it's also, um, just another reason I love to do a little bit of Mild reverse engineering, some lazy reverse engineering, because you get to see how other developers. Things. I mean, there's only so much you can learn from a call stack, but I'm an old reverse engineering person. I've looked at call stacks my whole life. I've tried to figure out how apps work and all that kind of stuff. It's honestly, I attribute a lot of it to like, um, A, my joy of programming, but, um, B, why I don't, why I feel like I can take on any challenge just because I just read a bunch of other people's code. I'm just constantly looking at their, uh, decompiled code and that kind of stuff. I'm just always curious. Anyway, it never would have occurred to me to just put a whole view right up in the menu bar, but there you go. It might be possible. I'll have to think on it. [00:24:12] James: Well, the real question that we have at the end of the day is if 1 percent of your CPU is sitting there spinning. Aren't we just wasting precious fossil fuels on this little widget that's so important at the end of the day? Really, uh, should Apple be buying some carbon credits to offset the 1 percent of the CPU, Frank? [00:24:34] Frank: Yeah, I mean, what, they built a forest to offset their nut factory? So I think they gotta build a continent with a new forest on it to offset this icon? Constantly doing layout. Yeah. Uh, it's tricky. It's tricky. Like, you can't help but think, okay, so what are the real ramifications of all this? Again, everyone remember, I'm just procrastinating, just having some fun. This is all just in good. And I was clear in my thing. I said, like, this is no big deal. And the reason I said it was no big deal, um, I, I come from an embedded world where processors are very simple. So I have a very simple model of what a microprocessor does in my head, just from the simple processors I worked with. And one thing I don't think a lot of people fully understand in an operating system is, is these percentages. Um, if you have a computer where no process is doing anything. Nothing's being done. You're not touching it. It's not doing anything. No video is playing. You would expect all your CPU usage to be 0%. But that does not mean that the CPU is taking 0 power. The CPU is still running. Um, it's just kind of how they are. They're always ticking away. Um, we never stall them. There are times where you can stall them. Apple's gotten really fancy with multi core setups, and you can turn off different cores, and you can throttle cores, and all that kind of stuff. But note there, they're saying throttle, not stop. Because you just keep ticking a CPU. You do it for a lot of different reasons. Um, So, when you're talking about 1%, um, I don't think the calculation of, is that meaning that I'm consuming 1 percent more power than I would be if the icon was not updating? And I would say, no. Uh, things are not that simple. Because the CPU's always running kinda no matter what, whether it's doing any useful work or not. It'll just do unuseful work, no operations. Um, yeah, whether it's doing useful work or not, like that 1%, it would otherwise just be running the idle process if it wasn't doing that layout that it absolutely doesn't need to do. And so I would say in a nutshell, the 1% was no big deal because a, it's a very small number. One percent and one tenth. And then B, I don't think it's a measurable power thing. All that the real impact is, is that it is depriving potentially other apps from one percent of CPU. Uh, of what they could possibly use, but you rarely ever, ever peg a computer. So it kind of doesn't matter. So I said, it's no big deal, but other people had [00:27:28] James: other opinions. Yeah. Now at the end of the day, the real question is throughout this podcast, what else did you do? Were you a good steward to the Apple? Community. And did you open a radar ticket? I am [00:27:43] Frank: a bad, bad steward. I'm not a steward of the community. I'm, I'm just a bad participant in the community. No, this is what I should have done, but no, James, again, I'm procrastinating. I tweeted it. I didn't do what you're supposed to. I didn't file a bug report. They actually have like a really nice feedback app. That's always like sitting here. It's a big purple icon now. Uh, no, I didn't do that. That's what a good person would do. That's what a good engineer and a good steward of the brand would do. Um, I tweeted it. And then, via my tweeting, someone else posted the bug report. So, score one for... [00:28:24] James: Twitter. Boom. That's what I say. [00:28:28] Frank: Oh, isn't that terrible? I mean, because honestly, it's no big deal. I, I don't, um, I'm, I get the Twitter satisfaction of a tweet blowing up, but then also the huge amount of guilt that some poor Apple engineer is probably going to actually have to take a look at this now. And I got, I felt a little bit sad, honestly, in the end, cause like my procrastination, my curiosity of what the heck is this stupid process doing? And then my desire for a little bit of interaction on Twitter, because again, I'm procrastinating, uh, turned into something and I, I apologize, uh, in advance, uh, to any engineer that has to deal with this now, but also don't update your UI if the UI is not being [00:29:09] James: displayed. I blame SwiftUI. No, I blame. there we are. Well, this is pretty fun cause it's fun to learn how you debug it. And then also fun to actually figure out what's the next steps here on it. So, uh, well, good. I'm glad you got it and I'm glad that, uh, yeah, maybe your tweet's gonna give you some... I don't think you get any money unless you have like millions of views across a certain amount of months and then something else, but I will say it's very popular, I saw that half a million views and this has only just been like a day. So. That's pretty cool. Congratulations on being viral, Frank. [00:29:42] Frank: Okay. Yes. Uh, I appreciate it. I just wish there wasn't a victim involved, the victim being the engineer at Apple. I apologize. One last time. [00:29:50] James: I bet you could do a video on that. I bet you'd get a bunch of views. Like if you went down the rabbit hole and like showed how to do it, you should do that. That'd be kind of fun. I challenge [00:29:58] Frank: you. Yeah. I actually, I do watch a lot of YouTube and I don't think people do enough, um, system tools. Uh, there, it's actually surprising how few programmers know all the powerful system tools. I think it's a lot of fun, uh, learning how to investigate and poke around someone else's code. [00:30:16] James: You know what would be a really good, uh, series for you to do? Would be to do All of the, um, um, CIS internals, like all the apps on windows, every video for every single one describing like what it is. Cause like no one knows, you know, I could do [00:30:36] Frank: 10 videos on process explorer, man. Easily. [00:30:40] James: Uh, all right. Well, I think that's going to do it for this week's podcast. I do want to do one final cool shout out here because. One cool thing that happens, at least to me on occasion, and maybe to Frank on occasion is people send us stuff, uh, cool companies want us to test stuff out for YouTube, for Twitter, for other stuff. Um, I do videos on my YouTube and those are all sponsored. Um, but I had a company had sent me a webcam. I reviewed it. It was cool. And then a different part of their, or reach out to me and they said, Hey. We want to send you this light bar now. I don't have it here. If you're watching this on YouTube, I'm at a different location. So I don't have it here, but I've been noticing that I don't have it here because this light bar, I put out a tweet, a little like two minute video recently on it, um, and describing this is I often code and I'm working at all times of different day, normally during the day, but wake up pretty early, a little bit later, it's getting later now. So the sun's going down here. And I've been doing this work from home, obviously for all the pandemic, but before that and coding long hours. And I've always had some sort of like eye screen, sort of like, you know, you get that light and you're like, Oh, you know, this and that, especially at night when it's just completely dark and your screen just like in your face. Right. And there's apps that have been built into your computer, but this light bar, I never thought about it. I've seen them in different setups. I never thought about it. And Ben Q, which you think of them sometimes for like monitors, they make a whole bunch of accessories, but they sent me this. Ben Q it's called the screen bar. Halo. And it's pretty neat because it has a bar in the front. It also has a light in the back and then you can do one or both, but there's also an auto mode that will automatically detect the ambient light and automatically adjust the. How bright it is and the tone of it as well, which is nice. And that's my favorite feature. And that's a cool dial and it's not connected to a computer. It doesn't need to be plugged into USB, any USB. So I have it plugged into like a little dongle on my thing. So no matter what computer I'm using on my monitor, it works, which is cool and same thing. So like the little accessories, we're talking to it. Anyways, I've been using it for a week, Frank, and I love it. I am addicted to it. Um, I use it mostly in the morning and the afternoon, not throughout the day. Um, because during the day I have a lot of light coming in. It's totally fine. I feel a lot different, like when I use it and so they totally sent it to me for free, but this is my words. Um, it's really cool. I don't know. It's really nice. I'll put a link in the show notes if you're interested in learning more about it's like 150 bucks, so it's pretty expensive, but, um, it's really nice. It's a really nicely designed. It works on my ultra wide, you know, type of thing. I don't know. I don't know if you ever looked at, uh, bars at all. I just think about because we're talking to developers and I'm coding at night and it's like this has been helpful and I don't know if you've ever looked at anything like [00:33:23] Frank: this. I do. Um, me being me, I tend to like kind of make my own. Um, but I, I'm a big believer in backlighting. Um, it's, it's when your monitor is a heavy contrast to the rest of the lighting. I think that's when you can kind of wear out your eyes when you're constantly shifting between dark to light, dark to light. So I just try to have the ambient light match the brightness of the computer. And so, whatever you can do for that, and then, yeah, match it up to the time of day. All, all the fanciness you can add on top of that. But yeah, I am a, I even, I've, I've been wanting to do it by TV. There's cool people who've done, like, color effects that kind of, like, extend out movies by doing, like, you know, the big blur effect you do with portrait video. But you, like, shine the light onto your wall that matches the movie. And therefore, like, you're creating the ambient light to match the, uh, video light. a little bit better. So I don't have, I don't think I've suffered too much from the eye strain thing aside from I've just always naturally tried to make the light behind the monitor match at least as bright [00:34:27] James: as the monitor. That makes sense. Yeah, we've done that at home and that's what made me think of this because Well, I got this recommendation early on about the TV when I got the bigger flat screen, I had the plasma still, but I looked at those and this was a long time ago. I remember seeing on Kotaku or Lifehacker that was like, it was like 25, like, you know, stick on LEDs, USB power. And I have USB ports that are unutilized on my. TV so that it should be cool. So whenever I turn on the tv, yeah. I have the backlight. It's like strip lighting that goes around it. Now they're not cool. Fancy, they don't do anything. They're not matching the video. Yeah. . No. They're just like a nice, a nice uh, soft white behind it. But it does, it's a game changer at night. But I did see that Phillips hue. They have a, um, they have the lights that do that. And what you do is they have an HDMI inbox. So like your main source, they, you, they capture the HDMI and then they output it. So it's like a repeater, but then that way they know what colors and like, Whoa, that's so cool. Like that blows my mind. So, um, I don't want to spend the money on that, but I think that is really cool. [00:35:33] Frank: Yeah, you're kind of, I dare not tamper with the HDMI gods, but that sounds lovely. Yeah. Yeah. [00:35:41] James: Fun. Lighting. Lighting. Yes. Anyways, to wrap it up, uh, let us know if you have any lighting tips or what your setup is like. Uh, go over to mergeconflict. fm. There's a contact button. There's Twitter buttons. There's YouTube buttons. There's all the things. And show us your setup. What's, what are cool accessories that y'all are using on your development setup? I'd love to know. I'm always down to improve my setup. So, uh, let us know. Uh, but we'll, uh, beyond that. And we also have a Patreon, patreon. com forward slash merge conflict FM. There's a button over there. We just did a really cool, uh, update episode on, uh, my smart thermostats that I've been installing, which are low voltage to wire. Uh, if you're interested in that, uh, we also talked about how. Um, neutral wires work and line in loads. If you're interested in electrical engineering, um, I guess it's just electrical ing, electrical stuff. Uh, go check it out. Uh, subscribe. Uh, you can even get a free trial, so you can, you can just listen to them for free. You can download all of them, but every week I'm a, basically every week, a free exclusive behind the scenes of what's going on with Frank and I on Lifes. But that's going to be it for this week's Emerge Conflicts, Frank. So until next time, I'm James Montemagno. [00:36:45] Frank: And I'm Frank Krueger. Thanks for watching and listening. [00:36:50] James: Peace.