 All right. Hey, friends, hey, hey. Lower your expectations now. If I get any of this to compile, I'm going to consider that a personal success. If it works and everything works as it's supposed to, then that'll be a miracle. So just expect nothing, and you will not be disappointed, because I have no idea what I'm doing, which is fine. Also, a little advertisement. I have a podcast. I've had one for 13 years. It's a non-denominational podcast. I have all kinds of cool open source people. I've had over 600 episodes of it. It's only 30 minutes long. Check it out. It's a good show. I work here, but I don't actually work in Seattle. I work in Portland, which is kind of like the forest moon outside the tractor beam and the reality distortion field. I originally worked in open source outside of Microsoft, and for many years did open source 10 years ago. And I went to Microsoft explicitly to open source everything or be fired for open sourcing everything. So if I've been fired, it either means I've made a mistake and been fired, or I open sourced something I wasn't supposed to and I've been fired, or it's all open and I have nothing to do. When I went there, people said I was a sell out, though, because I was in open source, and then I went to Microsoft, and it really hurt my feelings. I didn't really know how to feel about that, but somehow I was able to work through those feelings because this is me before Microsoft. This is me after Microsoft. It's been quite a ride. Now, you know that we open source.net. You may have heard about this, that we open source.net. Did you know that we open source.net almost 20 years ago? And we did a shitty job of it. We actually just zipped it up, took all the good stuff out of it, and put in a problematic license, and we said, hey, we open source.net. Look, don't touch it, just look. Look at the .net. But a couple of things didn't exist when we did that. What didn't exist? Git, the social web, a large choice of licenses, lots of problems, the organizational will power, not being pure evil. These are all things that we needed to work through in order to make successful open sourcing of .net happen. We actually did this, and we called it rotor, and it was basically a read-only drop of .net, and it caused things like Mono to be made because it was a minefield that we didn't want people to go into. And I went there in about 2008, and we created ASP.net MVC, the Model View Controller version of ASP.net. I wanted to call it .net on nails, but I was told not to. It would have been a way better name. And as we open sourced more and more and more stuff, we slowly trained the legal department at Microsoft to say yes by default instead of no by default. Now we actually have to have meetings to talk about why not to open source stuff. We have to convince people, hey, I really shouldn't open source that. But why? Is it got a secret patent? Well, no, it's just shitty code and no one should ever see it. But everything's open by default. And what's great is that the stack that I work on is open source all the way to the metal. And I'm gonna talk about what that means, what the metal means in that context and what it means to take something open source all the way down. Right now about 60% of the contributions to the core framework are outside of Microsoft with the Googles and the Samsung's and people like you bringing that code in. So more people work on .net outside than work on it inside, which is really exciting. Now this is a diagram with some bombs that Microsoft have dropped on various countries that marketing told me to put in. These are contributions to .net in 2015, 2016. And then in 2018, .net finally destroyed New Zealand, which has been my secret goal. And the other exciting thing about this chart is the people that are actually contributing to the .net source code from boats. Actually on a boat moving this way, this is either a boat or zero comma zero. I'm not sure. It's possible it could be zero comma zero. Actually my data could be all bad. Now there's, we say .net, .net, .net, like it's this word, it's this marketing term that Microsoft has used for so many years. But how dare Microsoft take over a top level domain? Like what if we called it .org? You think anyone would have allowed that? Who would have the audacity to name something .net? It's so offensive that they would just do that. It would be like as if you took like an editor and just called it code, right? We, modern Microsoft would never do that because it would be too audacious. .net now is not a thing that you can touch and point to on the disk and say, look, that's where we installed .net. In the past it used to be C colon, backslash, windows, backslash, Microsoft, da, da, da, da, da, da. And you would be afraid of it. People live in fear of .net because it moved slow, it became part of windows and updating it was problematic. You'd have to go and reboot the machine. And you'd have situations where somebody would be on .net four and they've got a great app and it runs their business and they just don't wanna touch it. They don't wanna piss it off. And then someone else would come out and say, I'm gonna build my app in the new .net 4.8. It's gonna be great. They get the application working and then they wanna update the server and the people who own the server are afraid. They don't wanna bother, it works. Can we just not anger it? And then that person then gets angry, quits the company, becomes a node developer and then they're lost inside of node modules and we never hear from them again. What we need is a .net that can be side by side, that can be flexible, can have self-contained installations. We need multiple .nets. We need plural .nets. So Microsoft made the .net framework, which is on Windows and then .net core, which was originally planned for cross-platform services. Now, all the while, because of problematic licensing and patenting and stuff, Miguel and friends decide to make a clean room re-implementation of .net. Clean room re-implementation. Clean room means they can't look at the source and re-implementation means that one day Miguel and friends went file new project. It was totally in a clean room. I assume they had no pants on and they were just on a non-networked machine and they said file a new project. How did they do that though? They knew what .net looked like, but they couldn't look at the code. So they looked at the shape of it. Like if I asked you to write system.string again, I would say make me a string. It has to work exactly like system.string. It has .contains and .length and .toot. You know, all the things strings do but just don't look at the code. He would write string and it would probably work the same as my string. And then I would say, okay, do the same of that for the rest of .net. And you'd have your own system.file, io.file. You'd have your own system.text.regularexpressions. You'd build your own jitter, your own garbage collector. All of it in a clean room without looking at any of the bits of .net that were problematic from a licensed perspective. And why did Miguel and friends do that? I guess Miguel, you wanted to make a mail application and they were like, we're gonna make a mail app. It's gonna compete with the best mail apps but before we do that, let's write .net over from scratch. It'll be fine. It's amazing. And it turns out you did it and it was nice and then we bought you and now there's three .nets. Now some people would say, well, that's stupid. You're gonna have to kill two of them. Clearly there can be only one. It's like the Highlander. There's only one .net allowed. Except people forget that there's innovation that happens at different times and different ways across the .nets. .net full framework on Windows has cool things happening in the jitter and garbage collection space. Some really neat computer science happening around 64-bit jitters that use specific new processor instructions. There's speed improvements inside of .net core with span of T and some of the new memory improvements. There's amazing stuff happening on mono with ahead-of-time compilation with tree trimming. It's all really just one family of .nets and there's no reason that we can't cross-pollinate because now they all have reasonable licenses. We can actually refactor via subtraction and we can have these things work together as opposed to fighting with each other. So I could theoretically go out to the command line here and I could go to, do-do-do, Scott, desktop, make a folder. That's not a right folder. I don't know what that folder is. I don't know what's, there we go. Hang on, go away. Do-do-do. Yeah, see one of the things that's hard about coding in front of a whole bunch of people is you're looking at me. If you would just look away, that would be great. I type 100 words a minute, but 90 is backspace. So that folder is empty right now. So I'm gonna say .net new and I'm gonna see all the different .nets that I could potentially do. I could make console apps and tests and all kinds of fun stuff. I'm gonna go and I'm gonna say dir .net new console dash o we'll call it FOSDEM con. Okay, and I'm gonna go like this. I'm gonna go into FOSDEM con. I see that I've got some code. I'm gonna say .net run, one one thousand, two one thousand, three one thousand, four one thousand. Ew, Microsoft sucks. Microsoft with a dollar sign. That took five seconds, bleh. And then you immediately go and do some other thing, right? That says, and then you're also like, that says low world, not hello world. It actually says hello world, it's just cut off on the screen there. Okay, that took too long, right? One one thousand, two one thousand, that's too bad. But in fact, what was going on when I said .net build and .net run, I was building this DLL right here. And if I wanted to say .net that DLL, it in fact runs really fast, right? .net run implies restore and build and all the checking, that net run is an SDK thing. .net runs that DLL really really fast. And now I can do some official benchmarking and I can prove that that scales, right? Now I can then put that in a container in Kubernetes and I can do it a cloud scale, containerized hello world, right? Awesome. What's interesting though is what if I went out to, let's see if I did this, what if I went to mono? We'll give mono a tiny font and then zoom in. And then I go to the desktop, to Faw's Demcon and I say mono that DLL. That's the LL part of DLL and that worked. Mono doesn't know about .net core. How is that possible, right? Well, it's because it's using IL. So if I go and open up a developer command prompt and I run ill-dasm, the IL disassembler and then title of my mixed tape ill-dasm and I can say file open. I'm gonna open up that DLL right here and we're gonna say hey Faw's Demcon, zoom, zoom, zoom, zoom. Someone actually drew that icon in the late 80s and they did not know it would be this big on the screen. And then I can see this here. I can see the IL. Now IL is a really interesting thing because effectively C-sharp is apples. IL is applesauce and it then turns into apple juice. This is the applesauce stage of our software. The really interesting part is that I can also take oranges like Visual Basic or cumquats like F-sharp and they also turn into applesauce. That's a whole other talk. What's interesting about it though is that we've got no op, load a string into the stack, call system.console.rightline then no op and then red. And then that's it. There's nothing in there that says Windows. There's nothing in there that says anything. We don't even know where this came from. Additionally, it's calling system.console but we don't really think about who's system.console. It depends on which framework you ran it in. Whether you ran it in Monos and then they ran system.console or whether you ran it in Windows or whether you ran it in the cross-platform.net. And this is a thing that probably not people at Fozdem but people outside forget about is at some point somebody has to call the syscall. Windows ultimately has to do that work or Linux has to do that work or the container has a syscall that is gonna do that work. Somebody's gotta do that work. We forget what's underneath. We're so used to driving self-driving cars that we forget about how stick shifts work and manual shift cars work. And when we remember that, a lot of power happens. In this case, Monos system.console works just great. Works exactly like .net cores. .net core didn't work just fine and it went and it ran no problem. So now I can go back over here. Let's go back up one layer. Here's Fozdemcon and we'll go and say .net new class. Did you say class lib or do you say class lib? Lib or lib? Is it a lib? Do you get books at the library? I'm just saying. I'm just saying. I'm gonna call it lib and I don't care. But you never know, right? It's Europe. We get the books at the library. I'm gonna go here into class one and we'll call it greeting and we'll say public. This is not an IDE and it's not Vim. If I ran it in Vim, I'd have to reboot Windows to get out because I don't know how to get out of Vim. Okay, magical. All right, now Fozdemcon, let's go down in there. That one's gonna go and use Fozdemlib. I'm gonna say var because it's better and I'm gonna say greeting.hello and then we'll go and we'll say are and then this will fail because it's never heard of that before. So then I'm gonna go and I'm gonna do the command line equivalent of right click, add reference to that previous project.net, add reference up to there and then into here and then I'll go and run that and then it says, oh, this file's open. It's because it's open over here. Close that and then it worked, okay? No, I don't want your pity applause. If I'm gonna get it, I gotta earn it. Okay, so just be like, okay, that's fine. You did hello world. Good job, Microsoft guy. We here at the Fozdem appreciate a little bit more effort in our demos. Fine, what if I then went out to, let's go.net new slash o, not a new razor slash o. Fozdemweb, okay, and then we'll go down in there and then I'll hit that and we'll run code and that's yummy and then we're gonna go in here and let's try using Fozdemweb, doesn't feel right. I'm gonna say h1 and we'll say at greeting.hello, hello. Got net run. Then I will open up competitive browser and one of the fun things I'm doing with competitive browser is that I have this thing called Bing new tab. It's really great because when you open a new tab in Chrome you get Bing, but then when you search for something it uses Google and that, and what's nice about that is it allows you to have the really nice Bing home screen and then also find things on the internet, which is really fun, so. Now I just wanna point out that in just a few minutes I've gone and made a cross-platform DLL and had it running the exact same DLL shared inside of Mono, Windows, Linux, the web, but you clapped for a Bing joke, so just kinda letting you know that it's a little disappointing. So in this case here, that DLL is interesting. We've been taking that lib at live and we've been doing stuff with it all over the place, so let's go and say Fozdemweb and we'll go and say look at that CS Proj and that's cool, what's going on there? It doesn't say Mono, it doesn't say .NET, it doesn't say Windows, it says .NET Standard. .NET Standard is an agreement, it's an API level agreement, it's like Android API levels. With Android you say I don't wanna support that weird phone I've never heard of, I support Android API level 14 and that will allow me to support all of these weird Android phones and then if I support Android level 16 some of the weird cheap phones fall out and some of the new shiny phones work, you decide how many APIs you need, you pick the lowest common denominator and it allows you to target as many things as possible. The .NET Standard works the same way. You go and you say hey, I learned how to do system.io.file and I did that in the web for years and now I wanna work in containers or I wanna work in the cloud or I wanna work on an iPhone, I wanna work on Android, you expect system.io.file to work. So the .NET Standard is a contract, it's an agreement that works everywhere and then anyone can go and do that. You could go and you could take .NET, fork it, search and replace all the namespaces, call it scott.net and distribute it and it would work and it would be .NET Standard compliant. You could write your own .NET from scratch and give it that compliance and as long as you can run .NET Standard DLLs, it'll work. If I were to put that in a frame, am I having a stroke? No? Is that me? It's not me. You ever have that sense where something's beeping? It's like, is it my computer? It's not, fine, okay. So in this case, as long as the .NET Standard is implemented, you could put it on any device at all that is written with .NET Standard. So in this case, I put that DLL on a bunch of different places but if any of you saw, Michaela's excellent talk about WebAssembly, WebAssembly becomes really, really interesting. So I'm here in Ubuntu on Windows because Windows runs Ubuntu and OpenSusa and all kinds of great stuff. And by the way, to be clear, it is pronounced Ubuntu, period, not Ubuntu. Don't ever say that. The reason I know that is my wife is a Zulu. It's a Zulu word and Ubuntu is the correct way to pronounce it. True story, person at work, I won't say his name, told me it was pronounced Ubuntu. I showed him a picture and a video of Nelson Mandela explaining the meaning of the word Ubuntu. And even after seeing the videos, I don't believe it, fake news. So anyone you know says Ubuntu, smack them. Now, here is hello.c. So there's a C application and Michaela talked about how you could potentially go and take that. Actually, it works better if you see the whole words. There you go. The C application says hello world to the console. We can go and GCC that. Make sure you run GCC. It works great. And then I could go and compile that with M-scriptum for safety's and speed's sake, I won't do it. I've already done it. And I've gone and compiled that into the applesauce of the internet, which is WebAssembly. It's that middle place. And WebAssembly doesn't care what got compiled to WebAssembly. It just cares that it's applesauce. If you made it out of oranges, it doesn't matter. So I need to go and run that hello.html. So I need a tiny web server. I'm just gonna say .NET serve. This is gonna make a tiny web server. Port 8080. And then I'm gonna go back out to competitive browser and I'm gonna say 8080. And there's that. Hello.html. So now I'm running that C application there. That's cool. Now, what's interesting though is when Microsoft was making a cross-platform.net, they were using Visual Studio and the Visual Studio build system and some C and C++ isms. That doesn't make it super portable. It's portable. It's just not super portable. However, when Miguel and friends were making mono, they were like, hey, get clone, app get build essentials, configure, make, wow. Really nice clean portable C code. What is really nice portable C code good at doing? Being portable. You could go and compile it on a Nintendo Wii. Like that's why other technologies use it. That's why mono's so great is that places mono wasn't expected, mono shows up. Mono's just like that friend. He's like, I'm here, you weren't invited. What if you compiled that create wonderful C code into something like WebAssembly? So what if I went back up here and I said.net new blazer-o-fos-dem-blaze? Go and run that and then we'll go into Fos-dem-blaze. And then I'm gonna go and say, add a reference to that live. Now I'll run code. And this looks like I'm back in another one of those web applications like I was before. And I'm gonna say using Fos-dem-live. And I'm gonna say H2. And I'm gonna say, hey H2. Greeting God, hello, hello. Now that was a Dutch hello, hello. And then I'm gonna go out here and I'm gonna say.net run and I'm gonna wonder if something else is on that port already. Pause for effect. Thinking about shutting other things down that might be on port 5000. There's not. Port 5000's my favorite port. Boop, okay. This DLL shows up in another web app, yay. Hit F12, hit F12 again because the F key is always in the wrong position. Much like a USB port, you only ever get the F lock right once or twice a month. It's always wrong. Then I'm gonna hit Shift F5. And I'm gonna go in here. And I'm gonna say, what? There's mono. And there's that DLL. So that.net standard DLL is now running inside of the browser. Did I compile that DLL for WebAssembly? No. I delivered it. Just literally did an HTTP get and got that binary and it is being executed in the context of the browser. Who's doing the work? That lovely portable C code for mono with a lot of work and a lot of engineering magic compiled into WebAssembly so I'm running a run time of CLR inside of the V8 virtual machine, inside of the process or the 6,000 processes that Chrome spawns inside of Windows or my iPhone or my Android phone or whatever because Wasm is already on your machine. Now at this point you might be like, hey Microsoft guy, you're trying to sell me server light again and I already said no thank you. Except this is the internet. This is the open web. This is WebAssembly sitting on top of HTML. Microsoft didn't kill server light. The internet killed server light. This whole stack all the way down is open source and that's really exciting and then for .NET people who are just getting into this environment for them to go and take an existing DLL or an existing code base and be able to reuse that is super powerful. Now let's pop all the way off the stack to the beginning of the thing when we were talking about that original .NET 10 year old, 15 year old .NET that maybe people are afraid of. Maybe they're writing WinForms apps or WPF apps and they write it on Windows and somebody says hey I wanna install my Windows Forms app because it runs the company and then we have to say well you have to install this version of .NET first and this patch level and then reboot da da da da. Well there is a Windows .NET. It's built into Windows and it's very stable but if you wanna go and do daily builds your own private fork of C sharp, your own compiler, WinForms and WPF we open source those two. How would you do that? Well what you would do is you take Windows Forms and you do a brain transplant. You take your 15 year old app and you put the brand new .NET Core 3 underneath it. Then you'd have a fully open source stack on that front end and you'd be able to put it all in one folder and then theoretically even turn it into a single executable. Now you might say gee why do I want two and a half gigs of .NET into a single folder? That would be not awesome and now you're saying you'll zip it up? No. What you'll do then is apply some of the other tools available to you like the great tree trimmer from Mono. Mono's got this tree trimmer where you would take your app, you'd hang it where you've got all the methods and all the dependencies and you'd give it a good shake and the methods you're not using fall off. So then you just ship the methods that you are using and you can have a white list where you can add in other things if you're doing dynamic loading and then I can get a .NET Core installation down to 30 megs and run it in a Docker container. Now it all depends on what you're doing and how much work you want to put into it but then I could put this onto a USB key and I could run it on a machine without having to worry about dependencies and that's when things start getting really interesting. But that doesn't really make me feel like I'm doing damage or I'm doing anything really amazing. So what could we do that would be really amazing? Let me load up an application that is a very old Windows Forms app. So this is like a 15-year-old app for like a memory matching game and basically this is like a WinForms app that brings up a grid and then I'll just pick the icons from this app. There we go. This is a very old app, okay? The logic, I'm not very good at it either apparently, the logic behind this is a .NET standard DLL. You just take that and you factor everything out and you make it platform agnostic, platform non-specific. So then what could we do? How much of that code could we get running on an alternate platform? How much of that could I get running literally anywhere else than Windows? So we'll go and we'll open that up in a different project that I've got going here and then I'm gonna go ahead and run that. And what we've done is we've gone and taken the logic of that game, so what it takes to win and all that kind of stuff and made it abstract so that things like clicks call out to this card object and now I'm gonna run it in the browser and that is a 15-year-old Windows Forms app now running in the browser using open technologies all the way down. So that's interesting. Now, is that, are you gonna clap for that? All right, we'll clap for that. Now, that might mean that you may be at Fosden but you may also be paying the bills with a Windows Forms app back at the office, right? And you may be thinking, wow, so that means that both of the people who have well-factored Windows Forms apps can go and do this. Well, yeah, there does require a little bit of factoring in the sense of everything had to be platform agnostic. Remember when we talked about all of those calls to native things, right? If you decide to go and new up a bitmap and your platform doesn't have bitmaps, you gotta think about that. Ultimately somebody's calling C, ultimately somebody's calling the platform so you wanna make sure that platform supports it. In this case, I'm using the dotnet standard as my basis and then these things, instead of being graphics in a tree inside of Windows Forms, they are dibs inside of a DOM inside of the web. In fact, with Blazor, again all open source, this is the HTML that describes the game card and that thing right there that says functions from line five down, that is all C sharp. That on click event gets hit when you say on click in the DOM notices the event, that runs and then it delegates to the card which is in the dotnet standard DLL, the exact same one that we send down the wire. So it could be tax calculations, whatever really great well-factored thoughtful code that you have that already works will now continue to work anywhere on a stack that you can change the source code to. So that's cool, but where else could I potentially run this thing? That would be cool. Well, I could go and I've got another machine here that I brought, I actually brought a bunch of different machines, another machine here, this is me. I brought this through airport security, so let's just give me a little credit. Airport security was not appreciative of this and I'm screaming, it's pie, it's pie, it's raspberry pie. But you know, after the questioning it went okay. This is called a crow pie and this is done, this is, they did a Kickstarter. You could use any old raspberry pie but I think one that looks like a spy case is even cooler. It's got the thing here, it's from a company called Elec Crow. I don't have any relationship with this company other than I'm a fan. And I've got buttons and stuff hooked up to the GPIO pins up here. I've got LCD displays and all kinds of cool stuff. And I've got that hooked up to my machine here and then I'm gonna switch over to PowerShell and I'm gonna go here and I am gonna shush into that machine. Yeah, we're trying to make that turn into a thing. If you would help me out with that, that would be great. We wanna basically just start casually throwing that into conversation. So when you're at work later, you'd be like, yeah, we did a little, and then I shushed into production. But don't make a big deal out of it. Just do it casually and then see if it infects your coworkers. And if they start shushing into production or other things as well. And then if you could then later add a little jute and you just, I just shushed into production and then you just kinda do a little, just a little body English, right? You know, I just shushed into production. And then see if you get the whole office doing it and then let me know. That would be great. So I'm shushed into the Raspberry Pi and I'm running top right here and this is cool because Raspberry Pies are fun. And in fact, I shushed into it with Open SSH which is actually built into Windows, ships with Windows now. You don't have to go and install Putty or anything. All the key management and stuff, it's just in Windows. You do all kinds of like really weird things like shushing into Windows, running PowerShell and stuff like that. So what I'm gonna do then is I'm gonna go over to Visual Studio Code and I'm gonna run that. And then I'm gonna go into Visual Studio Code and open up some .NET Core code right here. And this .NET Core code is using something interesting that we just released which is called system.device.gpio. Okay. So this is actually gonna talk to the LCD. Now I could call the .NET Standard DLL once you get the idea and I'm gonna say, hey LCD, pins, pins, pins, low level stuff. And the driver, driver for LCD is just source code which is basically sitting down with the spec and the wiring diagram and lining it up. It's not rocket surgery. And here's the interesting part. From Visual Studio Code, I'm gonna do a couple of interesting things. I've gone and I've modified Visual Studio Code's launch.json because everything in Visual Studio Code is extremely configurable. And I've set up a pipe transport. So I'm telling Visual Studio Code that I want you to build this application specific to the Linux ARM runtime. Have a self-contained folder with all of the Linux ARM stuff that I would need for .NET and Raspberry Pi. Then I want you to shush into the Pi and run the Visual Studio Debugger Linux ARM edition and connect to it. So then, go like this. Da, da, da, da, da, da, F5. Push F5, it goes and builds it. It then runs the tree trimmer from Mono which makes it smaller. Then at SCPs, right there, the files across. Now it's gonna turn orange. Now it turned orange. Now it is starting the Visual Studio Debugger over a secure channel using the keys that I've already set up. And then it's gonna hit a breakpoint on line 47 and or 42, probably 42. Boom. So now I'm doing cross, thank you. For that smattering of applause. So now we're doing cross platform, cross CPU architecture debugging where the build, to be clear, the build occurred on Windows. It built Applesauce. Then it got the ARM specific build for Applesauce. That's where the entire analogy kind of falls apart. When you talk about Applesauce in the context of processor instructions, you don't have like risk-based Applesauce. But anyway, work with me. And then I've got even variables and watches. So I can go and look at those variables across in Visual Studio Code. Didn't have to pay Microsoft to penny. That's exciting. Now, go back over to the pie. I've got all kinds of cool stuff that I can run over there. Where am I on the desktop? I can go and then the crow pie is great. It comes with a ton of Python examples that I'm slowly converting and trying out different things. So I can like see if we can do matrix demos and stuff with the Raspberry Pi. So I can do Python or I can go and do .NET. And then we'll say, I'll just run it again. Run SH. We'll go back to the here. Wait for it. There it is. Wait Microsoft guy with a dollar sign. This is a quad processor, two gigahertz, super computer, $35 super computer. But still, this is a lot of processing power. It's really overkill, wouldn't you say? To use a complete micro computer disguised as a bomb. And to just say hello world. You're really, you're just kind of pandering to the audience at this point. Micro computers aren't where it's at. Real programmers use micro controllers, right? Don't they? Well, what could we possibly do there? What I did is I talked to our friends at a company that has no relation, I have no relationship with, nor does Microsoft and we have a relationship with them called Wilderness Labs that worked on Mono and Xamarin and we're in the community working on things like Netduino. And they gave me something from their recent Kickstarter. Let me go and run Photo Booth on this thing here. Okay, this, this. Somebody took a picture of me once like this and they were like, there's no effect at all. It's his actual forehead. This right here is a meadow board from Wilderness Labs. And this is a tiny micro controller. This is actually the development version. There's four of these in the world. It's an alpha build. The actual one, I'm not trying to flip you off, will be about the size of a middle finger. But this one has some extra headers on top because right now I can't just plug it in and hit F5. It's actually using an ST link and I've got to go and flash the firmware. This is a micro controller, not a micro computer. So it actually boots into NutX, NUTTX, and then effectively boots into .NET. So without a full operating system, kind of with a micro kernel operating system, we boot into that. I'm gonna go and then build that whole thing. So, here I am in the lovely Visual Studio for the Mac. We have Visual Studios for every occasion. And they're all free for open source. Visual Studio community is totally free. Knock yourself out. And I'm gonna go into my app and here I've gone and said hello, pay attention. And in this case here, I'm gonna go and talk to this LED because this is not overkill. This is a tiny embedded device. If I took a tiny battery like a 2,000 milliamp hour battery and I plugged it into a Raspberry Pi, it would run it for tops, four hours without a screen. Tops. Because it's a freaking computer and we have to power the whole thing. But if I was to do an IoT device, I might want that to run for months or weeks on a small battery. It's a single tasking thing. So rather than booting into an operating system and then shushing into it and running stuff, why don't we just boot into the app itself? So let's see if this works. What am I doing? I have no idea what I'm doing. Okay, hang on. I'm gonna turn off the Raspberry Pi because I don't have a cable for that. And then I'm gonna go and take the power cable from the Raspberry Pi. I'm gonna unplug it. I don't wanna have to F suck this machine later. So I'm waiting, send it down. There we go. So USB cable for five volts. USB cable for five volts. Plug it in. Right there. Y'all sing when you do debugging? No? I hope this code compiles because it doesn't die on my failure. And I'm gonna then plug in the ST link. And then I'm gonna go out to the command line. Now, this is a little funky because it's an early build, so bear with me. But in the future, you'll just plug it in, you'll hit a five and a miracle will happen. But it's nice to know what's happening underneath. So what we're gonna do is we're gonna go and we're gonna run STUtil and GDB, we're running GDB server and we're listening on 4242. And then in another window, I'm gonna go and do a remote target over to that other window. So now we just connected to 4242. All right, there you go. So the dots, the dots mean it's working. Hang on, don't applaud for dots. We don't applaud single dots. You applaud when the dot makes it all the way to the other side of the screen. So what that's doing is it's literally flashing the firmware of the entire operating system of this thing using these four pins plugged into that ST link. And if we go back into photo booth, okay. What we're gonna expect to see is this app booting into dot net. Now the wire's a little bit small. So this is actually using mono for the work. But it also brings up some really interesting computer science questions because dot net is traditionally jitted or just in time compiled. But things like generics kind of explode when you just in time compile them. But you can also do interpretation of dot net code, but that would be kind of slow. Or you could do AOT or ahead of time compilation that mono can do. Or you could potentially do all three. What if you could have a hybrid execution that would do the thing that was most appropriate? Having all three execution contexts happen while the same CLR context kind of runs through them. Let's go back to photo booth. And there we go. That is a microcontroller running dot net no problem. Isn't that cool? So that is from Wilderness Labs. And the thing that's interesting about this is that none of it would be possible unless Microsoft started thinking about open source the right way. Why I went there, why Miguel works there, why we all do open source now. The compiler all the way down to the metal enabled these folks to put it on actual metal. Whether it be WebAssembly or 15 year old WinForms apps, Docker containers in any cloud, Azure, Google Cloud, Oroku, Amazon, whatever, you can do this code anywhere with a toolkit that is open source and flexible enough that you can plug in the pieces that make you happy and remove the pieces that you don't. Whether I was using Visual Studio Code or Vim or Emacs or Pico, I can do whatever I want. And it makes me very, very happy. I'm gonna have all of this stuff available and I'll be outside to be able to talk to you. But that's my talk. It's a very exciting time in the dot net space and I'm happy that we're here at Fozdem. Thank you very much. This is the Battle Angel Alita version.