Speaker 1: 00:05 [inaudible] frank, Speaker 2: 00:07 we all know that we still tons of code off of stack overflow. I mean it's just how you develop in 2019 you Google something, the top hit is stack overflow and then boom you copy and paste that. But wait frank, I know what you're saying. That sounds like a stupid topic but I want to talk about actually not just stealing code but the community around open source projects and maybe borrowing code from other projects and then redistributing that code because everything is under this beautiful MIT license. Frank. Wow. Speaker 3: 00:40 I have so much to unpack from all that. Hi everyone. I don't think this is a stupid topic at all. I think that this is a great topic. I don't like the idea of calling it stealing code cause we all read the license like you just said. So it's all there for the taking. You just have to copy the license file over, write down their names, make sure you have a link to it, a little bit of work to do, but I'm all for stealing code so let's totally talk about it. Speaker 2: 01:06 Yeah. So this came up, I mean this is in my non-professional part time Gig because one, I'm not a lawyer too. I also do not do this for work. So, um, you know, I want to get that really clear. Uh, but it came out because on Twitter there was a conversation about, you know, commands like with MVVM. So when you have a button, there's a command. When you click on it, it gets called and it's a little tedious when you have an asynchronous task in there and you have to write a bunch of lambdas and it's Kinda gross. So why don't we just have a nice asynch command. And of course this started a threat in which, of course there is one and here's a great blog post and here's an open source library. And then the conversation said, yeah, but like James has this library that I use in a bunch of people use called MVVM helpers. Like, why isn't it in there? And then I said, why is it in there? And that was where it all began this weekend. Speaker 3: 02:04 Okay. So another episode about MVVM helpers. Good. Got It. We're, we're always getting back to it somehow. Well, full disclosure, James, I was a part of this thread and unwilling part of this thread. I kept checking my phone, kept buzzing all about it all day long. And I'll be honest with you, I had absolutely no idea what you were all talking about, especially when it comes to a sin commands. I don't personally use the command pattern. Um, I know vaguely it's an interface that has an execute on it. So I'm assuming a sync command, Speaker 2: 02:36 sir, and have a execute a think on them. Am I right? You are correct. Yeah, exactly. Speaker 3: 02:43 So your library is just going to make it easier to create these puppies because it's an interface. There's no Speaker 2: 02:49 actual object out there to create. Yeah. When you, you create, um, so Xamarin forms ships a command and you can pass it a method which would be a void. And the thing with the task is that you'd have to put a little lambda in there that said Async, a little lambda and then a weighted on the method. So it knows that it is a action. Now what my async command will do is nearly identical to what one of our good friends, John Three Thera 10 threat, threatened, I forgot how to say his name. He's a very lovely French man. And John wrote a great blog post all about how he created ace in command. So He created Asen Command, which allows you to pass it on ea a task and then it handles exceptions very gracefully. And that's sort of where it began, where I said, here's a bunch of code on this blog post. Like I'm just going to ask him if it's okay if I can steal it. And John said yes. So that's how it began. Speaker 3: 03:47 That's net started out except it was just an email list. And then someone said, ah, there's a bunch of code here. Do you mind if we all copy this? And like, hmm, I better do this open source thing and put a license on it, or something like that. So that's funny. So the code that you wanted, it came from a blog and I think that happens a lot, lot. Um, how many times do we copy one line of code from stack overflow? I'd say several times a day. How many times do we copy a function off of stack overflow? That feels a little scarier to me, but I'm off of a blog. Yeah, that seems like a good place. I still want to license, I still want them to put it up on get hub so I feel super safe. Speaker 2: 04:26 That's true. Yeah. Well John said what happened is a brand Minnick my coworker and good friend, he had already asked John about it and I believe back in the day or created a version of an himself and he's been using this in all sorts of workshops and sessions that he's does on [inaudible] best practices. And he goes, you know, there's some newer code, you know, I wrote this like a year or two ago so that you could probably use new c c sharp features and sort of remix it. So it wasn't going to be a straight copy paste. I was going to sort of make it my own, you know, rename a few things here and there and use, you know, my editor, config and my spaces or tabs, you know, however I have it in my code. And uh, he said, you know, Brandon sort of already did this so maybe you should talk to him. Speaker 2: 05:14 So reach out to Brandon and Brad's like, Oh yeah, here's my repo. And I'm like, oh, it's under MIT. I like this. He's like, what? I'm like, why don't you just pull this puppy in? Cause he did a bunch of other things, he looked at some optimizations, he added, uh, this week event manager. So when you subscribe to notifications, it makes it a little bit, um, garbage collector, um, compatible if you will. And I said, you should just, you should just put that code right, take your code. You should put it in mind. You know, cause that's, that's the issue here is Brandon had already released a new get, he already had his package out there and I, I respect that. I'm very like, great job, but I already have my own, which has a bunch of other things that this a natural fit. I just want to pull it over. So I didn't know what to do at that. Speaker 3: 06:02 Yeah. To be honest with you. Yeah. Um, I, I actually know the conclusion of this. I know where we're going with this, but this is a tricky part. I think we all face this at some point when we talk about get submodules I think we're talking about this a lot. Like I want your code, but I don't really want all of it. I just kind of want these few files from it. And so you just, you know, you pull in to get library or you'd copy and paste the code in and start changing names, bases and all that stuff, which is, you know, all totally still allowed. So let's take one step back though. Um, this is normal coding. We all do this, right? I want to make sure that this doesn't sound like something special. This is all how we learned to code. I remember the first time I looked up, how do you Parson into juror? You know, you find someone's code that does it. They figured out how to do it. So in your case, I think you just feel a little strange because it's sophisticated code that required some kind of knowledge to create. And so you wonder about like the right way to grab it. But then as he said, um, it's neat that Brandon made a library but it had all those little extra features like that. Um, we can wha what was it, the week thing you need that feature. What was it? Speaker 2: 07:11 So it is a week event manager. So normally you create an event manager that people subscribe to or unsubscribed to, but this one you create one that has an add remove or whatever to it. And Speaker 3: 07:25 I get it now this is, this is when you're manually implementing events. Okay. I try my life never to do this, but I get it. If you're doing that kind of thing, so weak, I'm assuming you just have a weak point or so the garbage collectors not going to trace it. And that's just for crazy safety, correct? Yep. Exactly. Yep. Yep, Yep. Yep. New York. [inaudible] sound complicated. Totally. Just copy and paste this. No attribution. It's fine. Speaker 2: 07:51 Yeah. So that way that is sort of my question is I'm not exactly sure what I was going to do at this point because, uh, I had already started to grab the code that John said, you know, go for it, you know, go, just grab that code from my, my blog posts. So I copied that in and then I said, you know, maybe I do want that week event manager, but I don't know if I want Brandon's week event manager cause it seems very complex. And I go, I wonder if someone else has an a week event manager. Oh boy. And uh, you know who did Speaker 3: 08:25 a little white rabbit running down a hole. Speaker 2: 08:28 Yes, correct. And that white rabbit is named Xamarin forms. And in that beautiful, beautiful Xamarin forms and this beautiful Xamarin repo sat this a week event manager. And I was like, oh, this is, this is great code. It's what file? I want to protect something. I want to predict them. I Speaker 3: 08:47 think it's going to be internal. I know this, I know this from the Xamarin forms, it's all the good stuff is internal, am I right? It was internal that it's coming of course. Speaker 2: 08:56 So I got the ability now to copy paste and change that internal to public who did oh, Speaker 3: 09:04 copy and pasted that puppy. Okay. So you like their implementation enough that you just I'll add their attribution to my about screen. Speaker 2: 09:11 No biggie. Yeah. So now at this point, you know there were some of John's code, some of Brandon's code that I did like cause Brandon added some nice little optimizations with configure await uh, false here and there. He, he, he cleaned it up a little bit that I liked over John's implementation. It was kind of a hybrid. And uh, then of course Xamarin forms had this nice week event manager took that, pull that in. And then I said, you know what, if I have async command, I might as well just put a command in there too. And you know, who already has a command implementation Xamarin forms. So I just ran that code right in there where you're just copying everyone's libraries at this point. I love it, but are you be honest. And then I w Speaker 3: 09:55 where do you stop? Where do you stop? Someone who has a neat string implementation, you could use their string implements. Speaker 2: 10:02 You know what the funny part here is is this is a weekend little hack and then I, so I need a unit test, right? Yeah. So to copy their unit tests and guess who had units out? Ready? Both Brandon and Xamarin forms. Now they weren't written in Ms Tests. I think one was maybe n unit and one was Axion, or maybe they're both x unit, I'm not sure. So I converted those puppies over Bingo. Vango. Now I'm sitting in a beautiful world where I've taken a little bit of code from Xamarin Forms, a little bit of code from John and a little bit of code from Brandon. Right? And I've mashed it all together into my own flavor. I've renamed some events here and there and I've made the API how I want it. But you know, 90% of the code wasn't really mine, but it would've been the code that I would have had to write. Like you can't implement those things too differently. You know that, and that's the problem here is that, could I have written my own async command from scratch? Yes, but a billion people already did it, so why can't I just take some of that, put it in there, add some attribution, you know? Yup. Okay. Speaker 3: 11:12 You're saving typing. That's all I'm hearing here. This is really efficient macro searching. It should just be code snippets when you hit tab the right number of times, something like that. So it's going to go into this whole thing about like, well when copying code from another person's library, it's, I guess it's okay as long as you make it private because you don't want to run into name conflicts because what if you release a library and then someone else's consuming both your library and that library. Then if they're both public, then you're going to have all these name conflicts. I'm like, I guess it's pretty safe if you make it private, but you're just like, no, no, I make it public too. This is my public interface. That code is good enough. And is that true? Is, are these all your public interfaces? Speaker 2: 11:57 Yeah. So everything's going to be public, but I did think about that specifically. And so because what if somebody is using Brandon's library and somebody is also using my lair library or more likely using Xamarin forms. I don't want that to collide. So what I did is MVVM helpers is very simplistic. It only has a few classes in it all in one namespace. So what I did is for commands, I implemented it with a new namespace. So it's MVVM helpers dot commands. So that way if you already have a project with Xamarin forms and MVVM helpers, you may be using the Xamarin forms commands and you don't want to use mine. So it's an opt in at that point to use my async command and my command. Speaker 3: 12:45 Bravo. Good job. I like that a lot. Um, I hate the conflicting names. I actually tried to avoid that too, just because I know if I'm using, um, MVVM helpers, it just kinda goes into every file. I just want it available all the time. So it always gets included at the top. But that was very smart of you to dump it into a namespace. One that hasn't existed right in the past, so you have absolutely no chance at name conflicts. So that was a nice safe, um, uh, move to make there. I'm still a little worried though that it's kind of annoying. I hate hiding important features under namespaces, but you know, you're going to type the using at the top and like you said, you have so few classes anyway that I think your commands, uh, namespace will show up nicely. I think in your case it's a good solution. Again, I'm on your side. Speaker 2: 13:36 Yeah, conflict. So far, so good. So far, so good. So yeah, so that's what I decided to do there. The week event manager, it's in the same name space cause it's brand new. Like you said, not a big deal there, which I think is, is good. Uh, and yeah, so I started to think about these things before I even released the package. I got the sign off from people, right? Uh, and yeah, I think that I felt pretty okay about it just because, um, I didn't want additional dependencies. So the first thing Brandon said is, why don't you just, you know, have MVVM helpers and then have it, have a dependency on my library. Like just include it as a, as a dependency. So people have to bring in both libraries. Speaker 3: 14:23 I assume that everyone listening is screaming that right now. They're like, why aren't you guys talking about that? That's the most obvious solution here. Um, I want to give my reason why I didn't do y. I'm, I'm going to hypothetically place myself into your position and I'm a Weirdo and I hate dependencies and I hate apps that get bloated. I hate my pulling in a small 20 k library that ends up taking a dependency on a five megabyte library. And then all of a sudden my app size is huge and I care about these things. So I totally get why I'm, you're paranoid about dependencies, especially when it comes to your MVVM helpers because it's whole shtick as it's supposed to be. This tiny little thing that's not going to affect your app in any way if you don't use it and it's not going to do anything too surprising for your app. So I think you have that shtick going for you and it can work out that way, but there's problems. Um, when you copy someone's code, you're not getting the bug fixes. What do you think about that? Do you think the code is simple enough that you just don't have to worry about it? Speaker 2: 15:27 Yeah, so that was, there's, there's a few things to look at there. I think that with Brandon, he thought, well, I said when I said, hey, just add your code, right? Just you go, you know, that's an easy thing to do. Hey, you have this code, put your code over here, Brock, let's move back code. And then he of course, made the correct statement, which is then I have to maintain two sets of code, two things, blah, blah, blah. And I said, that makes sense. That makes sense. And then of course, if I bring in the code [inaudible] one better be code that I understand and that I can maintain. Uh, and, and that is very, very important in the longevity of it. So what I decided to do here is I not only brought in the code, but I refactored the code, I re analyze the code, I looked at every, you know, chunk of code that was in there and now it's not a lot of code and these things are maybe just a few hundred lines of code. Speaker 2: 16:23 Again, it's a small library. Uh, and if I was bringing a very, very large piece of functionality, you know, millions of lines of code, then that would be a problem then that should really be a fork of, of that project and doing something else. So I agree. I think the, may it maintain it maintainability, part of it, I don't have a problem with Xamarin forms because that thing's been battle tested for ever. And then additionally, John wrote this code for Async command and I feel really confident cause he ships all sorts of apps and there was a unit test by Brandon unit testify xamarinforms. So I feel very, very comfortable shipping this kid. But it is a consideration Speaker 3: 17:01 to have [inaudible] [inaudible] uh, sorry, I'm still just thinking about like where does your thing fit because you have what's review again, just so I'm caught up. Xamarin forms has a command but it's not async. They also have a weak reference thing but it's not public. So you're providing both a command and a command. You're not making the week thing public. Are you doing that too? Yes. Yes you are. Yeah, of course. You want the maintenance burden. You want to be supporting that code the rest of your life. It's good. It's very honorable of you. I wouldn't want to do that. Speaker 2: 17:36 Well, yeah, I mean when I, when I decide to put things into one of my libraries, I do it because I want it in there and I want to use it, which means that I will maintain it for however good or bad that is. But I decided to make it public because I could see myself using that in my own apps. And uh, how that works normally for maintenance, if I go into this, and that means that when I started a new app, I rely on MVVM helpers. That also means that I am not copying code from MVVM helpers over into my project. I am using only that library. So this is two things. One, it means if there's new code that I wrote in my app that I think could go into MVVM hoppers, I'll put it there and then remove it from my project and second over, since in my mind, I will never copy that code from MVVM helpers into my project. Anytime that I find a bug or want to add a feature, I go do that in MVVM helpers first release a new package and then update it into my app. So that's sort of the maintenance cycle that it goes. And when I made it public, I said, you know, I want to, I will support this. I will maintain it because I want to use it in my own apps. Speaker 3: 18:54 Oh boy. So it's almost feels like, um, I, you definitely, I feel like there's a package religion out there where every library you consume in your app should be a package. So we should all be using my get feeds and things like that. So our main app just has a bunch of package references and I think of that as kind of the NPM world, the node package managing world. And to some degree like the python world where packages just have dependency upon dependency upon dependency. Now in the old days, that was kind of terrible, especially on Ios and Xamarin apps because every time you added a dependency you saw all of its dependencies. It would really clutter the list of things in your app and be like, what are all these files here? And a lot of times they were system files that made no sense. But I think that, um, the world has improved and goodness, we only show the dependencies that we're actually referencing. Speaker 3: 19:50 So I, I still have mixed feelings. I think in the, in your case, these are small classes with very simple behaviors, expected behaviors. And I think it makes perfect sense, but I also like the package world mentality. I haven't gone so far as doing the, my gets and you know, forcing all my code into them. I think that especially in the open source world, the package system is just healthy for a community. It's a more efficient way for us to share code with each other and keep higher quality and not run into 8 million dependencies and forks and things like that. So I still have mixed feelings, but I still feel like you did the right thing in this case. Speaker 2: 20:30 Yeah. A lot of people would just be saying, hey, you know, Brandon creates this library. Why don't you just use his library? Just like bring it in. Because not into my projects, but why don't you just use his library? Right. There's this great thing that you want, James, why don't you just use it? Yeah. Speaker 3: 20:50 It's some kind of control thing. I guess if I didn't write it, I can't use it. Not invented here. I have to admit I heard a tiny bit of that and when you were talking, but I don't wanna make you defend yourself. So I'll say we all have inclinations in that direction. I think you nailed that when you said you wanted something understandable. And if you just bring in a library, you tend not to read through every line of code. You tend not to completely understand it. So I'm going to pre defend you and say you're not a control freak. Speaker 2: 21:19 Well thank you. Yeah, I don't think that, yeah, that that's the reason why I didn't Ellis, I would have been adding a lot more to this project over the last, by the way, how many years? It has been four years since I created this library with very minimal releases, like one, two, three, four, five releases and in those four years, so I don't add or remove things lightly into this project. And some of these are just refactorings until you know, you know, newer.net standards stuff. But I think the other area that I look at too is when you start to build and add more dependencies. This also can have some issues with startup performance. And you know, if you're using reflection on libraries, everything is a little bit negligible. And if I want this library to be like the minimal slim line thing, I don't want people that to have another package to do things. That is what this package is supposed to do. Even so, even though new get hides things, and you could add this or you could remove it or you can make it a dependency or you could do a bunch of things. My thought is why have yet another dll which might have to be scanned or something else. And if this is used in half a million projects, you know, then that could be an issue. Speaker 3: 22:46 Hmm. I'm not going to buy it. Sorry. Not going to go there. Nope. Uh, I think all your, all your reasons up to now have been justifiable. Um, the multi DOL thing, that was definitely an issue, but let's call that an issue. Like five years ago. It's, it's not such a big deal these days. Right now the bottlenecks are always going through the c compiler and things like that. So I think libraries are actually just fine. But I, I get you, I remember when I was writing, um, windows apps, I insisted on a single exe. I would, I'll link all the dlls together because I hated having dependencies. And so no matter where the code came from, in the end, it was just one single giant assembly. Cause it's prettier that way. No dependencies. It's much better. Um, this is funny. This just reminds me, I can go full circle on this. Speaker 3: 23:43 Uh, when we were talking about topic, I was trying to think of what code have I most blatantly stolen off of, get home and just use all the time. And uh, it's the mono linker. It's the linker itself, the thing that combines dlls together. I just keep writing tools that I'll put assemblies. I don't know what's wrong with me. It's like a hobby or a disease, something along those lines. And that, um, desire of mine to never have multiple, um, files to deal with. I just want a single file output leads me to always include the Mano Linker in my little tools and things like that. And the model linker does not have a new get package j ins, there's no.net standard library for it. Nothing like that. It's just source code. So you have to kind of copy paste it. And I'm a little better. I use get hub, but, um, it's essentially the same thing. It's, I'm just stealing the code. Um, it feels wrong. I'm not stealing, I'm not rebranding it. I'm not changing the namespaces and putting up a new get. I think that would be wrong. Um, I've definitely had people do that with my libraries and I don't appreciate that. But I think, um, with things that don't have libraries, what else can you do? Of course you're gonna do that. Speaker 2: 25:00 Yeah. That, that is the, the, the bitter sweet. Um, part of this I would say is that while this code that I kind of repackaged part bits and pieces of it started from a blog post that wasn't published at all. I then found out that it was, so by the time that I found out it was, I had already started copying and reimplementing the code. So by the time that I actually was like, oh, oh, okay, I see that this is actually done. That's when it is. So there was some time between, Hey James, here's a bunch of code that I could implement off of the Internet basically off of a blog post that didn't, wasn't in a big package, wasn't in get hub, wasn't anywhere it made sense for this library. Then once I had already finished that initial implementation, then I realized that you know, hey Brandon and already kind of, you know, done some of this code. Speaker 2: 25:54 And that's really the, the flow that when, if you read it on Twitter. So yeah, the thing is to what you just said, people have yes, already done this to me in the past and it pisses me off so much. Now what they end up doing though is they will, you know, take the exact same code, rename a package, put it up, and then it makes it very confusing for people to find. And to do stuff and I'm definitely not okay with that, which is, here's my MVVM helpers. Now I've made MVVM helpers x and I've added something instead of doing a poor request that is not okay Speaker 3: 26:33 to me. Yeah, I, yeah, I don't, I don't think we should be inventing Straw people here, but if you are a straw person and then you want to go out there and copy someone's code and really fit as a package, don't do, it's not fair to just do a PR against the thing. Set up a CEI for them on a free service and be like, look, I set up the CEI for you. Just ship a library. Please do all the work. Give them a link and then there'll be internally happy to you. You don't need to release your own libraries, but Straw people aside, I hope no one's actually doing that. I don't know why people copy libraries. I think they're just having a bad day and they're just upset or I don't know. I don't know what it is chattering. Speaker 2: 27:09 Yeah. I mean I copied some code, but I will say that, you know, the reason, you know, I talked to Brandon and he also didn't want to maybe do this cause he, he uses these libraries for himself, auditioned his functionality is not one to one with mine. He has other things in his library that makes sense, that don't make sense for me because I don't understand them because he wrote them. I'm like, I don't want to tell what that does. But he additionally uses them as part of, um, sessions that he does and workshops that he does sort of allow you to understand how to correct some async await stuff and tidy up code and things. So it also makes sense for Brandon not to put his coat there because he wants to be able to fully own this a hundred percent and he has different goals with his library compared to what I have with my library. Speaker 3: 27:58 Oh, that's so different to, if this is, I'm going to call this teaching code. There's a style you adopt. There were explicitly, you don't want dependencies, right. If you're trying to teach someone a little bit of code or an algorithm or an idea, you don't it in a library and call that library. So you yourself in that style tend to implement things as simply and cleanly as possible to express the teaching objective. So yeah, that makes total sense. Um, they, he probably wouldn't want to make a lot of changes that you would ask for from an engineering standpoint cause it could totally clutter the example, the points he's trying to make. So I think that that's even doubling down. That's an even better reason. Uh, just steal that Code James, just copy and paste it right in. Speaker 2: 28:43 He will file. So, you know, that's essentially what I did, but I, I do want to get back to one part of, there's a lot of different reasons in which you'd want to do this, but at the end of the day, what is the legality of this on open source projects? We are not lawyers, we can't do live, but what should I do as a good citizen? That's what I want to talk about. Speaker 3: 29:08 Yeah. So, but I've been doing, uh, whenever I copy someone's Co code or like code files, I create a sub directory and I put their, read me in their license file and they're at a minimum. So that well established within my code base, you know that this is software from a different license. Hopefully the license is compatible with or it has to be compatible with mine. So I love MIT license and Apache license and BSD licenses. I put those things in there. Then that's in the source code side. Then on the app side, um, I tried to do an about screen where I actually name names. I think that's just nice. You're, you're good about this. You did this in the conference app. So I think that you can actually be a role model here where a nay name who wrote the library give a link to the library and um, you know, even apple shows the full license. So they have a huge about screen where it's just license after license after license. Uh, I haven't gone that far, but the rest I do. Speaker 2: 30:10 Yeah, I, with the conference app, I decided that that's what I wanted to do to sort of show the awesome community of people creating libraries. So a link to all the good hubs inside of there. And then the other thing that I've seen in the past and also done in the past is that license file. So that is quite fun because if it is, I don't know what the legality of these are, but there must be some lawyer for some companies that say you need to include those licenses in there, uh, because maybe they're using one that needs to be specifically cited, Speaker 3: 30:46 I guess not a lawyer Hashtag, Speaker 2: 30:48 not a lawyer, but that's how I found out that my software was in the Nintendo app because they have a intellectual property notices screen, which is that big is there's plus a big scrolly thing. So I was throwing down, I'm like, oh, there's my name, I'm look at that, you know, and I thought that was really, really cool. And they just include it all in this one big, big file. Speaker 3: 31:11 Did you actually do that? Or someone find it, like you actually scroll through a giant field looking for your name that will take forever. Speaker 2: 31:17 Yeah, I put it all in there. Right there. There's Xamarin, there's James, there's FFM v a, yeah. A bunch of stuff in here. All your plugins. Yeah, as current activity plugins. And I'm like boom, there I am. Right. And I thought how cool was that in general? So that's one thing that I've also been aware of. And additionally what I've done is for MVVM helpers is in the, in my license file, I've included the other license files and point to that license file in general. Is that the right thing? Yeah. Speaker 3: 31:51 Or the wrong thing to do. I was about to ask you, is that the right thing to do please listeners, right in, especially if you're a lawyer, listen, right in. I don't do that. Um, because I always felt like the sub-directory approach was pretty darned obvious. Um, but I can totally see the argument for what you did. Uh, I don't know. James Hashtag not a lawyer. We need, um, we need feedback. People let us know. Speaker 2: 32:19 Yup. Now, the Nice thing that said is that everything is under a MIT. Yeah, we can do pretty much anything. It says right here. It says, um, it's free of charge. Anyone can obtain it. They can use copy, modify, merge, publish, distribute, sub license and or sell copies of the software and to permit persons to whom the software is furnished. Um, yeah, you just, you go, now it does say that the above copyright notice and this permission shall be included in all copies or sub substantial portions of the software. So in the license it does say that you must include this other license in your license or somewhere else somewhere. It doesn't say where, but somewhere. Speaker 3: 33:02 Yup. Yay. We armchaired licensed lawyers. Um, I think like you said that that was just, um, a nice thing that you did for the community of showing off. But I think it's just a good thing. And software, I remember Adobe products always had credit screens, or at least back in the day they did. And as a kid, I loved watching those because I thought it would be so cool to have like my name as a programmer on a screen. So I see absolutely nothing wrong with in the very bottom of your settings app, having a detailed developer info or licensing info and have a little fun with it. Spend a day on that UI. Make it nice. Speaker 2: 33:41 That's a good idea because honestly nobody, no normal user is ever going to click on a button that says intellectual property you notices, but you know who will, Speaker 3: 33:53 uh, Bill Gates Speaker 2: 33:54 developers. Uh, and B, I mean bill's developers. So you have a developer. Got It. Is developer. Yeah. Developers. Well, especially if it is software that they are curious about. And I think that that is why you have been a, and I know that people will do it because you yourself just literally gave 18 different examples of software that does that, I think. Speaker 3: 34:16 Yeah. Yeah. I don't think apple does it though, right? Hmm. They do the licensing we've talked about you can find that on Ios. It's hilarious. Speaker 2: 34:26 I would be familiar with it. Yeah. I'm looking, I'm also curious if you know, Twitter user websites do it. I think the, you know, it's, it's not just apps. It could be literally anything Speaker 3: 34:39 thing. I would be very, very, yeah, and we should be clear. This isn't just for code. If you're using anything from the creative comments, any kind of graphics or anything like that, you have to include those too. So I feel like every modern app these days has to have a licensed screen. We should probably release a new, get out there, like the ultimate license screen and just make a nice version of it. Speaker 2: 35:01 I would like that. Yeah, just reads from a gr there is one for android. What is it called? Uh, I know there's, there's an app on my phone that uses it. Uh, there's not a cross plot, one plus fun platform, one that I call, but it's almost like monitor touch dialog for licenses. Yeah. It is called TLDR legal Lafitte great name. Uh, and I think that that has a like android kid or something. And what it does is it point, you pointed at files or Jason Files and it just generates a UI for you that you tap on and then opens whatever Speaker 3: 35:40 page you will love it. Yeah, that's perfect. Don, steal it. It's what I guess I should be saying for this episode. Speaker 2: 35:48 The bet better yet with this should really do frank, is it should scan all of your new gets that you have an inside of the new get is a link to your license file and could automatically generate that on demand. Million dollar idea. Speaker 3: 36:02 Million Dollars. Well, I'll write it and put a half million dollars price tag and get you out of that market. Speaker 2: 36:08 Perfect. Well, I hope you open source it, put it under MIT and then put it up on get hub and then I'll redistribute it for free. But with that frank, that's gonna do it for this week's emerged conflict. I love talking about this topic. This was so much fun, frank. Speaker 3: 36:21 Good legality. We got a little legal toward the end there, but the rest was fun. I liked. Other people are smarter than me and they're going to type faster than me, so I'm going to steal all their code. Great. Yes. This Speaker 2: 36:33 podcast, of course, brought to you by Brennan, Mimics Code John Threatens code, and of course the entire xamarinforms team code. And thank you so much for allowing me to borrow some of your code, remix that and re-publish it into a beautiful, wonderful, MVVM helpers library. And of course, thanks to all of our listeners that have been with us now for years upon years, this podcast would be nothing without all of you. So I hope that what you do is you take your best snippets, snip that out the best 30 seconds, publish that on Twitter, but of course the link back to this episode. So all of your friends know that it was credited to us and we would appreciate that or just tell them about the podcast. Either way that works for us, and that's going to do it for this week's pot until next week. Speaker 1: 37:17 James wants a Mac now, and I'm Frank Krueger. Thanks for listening. Peace.