Jon (00:06.062) Hello everybody, welcome back to Gone Mobile. Well, actually this one's probably two episodes after. We missed a week in there for Canada Day. Allan (00:15.15) Yay. Well, did we or did you just not upload the audio and it just didn't get released? Jon (00:21.038) Well, I was a boot too, but you know, no, yeah. Allan (00:25.007) Don't feed the beast right I hear that one all the time. They look you say a boot all of the Americans I'm like dude. I'm saying about I don't know what you're hearing David does the same thing David all the time every time I talk to him. He's like hey, it's a boot and I'm like, well first of all, I don't say a have you ever said a John, what are you doing? Jon (00:30.542) Yeah. Jon (00:35.726) What you're hearing is wrong. Jon (00:44.558) I think I do sometimes. I, I not on purpose. I mean, it's just living, living that one out, but the thing is, and you're not that, I mean, you're, you're farther north than me by a bit, but not like a crazy amount. I mean, you're more East than North or maybe Northeast perfectly almost. Yeah. So, but, but if you, if you think about like how much of the U S like you're saying, yeah, David might say a boot more than we do. Allan (01:02.574) Yeah. Just like a pinch, yeah. Jon (01:14.094) how much of the the kind of Midwest is about this about see I said about about how much of the Midwest is actually you know at the same like northern point as us and I think that's more that's more how the the sounds come out then you know US versus Canada Allan (01:18.99) Yeah. Yeah. Allan (01:33.007) I do know if you head to like Newfoundland or something, they have like their own verbiage. Jon (01:37.038) But that's that's totally different than the stereotype jokes, right? Like that's I nobody yeah, that's wild to understand Yeah Allan (01:40.815) yeah, it must be a D - It's a different language. Okay, so if you're if you're judging Canadian based on how John and I speak Quebec, obviously they're French. So their English sounds different. And when they speak English and Newfoundland is I don't know that some of the people that I've talked to there, I don't know. I'm like, dude, I don't know what you're saying to me right now. Jon (01:55.054) Mm -hmm. Jon (02:02.83) It's its own thing. Yeah, and then like manitoba, you know sounds like that, right? yeah, but Allan (02:09.774) Yeah, yep. Manitoba. You know what it is? Because on hockey night in Canada, so I think I think sometimes they get our hockey feed. And there's a guy on there that talks and he is very stereotypical Canadian. I don't know if you know who I'm talking to. I forget his name, but he comes on. He's an old hockey player and it's like, my God, dude, you're like you're stereotyping us like right now. You are bad. Jon (02:20.462) Yeah. Jon (02:28.462) I think, yeah, yeah, yeah. It's been a while. Jon (02:37.582) You're giving everyone all of the fodder that they need, right? Allan (02:41.422) Exactly, exactly. So we don't we don't we don't hear it. Besides, if I go into programming terms, let me make fun of some of the American stereotypes I hear. You've picked them up, unfortunately. Jon (02:46.542) Why? Jon (02:52.27) Yeah. Well, so the thing about where I am is I, I play both cards, you know, both, both sides of the fence kind of thing, because I'm surrounded by the U S and so, you know, when I, when it's to my advantage, when I'm around my American friends, I'm like, Hey, I'm basically American. Like I'm, you know, I'm one of you. Cause I just live right, right by America. And then of course, when I, you know, in the rest of the world, I'm like, well, I'm not American. I'm Canadian. You know, thanks. so I, I kinda, you know, use that one to my advantage. And because of that, yeah, I probably pick up on some of the stuff because I am like growing up TV stations and everything, right? We're all from Detroit. So. Allan (03:34.671) yeah, well we don't watch CBC, the Canadian broadcasting... it's awful. Jon (03:39.118) Well, no, I mean, and you probably had stuff from coming in from Buffalo all the time too, right? So kind of the same idea. Yeah. Allan (03:44.207) Yeah, yeah, yep. There was one one joke I did want to make and I hear this all the time for my American colleagues or anybody I work with and they say enums. I'm like dude enum number do you say number or do you say number enum not enums. Jon (03:56.814) Enum, yeah. Jon (04:01.678) I think I, I, that's a funny one. Cause I know I used to know, I know I used to say, you know, and then I think I, yeah, I was just around enough people that are like enum. And then that just became what I say. Allan (04:06.575) Yeah, you f - Allan (04:14.223) Yeah, you've popped it a few times and I've been like, what are you saying to me right now, John? Jon (04:17.806) Hey, I still tried to often spell color with a U, so I got that at least. Allan (04:23.119) Okay, good, good, good. Don't lose the heritage. All right, so we've talked about a lot about Canada and people saying enums. What are we talking about today? Jon (04:26.19) Yeah. Jon (04:31.534) Mm -hmm. Mm -hmm. Well, I was a little concerned when I saw the title I wasn't sure if we'd have to put the explicit You know flag on the episode like something about back ends Allan (04:42.767) Okay, marketing is not my strong point and I could do far worse, let's be honest. John is frequently, our rating means like, dude, you can't say that. I'm like, okay, okay. So it is called the backends. We're talking about the backends. Okay. So today we're talking about the backend, the stuff that drives our apps. Our apps. Jon (04:46.606) Hehehe yeah, no, you could. Yeah. Okay. Take off. Jon (05:08.526) Yeah. Okay. Well, what drives your app? Allan (05:12.975) Well, I mean, obviously as .NET people, you know, we're right in ASP .NET Core, right? At least I am. You are too. I know you are. Jon (05:20.718) Yeah, yeah, no. Yeah, I mean, that's, that's probably been like the, the most, dotnet thing with longevity, you know, that of all dotnet things is just like writing the web parts of things and dotnet. But for a while it was kind of, you know, ASP net kind of meant more on the client side, like angular and all that fun stuff too. Right. But we're yeah. Yeah. But, but we're not talking about the client. Allan (05:37.23) Yeah, it was a bit janky. Allan (05:43.694) web forums and MVC and we've come a long way. MVC is almost back with a bang, right? Because it's a blazer now. But we're not talking about that. Jon (05:50.478) Yeah, absolutely. But yeah, we're, we're not talking about client. We're talking about the back ends. And so yes, dotnet all the way, you know, API controllers. I'm still honestly like my, my app is done in dotnet on the backend too. And I, I, there's been so many changes to like how API controllers and all that stuff work. I feel like, and maybe not, there's been a lot of change, but maybe like not really has that much has actually changed under the hood. I still seem to somehow figure out how to make stuff work, but I feel like, you know, all of the, I never know if I'm doing it right. Basically like is my controller have the right return type? Can I do this or that with it? so that one's always confused me. Allan (06:33.485) Well, they still have controllers, right? But now they like minimal APIs, right? I think it's just because it's easy to get going. Like you don't need the fancy plumbing. Jon (06:36.014) Yeah. Jon (06:42.286) Well, there's minimal APIs. Yeah, you don't need as much of that, but there's also like, I don't have it open, but I don't know. Is action result, is IActionResult still the thing to do? Is it? Okay, okay. Allan (06:54.189) Yep. Yeah, because it, well, there's other ways you can control kind of the return type, like you can mark it with attributes. Jon (07:01.934) Okay. And they've done more, I guess, to try and make like some of that stuff work implicitly, I suppose. Is that, is that the case? Like I can return just an object it seems like, and then they'll do the right thing. Okay. Allan (07:07.135) Yep. Allan (07:10.988) Yep. Yep. And they do that more for like the swagger or the open API. Open API actually is what we should say now because swagger is well, I mean, Microsoft's been using it for years and it's going away now. So it's open API. Open API is the cool thing. And so they do all that, all those attributes and stuff and the I action result is kind of just a roundabout way of getting to something that defines a type. Jon (07:17.358) Mm -hmm. Mm -hmm. Jon (07:25.102) Yeah, okay. Yeah. Right. Jon (07:39.054) Mm -hmm. Allan (07:39.884) So it doesn't really matter. One way or the other, you're going to get a type. Return a task with a type, put an attribute on it, and return that type as an action result. Jon (07:50.478) And I actually was looking at recently and I'm you know, this is just more kind of I guess Syntactic sugar or stuff around all of that that part of it. I started looking at What was I looking at this for? I was I was looking at doing some like open AI Stuff, you know got to get all the chat GPTs and in all of the things and so making my like web API be the thing that talks to chat GPT for all the hopefully obvious reasons of security and stuff. And then having that send stuff back to my client, right? And so I started looking at like streaming results back because I wanted to like get that kind of chat stream coming back because I want my app to be able to say like, hey, here's the current state of my pool's chemical levels. Like, what do you want me to do here? And then it's going to be like, blah, blah, blah, do this, do this, do this. Allan (08:43.883) You wanted it to look like that it's being typed. Is that what you're saying? Or just return the result as it's coming in. Jon (08:46.51) I mean, yeah, more the return results as they're coming in just in case it's like take, I don't know. I feel like that would be a nicer experience than like seeing this big like just spinning thing and then all of a sudden like all the stuff on your screen at once. Allan (09:03.884) You know that it returns the result as one solid object, but then you can... Like even Chatbeat GPT does that. They put that delay in so it looks like you're talking to somebody. Because if you just hit enter or something and it goes, here you go, I'll shut up now. Jon (09:09.454) No, they have a streaming. Jon (09:15.118) Yeah, yeah, that's fine. But their API, yeah, their API has like a streaming aspect to it if you want to do it that way. So I assume you can do that. I think that's what I was using. And as best as I could tell, I think in like .NET 5 or maybe 6, they added support for like streaming the JSON back in whatever the way clients expect JSON to be streamed so that you're not. Allan (09:23.852) Okay. All right. So you're returning an async enumerable. Jon (09:44.238) You don't have to have the whole JSON document at once basically, right? Yeah. Yeah. Allan (09:44.557) Okay. Yep. No, it's a smart way of doing it. By the way, I just found a hypocrisy in my enums. Do you call them enumerators? Jon (09:53.518) Mm. Yeah, they're not enumerators. yeah. Allan (09:58.06) Damn, yeah. eat foot. Okay, well, all right. We're burned. That's all right. I can live with that. It's still an enum. Yeah, no, no enumerators. Enumerators, okay. That's cool. So, you got OpenAPI. You're using OpenAPI to generate or to define your contracts. Are you generating your objects yet? Are you cool? Are you just? Jon (10:06.126) Yeah, I guess I guess that's it we may as well just end the podcast right now stop producing episodes Yeah Mm -hmm. Jon (10:25.902) generating like, like what? No, I mean, so I, I think you've told me I shouldn't do this before, but at my, my object model is shared between like my. Dotnet code to implement my objects are is shared between my client and my server. So. Allan (10:33.227) Allan (10:42.956) Well, you know, it's your app. So I always say like do what works for you. If it's one app and you're the owner, you can get away with it. But in a big project, yeah, I'd probably have to give you a backhand because somebody will abuse that. Right. Or you need it to go to a local data store or I don't know. It's not supposed to hop tears. And if it does, then you'll just kind of have to deal with that later if it becomes a problem. Jon (11:03.47) Yeah. Wow. Allan (11:12.587) which you've been looking at offline. So it's kind of starting to show its face at you, is it not? Jon (11:16.206) But it's no, it's been fine. I mean, like my, my models are pretty simple. And so like, if I, like, I guess, you know, give me an example of, of, yeah. Allan (11:26.571) when that'll hit you. If you have to sync data to and from and the data can be updated. Jon (11:33.87) Yeah, but it's just data objects that like it's just a class, right? It's just a container Allan (11:41.418) Yeah, yeah, but there's there's what if you want to mark some stuff on it for SQLite or what if you want to mark some stuff on it for whatever that light DB or using I don't know if that does I use attributes. Jon (11:48.174) Yeah. Jon (11:52.014) Okay, maybe there might be one, is there one case now? No, no, that's a, that's a different part. I'm trying to think if there is, if I could actually prove you right by something that I was adding recently, but that's not, that's not the case. Allan (12:04.266) You don't need to prove me right. Whatever works. Again, you're the lone app developer. It works for you. In big teams, it can become an issue. Jon (12:08.398) Yeah. I mean, I would probably do, yeah, no, that's, that's fair. And I would probably do the evil thing of like, if I need something that SQLite only cares about, you know, I just add the property and then the server would just ignore it. And I would know that I ignore it. But of course, if somebody's working on the server, they don't, they don't know that that's there for one side and not the other. And yeah, I can, I can see what you're saying. Allan (12:31.498) You know where this really did become an issue is because we used to make a contracts library, like a C sharp library that contained all the Paco's plain old C sharp objects, if you want the full terminology. So we'd make that and that would be shared between server and client. The problem is the client would be like, I want to put this in a SQL SQLite database. So SQLite, you know, we love that library. Frank Krueger made it. It's great. Jon (12:38.382) Mm -hmm. Jon (12:43.15) Mm -hmm. Mm -hmm. Allan (12:59.85) but he's big on attributes, he doesn't like the external mapping. Okay, that's fine. So what people would do is put SQLite on the thing, mark the attributes and you'd have like this kind of now dirty, not Paco library. Jon (13:12.046) Yeah, which is why I didn't actually use that library myself here either, because I didn't want to have one. So there is an instance where I could have done it if I wasn't sharing. It would have been more natural to do it. Allan (13:25.93) Well now the fun thing is about open API and we've had this for several years, but now we, we basically end up, I don't want to say duplicating, but generating our object classes out of like, out of the open API spec or swagger before. And so you generate all the contracts. So essentially your contracts were built for the thing you're using them in and they were and they still existed in the API, but they were two separate beings. And I mean, that now it's great because now technically these are my, I generated them, I can destroy them. But if you generate them again, then it might wipe out your stuff. So then you get into partials and all that mess. So it just pick your poison, I guess. Now are you generating your objects now? Like a, like a, like a cool guy? Jon (13:56.462) Right. Jon (14:09.838) Mm -hmm. Jon (14:14.222) Yeah, yeah, fair. Jon (14:18.99) No, I mean, well, I have them. I don't really change them a lot these days. Like so. Allan (14:20.682) No, you're typing them all out by hand. Allan (14:26.122) All right. Do you share the contracts? Are you doing the old school way that I just mentioned? Okay. Jon (14:31.662) Yeah, that's what I mean. Those objects are attributed with some JSON attributes, and that's kind of it. And then those just come down from my server, and they're what I use in the app. And I shove those into SQLite, and everything's good. Allan (14:48.458) So that can become an issue for teams for sure. And the reason is, is you might have a backend team writing all this junk. I don't want to say junk, all these, these things, all these contracts that come back and you need to be able to keep up. And I don't want to keep updating a new get package like every five minutes because they're like, Hey, we just had another type. So now the cool kid way to do it is they keep changing this Microsoft, you know, they keep moving the posts on us. You gotta tell them to stop John. Jon (14:51.406) Yeah. Jon (14:58.094) Hmm. Jon (15:07.694) yeah. Jon (15:16.11) Well, you gotta, I mean, you gotta keep people upgrading, right? Allan (15:17.771) Get in there for us. Allan (15:21.962) So they released this thing for OpenAI called Kioda. I don't even know if I'm saying that right. Maybe. Jon (15:27.694) Open API right not open AI. We said open a I just I just want to clarify for people in case they're like, it's chat GPT related. No, no, no. Yeah. Allan (15:33.174) Okay I didn't put the... no I didn't put the P in. It's hard come on man this is like it's like one syllable one letter off. Drives me nuts. I'm getting old. Can't remember all these these acronyms anymore. Yeah okay thanks thanks. So this Kyoto thing came out. This is the new popular... well I don't want to say popular because... Jon (15:41.294) Yeah, no, I hear you. I probably have done it too. Yeah, see you now. Yeah, I hear you. Allan (15:58.537) but it's the new way that Microsoft's kind of putting it out there. And you bring all these flipping libraries and then it's like these arguments go through a dictionary. dude, I'm not feeling it. I'm not feeling it. Jon (16:01.262) Mm -hmm. Jon (16:08.814) So that generates it from the open API definition, but what, like I guess, you know, somewhere along the line, like you've got to define that thing that you're returning somewhere. Like how does it? Allan (16:22.569) Yeah, but it would be it would be in the API because the API has that that whole contract so you can still go into swagger and it'll say I'm going to return this. Jon (16:30.446) OK, so say I have an API controller that returns a person object and that person object has a name, first name, last name, phone number, whatever, a bunch of properties. I still have to create that like on the server side then, right? And then open API is like, I'll create a new. Person class based on the open API definition that your server generated from the Allan (16:36.36) Yep. Allan (16:46.952) Yes. Yeah. like a definition. Allan (16:59.912) Yes. Jon (17:00.046) person type that you're returning from that API. Okay. Allan (17:02.504) Yes, and it's returning. It's generating two things. It's generating your contract to get like to call that API. So it's like, here's the endpoint and then it's generated in contract, which is quite beautiful, right? So as your team is changing it, you just go run a command line. It updates it in your project. Boom. You can set the namespace, the class name, all that cool stuff. It works great. Jon (17:08.686) Right. Jon (17:21.774) Yeah, yeah. As long as you're, you're not, well, I guess, yeah, it presumably it's generating a good open API spec because I know if the open API spec isn't good, is not going to get, you know, crap in, crap out. It's not going to. Allan (17:33.255) Hehehehe Allan (17:38.087) Well, I think Yoda is still... Beta -ish? Jon (17:42.83) Yeah, so what I'm getting at is a while back I was trying to do some stuff around like Apple's App Store Connect API. They have a rest API. They publish an open API spec. Allan (17:46.087) Yeah Allan (17:52.519) Not fair. Yeah, not fair. You know why we'll get there. Because Apple doesn't do anything by a flipping standard ever. All of their APIs are like, how did we get here? Jon (17:58.798) No, I don't. Yeah, exactly. So like it, it. It works, you know, like it generates, like I think I used Kyoto at one point to do it a while back. Yeah. It, yeah. Yeah. It worked and I, and I used it, but then it's just like, Apple, like Allan (18:10.279) No, you did try it, but I remember I was trying to get you into my favorite. Allan (18:24.455) They don't do anything. Apple never does anything by the book. They're like, hey, there's our standards and then there's the rest of the world. So their APIs. Jon (18:30.798) And you're holding it wrong, so ours is correct. Allan (18:35.527) And well, in APNs is still, even though it's HTTP, I'm like, Jon (18:39.278) is it, is it HTTP three? Now I haven't followed along. I've, I've, I've got PTSD from dealing with that. Allan (18:44.808) The good part is that that doesn't really affect us too much, but the way they do their REST APIs, it's like, here's this dynamic object. And then we add, we clip on all this metadata everywhere. And you're like, okay, why have a contract? Hey, okay. Jon (18:53.294) Right. Jon (19:00.75) Yeah, exactly. So the thing you were trying to get me to use, I tried with their thing and it failed horribly, unfortunately. It was pretty bad. Well, but it didn't work. At least Kyoto gave me something that worked, technically. Allan (19:07.463) Yes. Well, it didn't do bad. It didn't do bad, but it didn't do great. Allan (19:17.993) So I'm a big fan of something called Refit. And Refit is like part of the reactive UI group. So you can follow why I used it. But I think a lot of people use it anyways. Yeah. Jon (19:29.07) Well, refit's cool. Like it was a thing way back in the day and I remember using it in Xamarin, you know, early Xamarin days to generate the API client for me and stuff. It was great. I liked it. I liked the idea of it. Yep. Allan (19:39.112) Yep. Yeah, it did all the best practices on HTTP client, it kind of generated all that fluff. And now it's been moved to source generators, it's still doing all that stuff. And it just it works fantastic. But another tool came out called refitter. And refitter I like because now it generates not only does it generate the contracts, it generates a refit contract that I can look at kind of muck with it if I need to. Jon (19:46.734) Mm -hmm. Allan (20:08.297) right? Because it generates partials and it just works and it's beautiful because I could still have all the power of refit because there's a lot more than just source generation for refit. It does the whole whole darn thing and I'm like yes yes okay. Jon (20:10.734) Mm -hmm. Jon (20:21.87) So that begs the question that, you know, in, I don't know how old is refitted. It's been a few years since it was out and now there's refitter. So how, how, how many years though, before we get refitist? Allan (20:29.896) Version 7. Yep and refitters like a CLI like it's there. It's Allan (20:41.08) that's what you were doing. You were looking for the button to make the sound nice. Canadian humor at its best. You're just feeding the beast. Jon (20:43.374) Yeah, I was, yeah. Come on. Yeah, I had to do it. But no, so yeah, it's a tool. It's more like an add -on to refit, right? Because it's like a tool to generate the refit code to use, essentially. Right? So it's a generator for the generator. Yeah. Allan (20:50.664) Okay. Allan (20:55.016) Yes. Allan (21:00.168) to generate more code at build time and. But it's beautiful. Refit is beautiful for many, many reasons to be on the source generation and I still use it. I've been using it for years. It's fantastic. Now. Jon (21:15.566) So, so refit's cool. Yeah. You were going to say something else about refit. Okay. So. Allan (21:19.144) No, I'm done with refit. Refit's cool. So I was going to ask you next, do you do resiliency on your calls? Do you? Jon (21:24.846) Yeah. So then, and when we're talking, we're talking about this, like, you know, we're talking about the back ends, right? But this is kind of like your backend that might be calling something else, right? Some other API. Cause that's, that's a pretty common thing. you might be, you might be calling it from your client too, but like, do you, do you not run into that a lot where you're calling services between services? Okay. Allan (21:39.336) Yep. I don't do resiliency on the server. Yeah, I do, but I don't do resiliency on the server. Jon (21:47.758) Yeah, no, that's that's fair. I don't really either there because yeah, if it's I don't know if it's gonna fail like I don't want the server chugging away retrying like that's a client side thing to have an opinion on right. I'll just pass through the air to the client. The client can decide if it wants to retry or not. Allan (21:59.176) Yep. So I. Allan (22:06.28) And I think for a lot of the funny part is that people go, well, you don't use resiliency on your apps. Like I don't put Polly in any of the templates. I haven't put it in my new meat meat eater library. I have resiliency there. No. And the reason is because most of my apps, I always have some sort of offline version. And if I'm doing offline, like in any aspect, I'm always hitting the database and then the database is being synchronized. I'm never hitting the API directly. And that's just a technique I've been using for years. Jon (22:14.446) So you don't use poly, huh? Why not? Jon (22:28.91) Mm -hmm. Jon (22:32.814) Right. Allan (22:36.296) because it's nice and zippy. And sure, I can force a retry, but I'm not going to make the user sit there and wait. Jon (22:37.774) Mm -hmm. Jon (22:43.47) So what do you do in a case where like, okay, you're trying to save something and really the app kind of needs to block on that happening. And it's before the user can do something else. Like you just kind of say, hey, it didn't work. And then they can hit the button again. Allan (22:56.615) Yeah, for saving and stuff. That's what I try to do because then you know, there's a there's so many things that can go wrong with resiliency. Like in Jon (23:05.038) do you want a good example? First hand example? Yeah. So I, I, I've been using it in my app for a long time using poly. And so often it's like, if I'm going to save some data, I, I, because people are using this with their pool, it seems like often enough they're like out by their equipment where the wifi connection is real janky. Maybe, you know, that it's going back and forth to cellular. So I'm like, Allan (23:09.159) Yeah, go for it. Jon (23:32.75) I had enough people that are like, this is a problem. I have to hit the button. And after a couple of times it works. I'm like, okay, let's just, it's not that big of a deal to have it try, you know, two times even before I throw up the air, right? Like give it the old extra effort. So I put that in in a lot of places and somewhere along the line. And I didn't realize this until kind of recently. I actually, the way that my authentication works, one of my login providers is, Allan (23:35.878) Hehehe Jon (24:00.142) to the server, but then like the server talks to another auth provider and it's all like, auth kind of based and whatever, which is not an uncommon setup. But the other server it talks to, we've had problems with it, like thinking that the API server is like, that's, you know, doing some DDoS attack. So like CloudFlare is like really picky and it was like, because now they're looking at the user agent that is coming from the server is not like. It's not something that expects. And so it's like, no, drop it. It looks suspicious, right? Anyway, we fixed that up, but then we were still having some problems with this. And then it turns out one of the things I think that was aggravating this was I didn't realize that my resiliency, the poly stuff was, I had abstracted it away enough in my client code that it was trying logins multiple times, even though it might be like you typed in the wrong password. And it's like, let me try doing that three times. Allan (24:32.869) Ha ha ha ha. Allan (24:54.437) So. Jon (24:58.318) It's like, it's not gonna work every time, anytime. So that was a good example of a problem that you can run into where I'm like, yeah. Yeah, that was the problem, right? It was like, it was some generic like do this post to a API, give me the type, the request and response type and wrap that in a poly policy and don't use that one for the login call. Allan (25:06.437) Did you and you had that buried deep did you? The poly stuff? Allan (25:22.597) Well, you know, it's funny because the other part that I tend to see is that if it retries, and it still did get to the server, like the request, it's just the client didn't get the kickback or the timeout happened before it got the kickback. It tends to send it twice. So now you've got like duplicate objects. There's ways to fix that, right? You can mark it with a unique identifier and the whole yeah, but that would happen where it would send it twice. Jon (25:36.11) Right. Jon (25:43.662) Yeah. Allan (25:52.581) And do you know how many people like I work with a lot of young devs and nothing against them, but they don't really know async like these server devs that come in, they're interns. I'm like, dude, he didn't use a cancellation token. I'm like, nobody else is. Okay. Well, do you know what it's for? I assumed if the user closed the browser or the connection failed, right? So you got to use it because if he disconnects, maybe the transaction is no longer any good because it doesn't kick back. Jon (26:00.174) Yeah. Jon (26:15.502) Yeah. Allan (26:23.172) So they were just like, yeah, we ignored it. And I'm like, okay, well, now you created two objects because it's not. Thanks. Thanks. Jon (26:32.174) And if you have a can, like that's always funny, right? Cause that I always think the hardest part of like properly using cancellation tokens is like starting from the top of the API design, right? Or like the most, like the first like entry points, right? And then flowing that through. But if you have, if someone's giving you a cancellation token, that's gold. Like just, yeah, I have this, I can use it. This is great. It's, you know, it's the cases where it's like, Allan (26:52.164) Just use it. Jon (26:58.35) Really? I'd like a cancellation token and no one's giving me one that that gives me the bad feelings, but yeah. Allan (27:01.636) Hehehehe Well and I find that in a lot of APIs too right there's no cancellation token which is again another one the reasons I have love for Rx because you kind of get it implicitly but Jon (27:15.982) Yeah, okay. Kind of forces the issue. Allan (27:19.204) Yeah, well if the subscription dies before it gets there, throw it away. So, okay, we've talked about how we generate. We've talked about resiliency a bit. What about GraphQL OData? Do you ever use that? Jon (27:23.246) Yeah. Jon (27:34.734) yeah. No, I don't. I have, I've used OData. I haven't done, I mean, I've done GraphQL from like a client perspective. I've never tried to shove GraphQL, you know, as a, like exposing my endpoint via GraphQL. that has always felt like a lot of extra work that I didn't really want to do. and, but in same with OData, like, I mean, I know, like, I think at some point there was, you kind of got it for, for free quote unquote, if you did things a certain way. Allan (27:50.179) Okay. Jon (28:04.654) Yeah, but it's, I just, it felt like building up on top of some, you know, standard and adding more work compared to the value I was getting from it. Like I'm not usually producing these things for other people to consume, right? Allan (28:04.867) Yeah. Allan (28:16.867) Nope. Right. And that's a good point. I mean, I've used, I've played with GraphQL. I haven't done it in a production setting yet. But when we talk about like customer facing API, so like, let's say you've got an integration point, it can make sense. But I've used OData in a production setting where a customer could do their thing. And do you know what I spent most of the time doing at that point? Can you take a guess? Any guesses? Jon (28:32.43) Yeah. Mm -hmm. Yeah, for sure. Jon (28:49.358) Hmm. Allan (28:52.002) Really, really easy. Preventing them from DDoSing us to death, right? Because OData doesn't necessarily, well, didn't, I still don't think it does, because you can let it go wild, right? So you lose control of like the standard endpoint, you can be like, dude, this is what you're getting. Like, you know, the arguments. Jon (28:52.366) I mean. Jon (29:10.734) Right, like you're going to give me these parameters because I need these to filter down some massive queries so you don't try and return the whole database. Allan (29:18.291) Right, right. And people would, right? And you could, then they started releasing, okay, you can set a maximum of like 300, for example. Okay, well, that's still a lot of bandwidth to use. That's fine. But what would happen is we'd always be doing these things then sort. You were a database guy, right? You know, when you get into order buys and you're like, we didn't put the right includes for that order buy and. Jon (29:21.486) Yeah. Jon (29:27.598) Yeah. Jon (29:36.27) Yeah. yeah. Yeah, nobody will ever try and sort by this field. Allan (29:45.41) Right. And so you'd start seeing them there. So you spent more time dealing with the security because the security was also dangerous to wear clauses. You know, there's there's stuff you can go out there. You have to think. And then there was the indexing of hitting the database and there was like, OK, don't return the database. Don't use all the available bandwidth. So you spent more time dealing with that than just working with the data. Jon (29:57.134) Yeah. Yeah. Jon (30:07.758) Mm -hmm. Jon (30:14.542) Right. So yeah, yeah. You're trying to create this like whole kind of generic way for people to get whatever they want from it five different ways. When really, you know, if you just kind of said like, well, what, what are you trying to get from this? And then, okay, give me this and I'll get you exactly that answer. And it'll take, you know, an hour to implement. Yeah. Allan (30:25.73) This is what you get. Allan (30:32.901) Yes. Minutes. Yeah. The hour is basically it took me five minutes to code it. Then it went through DevOps. Then it went through release and then it went through a manager and then it hit the server. Right. So. Jon (30:41.742) Right. Yeah. And it's easier like from a consuming it perspective. It's like, if I have just this O data, I know I'm always thinking at that point about kind of the stuff that you were trying to guard against, which is like, well, if I, if I do it like this, is that going to return like way more data than, you know, than I need to let and not so much because I care about the service I'm hitting, but more like I want my stuff to be fast. Right? So I'm, I'm having to think through more of like, if I want this very specific scenario, How do I do this well? How do I do it the best way versus just if you have the API, it's like, yeah, here's the things that I'm able to do. I can just do it and be done. Allan (31:23.808) Yeah. Well, and the funny thing is, is that we also start to put on these magic handcuffs of like, you can only return 300 records. And for a mobile app, I mean, here's the thing, we've got paging, we've got all that good stuff, the skip, you know, run through these pages, but people generally tend to send that pretty small because back in the DOM days when we did like web forums and ASP .net, the DOM sucked, right? You rendered Jon (31:31.758) Mm -hmm. Allan (31:52.256) or 300 items to a drop down because those weren't virtual yet. It would render all that to the DOM immediately and it would be it would suck right to consume even like five or six thousand records you're talking about like anywhere between 20 to 100k that's nothing right Jon (31:54.606) Yeah, yeah. Jon (32:12.27) Yeah, it's not a lot of data to push through. It's just... Allan (32:14.624) And if you're using a virtualized collection view, this doesn't change the equation at all. It saves you some server, right? Call it once, just be done with it. Boom. So, you know, those are kind of some of the things that people try to calm down with OData and it's like, okay, well, let's just calm down the querying, fix the indexes and return to straight endpoints. Now, GraphQL is a bit different. It allows you to really control that stuff. Jon (32:40.846) Yeah. Allan (32:45.441) but it's pretty hard to understand how all the join points, like it's a pretty rich specification. And I've heard a lot of people have success with it and I've heard a lot of people have not so much success with it. Jon (32:51.054) Yeah. Jon (32:59.15) Well, and I think when you're doing, like if you're a massive set of data, like if you're GitHub, like yeah, GraphQL makes sense to invest in and implement, but because there's just, there's so much data and it's an okay way to consume it for a lot of consumers. But like if you're, yeah, if you're just doing it, I mean, if you're just doing it for your own app, like why, if you're doing it for a customer facing thing, like yeah, maybe. Allan (33:06.56) Yeah. Allan (33:24.416) They do things a bit differently though. They're really good about throttling you. So you can make the big call but they can be like, no, you don't. So they've got some really good throttling mechanisms. But that can suck too, right? Because it depends on how you throttle. Now, usually with the GitHub client or that GraphQL, you're hitting it from like a server or like, you're not really doing it from a backend. You're probably doing it from like a client. Jon (33:31.086) Yeah. Allan (33:52.768) facing app and you've integrated somehow because it needs like a GitHub token and all that stuff, right? So, but they're able to throttle at that level, right? On the server, if you're doing it for a whole bunch of people, it'll slow you down from pulling too much. Jon (33:52.814) Yeah. Jon (34:01.678) Yeah, exactly. Jon (34:08.462) Yeah, no, I'm a pretty big fan of more purpose built stuff. And unless there's like, it's kind of one of, to me, it's like one of those, you know, premature optimizations, right? It's like, don't do this until you know that you actually need to do it. Allan (34:22.496) Yep. And that kind of brings us to our good point. So I tend to build, I've been big on this vertical slice thing. I've been big on it for a while, but I've kind of come back to it. For the server for several years, one of our, one of kind of the big .net community guys on the server, he's been an end service bus advocate for light years. He wrote AutoMapper. Jon (34:25.678) Hmm. Jon (34:43.598) Mm -hmm. Allan (34:49.76) and he's written a thing called Mediate R mediator. His name is Jimmy Bogard and I've been using Mediate R for quite some time. It's really good at kind of Jon (34:54.382) Mm -hmm. Jon (35:02.541) I mean, you know how it's dated by the naming convention, right? When everything was like, let's drop the vowel between, yeah, exactly. Allan (35:06.304) Well, signal are and. But it's it's fantastic. It's a small. It's a small little thing, just like automapper was. But then people found ways to use automapper and now it's like the devil. And I'm pretty sure the original intent was to take a DTO or data transit object from your API and map it through to a service bus call, right? Because there'd obviously be differences between the two. Jon (35:12.718) That's how you know it's proven. Jon (35:18.926) Yeah. Allan (35:33.568) There's usually more data you feed to it like the user ID, which shouldn't be coming from your DTO. And so you bolt that on to your object before you'd send it to the service bus for processing. So that I'm pretty sure was the original intent and people are like, hey, we can use this for any framework and solve real piece with automapper. And now it's like the devil and people are like, I hate this thing. It sucks. What were you thinking? And it's like, well, the original intent was fine. You abused it. Jon (35:36.622) Mm -hmm. Jon (35:51.246) yeah. That's right. Jon (35:59.79) Yeah. Allan (36:03.903) So mediator is kind of the same thing. People are like, what's the point? The point to it is for me is that it's very easy to pull it apart later when you get it. You know, everybody wants to write microservices right away. And because it's the cool thing to do and it's like, okay, you've made a mess of something that gets like five users, right? And mediator is not hard to get. Like it's not an over engineered problem. You can make it that way, but you can start small. Jon (36:16.782) Mm -hmm. Jon (36:23.182) Yeah, yeah. Allan (36:32.703) and expand it out really quickly, like super quick. And so you can get to a microservice point. So if you've got one set of endpoints, we're like, my God, it's like 99 % of our traffic, you can unbolt it, put it in a separate service and scale it that way. So it's a, it's a, Jon (36:49.934) So does it does it help you like like how what's the mechanism at that point that you're you're kind of routing things I guess. Allan (36:57.791) Well, you still end up using like you still come in with the standard controller or minimal API. But what it does is instead of calling a method directly, you're passing an object like a request object and you're saying, I don't care who handles this, somebody handle it. If you don't, I'll throw an error. Right? So it's just like a, it's like, it's, it's not, I don't want to say pub sub. but it kind of is in that way. Like you, you pump a message out and hope that somebody's going to handle it. There should only be one handler. Jon (37:19.118) Right. Allan (37:26.302) and you hand it off and get a result, right? You can use some cool generics to control that flow. Maybe it's a one way command, et cetera. And it just does that. The other thing that a mediation type pattern does is it allows for events. So you can keep it all tightly bound, but kind of request response and eventing is the whole purpose of the service bus. So if you do it locally, again, very easy to break out. And an event might be something like, hey, I just created an order. You know, maybe I've got one that's listening for email to send email. So, hey, order created, send email. Another event is like, hey, send an SMS to tell the guy we just were shipping it, et cetera. So it does all those cool things, right? And it allows for a very broken up kind of approach that you can truly break up into microservices later. So I love to tell people, start small, start with a modular monolith. That's the popular term these days. Jon (37:59.79) Mm -hmm. Mm -hmm. Allan (38:24.253) and use this because it's not over engineering. It's very easy to use. It really focuses on the problem, right? So you have like a handler. Jon (38:30.382) Yeah, there's, there's not a lot to it. Yeah. It's kind of a really simple, you know, simple like categories of things, right? It's it's yeah. I like it. Allan (38:39.005) Right. So controller, you might have like an order controller and it has a create, it has a get, it has, I don't know, what other things does an order have? It has several, several mechanisms, maybe a ship, right? So when we talk about mediator, it's like, I give it a reorder created or order create request. And it's going to do the thing and it might turn return an order result to say, here's your order number, blah, blah, blah, blah, blah. And then it might publish an event in the backend that we're not waiting for. And, but your order created handler is only to handle orders, order creation. So you can really focus on what needs to be dependency injected, right? What things need to happen from there, like events. So you don't need to inject your SMS or your, your email that can happen from an event. So it really focuses you on the, the ability to create the order, whatever you have to do to create the order. Jon (39:20.974) Mm -hmm. Allan (39:36.893) Do it here. Jon (39:37.966) Now, do you find that, like to me, this seems like it would also still, I mean, not that there's necessarily a wrong answer, but it would be easy to, you know, kind of not architect things in a way that is kind of the best way to use this. Is that a concern at all? Allan (39:54.365) Yeah, people have trouble with separating your domain. Jon (39:58.35) Like what? Yeah, cause like you said, like, okay, I've created an order now. Just the example you gave it like sending an email or some kind of SMS. Like you have to think about doing that, you know, in an event versus doing that still in the, you know, order, what do we call the thing that the order create handler, I guess, right. Allan (40:19.773) Yep. I think what happens there, the events aren't too hard to figure out because people just start spawning events everywhere. And then if nobody's listening to that event, who cares? What really becomes the issue is that people don't know. So when I talk about vertical slicing, you have like orders and you might have like customers, right? And they'll tend to bleed those over into one another. And then you're like, it's kind of order customers. It's not customers and orders. Jon (40:27.054) Mm -hmm. Allan (40:47.005) And that's where things start to get a bit milky. You really have to kind of stay in your lane. But you have to do that anyways. If you go to a microservice approach and you start bleeding those services across, it gets really mucky real fast. So you have to plan for it. But mediator and service bus, they're not going to solve that for you. They're just going to make the mechanism really easy to pull it apart. If you've made the waters muddy to begin with, it doesn't matter. Jon (41:11.406) Yeah, so it gives you a nice pattern to start with, like you're saying, and as a monolith and then, you know, be able to move it apart. Now, when you, when you go to move it apart, does it, does mediator itself help facilitate like, you know, scaling to different instances or something like that? But I'm assuming somebody's probably built something on top of it to, to, to do some of that. Allan (41:29.5) No, because you can just change the URL up. You can treat it like a front door. So like a proxy, you can call over to the other API. You can. Jon (41:34.286) Okay. Jon (41:37.934) OK, so a request handler would be associated with like an endpoint generally, is that OK? Allan (41:44.156) Could be, yep. And so you could move that endpoint out. You can actually move it to a full other API or endpoint like URL. You could even move your events. So something like email, you know, I might move that off to an email event handling service, because there might be many events that I want to listen to that send email. I don't need to bog down the server. And I don't want to pay Azure charges on. I could even bring it in -house. I don't care how long it takes to process the email. Just listen for the events and send email. Jon (41:47.63) Mm -hmm. Jon (41:52.142) Okay. Jon (42:04.621) Yeah. Jon (42:09.39) Right, right, yeah. Yeah. Yeah, run in your own email server. Allan (42:14.524) And if I need to take it down, right, the thing about service bus is if I send a message to it and as an event, I don't care how long it takes to run. Right? Well, I do, but you know what I mean? I can send it there. If I've taken the service offline to do an update or whatever, I bring it back online. It just continues processing. It's like taking mail out of a mailbox. So you can start to break those things out. And it's super easy because you can take your event handlers, basically copy the code into this new project. Jon (42:23.342) Yeah. Jon (42:34.99) Yeah, it's kind of. Jon (42:43.694) Mm -hmm. Allan (42:44.284) and tell it, okay, listen to the service bus now for your calls and do the thing, right? And I can turn an event handler in the mediation pattern to say, yeah, we see you got this event, just send it to the service bus now. So you can keep the pattern the same in your API and just kind of explicitly grow or implicitly grow without having to do a lot of work. Jon (43:08.942) Yeah, and not optimize before you need to. Allan (43:11.899) So I'm big on mediator. It's a it's a godsend if you do it right. Jon (43:18.03) Yeah, it's, you know, these kinds of things. I don't, I don't build enough different things. So like, you know, it's kind of the same thing when we've talked about your, mediator type pattern for mobile space. It's like, if I was doing a new app today, this all sounds amazing and I would do it. you know, getting it stuffed into something that exists is obviously, obviously possible. It's just, you know, the, having the motivation to do it kind of thing, but like, Allan (43:42.267) Is it worth it? Yeah. Jon (43:45.07) It almost makes me want to because it's like, yeah, this is really cool. If I was going to do it from the start, how would I architect things and do it in such a way that it's conducive to use this? I like it. Allan (43:56.187) You'd be surprised how easy that is to build into existing apps for the most part, but. Jon (44:00.142) Yeah, I mean, you can start small, right? You don't have to do the whole thing at once. You can pick a part of it and do it from there. Allan (44:04.059) Mm -hmm. Allan (44:08.059) We'll have to talk about that in a future episode, right? So what about, so I kind of jumped ahead to Service Bus and the modular monolith and stuff. What do you do? Do you do real time stuff at all like signal R? Jon (44:16.91) Yeah. Jon (44:20.718) No, I mean like the whole chat, GBT thing that I was looking at is as close as I, I maybe get to that. I don't, I don't do anything. Once upon a time when I tried using realm, you know, originally that was a little bit more like that because it was kind of handling things, but, I haven't had a lot of need to do any of that. How about, how about you? Allan (44:33.627) Hehehehehe I've done some SignalR, but I found as time's gone on, especially with the disconnected realm, because obviously I'm writing more mobile apps than web these days. There isn't really the need because keeping a mobile app connected to SignalR is next to impossible, right? Because the second that app... Jon (44:51.182) Mm -hmm. Jon (44:57.966) Yeah. Yeah. You, cause once the app backgrounds, it's like you're done. Right. Allan (45:01.754) Right, so I may, there's still a few points where I still use it for small things, like a like a chat app, it makes sense. But even in that case, you can do polling and the whole nine yards. Jon (45:06.83) Mm -hmm. Jon (45:12.526) Yeah, well even like the the the json streaming the thing that i'm talking about too, right? Like that that that could be a way to do it I mean it might not be the best way but Allan (45:21.114) Well, and it signal are kind of works like that anyways under the hood, right? It's just a pump. So you could be turning, you could have a stream open and just keep pumping the data as it comes in. So I might do that for like a GPS app where I'm like, where's my fleet, right? So I might have signal are pumping those events as it's reading them. But even that can get dangerous versus like it just, just every three seconds, call the server and get a blast of data. So Jon (45:26.478) Right. Jon (45:36.046) Yeah. Allan (45:46.97) It's you really have to pick your poison, but I'm finding it less and less important to the mobile side these days. Jon (45:52.174) Yeah, no, I would agree. And maybe partly because the mobile side doesn't really, like you said, it doesn't really let you use that to begin with. Allan (45:59.514) Right and again because I'm hitting the database for most things again not for fleet GPS like real time stuff like that but I still might do HTTP and just work with it because otherwise you keep connecting to this thing and then you have to wait and then you have to wait for messages and it's like you know what I'll just pull it's good enough. Jon (46:07.246) Yeah. Jon (46:17.998) Yeah, well, and that's it, right? And maybe, maybe because things have gotten cheap enough to do that. Like I just, I find it hard to think of use cases that really I'm like, no, this is be great with, with real time. Like it just doesn't happen as much anymore. Allan (46:30.584) Right. Now you could argue, okay, if you did it through signal R and you stayed connected, it's probably faster because you don't have to hop through other layers, right? You don't have to do, you don't have to make the connection in HTTP client, do the DNS resolve, then the server doesn't have to go through the the authentication portion and all that crap. Like there's so much, there's a lot of hoops to jump through in an HTTP request that people don't realize. So arguably, it could be faster. Jon (46:44.174) Mm -hmm. Jon (46:52.11) Yeah. Jon (46:57.294) Yeah. Allan (47:00.568) But in practice, it's not because you still end up doing that with SignalR if they're going to the background or they're swapping between apps anyways. So I don't know. I personally haven't found a need for it much these days, but I'd be curious to see what other people think about it now. Like are people using SignalR still? I was using it for sync for a while. And the thought was is that if I had a lot of data, right, I could be like, here's a record. Did it sync? Jon (47:07.278) Yeah. Yeah. Jon (47:18.286) Yeah, yeah, I don't know. Allan (47:29.592) Okay, remove it from my list. Here's a record. And it was slow that way, but it was guaranteed order, right? So like a transaction log for a database is guaranteed. And I could just stream as much as I could before the connection lost, but it slowed everything down because then I had to do make database connection, start transaction, ship data, commit transaction, return. Jon (47:37.838) Mm -hmm. Jon (47:45.902) Yeah, and like... Right. Jon (47:53.134) Yeah, and then you compare that against like, you know, kind of batching those up into like individual calls or something instead. And it's like, okay, so if, if you batch them into like a set of a hundred or whatever, right, or whatever's left in the queue. Allan (48:03.064) Right. Well, and that's what I did. I started batching it. I put an ID like a unique identifier on it. So I would update my database locally and I'd say these ones are going in this batch. And if I happen to send them again, so let's say I didn't get the kickback from the server because the server was taking forever. The server will go, no, we already received that batch get out of here. Or it just wouldn't even error. Just be like, okay, great. We already, yeah, we saw this already get lost. So that ended up being a safer method anyways. And it was a lot faster. Jon (48:26.862) Yeah, Bailey, thanks. Yeah. Give us the next one. Yeah. Yeah, exactly. Allan (48:36.95) So what about when you deploy these things? I know you're Azure heavy. I know a lot of the companies I work for are Azure heavy, but for development, obviously you're using Docker. I know you're using Docker, but are you? Jon (48:43.374) Yeah. Jon (48:50.126) I mean, I use it for some stuff here and there. The thing that I'm finding is like, I don't have a lot of infrastructure that has a bunch of different pieces to compose. Like I'm not doing microservices. I'm not, you know, my web app is a monolith. It's one thing, you know, it's one project that I deploy through GitHub actions when I want to, to Azure. And that's it. Allan (49:13.974) You don't have like a timed service or like a workflow service that runs like periodic. Like some subscription like timeout a subscription for example, right? Jon (49:19.086) no. No, I - No. So, so what I, I mean, that's all like date based, right? So I kind of know when, when the transaction happens, okay, you're good till this point. And then the client checks every once in a while. And I'm just kind of lazy about like, if you get away with messing with the system a bit, like good for you. yeah, like one, and there's, and there's some like ways that I know already that exists to do that. Right. So like I, because I want it to be Allan (49:39.35) There you go. Everybody go download pool math and find, find John's holes. Jon (49:49.934) cross platform and subscribe from anywhere and know that everywhere you could subscribe like on, you know, one, you can actually subscribe somewhere, log into an account, log out of your pool math account, subscribe, log into another different pool math account and restore your subscription. Right. And then it's going to apply that date to both accounts. And it's like, okay. Allan (50:13.398) There you go. Everybody listening. Jon (50:13.518) Go start selling cheaper one -off accounts that you built that you're maintaining a subscription for. I don't know. It's fine. I don't care. Allan (50:17.462) Hehehehe. There you go. There's how you get free pool of math for your family. It's a resell pool of math. And there we go. So I do use Docker because I'm always going to have some services like a workflow that runs a time service that wakes up. Generally, if I'm in a big boy service, like stuff that's getting a lot of heat, there's already a microservice. So I'm big on being able to deploy that locally. Jon (50:25.134) Yeah, there's a business idea you can like, you know, it's like pool math arbitrage. Yeah. Yeah, no. Allan (50:51.478) I don't like like that. There's a client I have that they are so Azure heavy. They you know they're using Cosmos DB and SQL Server and stuff does equal. I can put that in a Docker container, restore the database. You know all that cool stuff. Cosmos DB I know there's an emulator out there. I think there's a Docker thing out there. I don't hear it. It's it's if I can't do a Docker compose file and go Docker up. Jon (51:11.214) Yeah. Allan (51:20.086) and give it an environment file and it's just up and spinning in a few minutes. I don't want it. Go away. Leave me alone. Jon (51:24.622) Yeah, they might have more of that now, but I think, you know, admittedly, it probably doesn't work everywhere yet, that kind of thing. So it's probably not ideal. Allan (51:35.446) And that's fair. I mean, I use it for my stuff because I can spin up an environment, test it locally, see the traffic moving. You know, there's a lot of cool stuff out there. Aspire is supposed to help with that. I'm not completely sold on that. I know Microsoft is pushing it hard. They've got that hotel slash telemetry thing. What is it called? Aspire? Jon (51:47.63) Mm -hmm. Jon (51:58.574) I mean, it's open telemetry stuff. Allan (52:01.333) Yeah, it's pretty cool as it doesn't store it. So there's no historical value in it, but it's pretty darn cool. It's easy to spin in my containers. So lots of cool stuff there. Lots of cool stuff there, but I'm big on Docker for all of that stuff. And then it makes it super easy to deploy dev environments. In production, well, you can see ICD your way to cloud native. Is that the cool term we use now? Jon (52:24.974) Yeah. Jon (52:28.558) Something like that, yeah, I think so. Allan (52:29.397) I don't even know what that means anymore. I'm like, dude, if you're hosting on a windows, it's still IAS. I'm pretty sure maybe some Kestrel now, but like this is just a web server. We can call it whatever you want, whatever the marketing. See, they're better at marketing. Why should I call this? What would have been a cool name for this now? I don't know. The native, the native backend, the cloud native backend, but it's not cloud native. If it's Docker, is it, do you know anymore? I don't even know. Jon (52:43.726) Yeah, exactly. Jon (52:56.686) I'm gonna... Allan (52:58.741) I don't care. Jon (53:00.078) I got to pause here for a minute. Sorry. Well, I'll mark the clip. I got my kids coming home that wasn't supposed to be home yet. So give me, give me a minute. Give me two minutes. Allan (53:01.813) Okay. yeah, I just saw somebody. Yep. Allan (53:50.165) it's done. Jon (54:41.07) All right. Allan (54:41.78) I saw the ninja going behind you. I saw like a doo doo doo doo doo. It was like, it was only like a hair just flicking by you real quick. Jon (54:47.79) Yeah, yeah, the wake up, somebody's home. yeah. All right. I didn't stop the recording because I figure whenever you do that, it like splits the clips up and then it does a weird thing. This way it's like one continuous clip that you just have to cut the sections out. So Allan (54:54.9) Okay, do you wanna? Allan (55:03.86) Okay, did you have this stop time? Jon (55:05.774) Yeah, yeah, I marked it and then we'll pick up from Docker names and stuff. Allan (55:08.436) Okay. And I have to shut up for three or four seconds after you hit the record? Okay. Jon (55:15.278) Yeah, maybe. I'm gonna start. Jon (55:20.814) Again, naming is hard, but yeah, I mean, Docker makes, I think a lot of sense for a lot of developers and workflows and stuff. but then the aspire thing, I don't think is really, I don't think it's necessarily competing with that so much, right? Like maybe, maybe it is to an extent it's, it's helping that. that is one thing that, that I am looking at trying to switch my stuff to use because I, like I said, I don't have that many pieces, but the pieces I have Allan (55:36.18) helping. Yeah. Jon (55:46.734) it'd be nice to just have like, okay, Cosmos it knows, you know, to either try and hopefully use an emulator if that's kind of built into that at this point, I don't know. But then it knows how to like inject, you know, the right connection string to the web API and then set that all up and order it properly. So it's interesting, I think. Allan (56:05.172) It's something that I've been looking at. I just not completely sold on it yet. You know, because it's the cool new thing. Everybody's jumping on board. I guess I'm getting a bit more becoming a bit more of a pragmatist over the years. I don't know. Is that a fair statement? You're worse than I am, but. Jon (56:15.022) Yeah. Jon (56:21.742) Yeah. Yeah. Yeah. I mean, let, let everyone work out the, the, the initial bugs and stuff, right? Figure it out and then then get to it after it's all nice and works well and you know, is still around. Allan (56:35.348) Well, and the thing is, is that once it's there, does it help with the scaling? I mean, it can talk to Kubernetes, I think. I've seen some stuff. Jon (56:43.278) I don't know if it's supposed to help with the scaling. I could be wrong. This is just my own take. I think it's, yeah, it's mostly about like, how do I like compose all these pieces and have the config all set up together and not have to write a Docker compose file? Like it will help figure out, okay, I'm, I have my web API project. It references these things, which reference that thing. And they all like, I need Redis, I need Cosmos, I need whatever. Allan (56:48.084) the config. Jon (57:11.63) And instead of me having to go like set up all the different configuration and endpoints and stuff, especially if you're, you're flipping between running locally and running in your deployment, it's the same code that, that orchestrates that for you. Right. So that everything knows how to talk to each other, no matter where you're running it is, is I think one of the big parts of it. So I think that's, that alone is, is worth using it, whether or not it helps with actually scaling stuff up and stuff. I that's kind of beyond my understanding. Allan (57:29.716) All right. All right. Allan (57:41.205) That's fair. I mean, to me, it hasn't been hard to spin it in a Docker compose for what things I've been doing. And the good thing about having it in the Docker containers is that like if if an infrastructure specialist now, I don't really do Kubernetes. I'm just I can do the absolute basics. I don't like it. But it's not my it's not my field anyways. But there's infrastructure engineers that can go in and set up all the nodes, set up all the elastic scaling, and they're happy because it's a container. Jon (57:46.03) Yeah. Jon (57:59.406) Mm -hmm. Allan (58:10.612) They can take it. I don't know if they adjust what they do to adjust, but it just works. And so that's always been a thing is that I can give I can I can test my container locally. I can test all of the stuff together locally, throw it over the fence. And then the Kubernetes guys are fine with whatever they get and fixing it up. And sometimes they'll give some Kubernetes stuff back and then you just switch up your CLI and it's great. It still runs locally. It takes a lot more runtime, but it works. Jon (58:39.15) Yeah. Yeah. And I think like, yeah, again, this is, this is kind of trying to help, build with that in mind. Right. So like it's still like, I know, I know your, your app still can be, or does, or can be launched in a Docker container. And it's still using that stuff behind the scenes at the, the elevator pitch that I always kind of heard was like, why do I have to think about You know, I already, I've already defined the relationships between these things within like my project references and my, you know, how I'm like building my, my app builder and stuff and like referencing Redis and referencing cosmos and referencing all these things. Like, why do I have to then go tell like set that up somewhere else a second time? Like you should be able to infer from how I compose these things within my code, how to do that for me. And I think that's the elevator pitch. Allan (59:33.236) All right, sounds like a big over complicated extension method that you put everywhere and puts the configuration in. Jon (59:37.102) Yeah, that's kind of what it is. It's just like extension methods that are like injecting, you know, the things from all the different places in the right spots, basically, I think. So it's, yeah, yeah, you do. I think it's pretty well done. I'm a fan. I haven't gotten there to using it myself fully yet. I've started down that path. One of the, like I have, so I have Cosmos and this can lead us into our next thing. Allan (59:46.836) Any tooling and libraries for that? I don't know. See? Allan (59:59.892) Alright. Allan (01:00:03.667) Yes. Jon (01:00:04.462) I have Cosmos and, but I'm using like the two dot X API and they've now, you know, imminently are deprecating that one. And it's like, it'll work, but it's, they're not going to update it. And so now you have to move to three dot X. And if you want to use aspire, you need to already be on that one. And so I'm like, okay, first I have to get there. And then I can think about, you know, using aspire for all the stuff. Allan (01:00:25.267) And you just labeled one of the reasons I hate cloud native sometimes, right? It just, you got to deal with all that stuff. And sometimes, you know, you don't want to deal with it. Jon (01:00:32.846) Yeah, like when's the last time the SQL server client changed, right? Allan (01:00:37.715) Yeah, it just keeps running. You only get new toys. You don't really, you don't, I don't know that you've ever been, you want to upgrade because you want all the latest performance improvements. I mean, Azure doesn't matter obviously, but you want to get all the performance improvements in the new toys, at least back in the day, right? They were constantly adding stuff to T -SQL and you're like, I can use that. I can use that as well, but it never broke. And I know that the SQL client nowadays, you're like, Jon (01:00:41.006) Yeah. Jon (01:00:48.078) Yep. Yeah. Jon (01:01:03.726) Yeah, no, and. Allan (01:01:06.931) Okay, why is it including all this Azure stuff? I know that some of the community members were just eating them alive. Jon (01:01:12.43) yeah, some of the basic packages do that now. Yeah. Allan (01:01:15.283) yeah, the SQL client pulls in like all of Azure just to run a SQL connection now. It's kind of crazy. Jon (01:01:18.606) Yeah. Jon (01:01:23.598) Well, speaking of SQL databases, you probably have used a few of them. Allan (01:01:25.267) No. Allan (01:01:29.395) I have I have done a lot of SQL Server. I've done a lot of Oracle. I've done a lot of MySQL in the past, which is now MariaDB. Still MySQL exists, but Oracle bought them. So does anybody really use it? No. I did a lot of Oracle back in the day when I was doing Java. OK, but is it back then we loved it? Do they get? Really? Jon (01:01:38.222) Yeah? Yeah, I don't know. I don't think so. me too. Sad. No, I hated it every, every minute of it. I, cause I, I had done SQL server already. And then, well, to be fair, I went into it when, or when I was at being a DBA for Oracle running on open VMS. That was not fun. I mean, I had done, I'm familiar with Linux and stuff. I know command line stuff. I had never used VMS before that, but I mean, it wasn't just the command line part of it that was sucky. It was just. Allan (01:02:04.561) Okay. Jon (01:02:21.134) Now I've got Oracle on top of that and have to figure out how to manage things through that. I did not like that. It wasn't good. Allan (01:02:26.001) Oracle is very complicated. It was still a pain to set like, but that's why they had admins, right? Jon (01:02:28.782) Yeah. Well, and that was the problem, right? Like I remember I kind of had to learn on the job a fair bit about it. And at one point I remember not understanding how some of the transaction log stuff worked in terms of like clearing it out. and so at one point, like we ran into the case where one of the apps, like one of the databases, I just, it stopped working cause the transaction log filled up. Yeah. Allan (01:02:54.449) Really? See that doesn't Oracle was like a SQL Server back in that time. Like I'm talking SQL seven. So like that's before 2000 1997. Jon (01:03:01.454) Yep. Well, I might've, yeah, I was going to say like, I think I've used SQL server seven, but I only in like learning and local dev and stuff. I think SQL SQL server 2000 was the first one I used in production. Allan (01:03:13.041) All right, well I'm. I'm a pinch older, so I think I might have had that inexperience of or that lucky experience. Jon (01:03:21.07) I mean, it was there, I just was stuck on Oracle before that. Allan (01:03:25.041) But it was, SQL Server was a lot easier to set up, but the thing tanked like nothing. You looked at it the wrong way and it was like, it's dead. Jon (01:03:30.318) Yeah, yeah. No, that's fair. That's fair. But so, but like Oracle, it tanks in weird ways that you didn't necessarily know unless you knew how it was going to like the whole transaction log crap that that I ran into. Allan (01:03:43.537) I never that thing was back in that time. We we could shoot it with anything. Sure, it would take some time, but it would figure itself out. It would not die. I don't know if that's the case anymore. And like Jon (01:03:55.63) no, it constantly died. Actually, you know, the VMS one never died. I will give you that. It was the, when we moved to Oracle on, on Windows server, that things just died every other second. Allan (01:04:03.249) Okay. Well, yeah, well, Windows also, to be fair, Windows still isn't as stable as it should be. But that kind of makes sense. But SQL Server has come a long flippin way. Like it's a tank now. It's easy to still move around. It runs everywhere. People still say there's scaling issues with it. Jon (01:04:15.854) Yeah. Jon (01:04:23.022) yeah. And it runs everywhere now. Allan (01:04:32.529) I'm still of the opinion if you set your boundaries up right and you split that thing up where you need to and you do the right indexing, it'll run just fine. Use caching. Jon (01:04:42.862) Yeah, that's more of like an app architecture issue at that point than anything, right? Not a database issue. Allan (01:04:46.833) Right. Now I have seen cosmos where there's just so much data, like so much data just recently. And it's it's beginning to kind of buckle a little bit. Yeah, I thought it was supposed to be invincible. Jon (01:05:01.646) interesting. Is that like they're not doing the proper partitioning and stuff or? Allan (01:05:08.401) I'm not sure 100 % yet, but the way that that data has to be shared, they can't really partition it in certain ways. And it's just, it's a lot of data, a lot of data. Jon (01:05:18.414) Yeah, I mean, at some point you kind of have to code around that too, right? Like some apps, like luckily my app, well, first of all, I jumped on Cosmos DB early days before when I made the database, they were like, you can do a partition key. You probably should, but you know, you don't have to, it's fine. So I might, actually to this day, my database still doesn't have a partition key set. Allan (01:05:24.049) Yeah. Jon (01:05:47.406) Which is interesting. I mean, my, but luckily my, this is something I have to do in this off season because, you know, it just, it's getting to the point where it's like, yeah, if I need to scale past, cause you can only, you had, there's a max amount of data per partition that they allow you. I think still it's gone up and up over the years, but like when it first started, there was the one year I'm like, I'm going to have to move to like use partitions because I'm going to hit the data limit. And then they're like, we just. tripled the data limit you can have per partition. I'm like, thank you. You bought me another few years of not having to think about it, but I'm getting there. So I'm going to have to do it. Yeah. By user ID is for me, it's an easy natural choice. Cause it's like you, everything you put in there has your user ID associated with it. The only kind of one tricky thing, which I think I'll get away with just enabling cross partition queries on this particular query is when you log in. Allan (01:06:24.367) So what are you gonna do split it by user? Allan (01:06:29.615) Yeah. Allan (01:06:34.991) Yeah. Jon (01:06:43.919) And I have to like figure out what, what user object is mapped to like your authentication provider identifier. Right. so I, or I could, and this is where I was kind of getting at is like, I could do the whole thing where I'm, you know, duplicating data because that's not always a bad thing when you're talking about no SQL, right? It's, it, I could create records that are using the partition, key of like the social user identifier. And then I could map, I could create a record that Allan (01:07:10.639) Okay. Jon (01:07:12.558) which tells me, well, what's your actual user ID, right? And I could query it that way, that would be fine. It's more duplicating data, but that's kind of, at that point it's like, yeah, who cares when you're doing, you know, right. Yeah, exactly. So I could totally do that. I'll probably just try and see how it works with just doing a cross partition query, which is more expensive, but it's like, it's a log and it's not, you know, it's not the thing you're doing all the time. So. Allan (01:07:18.799) Yeah. Allan (01:07:23.887) It's IDs, right? It's IDs and things you're in control of for the most part that aren't going to change. Allan (01:07:40.239) So Cosmos is working for you. Jon (01:07:41.998) It's working. Yeah, honestly, it's been great. there were some weird things to figure out coming from a SQL server world. so like one of the things that I think now I could just kind of step back from, but when I originally did it, when you add logs and stuff to your pool, I want to keep associated with your pool, what the kind of current snapshot is of it. So like, what was the last test log for all the different types of blogs you might have? so that I can show on like the main page, like, your last, you know, chlorine level is this your last, the last time you, you logged, you know, doing this maintenance was then et cetera, et cetera. And so I chose to kind of do the duplicate data route and update the pools record. So whenever you add a test log or change a log on the server, I go query like, well, what's the most recent log of that type for your pool? And then I update the, the pool object. and I do that in cosmos with like a, I forget what, if it's a, if I run, I think I run a stored procedure. So they have that concept too. And I do this weird thing in the code. Like I'm scared to ever touch it because it was kind of hard to write and it's a little bit like of a recursive function call on it, but it worked. It performed super well. But that's, that's how I've chosen, you know, chose originally to do that before I started like caching everything in a local database anyway. So now What I could really do is say like, I don't need that stored on the pool. I can go just query the local database for those different logs and get that information, right? But it's, you know, it worked surprisingly well for that. I have, you know, I like being able to store objects because I'll do things like nest, you know, what's the current weather conditions for that were logged at the same time that you did a test log. Allan (01:09:28.972) more metadata without having to worry about missing metadata, right? You just check it. Is there metadata on this that matters? No, okay, who cares? Jon (01:09:31.054) Yeah. That's right. So it's been really easy. I have a few optimizations that I need to do as well in terms of like, they're starting to roll out some better advisors that'll say like, Hey, you're, you know, you could really use these indexes or like some composite index that we see costing you a lot and try and get your costs down that way. But honestly, like the thing costs like $40 a month to run still. So like I have it set to like the elastic scale, right? Or whatever. And it's just like for the, the Allan (01:10:01.295) Yeah, it's not. Jon (01:10:06.926) the amount of revenue the app is generating. It's like, is it even worth the effort? Allan (01:10:11.534) And that's the one thing like I, I've never, I've never been able to see where Cosmos can save money. But honestly, when we talk about running, if I run SQL hot, like a full charge SQL server on Azure, with no, almost no traffic, like just it can chew just sitting hot. It can chew up $200. No problem. Just sitting there. It's not doing anything. Now it's hot. So if I hit it, it's instantaneous. Jon (01:10:21.678) Mm -hmm. Jon (01:10:33.454) yeah. Allan (01:10:39.726) And that's obviously not an elastic scale, but you're not waiting, right? It's just, here you go. So, but that, but it costs and it's not $40 a month. So that's interesting. But one I have been doing, and this is, this is, I'll be quick about this one because this one's small, but I've been trying to get Postgres SQL a real big attempt. So I'm using it for my own apps now for two that I'm writing and I love it. Jon (01:10:44.878) It's there, it's ready to go. Jon (01:10:50.702) No, it's not that cheap, yeah. Jon (01:11:01.358) Mm -hmm. Allan (01:11:08.526) The driver support in .NET for Postgres is amazing. Jon (01:11:12.238) that's I feel like it wasn't, you know, many years ago was not that at all. Allan (01:11:17.185) I'm not sure when it changed but whatever is there now is marvelous. The GPS or the geo geography stuff is amazing. They've got some proper time zoning stuff which SQL Server is still kind of funky about and it's there and it works awesome. And the thing is a tank. It's really fast. There's people using it as a queuing mechanism so if you don't like like RabbitMQ You can set up a special table. They've got like this new table mechanism that's like ultra fast. Now it's meant for queuing. And it's, it's, it's awesome. This thing is like, I don't know, I'm, I'm planning to use it and it's a cost savings thing, right? Because I don't have to pay to use it really. I have to pay to use it in production. Really? I mean, at some point there's, there's always a kickback. There's always a cost somewhere, but right now I'm seeing some Jon (01:11:52.302) cool. Yeah. Allan (01:12:16.428) some real good benefits on it. So if you're looking for another thing, I know MariaDB is out there, the MySQL MariaDB stuff, but Postgres has been around so long and it's just people that have used it in production swear by it. So that's also worth checking out. I'm trying it. Jon (01:12:23.918) Yeah. Jon (01:12:33.774) Yeah, it's been, it's been forever since I used it. I mean, I, I remember back in the day wanting, I think it was just the novelty of like, Ooh, what's this other one that I could use. but I didn't really ever do anything serious with it. Allan (01:12:45.196) So I'm doing some pretty cool stuff with it and I'm hammering it to test it out. It's working. I think it's going to be a real good thing for what I'm doing. So it's worth checking out. But that leads us to two other things. Have you ever done a backend as a service? Have you ever rolled like a, you know, Firebase has like everything now, right? It has auth, it has the database, which has syncing. Jon (01:12:57.07) Yeah, that's good to know. Jon (01:13:07.214) Mm -hmm. So like, have I like used any of those? You mean. Allan (01:13:13.324) use them or thought about using them, right? Jon (01:13:15.534) Yeah. I, I did think about using Firebase. Actually there's been a couple, there was one that got, did it get bought and then they kind of just shut it down? what was it called? It was, it was a, it's open source. Like I think some people still kind of maintain it. shoot, I'm gonna have to think of the name. Yeah, it's, it's from forever ago. Like it was Xamarin days. I looked at that one very closely and decided that it wasn't quite what I wanted. Allan (01:13:33.26) Okay, I'd be interested to know what that is. Jon (01:13:45.55) I looked at Firebase and I kind of almost tried that one too, but I was always a little shy of having to use. Like I don't the bindings, you know, around it for, for like Xamarin stuff. Like we, yeah, they're, they're kind of maintained, but I don't know. It just, it felt like it's one of those pieces that if that's the thing that's foundational to my app, I didn't have the most confidence that, you know, we'd, we'd always be like current on them and. Allan (01:13:58.508) Yeah. Jon (01:14:13.87) that there wouldn't be some weirdness. And then it's not the same like across platforms, especially at the time when I was looking at it, there's no abstraction. So it's like, well, then I, I got to do that. And I think the other thing, and this will be your favorite is that there was no like windows support for .net for using it either. I had a, I had a windows app in the store for the app, the pool math app. So, so that was kind of like a, it was an uphill battle to get there. So I was just like, no, I'm just not going to use them. Allan (01:14:25.002) No. Hehehehehe really? well. Allan (01:14:41.994) So I've been looking at two and I've tried and I've tried to find uses for them in production with several customers. I can't quite get there because they come with a cost, right? And I get it. And the other problem is that sometimes like these things do everything like they're user auth, right? So it's your user store. It's a database with sync. It's a push notification. It's an SMS provider. It's a real time provider. Jon (01:14:49.454) Mm -hmm. yeah. Allan (01:15:09.194) You know, it basically does all your infrastructure needs just like Azure, but you can take it and run it locally, right? And then it does all the things for you. Jon (01:15:12.846) Mm -hmm. Jon (01:15:16.526) Okay, yeah. So you could stand it up on your server. Like do they offer a hosted version of it? Did I miss that? Okay. Allan (01:15:22.186) Yeah, well, no, these so these are meant you can they do have hosted versions, but you can also stand it up in Docker, Docker compose, whatever, spin it up as part of your infrastructure and you have all of those things out of the box. So the two I've been looking at for years are well, at least the last couple of years is app, right? So not R I G H T right as in W R I T E and super base. That's not a Canadian slang that is cool guy slang. S -U -P -A base. And both of them seem to have their pluses and minuses. So super base uses Postgres. So I'm instantly more drawn to that. But AppRate seems to have an easier API surface to work with. I don't know that to be true. So nobody hate on me. It's just my general observations because I'm still wanting to use them. Jon (01:15:50.35) Yeah. Allan (01:16:18.981) And so an app right uses MariaDB again. I don't know. I'm not sold on it. Jon (01:16:23.598) Yeah, I mean, it's the standard in like open source community stuff. But yeah, when it comes to like scaling it up enough, is that really what you want to do? Allan (01:16:31.653) And just, yeah, you pick your poison. It's but these are designed to scale. They're your infrastructure locally. They also owe. The other thing is they have blob storage, right? So if you're you're doing like Azure blob storage or any of that stuff, it's here as well. So these guys are like all the infrastructure you need locally or you can deploy to the cloud or they have a hosted version which you can use. So it seems pretty cool. I'm trying it. Jon (01:16:34.766) Yeah. Jon (01:16:44.462) Mm -hmm. Allan (01:17:01.093) I'm trying. I want to use it because it, it, the time savings of all of that is fantastic. But the reason they don't end up working for clients is because clients usually have a database already. She's not going to port it. They usually have a user base or some sort of user auth already push notification. I don't know. That one's not a big deal. They'll have some sort of email mechanism already. Good, bad, ugly. It doesn't matter. They'll have it right. So it's really hard to, these are more, Jon (01:17:13.07) Yeah. Jon (01:17:28.174) Yeah. Allan (01:17:31.941) And again, nobody hate this is just my opinion on it. They're more of a you're starting a new app. You don't want to spin all this stuff up. You don't want to bring in all these pieces on your own and assemble the Lego. These give you the most things that you will need so you can focus on the business of writing. Jon (01:17:41.806) Yeah. Jon (01:17:48.43) Right. Yeah. You're not trying to figure out all these pieces. I mean, that that's the dream. And I think that's part of why I didn't go any of those routes is because of the time I had with, realm that made me very shy of like going into some other thing that it was kind of like a, you know, magic black box that solved everything. Allan (01:18:08.451) Well, and I'm not saying that these things will solve it, but people seem to swear by them. Like they love them. Jon (01:18:13.646) Yeah, I totally get it. I think if I was starting again now, I mean, there's more options than when I, when I was trying to look and I found the one that I was thinking of, by the way, it was called parse. Allan (01:18:24.163) yes, that's the one. I do remember that. Jon (01:18:25.806) Yeah, it looks like it's still had some kind of resurgence as an open source thing. but you know, I don't know how it compares off hand to the other ones you mentioned, but just the fact that there are these other ones that aren't like, you know, Firebase that maybe are things you can host yourself to like that, that would have been a lot more compelling than, you know, maybe trying to do it myself again, if I had that confidence. Allan (01:18:50.659) And who knows, right? Like some of the things, like if you think when I go into Azure, sure, I can spin up an app service, but then I have to know the plans. And if you set your plans up wrong and that grows, you know, you really got it. It takes experience to really set Azure up properly with a host like this. I mean, I don't have to worry about the billing stuff, right? It's just, it kind of works. I don't have to worry about Azure notification hubs, which is, I guess that's not hard to set up. Jon (01:19:01.902) Yeah, you can. Jon (01:19:13.454) And you're tied to wherever. Allan (01:19:19.619) It's a layer on top of Firebase, which is a layer on top of Jon (01:19:22.67) Well, but but like like you're kind of saying too, right? Like that's just more stuff to do if you're just trying to like write the thing. Like if I want to build the app, I don't want to have to think about a lot of those things. Allan (01:19:32.803) Right. Now you still have to set up like Firebase and APNS with this. If you're using them, you still have to point it towards an email service like, well, send grid or there's a couple others. I forget what they are. but they're there. Right. Jon (01:19:35.822) Mm -hmm. Jon (01:19:43.822) Yeah. Jon (01:19:47.214) But that's not any different than rolling your own anyway. Like I still have to set my stuff up to send emails with Azure email, whatever. Allan (01:19:53.539) Right. And the other thing is too, is that user authentication, I'm sorry, everybody uses MCEL. I hate MCEL. John, I hate MCEL. It just, I get it, but I hate it. I hate it so much. Jon (01:20:01.39) it's it's I mean, I I My, my putting my personal hat, not Microsoft affiliated on, because I want to be extra clear that the, this is my opinion of it, right? Is that it is, it is very complex. And I think there there's parts that are necessarily complex depending on how your integrations work business to business, whatever. But if you're building an app, that's like not this big enterprise thing like that, like it's. Allan (01:20:18.019) Ugh. Allan (01:20:27.299) Yeah. Jon (01:20:34.926) It's not easy to set up like it's, it's hard. And so yes, you want authentication to be simple and like Firebase authentication is pretty compelling in its simplicity. Now there's parts of it that that was another thing that I was like, I don't know how I'm going to do this exactly because the way that they handle, like you just have an account and then it's like this random, you know, account ID and how do you associate that back with the thing that there, there were, I don't remember exactly. There was weirdness to it though. Allan (01:20:44.867) Mm -hmm. Allan (01:20:49.699) hot thing. Allan (01:21:00.675) Yeah, they had some weird. But people people are using it. We just did that. Do we do focused, sorry, slim bindings for off? One of us did it. Instead, I don't remember anyhow. So that's kind of all the infrastructure stuff I could think about all the back end, the back end stuff. So databases tooling. Jon (01:21:06.046) yeah, yeah, yeah. Jon (01:21:10.734) Yeah. Yep. I think that's there. I mean, yeah. Jon (01:21:22.51) Mm -hmm. Jon (01:21:26.67) Do any of those ones like try to do the offline sync thing or is, have they learned and not really gone there? Allan (01:21:33.859) I think so. It's optional. But obviously, you still need a database to feed your push notifications, you still need a database to feed your user stuff, right? So it's there. I don't think you have to use it. I think you can still just build an API around it and still build an API around pretty much all of it if you want. It just whatever you want to open up you can. So I'm determined to try I think super Jon (01:21:43.31) Mm -hmm. Jon (01:21:47.086) Okay. Jon (01:22:00.686) that's something else that Firebase, you know, claims to do to try and do. I don't know how well it works in practice, but it's like your database is just there and it just works and like, okay. Allan (01:22:11.427) See the pessimist in me says, if I host it with Firebase, I can't test it locally without paying. I don't know. Am I out of touch or something, John? I just, I like to know. Jon (01:22:16.942) Yeah, yeah. Well, yeah, they well, there's a free tier, right? So like in theory, you can test it a bunch and you're not going to pay anyway. Allan (01:22:27.459) But if they choose to up the price, that's it. Yeah. And that Jon (01:22:29.646) Yeah, you're, you're beholden to them. Like for sure. Absolutely. And this is why I like Cosmos. I think you can argue the same thing, but at the end of the day, if I really want to move that, it's not totally, it's going to be hard, but it's, I can move it to Mongo. I can, you know, there's a bunch of stuff I can do that's relatively similar. Allan (01:22:42.339) gonna be hard. Allan (01:22:48.643) you don't have a bajillion records in it because once you're there, you're not moving it. It just is not happening. Jon (01:22:54.958) Well, and that's and that's part of it. Why I wouldn't at this point, because I have enough data in there that I'm yeah, I'm not not moving it anywhere. Allan (01:22:58.179) Yeah. Allan (01:23:02.499) But if you had to, you'd be, and you had a bajillion records. Jon (01:23:05.102) But they've done a good job though. Like I don't want to move it anywhere, right? Allan (01:23:09.123) Yeah, no, and that's fair. And like I said, Apprate and SuperBase, they could raise the prices on you as well, like licensing wise. But it's not it's not like, hey, you're paying by compute, right? They're not going to raise it there. They can't really, I guess they could. But it's your compute. So wherever you pay, wherever you're using the compute, you're paying for it somewhere. You can always move it to a cheaper place. And it's portable. Jon (01:23:24.142) Yeah. Jon (01:23:33.998) Mm -hmm. Allan (01:23:37.603) So I think that's the big thing. I just because of Azure and AWS, the way they're moving costs these days and the way they're forcing you to update, I've become such a pessimist. Let's say you know you're old. Like, I don't wanna change. Get off my lawn. Just leave my stuff. You don't tell me how to do it. I'll tell you. Jon (01:23:48.878) Get off my lawn. Jon (01:23:55.886) Yeah, so I'm at, if account indexes too, which I need to bulk up on apparently if I want to save some read units, which is the thing that you pay for in Cosmos, which is, this is another part of, and Cosmos is kind of the same thing as Firebase here. It's hard to know what your costs are going to be, right? Like what does, what does, how many read units am I going to need? I don't know what the heck is a read unit. Like I get they've kind of tried to figure this out and it turns out it's not that bad, but at the same time it's like, it's not. Allan (01:24:14.595) You Allan (01:24:25.763) They still have trouble figuring it out though. You can put that analysis tool on a SQL Server database and like, it should cost about this much. You know, it didn't cost that much at all. There's been cases where it's been a lot more or a lot less. And like, how do we get here? And the salespeople tell you, you gotta just be on Cosmos because like, like Microsoft sales, you're on Cosmos, you're pretty sticky, right? And then like, it'll be the same cost. And usually what they do is they end up making a deal to get you on it. Jon (01:24:32.622) Right. Yeah. Yeah, yeah. Exactly. Jon (01:24:47.566) Yeah. Allan (01:24:53.699) then once you're on it and that deal is now enforced, you're stuck. So, need Kaylee. Jon (01:24:58.286) What are you going to do? Yeah. So I'm at, I'm at like, I'm getting, I'm approaching 20 gigabytes of data. So I'm getting there, right? But it's not, you know, so much that I couldn't move it somewhere if I needed to. Allan (01:25:04.035) he didn't do nothing. Allan (01:25:11.747) So there you go. When you get to billions of records and they start, well, I guess you've got the money at that point, it won't matter, right? If you're getting billion records, then you can think about how to, because that's what happens, right? A lot of my customers, you end up, they're like cloud, cloud, cloud, cloud, cloud. They hyperscale, they get all this stuff in there and they're like, as their business. Jon (01:25:17.358) Ye - yeah. That's the idea, right? Allan (01:25:37.731) begins to kind of flatten out in terms of money making, which does happen. It has to happen, right? Until you spin off more things. Then they're like, okay, well, now we need to optimize, optimize, optimize. Okay, we're costs, right? We're going back up. Our costs are coming down. And then they'll be like, okay, now we need to bring hybrid approach to get our costs back down more. And that's, I guess that's just the nature of business. Jon (01:25:39.598) Mm -hmm. Jon (01:25:59.982) That's that is. And when that's kind of like, that's funny because that's kind of in a, in a small, much smaller scale where I'm at with the app too, where it's like, I hit a kind of a cliff of like the basic tier of stuff wasn't doing it anymore. Right. So I had to like scale up my web server a bit because I've got enough traffic. So it's like, okay, now, now my stuff starts to cost more. Do I, do I want to try and figure out how to reclaim some of that? I mean, the answer probably is short term. No. Cause the, the, you know, it's, it's like, okay, you're running a business. Like you got to pay something to make the money, right? And if your ratio is pretty good still like, okay, another 50 bucks a month compared to what's coming in like fine. Allan (01:26:29.187) Yeah. Allan (01:26:35.811) Yeah, you don't need to pass that off to the customers right away. Some companies do and then they're like, Hey, we've got no users and now now you're screwed. So you got to Jon (01:26:38.446) No, no, exactly. Jon (01:26:42.766) Right. Or pass it off or do the work to bring it back down. Like, do I want to spend that much time to save five bucks a month? No. Allan (01:26:46.339) Right. Well, you can split it, but if it's five bucks a month times X amount of users, right, it's an exponential problem. Jon (01:26:53.838) sure, that would be, that would be different. But good news, I just checked. So because I just said, I'm like, I'm almost at 20 gigs. I'm like, I think that that's what the limit was per partition. So like, am I, am I going to hit this soon? Like this year yet? Am I going to, but the, every time I get close, they keep raising it. It's now 50 gigs. So I got like, I got years left if I wanted to, to do this. Allan (01:27:06.627) Hehehehe You got time. Well, hey, if you keep going up, though, keep getting popular. Jon (01:27:20.494) Well, stuff's going to get slowed down too, right? So it'll cost more cause like you're, you're querying through one partition, you know, over more and more data. So even just splitting stuff out, probably I'll bring my, my usage costs down. Allan (01:27:31.139) So see there you have to optimize now to save money long term or to keep running apparently if that happens. Jon (01:27:34.957) That's a win -win. Yeah. Yeah. But we're good. We're good for now. Allan (01:27:42.243) So packages of the week, I figured we don't really need it. But I mean, I'm going to put out the three. I'm going to put out mediator. I think people, everybody that's writing ASP .net, just, I think you really should use it really truly. It's a great library. Use it right. It's great. Re -fitter. John's like tele -prompting me and he's like tele -prompting me right now. I'm watching this. Jon (01:27:46.03) Oof. Eee. Yeah, yeah. Jon (01:28:00.91) I'm typing them in so we don't forget. I'm not sure which one you're picking as the third though. Allan (01:28:07.555) I want to throw out Apprite and SupaBase. I think there's a third one that's popular right now. They're more infrastructure backend as a service, but they're pretty nice. I'm trying. Jon (01:28:10.542) Okay. Jon (01:28:18.734) Yeah, they look good. They look good. Allan (01:28:21.827) So we'll include the links. They're pretty, everybody check them out. They will be on our, wherever we post these things when John remembers to post the things. Jon (01:28:30.574) Well, I mean if it's on somebody remembers to or if you do, yeah, I certainly never remember so Allan (01:28:36.131) I will post the links as soon as John posts the episode. And it's not that Canada Day we didn't, we, well, John did forget he didn't post the, he's got the media file. He's the studio man because I am stupid and we continuously prove this with the audio processing. We keep fixing my mic. I don't know if I sound like I'm like I'm breathing into the mic this week. I don't know if we're going to fix that, but. Jon (01:28:37.678) There we go. nice. Jon (01:28:45.838) What? Yeah, I forget all the time. Jon (01:28:56.27) What? I didn't, I didn't tell you that the last episode that we recorded, I actually messed up my audio again. It was all clipping and stuff, but I, I, our wonderful audio engineer, Jim has found a VST plugin that helps tweak some of the clipping stuff. So it actually like that works super well. I have to, I have to pay for it, but I'm like, I'd rather pay for this plug and then re record the episode or like, you know, have it sound really bad. Allan (01:29:24.003) You Jon (01:29:27.246) So it's gonna be okay as a result or okay -ish, but yeah, no, I've done that a few times now where Windows messes with my volume and just, messes it all up. Allan (01:29:37.667) So John is like the studio engineer and I'm kind of the project manager that just has to keep whipping like, John, where's the audio? Where's the links? Right, AI is doing the rest of it, kind of feeds the episodes and all that stuff, so. Jon (01:29:44.782) What? Yeah. I don't know why I haven't shared the folder with you. It's all on a OneDrive folder. Allan (01:29:54.237) well, there you go. See? Studio manager. Anyhow, we will get an episode out. The Canada Day episode was missed. Jon (01:30:01.582) It'll be there. I might put it, so I recorded a video today that I might throw up as a bonus. What's the word for like a mini episode? It's like a seven minute thing that it's not, not related to tech at all. It's, it's more of a coffee thing. Allan (01:30:16.86) okay. there we go. John's gonna share his snob coffee stuff. Jon (01:30:21.006) Just for you, maybe. So maybe I'll start doing some of those. Do you like a little video here and there? Anyway, we've really dragged this one out. It's been going, so we probably should end it. But I would say before we end it, make sure that you go, you've had plenty of time listening to this, so make sure you leave the five -star review on the things. We get some feedback, listener comments and stuff, but we'd read out more and talk about more if you want to send something. Allan (01:30:29.116) Okay, well there you go. Allan (01:30:35.964) Alright. Allan (01:30:54.236) which our studio engineer also doesn't share with the project manager often enough. The one, the one shared, okay. Yeah, there we go. Jon (01:30:54.446) Gone mobile IO. Jon (01:30:58.574) I shared the ones that we get, I think. Well, there's a few. There's been a few. All right. Well, I have to do better. story of my life. Alright, so that'll do it. Thanks everyone. See you next time. Hopefully, if we don't forget, on another Gone Mobile.