mergeconflict306 === [00:00:00] James: Frank, a big congratulations to you. You've had a PR [00:00:12] Frank: merge. I have contributed to open source software. I am very proud of myself. Well, I mean, I did it selfish. Isn't. I mean, I guess that's why we all do open source stuff, but yeah, I did it. I got something committed to the Xamarin slash Xamarin, hyphen Mac iOS repository, which if you're not in the know is the Xamarin repository. And also the dotnet 61. They like reflect each other. Now, I don't know. There's some bot that does it, whatever it's in the big stuff. [00:00:48] James: I like it. I think that's absolutely spectacular. You know, I actually was reading someone on Twitter. I think I don't, I don't, I don't know. You know, Twitter always recommends random posts for you. And then I try not to read anything, but then I did and I was reading through and someone was, was like, I always get asked, recommended, like, you know, oh, And where can I go to, you know, contribute to open source? Or should I contribute to open source? Like someone keeps asking. I think there were a library creator with a popular library. Okay. I get to contribute to your library. And I think that person's answer was like, no, and I was like, that's funny. I was like, We are because we talk often about our libraries and it is hard to take, you know, pull request, and it goes through a process and is someone that does want to contribute to a, a repo or project. It can feel like demoralizing a little bit to. Wait and wait and wait and go through process and back and forth and back and forth. And you see that often with especially large, large projects. Right. And, but for me, even on my libraries, whenever I get a pull request, I jumped for joy and then I'm like, okay, now I need to like, pull it on the thing I need to like test it and needed to go through this. And it's, it's a big cognitive load as well. I think though that all of that, what I'm trying to say is still worth it to me at the end of the day, because when I do get something approved or I do merge a pull request in, I feel pretty good, like David pine, um, on the endeavor on our docs team, where he was, he's really into this Donna podcast. And we've been building, we did for Donna and he keeps adding new features. He's just like, oh, I added a, you know, a speed up podcast as I do this. He's like, oh, I added this, you know, use system theme, blah, blah, blah. I'm like, okay, David did send as many pull requests as you want. Just go ahead and do it and make sure you send a screenshot and a demo of like it working. I trust you. Right. And, and I, we built that rapport where it's like, all right, David, I trust you. Like, I trust that you've tested this scenarios XYZ. He's feeling good. I'm feeling good. The project's getting better. Great cycle. And it seems like Frank you've now contributed back to the product that you know, and love and build, and is so essential to your business every single day is that. [00:03:08] Frank: That is correct James for about the fourth time. This is about my fourth and it gets harder every time. I'm just kidding. It's funny because I have been contributing to Xamarin since actually the earliest earliest days, there was so much stuff, so many things to bind in the library that they were just asking for contributions left and right. Like. Pet fame pet framework, and you want to bind it, please bind it and contribute that. So in the early wild, wild west days, I was actually doing more of that. But as Xamarin grew up into a real company, and then as they got acquired by Microsoft, the processes become a lot more formal and a lot more work. And the project is so, so big now. So I think the trick with contributing to projects is often how easy are they? The build, how easy it is to get all that stuff set up. Uh, I had seen that tweet you're talking about, and they had mentioned, they had mentioned that, um, the code was so well-designed that it was easy to contribute to and that's important, right? Like the hardest part, uh, contributing to the Xamarin code base is. Downloading the huge code base, getting all your dependencies at the right versions, locking your system down to those versions and then actually doing a bill. Like it, it stresses out my 10 core machine, like nothing. So if you do have an open source project and you want people contributing to it, just make sure that build process is like one line and always works. Things like that. [00:04:42] James: Yeah. That makes sense. Yeah. I do think that one of the hardest things is. Coming into a large project following the guy answer because actually with Don and Maui, I know that the team actually spent a lot of time focusing just on that, on the contribution guide on how to make a pull, request, how to do this, and it can seem overwhelming, but I'd rather have more guidance on how to contribute to a project. Then less guidance, especially on a large project, right? If it's a small. Project that, you know, as well, architected, uh, then, you know, maybe it's, it is easier to contribute to, but that doesn't mean that large projects are impossible to, or should be impossible to contribute. [00:05:28] Frank: No. And in this case, although it's painful and big, the project is what over 10 years old at this point. And so it has all sorts of sanity checks in the beginning. It's mostly a frustration of up, it gave me another warning. My X code is the wrong version, or sometimes it wants two versions of X code, you know, like, okay, golly, gee, Different versions of mano different versions of.net, all these things. And fortunately that's all written down and, uh, you know, development guide on get hub somewhere. So you can just follow their instructions and it mostly works. You know, you gotta be careful with like master branches or main branches because they might not build there. You know, there might be something weird going on with them. So I always, uh, I like to file an issue first. Uh, just kinda let everyone know my intentions. Like, Hey, here's a missing feature. I'm willing to contribute it. And, uh, please point me in the right direction if, if you haven't done this before. So that's the tact I took here. Um, I'll mention this is Apple's new library, everyone. The new AI library, we mentioned it on a previous episode, it's called M P S graph. Metal performance shaders graph. And it's like their fifth neural network library. But James, this is a good one. This is the good one. I'm really excited to have it, but, um, it wasn't bound. So I decided to do this Polaroid. [00:07:00] James: Well, that's good. And this is, this is why we went back in history to figure out where we talked about this. This is one where we went back and we were talking about the swift, the new swift API for inept billing on Mac, which will us on this discussion that apple actually has about 25 billion different machine learning and AI libraries. And which one do you choose? And what do you rewrite? But it sounds like this is the one that you do want to use. [00:07:26] Frank: Yeah, it is. Um, and that's coming. It's funny because I haven't used it, you know, maybe once I get using it, I'm going to hate it or something like that. But it's one of those chicken and egg things. You kind of have to have it before. You can judge it. Plus it's awkward timing. We're recording sometime in may and WWDC is coming up and it's a giant question, mark. And it's a serious question, mark. Will there be a sixth machine learning library or will they finally use. Do I add, you know, improve upon one of the existing ones, really looking for a clue from apple there, but I will say out of all their libraries, this is the, this is the best designed one. This is the one that's the most powerful has the most features. I I'm happy to get into those features if, if, if you're willing, but I don't want to bore you too much with it other than to say, um, [00:08:20] James: Well, what I want to talk about here is a little bit of the journey to open source because we both saw that tweet. And I think that we both didn't agree with the tweet and I think that it should be easier to contribute to open source. So let's talk about where you started, right? You said specifically you started not with the port request, but you started with an issue. Can you explain? Yeah. First and foremost, why you started there, what you prompted and what your expectations. [00:08:49] Frank: You know, this is something I learned from contributors to SQL Lite dash net. Um, I never re required or requested this in my own open source library there, but I noticed that people had started opening issues so that there could be a little discussion around something before doing a poll request for all my God, 8 million different reasons, because why spend the time coding something? If the project is just going to reject it, like, Nope, not interested in that feature. So a, you have to get some kind of sign off from the project. Otherwise you can do it in your own fork or something, but you're not going to go through the pain and misery of, um, getting a PR merged into the project. Number one reason is just to make sure that they're at all interested or in my case, I was curious if anyone else was already working on it. And I was like, Hey, it'd be wonderful. Someone else did this. I don't want to do this. Very nice to know someone else's. So those are the big number, one reasons to do it. [00:09:51] James: That makes a lot of sense. Okay. So you. You open this issue now, how much detail did you fill in? Right. Did you like spec the thing out or like, what was your sort of, cause, because I've seen like, I want X feature and some people will be like, I want it to take 25 photos on one, you know, with one API, for example. Right. And you're like, okay, like, well, how does that affect the API? What would that API look like? Like, you know, this is obviously a bit different, cause it was a binding, but how would you approach like, Hey, I want a new feature or, you know, I found a bug, right? I think actually another point here is we're talking about features, but I think the same thing applies to bug. [00:10:28] Frank: Oh, absolutely. Yeah. So bugs, I think you have to explain almost a little less, obviously if they explain the bug and the reproach, but once someone agrees that it's a bug that may be like, yes, I want your PR those, those are not hard to sell. You know, people are willing to accept bug, fix PRS, pretty eat quickly and easily. It's the feature once. Yeah. You absolutely have to prove out in the case of this one. It's very direct. It's a. Binding of an entire framework. So I was actually debating like, ah, could I do a partial binding, only take the bits I want any of that, or is part of the thing already bound. And it wasn't. And so my, my selling line was very easy. You don't have this giant hunk of code. I'm going to give you this giant chunk of code. So it's hard to say no to that, but you know, going back to SQL Lite, oh, I want like. Not unit tests, but I want multiple code samples and database schema of what they want and how they think it's going to work. Because someone can say something like I want joins to work in SQL Lite, and that means 8 million different things to 8 million different people. And so you really do have. Code examples for a library. I would just show yeah. Uh, API level code, examples of how you want it to work. [00:11:49] James: Okay. So now you have this issue open, you get a response, there's going to be one of three things, which is like, that's amazing. You did the best issue ever go do it. And then there's the, we need to talk about this more and then there's, I don't think so. Talk through the next steps in each of those scenarios. [00:12:11] Frank: Yeah. Um, so you're waiting for that response. Absolutely. Uh, there, there's another one of this is really intimidating and I could use some advice. And would you please give me some advice here? So you're like waiting for that advice to comment and also, and the case of this project, I, um, I, because I do have a little bit of experience in this report. Like I said, this is like my fourth PR it's my second large binding that I've done. The problem is I always have like four or five years in between them and I can never remember, um, how to do it basically. And so fortunately, um, For a large binding, like this, there's a lot of tooling support. There are tools in the repository to use to help you out with a lot of this stuff. You are not supposed to hand type all of this. You're supposed to use the tools so that you don't make common mistakes and you check over things and things like that. So fortunately in this case, um, I got the approval pretty much right away, and then it was straight into, uh, please help me. This is huge and asking for a little bit of help reminders on how to use those tools, because unfortunately some of those aren't, uh, documented as well. [00:13:28] James: So it's okay to ask questions as a follow-up, maybe even talk through your proposal, your plans, your details, even before you start the. [00:13:40] Frank: Oh, absolutely. Especially when it's a wide ranging, uh, I can give an example in this API. So this is a neural network, API and neural networks. You deal with things called tensors, which are just giant matrices, but the matrices have, you know, it's like a multi-dimensional array. It can actually have, it could be a single dimensional, right? The normal one, two dimensional three-dimensional four dimensional, five dimensional, all the dimensions and you represent those as. The dimensions as an array of integers. So instead of one length for an array, you have five different lengths for an array it's normal. It's actually built into the C sharper Ray supports all that, but the apple API, and you've done enough apple programming that I'm hoping to elicit a groan from you here is an NS array of NS number. Okay. It's just, it's the worst data type to construct. It's not that it's hard to construct. It's just gross. And like the amount of code that you have to write to get an NSRA of an S number is a bit of work. And so in the, in the issue thread, Hosted a big question. I'm like, oh, look, when I'm, when I'm writing the software here, I am not going to be constructing an SRAs event as numbers that is ludicrous. Can I have permission to do all the type conversions and maybe memory copies to do array? Yeah, classic gorgeous array. And honestly, I was nervous. I wasn't sure if they would approve of it because there are, you know, there's the tiniest, smallest performance overhead because you have to do that conversion every time. But, um, I was really happy. Everyone's like, yep. Go for it. So dodged a bolt there much, much nicer API. [00:15:33] James: Nice. I mean, that's pretty cool that you are not only like starting the process, you're getting feedback in real time and then you're kind of on your journey. Okay. So I want to talk about that journey, right? Which was, you started to do the you're working on the code. You're trying to do the port request and then, you know, you, the day comes and I think we may have talked about the pork was day and that's the beginning of the journey. But before I do let's thank our amazing sponsor. Seeing fusion, listen, you don't need to write bindings. You don't need to send pull requests because sync fusion has all the controls and all of the great widgets and gadgets and Excel, spreadsheet processing, and all the things that you need for all your applications. Don't be like, And write a bunch of code let's think fusion, do it for you. Listen, sync fusion has hundreds of controls for absolutely everything that you are building. Whether it's a web app with blazer, asp.net, core JavaScript, angular, reactor view, or mobile and desktop apps with Donna Maui, Xamarin, flutter, UWP, or hack, even desktop apps with wind forms and WPF. They have absolutely every single thing that you need, including beautiful charts and graphs. All sorts of beautiful controls, like a whole Kanban control, like here's a Kanban board done. And heck they even have file format processing, including Excel, PDF word, and so much more. You got to check them out@syncfusion.com forward slash merge conflict. That is sync, fusion.com forward slash merge conflict. And. James and Frank Sanchez, thanks to St. Visa for sponsoring this week. [00:16:58] Frank: Thank you. Thanks fusion. I do thought that there's like a whole control. That's just a whole combined board. That's I love that. I love giant controls. [00:17:07] James: Here it is. And you're done. You're like, yes, done. Okay. So you, you you're, you're like, this is the best code ever. You totally submit the port requests and it's accepted right away. [00:17:19] Frank: No w wow. Oh boy, we're skipping over two large steps. One, get the code working to get that poll request. And, uh, the, the number one was actually tricky here. This was, this is a brand new framework. There's no knowledge on the internet about it, or next to no, there might be zero stack overflow questions on it. Right now. All you have is. Uh, WWE 20 minute WWDC video and sample code. And so like I start out in the swift world. I, I take their sample code and James, this stupid sample code. Like this is Apple's own code for a new framework. And so I go through all the phases of grief, you know, I, I try to, I update my X codes. I update my operating systems. I update my devices, I try all this stuff, you know, and I finally had to do, I had to put in a paid apple technical. Request just saying, Hey, you have the sample, the sample crashes, the moment you try to run it, can you please explain to me a what's wrong with the sample B, how to fix it, uh, and see a few other things. And so it was, it was quite frustrating to be throwing honest. I loved this API. The API was gorgeous, but to have like the sample crashing was really demoralized. [00:18:49] James: Yeah, that doesn't sound like a super fun process at all. If that's the case. [00:18:54] Frank: Yeah. Especially this API is for iOS 14 plus and Mac 11.5 plus, but you're really don't want to use it on Mac 11.5. It's really Mac 12 plus. So iOS 14 plus Mac 12 plus hot off the presses. Barely baked, little, little cold in the middle. Burnt on the outside, cold on the inside. Uh, so that was fun. And the actual, a good amount of time went by finally kind of figured out what was going on with the apple sample. Um, That's like we could do a whole nother show on those apple paid support things. They used to be really high quality, but I was very frustrated with the person this time. They just didn't want to do anything. So anyway, um, if you create an API. Tests the heck out of it before you submit a PR so long before I want people poking at my code, I want to make sure it works. So I ported the apple sample over and played around with it for a few days, making sure that my binding was decent, always important to do, especially because the binding. For.net. Isn't a one-to-one copy from apple. You want to make it dot neti. You want it to make a comfortable, like that array thing, you know? So I wanted to make sure the code was comfortable to use both from C sharp and F sharp because I'm a weird F sharp person. So I did all that. [00:20:20] James: Now, is that a sample that you check in? Like, is there unit tests or their UI tests, or how does, how does this process work normally now for this project, but what are your expectations as an open-source. You know, library, owner [00:20:34] Frank: yourself. I absolutely expect someone to write unit tests for something like this. Uh, if you're doing a bug fix, I would appreciate a regression test. Not always possible, but you know, they're nice, uh, for a feature, you definitely want unit tests. Enter problem. B's B yeah. We'll call problem. Be a bug for, I don't know how to write tests for the Xamarin repository. There are so many tests in it. James, there is a, there is a whole custom test runner. That's like a blazer app and you can browse 8 billion tests running on 8,000 platforms. The UI is absolutely atrocious. No idea how to use it, where to put my tests, how to run my tests or any of that stuff. The test infrastructure for this thing was absolutely insane. And so, you know what? I submitted the PR without tests, but I put a big bullet point in saying, I have a test. I just have no idea how to add the test to the repo. So yeah. During that development phase, I was definitely thinking about, and it doesn't have to be a perfect unit test. You know, this is just a binding, just have to prove that, you know, I can train the smallest dumbest neural network possible. I'm not doing a thorough API coverage. Just want to prove that it's working [00:21:59] James: nice. So you submit all this at once. And it's good, right? Because you've tested it. You said you've tested it for days upon days upon months at this point. So you're rock solid. You're feeling good. And it's accepted, correct? [00:22:16] Frank: Yeah. Instantly within five minutes. Perfect. Just like, oh, Frank it's [00:22:20] James: in. Oh yeah. They see per Clara. Well, obviously it is a no-brainer might as well, just immediate. X approve. Go done. Yeah. [00:22:31] Frank: Yeah. I wish I wish. Oh my goodness. No, I went through the full, I went through, uh, uh, so there were in the end, something like two, two or three reviewers and they went line by line. There were, there were a lot of lines and they went line by line. I wasn't expecting that. It was so much, Hey, I haven't, oh, I don't work on big teams anymore. I'm not accustomed to big PRS and code reviews anymore. I mean like white space changes, tons of those. And then the endless naming debates that you can get into with a giant API binding like this. So I would say. I, I was pretty proud of myself. I did a good job here. Here's where I messed up. Um, there's a lot of, um, there's a lot of attributes that you have to add to API APIs that say this is available on, I was 14, this was available on Mac and all that. And nowadays we have four platforms. We have to say that for on the apple side, you have iOS, you have, uh, what's another one T V O S. You have macro S and you have Mac catalyst. Now, so you have to put those four attributes for everything. So that was one big round of boy that was like bookkeeping, because Apple's not even that clear about it sometimes. So you really have to look around for all that stuff. So messed up that, but that's somewhat understandable that doesn't really come up in unit tests. [00:24:06] James: Yeah, that's a tricky one because it is a rather complex API, right? In general, because of the vastness of the operating systems in which it can run in. And those aloe attributes are more like little indicators. Right. They show up, tell us, like you said, so they're not required, but they're nice to have. [00:24:25] Frank: Yeah. Yep. And then just a lot of white space bugs because oops, I haven't worked, you know, I actually blamed the repository a little bit for this. They need a better, or they don't even have an editor config. I just rely on editor config for everything now, because I bounced between so many things. Styles now. So I'll say that's a little bit on, uh, the, uh, library here. Everyone add an editor config to your open source projects, please. Then you won't have to go through this misery of stupid white space changes. [00:24:56] James: Yeah. I'll tell you this much. I've definitely had some PRS come into my repos that have. Space issue or new line or indentation or tabs spaces, things. And I'm like, I'm pretty sure, like, cause I remember what I would do is I would go into my repo and make sure I have my editor config and then I'd open every file and I do control shift a control like KF or whatever, which reformats every single one. So I'm like, I want to make sure that every file is formatted correctly and I'm like, you can't mess this up. But I think if you open things in other editors, You know, support editor, config. I dunno which editors there are you just do something in the browser or mess up then? Yeah, I can definitely run into a bunch of issues. I always feel bad about that, but it makes the code. If it's, if it's a single file, like you just added a new file. Like that's not a huge deal, but, but when you are contributing and you're modifying code reading, the diff becomes nearly impossible. [00:25:53] Frank: Yeah. Yeah. And this, this is all too, just because this code is going to be in here for 10 years, it's going to be worked on, you know, 10 is probably gonna be in there for 20 years, you know? And so they just want to make sure it goes in clean. And I get that. I was just frustrated because, you know, thank goodness get hub has made this so much better where they have the batch. Um, updates to a PR where you can check. Yeah. Oh, thank goodness for that. And thank you to the reviewers out there, Alex and Rolf, because they were real troopers. They went through and fixed all my stupid stuff like that. I appreciated it. I felt terrible. Really. I just felt bad for them having to go through and do that. Um, now because they went line by line, we did have some fun technical discussions. You know, me, I'm all about performance and I'm about convenient API APIs. And I figured this was a small opportunity to add a few convenience functions too. So these aren't bindings necessarily like these aren't calling in. Sorry, these aren't directly calling into Apple's API APIs. Instead, I'm just trying to add some convenience functions like data conversion, mostly data conversion, mostly because apple has a hundred. M L libraries. They have 1600 data types for storing floating point numbers and various ways. And so I added a lot of convenience functions for those and because they're convenience functions, I want them to be super efficient and fast. And so everyone had to double check my code because they were like, Frank, are you sure this is allowed? And I'm like, yeah, totes, I even wrote a year to test to prove that it works. And so I'll be honest. I get a little nervous. I thought that the unit has say at work, Rolf said it was okay. Rolf knows everything. So I'm sure they're going to be great. [00:27:45] James: Yeah. I'm looking at a lot of your code. There's a lot of math also happening in year two, especially in the extensions. Math scares me a little bit. [00:27:55] Frank: Well, you know, I didn't want to be the one binding this library, but if I can be arrogant for a minute, I'm kind of happy. I'm the one binding this library because I could make sure. That kind of stuff was done, right? Because I don't know how many other people are training neural networks on iOS, especially using Xamarin. I might be the only one. There might only just be a few of us. And so I just wanted it. I was happy to have an opportunity to make this stuff work, nicely, work the way I wanted all that. I think. So [00:28:28] James: you, you kind of got to create in shape an API for yourself in a absolutely ginormous project. For cross-platform development and you wrote. Thousands of lines of codes, like the actual metal performance shader graph dot CS file is 1800 lines of code. Um, and that's just one file. Yeah, yeah, [00:28:52] Frank: yeah. Um, and I didn't go too far. Uh, for example, I have an open source library called metal tensors, which is basically just a million extension methods on the existing. I didn't want to do that here because I don't think that's really appropriate. I think the Xamarin binding should be pretty close to one-to-one with Apple's API APIs, and then it should be up to third party libraries, other libraries to add all of our convenience stuff in real stuff. But where I drew the line was, and this is just a pet peeve of mine. Um, I don't want to have to write unsafe code and. My apps I have to from time to time, but I really don't want to. And by unsafe, I mean, literally in C-sharp you have to say unsafe. Yeah, I don't want to do it. I don't want to do it now. The, uh, native zone, the Xamarin binding the libraries. They have to do it all the time. I mean, that's basically all they're doing. And so I just try to, my policy was if the convenience method did one of those unsafe things and it could be safely put into the main library, then that's when I put it in. Otherwise everything could go out into an extension library that I can add on. [00:30:07] James: Nice. So accepted. You're good to go. It's amazing. [00:30:12] Frank: Name's James names. What is the one thing programmers argue about? Wow. [00:30:18] James: Names and white space. [00:30:20] Frank: Yeah, I got both. Uh, there were a few, uh, a few name changes went through just fine. I didn't care. I didn't, I didn't have a dog in that race. You know, if someone thinks something should be prefixed with get fine. If they didn't like my, uh, pluralization or non polarization. Fine. You know, it's not going to affect my code that much. There was one name change that I made me a little bit anxious because I really liked this library. And I like how the library was designed. And I like. You know what it is. It's a giant math library. Yeah. And yeah. And just like, there was a math class out there in.net that has like math sign math, co-sign math, tangent, math, absolute value, math, all these other things. This library has that it has graphics. Absolute value, graph dot, add graft up, multiply. It has all those things. And there was a question, a very innocent question. Should those functions be called? Get multiply. Get at. Good tangent get co-sign get sign. And I'm just like, no, no. I desperately think that that makes the API so ugly and yes, that is somewhat of a net naming convention and rule. But can I please, please. I just started bagging. I think if you go back and read the comments, I just start bagging at some point. I'm like, can I have an exception to this rule? I think adding get here would be terrible, especially because there's something like 120 minutes. Like that. And so you'd be putting 120 gets into the code for absolutely no reason. So anyway, I think with enough begging and pleading, they're like, okay, Frank, you can have your silly names without the get. So that gave me a little bit of a heart attack. I was like, oh, I put all this effort into, and it'd be ruined because they're going to make me use the word yet with all these functionings. That was a little stressful to be. Yeah, that [00:32:24] James: sounds a little strong. I mean, that's the conundrum, right? Which is enjoying adding, but then going through this process of having everything sort of dissected, [00:32:35] Frank: right. Yeah. Oh, it's painful. It's really painful. I don't know how people do this. You should all work by yourselves and no one's reviewing your code. It's the best? Well, it wasn't quite accepted. Um, uh, finally, uh, Rolf was very kind. I was like, Hey, I do have this test. I just don't know where to put it. He's like check it in anywhere. And I checked it in anywhere and then he moved it to the right location in the repository and actually got it, uh, executing. So that was really exciting. I actually needed help from, um, uh, one of the employees there to do that. I just couldn't figure it out. I, one of these days I'm going to figure it out, but not today. And then what happens when you add tests to a built-in. [00:33:23] James: Um, you, they break. [00:33:27] Frank: Yeah, they break it turns out test, test things and it's annoying. And then they start breaking. Uh, so we went through this, um, long problem. It was breaking in the weirdest of places. It was breaking on Mac on an M Y. Mac iOS 11.5. That was the only place it was breaking. And just like, what am I supposed to do here? And it was again, apple. Already kind of crashy sample. So I'm just like, ah, apple, you are killing me here. You are killing me here. And so I think something I just realized slowly and painfully through binding this library was, although apple says. It's available on Mac iOS, 11.5. And it's probably technically there it's really not a good functioning version of it. It's really a terrible version of a, and I remember in the past, I'm doing this all the time. They'll just say like, Hey, technically, this API is available on this distribution and it's always one of these point releases, but in reality, it's not done yet. It's not finished. And so. We were running into his failure. And I just, one more time bagged I'm like, look, can we just say that this thing's only good on Mac 12 and call it a day because it works fine there everywhere else. It's all good. And I was a little bit stressed over that, but mostly because I had no nothing else to say. It's buggy. Like it just doesn't work. And I was so happy that today, and this is why we're recording. I learned that Rolf agreed with me and it's fine. My binding has gone in end of the road achieved. [00:35:17] James: Right? You did it. I'm proud of you. I'm proud [00:35:20] Frank: of me too. I, I it's it's it's effort, you know, I probably had to spend five or six days on this, you know, it was work. Um, but I'm going to be so excited to have this library and honestly, it feels really good to contribute back to a giant open source project. So I I'm all smiles over here right now. [00:35:44] James: So you would recommend. [00:35:47] Frank: No, no don't contribute. Open-source it's too hard. No, I'm just kidding. Um, for the most part, they don't, uh, these large frameworks tend to get bound by Microsoft themselves or other contributors tend not to have to do this. Now, if you were going to go for a bug fix or an API improvement, I would say it's worth it. It probably takes. Two to four hours to get your machine set up, to build the repository. But once it's there, you lock that machine down, you know, you don't change a thing ever again. I have been on these same settings for the last couple months trying to get this PRN. And so you just, you just leave it alone, get a building and then leave it alone. And then after that, honestly, it, although effort, it was. A pretty painless process, uh, thanks to the reviewers, Alex and Rolf. And I think Chris chimed in also, and especially, I think that hubs PR system has improved with those batch updates. Thank God for [00:36:51] James: that. Yeah. There's some nice, nice additions there. Well, I'm proud of you, Frank, and I appreciate you walking through this process. We didn't actually talk. The library that you added the addition, but you haven't used it yet because it's not actually released it just got merged like 16 hours ago. [00:37:08] Frank: Yeah. But I'm so excited about. The, I wasn't sure if they would ever merge it. So I wasn't sure if I should be writing code that uses it, but now that I know it's, it's in it's this it's going to take some time to actually get released and, you know, shipped out to the internets, but I can keep using my branch for a little bit a while and start writing codes against it. So I'm excited to find out how good this library is and I'm sure we'll do a follow-up episode. Uh, if I, if I hate it or love it, I wonder I'm, I'm hoping I love it because I really want. [00:37:40] James: All right. Well, we will follow up with that. Just like we followed up with this story. I liked the story because we often talk about a lot of projects that we work on, but not necessarily our journey to contributing to other open source projects. We'll have to talk about, you know, when do you contribute versus make your own. Uh, cause I've seen that happen before as well, but that is for another day, Frank. Uh, well thank you for your contribution. I'm excited to learn exactly how great your code runs, Frank. Um, [00:38:11] Frank: it's going to be great. I mean, once I got around the apple bugs and as long as you're on Mac, it's going to work. Great. [00:38:22] James: Well, there you have it. We'll put a link to the PR. In the show notes. So you can check out the journey that Frank went through. And if you have had your own journey of, you know, contributing to any open source project, let us know, go to merge conflict.fm, right into the show, hit us up in discord or tweet at us. That's going to do it for this week's merge conflicts. So until next time I'm James Montoya Magno and I'm [00:38:41] Frank: Frank Krueger. Thanks for listening.