Jon (00:01.766) Hey everybody, welcome back to yet another Gone Mobile. I say, I think I said that last time too, but it is yet another one. So this is one 111, I think that's a fun number. Allan (00:13.709) I didn't keep track of what you said in the last one. But this is definitely 111 because the notes say so. Well, I hope if I'm copied and pasting them right, that that I'm numbering them right. Jon (00:16.966) Well, I mean, it's all the same. And the notes are never wrong, so. Jon (00:28.998) I've never made a mistake copying and pasting stuff and forgetting to switch numbers out. Allan (00:33.516) This is true. This is true. So you're standing today, sir. Are you still broken? Jon (00:36.742) So I'm getting much better, but I try to alternate. So I'm in my standings part of the day. Getting better, getting there. Allan (00:46.155) Okay, all right. So you're getting better. Well, you might still hurt a bit after today because today we're talking about logging and configuration. It's kind of boring. It's kind of boring, but I think we can make it exciting. It's a good topic because we're exciting. We're fun. You should listen to us because we're fun. But yeah, we've got a few rants in here. I can see them because I put rant on it. So we'll see. But yeah. Jon (00:54.79) Ehh... Well... I don't know about that, but... Jon (01:05.35) We are fun. Jon (01:15.43) or where you crack the knuckles and... Allan (01:15.947) What are your thoughts? Why don't you open, you open for us, John, what do you think? What's, what do you want to talk? Jon (01:19.398) Okay. What do I think? What do I think about configuration and logging? I, I, I do them a bit. I don't, I don't have, so my apps don't really need a ton of configuration because there's not, you know, I don't do anything like, you know, a white label or, or anything like that, where I have multiple config configurations and stuff to use now. Allan (01:25.994) You do them. Jon (01:48.39) To be fair, I mean, there's some times that I all throw in like the app pointing to a different server or something. If I'm, if I'm testing something that I don't want to hit, you know, the live endpoint on, which is how, how I should be doing it and how I usually am not doing it. so. Allan (02:02.09) Well, people know your app, John, so they know you've tested in production and it's still working. So you're all right. Jon (02:09.318) Yeah. Yeah. I mean, most of the changes when I'm testing that way are not, you know, server related at all. So it's not like I have to put an update out to the server or anything like that. It's usually, it's usually not that. And then I get to test with, you know, my actual data, which, it makes it a little bit easier to, to repro bugs and stuff that I see come in. So con. Allan (02:32.201) There are big companies I know that test on production anyways, big. Not ones I'm working for right now, but big. Jon (02:36.294) Yeah. And I, and I have the capability to not do that. So, and, and, you know, in fairness, one of the reasons that I, I usually don't do that is cause I'm lazy, right? And we're all developers, but you know, we're lazy. And one thing I do have to do, and I don't see it in the notes here at all. So I'm a little, I'm a little surprised is I want to, I want to check out some more aspire stuff and see if, if that's gonna. Make it so I can more easily put together the local testing scenarios and stuff and toggle between the two. Because that's... Allan (03:10.344) Are you talking Aspire from the mobile end too? That project? OK. Jon (03:13.318) Yeah, yeah. so there, there's some work that had been started there by a few people on, on the team, you know, on our group of teams, to try and figure out like, what does, what does aspire mean for a Maui app? Right. we can probably do a whole episode on, on aspire. I don't know if you've, you've touched it much yet, but the, the promise is kind of, yeah. I mean, Allan (03:30.344) I haven't played around with the mobile version yet. The server side I've been playing around with, not there yet. Not ready to buy into it yet. Jon (03:39.526) Yeah, yeah. And that's, you know, kind of like dipping toes into the water just to see like how, how would it fit into the picture? And I think we'll see, we'll see more of a look at, you know, how maybe investment happens there from an Aspire perspective going forward, but it's, it's kind of early days, but you know, there is some, some workable stuff. So the idea with that, I'm not going to explain all of Aspire, but like in this particular scenario, the idea would be it, you don't really have to do much for like your configuration and stuff. So like you run, local right and like everything just kind of lights up and the app knows what the endpoint is to connect to because it's all injected as configuration stuff. so that's, that's the dream. And of course people have been doing kind of similar scenarios manually, right? Like one thing that I know I've seen in the past and in Xamarin, and I've seen in Maui is to like, I've got a Jason file. How do I, you know, how do I figure out how to push that into my app as a configuration thing? And so people have done all sorts of crazy things. So it's, I'm sure we'll, we'll touch on a little bit, but yeah, me personally, I don't do a lot. I mean, on the server, I just use the, the like environment variables and I set my, you know, my keys up in my deployment slot or whatever, and that it all just flows through to the app and I'm done. Allan (04:54.82) I feel like from the Aspire end I went through the pain of setting up Prometheus which was a bit of a learning experience and now that I've done that it's like okay I have this thing that just took me forever I need to use it I'm gonna keep using it for now we'll see that's like your reads all your hotels and all that nice telemetry stuff and then you take that and then you wire it through to your favorite Grafana Jon (05:07.782) I'm not familiar with it. Jon (05:13.058) Okay. So all sorts of event. Jon (05:20.262) Mm -hmm. Allan (05:20.643) and it's just a whole wild whack -a -mole of Lego pieces that go together. Jon (05:26.342) Well, and that's why the Aspire idea is nice, right? Because you kind of compose it in code and not have to deal with figuring out, what endpoints does everything need? And how does it all start up and fit together? So anyway. Allan (05:29.443) Yep. Allan (05:39.938) their dad the dashboard is super nice the dashboard is super nice and you could just pull it in a docker container now so I'm like that's pretty awesome it just doesn't store anything right now which I think is that that'll have to be something that's there later but man to spin up to just spin up the container and have it working is like chef's kiss right just it's beautiful so Jon (05:42.246) Yeah, that's really cool. Jon (05:54.758) I mean. Jon (05:58.502) Right. Yeah, no, exactly. So yeah, I mean, configuration and then kind of rolled into logging too. So logging is something I do a little bit more within my app. I want to get a hold of all the crashes and stuff, right? And so there's, I've been using Sentry myself in my app and that's been pretty successful. I've just been on the free tier still because I don't know. It seems to be working. I haven't, Allan (06:18.433) OK. Jon (06:28.006) Every month I get like close to running out of the, you know, number of alerts or whatever, but actually what I need to do is take my old instance down. Yeah. Hold on. Hold on. Hold on. So, I mean, first, yeah. As soon as I said it in your, you know, saw your face and like, why? Yeah. That sounds like really bad that I'm, I'm running out on alerts, but I I'm pretty noisy about what I log and a lot of what I log is not. Allan (06:35.682) Jon (06:57.766) it's stuff I've handled, right? I'm not just being like, just, just log the unhandled stuff. I log other things. And then. At, you know, at some point now, I, like I said, I've got my forms app, which was like just, I still kind of out there in the wild. People are still updating. but I don't really care about errors and stuff at this point on it. It's like, well, if it's happening on that one, I'm not fixing it. So upgrade to the new one. so I got to disable that one. Cause that. Allan (07:00.641) Okay. Jon (07:25.99) I've got basically two sets of apps kind of logging separately into the whole thing. But no sentry has been nice. You get a lot of information back from it. Have you used it before? Allan (07:37.342) Yeah, I use Sentry pretty much that was the replacement for App Center for a lot of things and they've got their own logging like they implement the extensions library like the Microsoft extensions logger and which I use a little bit more of. I don't like the my goal is to never have the app domain crash catcher. You know what I mean? Like where it's it's unhandled and have those catch it. But yeah, that's what I'm using Sentry. It's great. I did. I know they had a big performance issue. Jon (07:44.934) Yeah. Jon (07:56.486) Mm -hmm. Allan (08:07.039) their version 3 and it's mostly gone in 4. It's not quite... Jon (08:07.398) Yeeeahhh... Yeah, I mean I so I found that too and I started I started looking at you know what was happening and it's like they were They were wiring up events to like every single view in the tree effectively And so we you know to their credit though Well, yeah, but but not even Necessary like I don't just what they were trying to aim for is like that doesn't still really make sense However, they you know to their credit they were super easy to work with and you know, I'd kind of Allan (08:23.358) Yeah, well, if you wanted telemetry. Hehehehe Jon (08:40.838) Gone into their, their discord and was asking about it and kind of looked around and said, maybe you don't want to do this. And maybe you want to do this instead. And they were pretty quick at turning things around. And, yeah, it's been, it's been much better. Maybe there's still some places they can improve it, but. Allan (08:55.741) I think they're still hooking a few places that's a little invasive to the performance. But the good thing, like I said, most of the time I don't actually, like I have my own telemetry stuff for collecting like certain logs there. Telemetry is a bit different than logging, arguably, I guess. But generally for the error crashing stuff, I have like a command and I wrap it in a log with an action. It's all safetyed. Jon (08:59.142) Yeah. Allan (09:23.803) See, John doesn't believe me, but I do have an app. He still, I can see him smiling now. I have one app that's out there and it's, it's, it's okay. It's fairly big ish. It's got several thousand users. It's for a company. So it's not mine. I don't want to say it's mine. I wrote it and I don't have any crashes in it. I have everything's caught. I don't have a single unhandled exception that goes through it. I know he doesn't believe that. Actually the one time I did have one, there's, there's only a couple that have come through. Jon (09:47.174) Well, I mean, maybe you do. Allan (09:52.154) And unfortunately it was measurement and Xamarin forms that just decided to kick out that day. It's always Android, of course. Android the misbehaving child. Jon (09:59.59) I mean, I don't know, maybe I've just done lucky and like the different variety of devices and stuff that I ended up seeing. Like I just, there's always some exceptions that I'm like, I don't even know how that's possible looking at whatever bit of stack traces there. I was like, it doesn't make any sense. I don't even know where I would begin to fix it. Okay. Allan (10:12.923) Mm -hmm. Allan (10:19.898) Well, and that's that's what I it was. It was a UI complete issue. Never touch my code. Was a measurement thing with Xamarin forms. Don't know why and the device was some weirdo Android device and it happened. I was like, well. I feel like I'm doing pretty good. Otherwise, John still doesn't believe me and I can't pull the telemetry out to prove it, but it's factual. If well, you want me to give you customer data. Sometimes I can get into trouble. Jon (10:40.07) Convenient, very convenient. Jon (10:47.558) Uhhh, yeah. Yeah, so I gotta go back now and actually now that we're talking about it, I gotta go look at my air reports again and see what's been happening to users in production with the new version and see if there's anything I can fix that's obvious. Allan (11:04.673) What? I mean, it's usually not hard. Like really, if you're setting up try catch, I'm not going to do my rant yet. This is listed as a rant in the notes. I put it on purpose because of try catch locations, but I'll get to it. If you're putting try catches in the proper places, you can have fairly easily a crash free app. It's not hard to do. I know that that sounds pretty arrogant and twisted. Jon (11:08.518) It depends. Allan (11:32.728) But believe it or not, it is not that bad. You just have to know where to catch. Jon (11:38.374) Yeah. And that's usually what the bulk of things are that come in. It's like, I could see, you know, like looking at scanning here. Now I see one that somebody clearly tried to like put a, or share something out to a view or I that I pattern or something that I don't expect. And I must not, you know, try to catch that particular spot. so it's like, yeah, that's, that's going to be easy enough to fix with the information that comes in, but. There's some that are like, you know, happening kind of in the O S land that make it a little bit more tricky to figure out. Allan (12:14.232) Can be, can be. So I figured before I go down the logging path, configurations are fairly small one. So you covered it, it's not really used. I mean, for your scenario when it's just one, I'd almost consider just doing constants and you can have it during compile time, just plug in those variables. Like I have like stuff on Azure and GitHub that just like replace variables in C sharp and then it compiles. Jon (12:28.678) Yeah. Jon (12:33.126) Yep, exactly. Allan (12:41.431) If you bring that to purest CILand and you're doing like deployments to multiple environments, they tend to throw a fit because it's no longer the same compiled product if you have to, which is kind of, I'm not going to call it dumb, a little bit paranoid, right? Because it's going to compile the same way. It's not going to change, but sure. So they're big on it. So one of the things that I wanted to do, so, Jon (13:01.638) Yeah. Jon (13:06.31) Mm -hmm. Allan (13:10.903) A lot of the people, they tend to, like in the apps that I've seen, and I'm sure I know you've seen this, because you've told me is, they tend to have the configuration files. So like your typical app, JSON settings, sitting right in an embedded resource in their shared project, shared project, single project, better get that one right, big difference in the two. And then they load that up. The problem is, Is it because it's an embedded resource? You can't really get it. You like you can't get at it. You're no longer appears. You still have to recompile it, right? You can't can't change it. So. Really, it's like why have I have the Jason file at that point? Jon (13:51.75) Well, yeah, I think because it's what people understand, right? And so you might put, you might have your config like that you would use the app settings for in the server. It's familiar. It's yeah, I think it's just, it's, it's a little bit of everything like that, right? And so, and maybe people don't realize, so yeah, what, what I've seen in the past and not that this is like horrible, but it's, if you're one of the, the, the people that's trying to make your startup time, you know, faster and you're complaining about startup time and stuff like these are the things that that can matter. I, I bet. Yeah, we see this with people. People are asking about, you know, it's half a second slower. Well, you know, sometimes we'll see like, let's put the Jason file as an embedded resource and your assembly. And then, you know, at startup time, you got to go take that out of the assembly and then you got to, deserialize the Jason. And it's just not, something that's really. Allan (14:21.204) No, I can't read. It's, I. Jon (14:47.174) I know it's not going to be fast. It's not that bad, but it's something. Allan (14:48.948) in its work, its code, it's got to run its code. It's got to run. Now, in my experience, I have not seen it really tend to go more than maybe 50 milliseconds. Like it's not slow. Configuration files are usually pretty small. I mean, you can get some wacko stuff in there. Like the last episode, we talked about the two or 300 Meg Jason file. If you've got a tour, 300 Meg configuration file, I think you need to rethink what you're doing, probably. So it's generally not that big, right? So it's usually pretty zippy. I have never seen a problem. I've never heard a problem, because I tend to get emails instead of proper issues, but I tend to get emails where people are like, hey, that's a slower, never for config. Now, going back to that embedded resource, something that I saw earlier is like what? Jon (15:21.03) That would be worse. Allan (15:47.699) I asked the question, why do it? Because it's familiar. But what if you could have both? So one of the things if you want the purest method, right, where you can, a lot of the purest people for CI CD, what they'll actually do is they'll unpack their IPAs and their APKs, because they're essentially just overrated zip files. And if you put these config files in either the root for iOS, I believe you just mark it as a on. Jon (15:52.646) Yeah, exactly. Allan (16:16.467) I don't remember one of the two. And in Android, you just have to put it in the assets, right? So the assets is the read only thing, but it's bundled. So you can actually go in and you can edit that thing and, you know, zip it back up into an APK, resign it, reorg it, boom, ship it out and, you know, still load it the same way. And you don't have to pull it out of embedded resource, right? So it's a file stream. I don't think there's... Jon (16:17.638) Yeah. Jon (16:43.306) Yeah. Allan (16:45.874) real I don't want to say there's a performance difference too much between the file system and an embedded resource if it is it's so slight it shouldn't matter. Jon (16:55.238) Yeah, it's not a lot. I mean, my, my stance on any of the time, anytime we're talking about like, you know, the little bit of performance is like, I see the work from the mouth, the group of Maui teams that goes into earning tens of milliseconds. And so anything that like is going to take that away, I'm just like, no, not today. Like you can't, and, and less so like from a Allan (17:13.073) Okay. Allan (17:18.033) Heheheheh Jon (17:22.118) customer usage perspective, I mean still there too. But something like Aspire, I know like, you know, one of the easy ways to try and like make that all work was gonna be, let's kind of do this thing where we shove, you know, a file in and we parse it at runtime and we load that as config because that's, you know, an easy way to kind of accomplish what we're trying to do with Aspire. Not me, but the people working on it. And... Allan (17:46.16) The team. Yay. You're part of the whole. You're part of DevDiv. So it's still. Jon (17:51.046) I know what was going on and that's about the extent of my involvement in that part. A smarter people were doing the actual hard work. So my, my one, you know, kind of challenge was like, okay, but let's, let's not, let's not erase gains that we had in favor of, you know, trying to make this work like fine as a first step, like let's make it work. But by the time we want to call this done GA, we can't. Allan (17:55.312) You Jon (18:18.822) We can't be undoing Pepper's hard work at gaining performance, you know, startup time performance on Android. Allan (18:24.687) Well, just one rebuttal to that, right? If it's an optional tool, you bring it in knowing. Any tool you bring in, it should just be, it's a given. Jon (18:33.126) Yeah, but, but if it's, if it's the built in, you know, not built in, but if it's the default, you know, thing that's provided to you, it's, it's gotta, and, and there's a reasonable path to a better way. Like it'd be one thing if we're like, I don't know what we're going to do, how we're going to do this. There's no possible way. It's another to be like, yeah, I know we can easily do this with like a source generator or something. It's just a matter of doing the work. Right. Allan (18:37.871) Out of the box. Allan (18:58.99) All right, fair, fair. That's a good segue too, because this was something that you had talked about a long time ago, was what if configuration could be source genned? And I think it can in part now in the core tooling, but I think it has a problem. The library that I have to load them out of the assets and the packed versions of the config, It obviously doesn't work with that tooling, right? It doesn't work with the secrets, right? Because all the app settings JSON, you can plug secrets in from the IDE. So it doesn't work there, unfortunately. Jon (19:39.91) Right. And that's fine because you shouldn't do that anyway for an app. Allan (19:44.461) What? Jon (19:47.974) Meh, nope. Shouldn't do it. Don't do it. Allan (19:48.397) Yeah, well, App Center, right? Like you may not want those keys to be public facing, right? Or, I mean, I just said a bad one. Jon (19:54.566) Yeah, but if they're getting into the app, like, I don't know, how would you even do that in a way that's not somehow exposable? Allan (20:03.949) You can't, but you can cycle it and you can cycle it with your environments and there's so many ways to keep doing it. Jon (20:08.23) Yeah, I mean that you're just kind of security through obscurity at that point, right? Allan (20:13.006) Yeah. And I mean, it's if we're talking about the comfort level, obviously having this stuff plugged in at build times or protected somewhere is helpful. And it's also helpful, like if I can switch environments and then goes, I need those set of secrets that you've configured, blah, blah, blah, blah, blah. There's so many ways about it. But the point is, is that you can't, you can't do the source gen tool that I believe is there right now, because it's just, it's were kind of different, right? The library is kind of different. So it doesn't see it, which is unfortunate. So John had asked at one point, Hey, can we just source gen this? Because again, there's that no effort, no, no, no runtime cost. I mean, there'd still be a little bit, but Jon (20:59.334) It's it'd be like the cost of like in knitting a dictionary, right? Like. Allan (21:03.02) constant. Yeah, exactly. It's all coming out. It's already there. It's the allocation is I guess the two allocations for your config to get iConfiguration. And then it's like, here's your constants. Enjoy. Right. So we had talked about it. I didn't do it only because I was like, well, there's already one out there. Maybe one day we can figure out how to get that plugged in. And two, I don't care about the 50 milliseconds. If you're bringing in a library at that point, Jon (21:07.686) Yeah. Jon (21:25.958) Yeah. Allan (21:31.019) you know it's gonna cost you something to play. The trade off is that you're getting something out of it at the cost of performance, right? It's like time versus money, however you wanna look at it. Just pick your poison. Jon (21:38.79) Yeah, yeah, I yeah I Don't know. We kind of talked about that last episode too, right where it's like, yeah if you don't if you want to reflect over view models, I there's a there's a line right? There's a curve of value to yeah, I Know. Yeah, there's a poor faith argument there. But yeah Allan (21:50.826) That's a big difference, huge difference and you know it. Allan (21:58.153) So, I mean, we could source Janet. Probably the end output to do such a thing. I don't know. Maybe it's something I could consider. I could probably even copy and paste the current config that's out there and just teach it. Go here, look for the JSON file here or something. I don't know. Jon (22:19.59) Yeah, I don't think it'd be too bad. It's just a matter of doing it. And that's ultimately, I think, you know, where the Aspire stuff would need to go as well as per my request. Not that I get to have the final say in it, but you know, I can be annoying about it and hope that being pestering enough actually makes the thing happen that I want. So, depends, sometimes. Allan (22:26.729) Hmm. zero zero runtime cost. Allan (22:41.575) Does pestering you work? No, no, the answer is no, you are the immovable rock. Yeah, crapes. I can't. John, try this. Nope. Nope. I'll bug I bug him mercilessly and he still will not budge so Jon (22:46.918) Yeah, not for you especially not, but you know, maybe others. Jon (23:00.358) Yeah, I'm very steadfast in my beliefs. Allan (23:02.822) you that's one way of putting it. So any other thing in config that you can think of that was my kind of general thinking. I mean the config files obviously help for consumer apps slash white labeling but aside from that you're right there's not a huge huge benefit but there certainly isn't a performance cost to be worried about in my two cents at least in my general customer world. Well if you need it you need it right if you're in a team. Jon (23:16.39) Yeah, yeah. Jon (23:24.07) Mm -hmm. Well, I think there is, but yeah. Allan (23:32.229) If the single app for just me, the only reason I do it now is because it's just a template. I can plug and play it. But if I need the performance or some sort of purist, I'll put it in a constants file and replace. It's just easier. Jon (23:45.414) Yeah. Yeah. So config, I think that that sums it up. Allan (23:50.085) It's pretty easy. Configurations is nothing more than a complicated dictionary. Not even complicated. Yeah. Jon (23:55.174) Yeah, I wore a dictionary of dictionaries, right? Like all the sections. I don't even know how deep it goes. Maybe it's just sections and I don't know how many subsections you can do. Allan (24:05.669) I don't think there is. I've never seen. Well, I'm sure there is a limit based on how much cycles you could go. Like 300 meg config file might be a problem, but. Jon (24:07.974) Is there? I don't know. Jon (24:12.966) Well, sure. Yeah. But I think that's where I kind of stopped when I thought about maybe I'll try and write this thing, this source gen thing quick. Cause I'm like, it's not just a dictionary. It's not that, you know, it's like, nah, I don't feel like it. Allan (24:23.716) Yeah. Well, cause even when you pass an environment variables, I don't know if you've seen that one, like that's obviously an end in memory thing, right? Like it just, that, that sucker just loads up quick, right? There's no hits, but what it does do is in order to get the environment variables to work, like the hierarchy is they basically do like, like a, like colons everywhere. And it's like a, Jon (24:30.854) Mm -hmm. Jon (24:41.702) Mm -hmm. yeah, I've seen a few ways and I'm always unsure about like, is there, what's the right, the right way or like, I think I always end up using like double underscore to separate and that seems to work, but maybe that's maybe colons work too. Yeah. Allan (24:57.412) Yeah, they've got a couple ways they split on it from what I remember. But it's basically to keep the higher. So you can have hierarchy, but with like a single command line variable, right? To come in, it works nice and fast. Jon (25:06.47) Right. Yeah. Yeah, I like it. So configuration and just to wrap that one up, you know, even tidier. We left the... We didn't like exclude the ability obviously to use that stuff in Maui, but we didn't end up putting any like default, you know, providers or anything in there, right? Because... Allan (25:11.748) So... Allan (25:32.484) Yeah, that's. Jon (25:32.486) for the reasons that we kind of have just talked about where, cause originally I think we were contemplating, like let's make the JSON stuff work, right? And then it's like all, all the things we talked about. So it's, it's, it's there. You can plug stuff in, but there's nothing by default. Allan (25:41.636) Yeah, you don't. Allan (25:46.916) And you don't need it until you do right so you pay the pay the cost to have the thing when you need the thing so it's probably a good decision. Jon (25:53.958) And that one was one level of performance cost. And then I think the other one that we didn't realize until we started really digging into it was logging was surprisingly heavy. Allan (26:03.78) Allan (26:08.9) Yeah. Which makes sense because if you see, I mean, of course it was peppers that discovered this one, right? But it makes sense because even in an app, like a server, like a server version, they tell you like, don't run console in production because it has to thread lock. Like it has to. So I don't know, they've got to be doing a while. I think they're doing some batching stuff and. Jon (26:17.862) Probably. Jon (26:29.19) Yeah. Jon (26:36.134) But, but it wasn't just like the runtime. I mean, it was runtime, but it wasn't just like the sustained use of logging and like too much stuff going out. It was even the startup, like the initialization, whatever the providers were out of the box, they just weren't that fast on mobile, you know, however they were tuned or whatever they were doing that was specifically, you know, more for like the server workload, right? Cause again, all of these things were built with that in mind. And it wasn't like anybody came around and was like, Hey, let's, Allan (26:48.196) Mmm. Allan (26:58.244) Yep. Jon (27:05.798) go in and do a pass at optimizing for Maui. I think maybe some of that has kind of happened here and there, but not, there's been no like major effort to be like, we need to make sure logging is super fast on Maui. It's like, well, don't, don't use it or use some other implementation if you want it. Allan (27:20.004) You know, it's funny, I think they've gone so hardcore on the logging performance. Now they've got some cool source gens with which do work in Maui, by the way. There's nothing special about them, but it's like, Hey, you know, you really shouldn't do the string interpolation at runtime, you know, do it at, you know, so we can help you do all that. Right. So, cause normally you end up going, if this log level is enabled, you know, interpolate this big giant string, which is full of objects and full of all this other stuff. Jon (27:28.07) Okay. Jon (27:36.806) Mmm, yeah. Allan (27:49.732) And then it's like, well, okay, that comes at a cost. And if you've got like, so for instance, shiny does a lot of logging for Bluetooth because there's so much stuff that goes on in the default mode, it can actually overwhelm the console really easily, right? Cause it's just so much crap going through. But one of the things that you can do is you can put these, you know, you don't have to go, if this is enabled, then write the line. You can just put a source gen kind of code path with an attribute. You can pass in rich objects. It figures it out all out for you and makes it into like some really responsive code if you need it. And it puts that nice if this log levels enabled for you, which is kind of cool. So save you some code. Does the string interpolation that like a I don't know how it does it. To be honest, I've never I've never fully looked into it, but it's smart. It's apparently very smart at how it does it. So it's nice and zippy. So it's a beautiful thing. But yeah. Jon (28:44.198) The whole conversation around logging being necessary to lock and stuff around it. One thing that I've always wondered too, I'm getting into the weeds a little bit here, is on Android. If you ever hook up Logcat and see the output, and honestly iOS isn't that much better in its terminal and its logs, like the log console, then you can peek in on it. Allan (28:57.284) Go for it. Allan (29:03.3) ho, ho. Allan (29:12.676) There seems to come in a lot smarter though. Jon (29:12.742) It always, it always makes me wonder. It's like these things pump out so much information. Like would, would the devices be a little bit faster if they just didn't, I don't know. Would the apps be faster? Allan (29:22.308) You'd think, because you look at it and if you've ever actually looked at logcat or the iOS logs, you see all the flipping errors that are coming out of it? It's like. Jon (29:31.398) Yeah. And it's not, and it's not just like, you can take a fresh device with nothing on it. And it's like all like Google's stuff is, is doing that too. Yeah. Allan (29:39.524) aired this aired that you're like, holy crap, is this is this device on the verge of hell? Like, is it going to work? Or? But it really if you spend any time looking in there, you can just go through it and see the thing is airing all the time. And you're like, Jon (29:47.11) Yeah. Jon (29:53.318) Right. So this is, that's always been like something I've thought. I'm like, this seems really like a, I don't know, like too much stuff comes here. Like maybe, maybe this is a problem that they're not thinking about, but who knows. Allan (30:03.772) Well, it's easy to happen, right? Fill all those logs up and then it stops alerting maybe, I don't know. It could also be one of those smart ones. If there's nobody hooked, nobody's listening, right? If the tree falls in the forest, does anybody hear it? So let's just not have the tree fall. Jon (30:06.086) Yeah. Jon (30:14.726) Yeah. Jon (30:19.622) Yeah, man, maybe that's how it goes. Allan (30:22.139) I, I, maybe. No idea. Jon (30:24.422) So what else is interesting about logging? Like what, I mean, we talk like we're talking kind of specifically console, you know, like type logging, but you can hook whatever you want up to it in theory, right? Allan (30:32.539) Yeah. Well, if. Exactly. Well, it's just, it's just a here's a string. Here's the log type. What do you want to do? What do you want to do with it? Jon (30:43.622) So I could probably, I bet you there's already one out there, like a Grafana or an InfluxDB logger or something. You could do whatever you want, right? Just put it to any storage thing that you have. And as long as you've got all the things to hook it up, it should just log out there. Not that you should do that, but. Allan (31:05.147) Yes, not that you should do that, but I'm sure people do find a way to do it. So one of the things if we kind of go back to like our core purpose, which is talking about Maui, right? One of the things that did suck in the early ages is that we didn't really have any good logging tools, right? We didn't app center was just like, you know, right to app center. A lot of people made that mistake where they were writing out to app center. And so they had this app center variable or what was it? Not analytics. Jon (31:29.67) Mm -hmm. Allan (31:35.867) Error exception, whatever they called it. Do you remember what the hell they called it? Anyhow, it's been surprisingly a long time since I've had it, but you know, you ended up polluting your code base with all these app center things and then app centers like, hey, hey, there goes push notifications. Everybody knew the writing was on the wall then. As soon as push notifications, they released it. Three months later, they said, yeah, we're not doing it anymore and we're cutting all those features. I was like, yeah, it's going away. But. Jon (31:37.318) yeah. Allan (32:05.627) All the people that waited, they had these app center things everywhere and you couldn't get rid of them. Jon (32:10.246) Yeah, it was a really nice setup for the parts that were useful. Allan (32:13.883) Right, but if it had have been in the logger interface, right, if you had have been doing the logger interfaces, you can plug in, plug out, right? It just, it's stupid simple to do. And so I did have one for App Center for a while and I was kind of shoving some Firebase stuff through it, but Firebase's logging is terrible for C Sharp. So it's not there. Like it's... Jon (32:16.966) Yeah. Jon (32:20.614) Mm -hmm. Allan (32:37.915) I don't, I think I ended up just deleting it because there was no value in it. If you can't, can't do anything with the exception. So we ended up throwing that out, but now thank goodness Sentry has their full product. I'm pretty sure they all do now like Ray gun. I heard there was a release today and there's another couple out there. and those ended up kind of filtering, like those, those go through the iLogger mechanism at the root if you need it, right? So they have all that you plug in, plug out if you don't. Jon (32:49.51) Yeah. Jon (33:04.134) Mm -hmm. Allan (33:07.451) If you don't, if Sentry goes out of business tomorrow, which I don't think they're going to, you can just find another provider. You can build your own server one. And it's, I'd love to see App Center, or not App Center, App Analytics, like Azure App Analytics get over into our world. Still won't apply, but eh. Jon (33:15.174) Yeah, exactly. Yeah. Jon (33:30.022) Yeah, that would be cool. Well, I mean, I, well, like App Center was doing, they were pushing their stuff to some Azure thing under the, like behind the scenes anyway, right? Allan (33:44.379) Jon (33:45.862) It was, and you could go like query on it after the fact and it was kind of weird to try and do it, but yeah. Yep. Allan (33:50.811) Yeah, you had to set that up though. It wasn't, it wasn't automatic. It was like a, Hey, our stuff isn't great. So you have to move it over here, which kind of sucks. But yes. Yes. So what about local logging? Do you do any local logging or are you just using straight console? Jon (34:01.222) Yeah. Jon (34:10.31) What do you mean by like, what do you mean by local logging? Allan (34:12.763) Well, we have debug and console, right? So obviously you need those during dev, but what about file? Do you use like a file store if you ever need it? I know you don't do a lot of background stuff. Jon (34:15.462) Yeah. Jon (34:24.39) No, like, like to try and like what I'm curious what the use case like in terms of if you're not debugging, then it's like to try and send that back up somewhere to be useful later or like what's. Allan (34:35.035) No. So this one is you don't always see it is clear, but I obviously do a lot of the backgrounding stuff. So you may not like, for instance, I'm doing a GPS based app right now. So I need a lot of log collection for that, right? Jon (34:50.406) Mm -hmm. Allan (34:55.035) And I don't want it to push to the cloud because it's simply I just do not need all the noise. I just need to see what it's doing locally on my device. I don't even have an API for the sucker yet. So I have all of these things going to. to a local database, like a SQLite database. So I could filter them, I have a little page. Jon (35:13.542) Okay. And then what do you do with them? Like what, how are you using them? Allan (35:18.843) Well then I, well then I have like a little page that I can go through. I can see the logs that I collected, anything that it thinks was erroring, right? What it was calculating. Cause sometimes, sometimes you got to figure out, okay, well what happened? All of a sudden I got this batch cause iOS sometimes goes, hey, we're not going to feed you anymore. GPS pings for a little while. And all of a sudden it regurgitates like 10 of them at one time. Why they do that? I don't know. They're, they're, they blast you for like hours and hours and hours. And then they're like, okay, we're going to chill. Jon (35:40.614) Allan (35:47.995) Okay well here's a hundred. Figure it out. I don't know why. Jon (35:52.07) So you build like a little UI into the app then and everything. So it's kind of like debugging, but not. Allan (35:58.043) Yeah, because some of the stuff like you can do, you can do like a trip in the emulator, like the, the, or the Iowa simulator and have it do like a trip, but it's never a true purpose, right? Like you don't really know is it, it's so simulated that it's like, it's not real world. It doesn't really meet what you need to test it with. So I usually get full blown app, full blown local logger with a page that I can read this stuff and, and see really what's going on. Jon (36:04.902) Mm -hmm. Jon (36:16.454) Right. Jon (36:26.566) No, it's fun. Yeah, no, I don't have anything like that. The one thing that I've, I've made use of, you know, talking about century is like, I do use all of the, like a lot of the breadcrumb kind of stuff, that they offer. Right. So it's, it's like events, right? So I can kind of see, I can log more information. So like one of the things that's notoriously a pain to try and work through is, in app purchases and subscriptions. And so. I make sure that I log enough information there that if something's going wrong, I can usually look back and see like, okay, what was the sequence of events that led to this state? How did the user get there? Sometimes if a particular user is having problems and I say like, hey, can I go look and see if, can I have your user ID and can I go look and see if I can figure out from the telemetry what's happening? I can even go and find a session based on that user ID and then kind of do the replay and stuff. So I'm not doing it locally. I kind of like that idea, even almost to extend it to like users having problems, like just go zip up that information and be able to attach it to a support request or something, right? Allan (37:47.035) Yeah, that's a pretty powerful feature. That's well beyond logging at that point though. That's like next gen stuff. Have you done any of that? Because I know that Sentry has that replay rate. Have you actually done it in your own app? Have you ever gone down that path? Jon (37:51.366) Yeah, yeah. Jon (38:05.286) I am not still clear on what they support from some of those advanced features in Maui versus like what I don't have access to because I don't pay for it. I use the free tier still, which, you know, I've been kind of on the fence of upgrading and like it's probably about time now because it is a good product. Well, no, it just like stops reporting for the rest of the month until you go back. Allan (38:15.163) I'm sorry. Allan (38:21.467) Well, you have to if you've flooded your log. Jon (38:29.414) And anytime it's happened for the most part, it's been like, there's like one or two days left before it resets. I'm like, that's fine. There's nothing new that's going to come in in the meantime. But, this time it's, I think we're, we're, I'm pretty far away from the reset date, so I might have to bump it up. Allan (38:36.635) Thank you. Allan (38:46.331) Well, the other thing too is if you had if you had anything major going on anyways, your users would be saying something right. So and that's generally the thing. Like if there's really a problem, you chant. Well, I don't want to say usually you should hear from your logging environment or something first, but it's usually your users aren't far behind if not right on the ball. Right. So it's hard to say. Jon (38:54.022) Right. Jon (39:06.918) Yeah. Jon (39:12.614) Yeah. Yeah. Allan (39:15.547) If. Jon (39:15.75) Well, and that's, and that's kind of where I generally in the, and why I say like, once it stops for a month reporting and I'm like, you know what, like there are, you know, it depends on the app and the size of your user base too. Right. Like if I look at all of the events that have led to unhandled, you know, exceptions and presumably crashes, there's a non zero amount, but if, if I compare it to like the number of, of active users, you know, in the same period or active sessions, it's like, Allan (39:44.315) Yeah. Jon (39:45.766) like less than a percent like okay that's fine. Allan (39:49.073) Well, that's a funny thing I like to say too, is that you can spend like 99 % of your dev effort there trying to fix those little bugs, not be successful, end up causing more bugs for, you know, that that fraction of a percent of a user base that's having an issue. And I'm not saying that that's right, but that is a fact, right? You can spend all of the dev effort. You can build the entire app. Jon (39:57.542) Mm -hmm. Jon (40:07.59) Yeah, exactly. Allan (40:15.024) and spend just all of your dev effort on that last 2 % which includes errors, making some stupid animation, et cetera. And it's like, is it really worth it for this one error? And chances are it could have just been a one -off error for like a hiccup and they go back in and they don't have an issue for months, right? Jon (40:19.174) Yeah. Jon (40:25.798) Right. Yeah. Well, and that's the thing. Yeah, it's like, yep. And they don't say anything because it's like, yeah, the app crashed. Sometimes that happens. So I just opened it again, and we're good. We're rolling. Allan (40:41.936) So I always get the question like from people like I guess this is this could have been one of our tales from the crypt is that the way people use try catch and how that they they can really truly monitor these things. And I notice with a lot of the younger guys that I work with nowadays it's like they think that their code can't crash. So in all service layers and the bowels of the app I always find these try catches. Jon (41:11.078) Mm -hmm. Allan (41:11.44) And I'm like, for crying out loud, like stop. It's all right if your code crashes because we can track if you don't muffle up the stack trace, which you're doing, we can track it from where it started to where it died. Right. And, but a lot of people just, you know, they try, they catch and they return null or they log it there. The problem is logging it there is we don't see the stack trace. There is no stack trace because nothing died. You swallowed it, right? Jon (41:45.318) Right. Well, and that, and, and you know, often enough, if you're, you're swallowing exceptions, you know, it's, it's only like, it's going to catch up with you, right? Like it's, you're, you're going to, you're going to lose out at some point. Like you're in a weird state now that probably some other part of your code doesn't expect cause you swallowed an exception and now it's going to crash and it just domino effect. Allan (41:54.095) Allan (42:06.447) Well, and what you see with these laws with these people that do this try catch everywhere and I've seen some, especially in the last year, I've seen some just awful stuff where it's like every single method has a try catch and lock. And the problem is, is there like, okay, it's an error here because it returned it. The actual exception did happen, but now up here, they're like, okay, we got zero. So that's a let's log that and. Jon (42:22.054) Hmm. Allan (42:34.415) So you end up with like all these false positives and only one of them is truth, but you can't tell the path because you have to decode that. But they're all fragmented now as opposed to, hey, I started up here. I went down to the, down to the balls of the app and it died and now it goes back up. And I can see that whole route. As long as you didn't try catch and then three, throw the exception that doesn't count either. Cause you've still killed the stack trace. Jon (43:03.038) Yeah. Allan (43:04.014) to understand C sharp. But I don't know, I keep seeing that. I keep seeing that. I'm like, what? I always ask them, where do you think you should do a try catch? And that sometimes they'll ask me and I'll be like, listen, you do it where you can either a handle the actual exception, like is so for instance, like an in 32 parse, okay. I don't wanna check it, I don't wanna run regex, it's really not that big of a performance concern, try catch it. This is the lazy way, okay? If it, what the hell do you think that's doing underneath the hood? It's the same bloody thing, except they're giving you an out parameter now. Let's not even go down. This is like your, I wanna rock yesterday, geez. So you can, like. Jon (43:40.262) I mean, you can try and try parse it too, but you know. Yeah, I know, I know, but... Allan (44:00.077) totally lost my train of thought on this. But like, just handling the exception is like, I can actually if that in 32 parse fails, just return negative one or zero because that that would have been what was coming out anyways. Right? If a string came through some offensive code, yes, it's not ideal. But who cares? It's zero. And probably chances are that leads to another kind of downstream like, hey, you didn't enter this or you can't have zero. And the user's like, well, I didn't put zero. Right? But it's not a thing that needs to crash out the whole app. So that, that makes sense. It's a place where you can actually handle it. The other one is the try catch goes where the event is triggered. So that can mean a number of things, right? Like for instance, where a command started, right? If I have a command, that's a good place to put a try catch because the user pressed the button or they've done a swipe or something to trigger that command to run. That's a good place for a try. Jon (44:55.526) Yeah, it's a clean, clean boundary because presumably, you know, that's, that's a recoverable boundary, right? You can kind of be like, okay, whatever the thing was trying to do, it didn't work. So like, let's just assume we're back at square one. Allan (45:01.101) Right. Allan (45:07.341) but you know exactly what started it, because your command was hooked up to something. You called your service there to do something, that service called other services, and then it went right somewhere in there, but you have the whole stack trace from where it started. And when you catch it, now you still have, you probably have logging at that top end. And you also now have access to the UI. So you can be like, sorry, something screwed up. We don't know what. Jon (45:11.974) Mm -hmm. Allan (45:35.725) You can even track certain exceptions because it could be as simple as like a task operation canceled or maybe your connections dippy. So you don't want to tell the user, Hey, we error. You might want to say, Hey, your connection looks like crap right now. Sorry. Try again in a minute. Or you can even get smart and try again in a minute for them if you want. Right. But putting try catch at every layer. just to stop, just stop. Just where the event started. Jon (45:55.046) Yeah. Yeah. Jon (46:02.406) do it. Allan (46:05.773) it or where you can manage it. That's all you need. That's all you need. Stop writing. Try catch everywhere. I see them in web API's too. And it's like you have a global exception handler, man. Just, just let it catch it and go off to the app analytics. Just. Jon (46:16.038) Why I always. Jon (46:20.614) I always think it's interesting too, cause like, especially if you, if you talk about the mobile world, like even if sometimes you have, like it's probably pretty rare anymore, but try catch doesn't always save you either depending on what you're trying to do. So, right. Allan (46:32.721) How many times have you seen a tri catch around a main thread call and you're like well that's about to hop out of bounds so I'm glad you caught it but it crashed on a different thread and you didn't trap in there. Jon (46:39.846) Yeah. Jon (46:48.582) Yeah, but even like if you're calling into some, you know, native API there, it might, it might lead you to a point where it's just the native native API is like, no, I'm crashing the app now and done. It hasn't, you know, no say about it. Allan (46:55.564) Native crash. Allan (47:00.588) Yeah, I mean, there's always those panics, right? Like out of memory and stuff. Like if who knows something stupid's happened, like there's cases where it's non recoverable, but those those are rare, right? There's the rare occasions in which case you're still going to get some telemetry downstream. And chances are it is indeed something you've done. But it is what it is. Like I've seen devices run out of memory and those are for freaking weird errors, man. And you're like, well, Jon (47:03.846) Mm -hmm. Jon (47:08.358) Yep. Jon (47:12.262) yeah, yeah. Allan (47:29.58) I don't even know what that is. And then you have to go online because iOS gives you these freaky kind of constants for those big errors. And yet you just have to go look it up and you're like, And that was the point where iOS said, yeah, not even we can recover. The user is screwed right now. Their device is full. So enjoy. We shipped you the telemetry though, so you know. I mean, it just so happens it is in a constant. Jon (47:40.518) yeah. Figure it out. Jon (47:47.782) Hehehehe Jon (47:52.87) Yeah, sorry. Yeah, well, now you have to go track down that user and tell them and give them a little slap. Be like, what are you doing now? Yeah. Allan (48:03.916) If you could catch that because that those those full blow ups like that They usually don't contain much because your app is just like the whole operating system is about to tank It's not gonna do much to help your app at that point. It's like just we'll tell you but yeah, too bad everything else is about to die Jon (48:09.03) No. Allan (48:24.396) You never had one of those? Jon (48:26.278) I'm sure I have a bunch of a bunch of native type things that are I haven't really sorted through yet. So there's probably some in there. Yeah. yeah. Allan (48:33.649) Unhandled they unhandled John. jeez people are expecting you have crash -free code, man Jon (48:39.942) I mean, there's enough users in the app that, I mean, it's not the most heavily used app by any means, but I have enough people that there's enough times where I'm just like, I don't know how you got into this state. So. Allan (48:52.712) Well, that's a positive place to be in, right? As long as you're not getting complaints and like, you know, any flame throwing at you or anything, right? You're okay. Jon (48:55.91) Yeah. Jon (49:01.35) No, people just like to complain about stuff like the colors changing in an app and things like that. So, you know, they're not complaining about the crashes. Allan (49:07.176) Those people have too much too much time on their hands. My God. I don't like the color here. Well. Jon (49:11.238) Yep. Everything changed, no. Allan (49:15.912) Sounds like something my mother would say. Jon (49:17.478) Well, this is the problem. I think my demographic trends on the upper end of the age spectrum. Allan (49:27.336) What do you say, John? Jon (49:27.526) So, and which is partly why I redid a lot of things because I tried to, to after seeing, after seeing how large of font my parents now have on their phones these days, I'm like, I need to make my app be able to accommodate my parents. Right. And like legitimately, like this was a thing that, that we were, that I was seeing too, I'd see screenshots of people that are like, this isn't working. And they weren't like pointing out. Allan (49:38.984) Hehehehe Allan (49:45.128) Yeah? Jon (49:55.59) the layout necessarily, but I'm looking at them like how that's horrible. This, this looks broken and not functional cause you know, you try and put like, I try to put like two things beside each other on the screen, like two labels that sometimes can be a little longer of text, but it would normally still fit. But then if you crank your font up 500%, that's not going to look nice anymore. So I start, you know, I redid enough things that I'm like, okay, like everything should be able to wrap and stuff. And so yeah, Allan (50:11.656) Yeah. Jon (50:24.87) It's, yeah. Allan (50:25.094) You did quite the effort. I remember you even asked me about a few points and you know I make ugly stuff. You know if somebody if I don't have a designer to make it pretty my stuff is going to be ugly. I can do good UX. I can't do pretty UI right. Well and the funny thing is you actually made an effort to see what do you think of this. What do you think and you had like four. I remember you had the four options. It was actually quite pretty. Honestly it was it was a pretty good. So people still complain in a. Jon (50:34.15) Yeah, I mean you can't... You can't please everyone, or anyone usually. Jon (50:49.094) I think it's alright. I think it's alright, but you know. yeah. Allan (50:54.821) See, you don't collect telemetry on them. You flag them and you say this, we don't care about this user. Can't do that, right? Well, you could, because if you're attaching your user to them, which you can in like App Center and Sentry and all that, you can filter them out. Jon (51:02.598) yeah. Yeah, sure. Jon (51:13.766) Yeah, I mean... I'm not gonna. Allan (51:15.397) You won't, but you could, you're fair enough. So, configuration logging, that's pretty straightforward. That's all I got. That's all we got. And the rant on the tri -catch. Please fix your tri -catches. You don't need to do them everywhere. If you're doing it right, you really don't need to do them anywhere. You can even do them at a high -end global error trap. Jon (51:23.238) Is that it? Is that all we got? Yeah, I don't think I have anything else. Jon (51:34.054) Yeah. Jon (51:40.198) yeah, I mean, Allan (51:42.181) Well, you can and your app won't crash. Where you have access to logging in some sort of user interface, you can notify the user this happened. You can do it and make it look not bad. Jon (51:44.39) Sure. Jon (51:51.078) I know you can, I just don't feel like that would be pleasant. Allan (51:55.077) I can show you, it's not bad. Well, when you error, what are you gonna tell them? Hey, there was a glitch in the matrix, we divided by zero and the customer is gonna be like, what does that even mean? Why tell them that? Jon (52:04.806) Well, that's what I do, right? I do the whole like, looks like your phone went swimming. Sorry, don't know what happened. Allan (52:07.909) Here's the... That's pretty good. Actually, you should have one of those error pages for your customers to see that. That would be classic. Jon (52:19.334) Yeah, it's just a pop -up, but it's usually when there's a transient network error or something. And I even use Polly now in some places to, you know, like if it's gonna fail because they've got a bad connection. I want to maybe try a couple of times to do the thing. Allan (52:38.147) I see you're better than I am there. I don't even do that. Jon (52:40.806) Well, I found enough cases that it was, it was happening and people are like, and then they see the error, right. And they just hit the button to try again anyway. So I'm like, well, I may as well do it a couple of times for you. But you know, it's, what's funny with that is actually recently discovered. so I've had issues off and on with like the, I authenticate against a form for some users so that they can use their sign in from there. And cloud flare doesn't always like. the server to server connection happening there. So there was a few things, like one was like, I wasn't. Allan (53:12.803) Okay. Jon (53:18.79) Something with the refer IP address, it was like always coming from the same IP and then I changed it to try and pass through like the actual client that was hitting my server that was then hitting the other one. So that seemed to help. but then I also found out that I had inadvertently wrapped the login attempt in a poly block as well. Like I was kind of using some shared methods to do the posting. Allan (53:30.595) Okay. Allan (53:42.211) Jon (53:45.286) So like if you put the wrong password in it, it was like hammering it like three times in a row, like try this, try this, try this. So like, of course that looks, you know, like a denial of service thing potentially, if there's enough people doing it at once. So yeah, fun, fun times I learned. And I think I found that one from, from doing some logging too, and the breadcrumbs and stuff. I was like, why is it, why is it trying to log in three times? Like within like, Allan (53:53.091) Nice. Allan (54:01.891) you learn. Jon (54:12.71) You know, one second, like people aren't hitting the button that fast. Allan (54:16.547) It's a good thing you don't have an account lockout feature there, because sometimes that'll trigger it, right? Lessons learned. Jon (54:21.894) Yeah, so, yeah, thanks. Thanks to logging. All right, what do we have for our plugin package product? I see a couple things here. I like tossing out something to Sentry. I like Sentry. Yeah, I have to start paying for it, but you know, other than that, maybe we need to see if we can get a sponsor on the show. Allan (54:30.627) Yes. Century's been great. I use them. I use them professionally and personally. They just That's it. Allan (54:44.864) reach out to Bruno he's a nice guy I've talked to him online a few times he's in Toronto you'd think I would have met him by now yeah no but they've tried to get me to come down to their Toronto meetings but they keep giving me like three days notice I'm like dude I got kids you gotta you gotta give me like a week if you give me a week I can make it so Jon (54:46.598) Yeah. Yeah. Is he? I didn't even know that. That's that's so you haven't even or no. Okay. Jon (54:58.726) Mm -hmm. Jon (55:03.046) Yeah. Jon (55:06.694) Okay. Yeah, I forgot that he was Canada way. Hmm. I don't think he's working as much on the Maui part of it these days, but I know he's around Okay Allan (55:11.264) Maybe. Allan (55:16.448) Yeah, maybe we can do like a, we'll do a podcast live at Sentry if they become a sponsor. That's marketing, marketing 101. We both suck at it. Sentry's a good one. Jon (55:22.022) Yeah, there we go. Jon (55:25.83) So Sentry, Sentry is good, like them, not even getting paid or compensated to plug them right now. So that's how good they are. Yep, true. Allan (55:31.872) Yeah, and but we're using them for free. And there's this my my shameless plug. I have the shiny extensions configuration that's for the white labeling puts your config in the assets so you can. Jon (55:40.614) So what? So OK, I was going to say like I forget. Did you do any more optimizations or do I not use it because you didn't? Allan (55:49.664) You don't use it because I didn't make any optimizations and you've already covered that you don't need appsettings .json. You don't need it. I wouldn't use it either. You don't need it. Jon (55:52.646) Okay, that's what I thought. Yeah, I know, but I don't need mediator and I'm thinking about that. Allan (56:01.312) But that's did you do need it? We'll talk about that in a future episode. This is gonna be sexy. That's a good library use it This like the Frank's red hot put that where's my beeper? Where's my beeper put that on everything? Okay, probably not everything but you know where I'm going with it you'll see it's gonna be good Jon (56:07.502) You Jon (56:13.029) yeah. Jon (56:17.222) Maybe, we'll see, we'll see. Yeah. All right. Well, I think that'll do it for today. give the usual spiel. and if you're from Sentry, a five star review would be great, you know, in absence of the, free Sentry usage. I gotta try and find, find a hook in there. Yeah. Yeah. I'll go pay for it. I'm happy to pay for a good product. and if you're not from Sentry, Allan (56:36.444) For my professionally paid app. Jon (56:50.95) you still could leave us a five -star review because we recommended all of the best things to you to go and use, and you should go use Sentry. So yeah, go check us out. gonemobile .io has all the links to the things. You can leave us feedback. You can send an email, do whatever. And we will, actually Alan's been putting the links on the shows now. So I think, you know, they're there. So thank you. Allan (57:15.452) Yes, I went and backfilled a few. You weren't that bad. You stopped at one point. They just stopped going in. So I put them in. Jon (57:21.414) Yeah, I just didn't remember to do it ever. I'm like, I had my routine of like do this, this, this, this, and then I stopped after. So they're there. Allan (57:28.188) That's alright, I'll do it. I'll go enter them once this episode's created. No problem. Jon (57:32.358) Alright, sounds good. Well, thanks all. We will see you next time again. Allan (57:37.148) Bye everybody.