mergeconflict406 === [00:00:00] James: All right, Frank, let's do it. Let's talk about the command line. Everyone loves the command line. You know, I hate the command line. There's so many command lines, all the command line. I'm a GUI person. I'm a, I'm a GUI person, Frankie. I like a GUI because I'm a developer of GUI applications. And the reason I do that is because I like GUIs myself. I'm a, I'm a, I'm an IDE type of developer. I like a rich. Integrated development environment. I love my windows. I love snapping. I love clicking. I love doing stuff inside my GUIs. And the one thing I despise is the terminal, Frank. It's everybody's enemy. It's the worst. [00:00:39] Frank: Well, given that I'm living in a GUI world right now, I thought this is a perfect time to talk about the console. Cause, okay, look, I mean, life stretch goals. I wish I wrote a GUI for everything, but I don't. I write so many console apps still. As a mobile developer, I feel like I write 10 console apps a day. Just because. I do. It's, it's what happens. I should probably use Jupyter Notebooks more. Um, but instead, I create console apps. And, um, you know, they usually start out kind of nice, and then I start, um, outputting some color codes. Start looking at, like, console color dot red. Make your errors red. And that's, that's about as pretty as they ever get. But I was, uh, surfing the web today. And ran into a cool library. And I think we should talk about a cool library to make our console apps beautiful since I write too many of them. And it's a, it's a way to kind of like bring UI stuff into the console, right? We're going to be UI developers on 1970s terminals. [00:01:46] James: Sure. I would say that I do develop console apps. In fact, most recently I've been spinning up a lot of NET console applications, but I've been using them more as a, not as an app, more as a. To be honest with you, that's actually, I've been using them as mostly like, Oh, I had, I have this, this is what I did recently. I was like, I had a little bit of piece of functionality and I had it in Azure function, but I was like, having problems, like deploy stuff on my arm machine. So I was like, I just needed to test this. I'm like, let's do a console app and then put, put it out. Right. And then done. I had this other one, which was, which had zero GUI to it. Right. So it was literally. I scraped all this data from dev two, and I need to convert this JSON to another JSON. So I need to read these files, convert them, spit them out, like in the same directory, like underscore converted, like go, right? And like run it. So zero input, except for like one council dot right line finished. You know what I mean? Like that was nothing, nothing else. Those are the extent of my, because, because of my terminal applications, like the problem I have is, is that they're not super pretty. Like you're saying in general, if we can make them prettier, but then also. One of the issues I mostly have, which I don't think anything we're going to talk about today solves is. All of the arguments, like how are you supposed to remember all that stuff? You know what I mean? [00:03:04] Frank: Yeah. [00:03:04] James: So, so two different issues and I don't think we'll solve both of them today, but maybe we will. [00:03:09] Frank: I don't know. [00:03:10] James: We'll see. [00:03:11] Frank: Well, we can, we can speak a little philosophically first cause I like to do that. Why not? Um, UIs and command line apps are kind of fundamentally different in that a UI is an app that's always running and it's sitting there waiting for user input. Whereas most console apps. Scripts. Let's just call them scripts because that's what they are. They take a bunch of data at the input, do a bunch of bad stuff to it, output a bunch of bad stuff, and that's life. That's programming. Um, so that's more, they're, they're almost like a big function, our programs that way. So that's why they have nasty command lines, because you got to fill in a bunch of data. Um, It would be nice to pop up like a little web form. Uh, so I wrote a library a long time ago, OOUI, and it was specifically my goal. Like I'm writing all these little command line apps and I want to present like a little UI as easily as possible. And so I wrote the library. It's a small import and it'll bring up a web UI, uh, pretty easily. But that is not a terminal. App. I can't run that on a Linux server and SSH in and get the output. Well, I could if I was better at port mapping and all that kind of crazy networking stuff, but I can't do that. I'm terrible at that stuff. Uh, so I still like to write command line apps, but they are fundamentally different. Uh, UIs and these kind of One off pieces of junk that we write all the time. [00:04:45] James: Well, when we think about console applications too, like in our core of every single file, new application, there's literally like a console dot write line, right? Everything is like, everything is console based, right? We are literally the experience that most people start when they start with NET is a console application. And even if you're using a REPL of sorts, guess what? It's outputting it too. It's. probably a council. Mm-Hmm. Of some sort type of thing. Mm-Hmm. . So like when you actually look@thesosystem.com, so I'm looking at the API Explorer, you know, I pretty much use, uh, three or three or four total. Uh, write right line. Uhhuh, read, read line. That's you use read, read line. Yeah. I'm pretty sure that that's, that's it. There is a read. Yeah. Yeah. There is a read. It's sometimes a read key like that. That's pretty cool. Mm-Hmm. , uh, that's probably about it to be honest with you. Yeah. , I'm, I'm looking through the methods. And, uh, yeah, that's about it. So there's a lot of things I don't need. I didn't realize there's properties, right? So inside the properties, there is background color. There's there's cap locks, there's errors, there's foreground color. There's. Um, window heights, number locks, there's titles, there's inputs and encodings and error redirects. And there's methods like get cursor position, there's a standard input and output and reading keys and reading lines and resetting colors and setting ins and setting out of text readers and text writers and like writing stuff and like more than just strings. What do you know? There's more than reading just strings. That is wild. Um, so there's, there's quite a lot, but there's also. Not that much at the same time. Like, it's not like you're building a full GUI esque application with what's in the box of, uh, just counsel. [00:06:29] Frank: Right? No. And it's pretty barbaric. If you, if you want to do like even something like a progress bar that like shows the number 5%, then 10%, then a hundred percent, and you want to go back and, you know, like, Overwrite it, not take up new lines. You actually have to put literal backspaces in, you know, you feed those out through it. Yeah, it's a, it's a big nasty class because it has the redirecting for standard in, standard out, standard error. So that's three streams that you can redirect and handle. And then on top of it, There's all the ANSI functions, which are fun, which are setting the colors. And then there's a few terminal things like getting the window size that is if you want to live the nasty life of trying to build a GUI in it, but that's too hard. You should use an awesome library because yeah, okay. It's step one. It's fun to make the console foreground color red. Everyone should do it. It's just better that way. Um, but once you get beyond that, like I, I was a kid. I loved antsy drawing. I knew all the box codes to like draw a line in a corner and that thing. I don't remember any of that. That's too hard to remember. One must definitely use a library if one wants to make their console apps prettier. And, um, I'm setting it as an actual goal for myself. I'm totally going to make my console apps prettier because I love some of the libraries out there and I really need to use them more. [00:08:00] James: Well, and I think that's his point is that console applications don't have to be just readings and writing some text onto the screen. There can be so much more. In fact, back in the day, back in high school, so circa. Over 20 years ago in my C days, I was writing out using the standard lib, um, if you will, and all the good C things that are out there. I, and some of my high school friends were very into making. Console based games. And I made card battlers. So I had made a whole mega man card battle game, but my most epic game of all time that me and a friend of I made was a sequel to the sequel, a sequel to the original that they, him and his brother made, which was dungeon quest and dungeon quest two, we made dungeon quest three. And that had an entire, it was basically final fantasy. Um, it was an entire. Play field that had an outline in ASCII had little mountains. It had little waters. It had little like house figures and you're a smiley face and you would move typing, you know, W A W S D, uh, into it. Um, you know, where you would go and then that would move you around and then you would do dungeon battle. And it was ginormous because how I coded it back in the day was every X, Y position had its own map that I had as I was, brute forced it. Uh, if you will, I remember back in the day, but there was, there were, it was a huge application. It was just, um, you know, command line text adventure, right? It's text adventures. I think like. Was it Zork or Zorb or whatever it was. It was like, there's something like that. Like the original command line text eventually these can be really epic. But, but mine was what's ASCII that can be displayed on the screen. And it was black and white. And that was it. Like I do anything, this was, yeah. So that's how you get, break through this and actually build really big things. In fact, like you go to banks or like, it's basically a huge console applications, like press F12 and it's like, it's like dot matrix. It's terrible. [00:10:18] Frank: It's terrible. But it, I mean, it worked over terminals. That's, that's how those work. You know, they're big servers and people were just working at terminals. Yeah. And, yeah, playing the old man card. I used to dial up into BBSs and all those games were antsy, graphic games. And so I'm, I'm proud of you. I never had the patience to try to write a game using those es, especially hard coding the position. Oh, yeah. That's insane. Dude. I, I thank, thankfully I was introduced to VGA. At an early age, and was able to write all my terrible games in VGA. [00:10:52] James: We wrote, uh, after, after that, we went to Turbo Pascal and I was drawing stick figures and moving around on the screen. And we did like a, a thing. I'm going to, I'm going to find it. It's on my GitHub. I don't think it's open source, but I will share my projects with you. Uh, not many people have seen them. I did do a video. Uh, oh, here it is. Dungeon Quest. Can we use public links? Um, should I? Oh my God. It's what, what could, what, [00:11:22] Frank: what badness could be in here? We all, we all have our starting. I wish a lot more of my code was public. [00:11:28] James: Well, this one, one files, 8, 000 lines, um, is [00:11:34] Frank: your friend programmers, [00:11:35] James: the header complaint about chat GPT. Oh, I mean, I can open source it. Okay. So the header file is 16, 000 lines of code. Okay. We're we're doing it live. Oh God. Oh God. I don't even. Want to [00:11:50] Frank: No, this is so worth it. We all want to see this. We're all big fans of you, James. You're in a safe place. [00:11:57] James: The license We're all [00:11:58] Frank: gonna look at your [00:12:00] James: MIT license. That's, that's fine. That's good. Right? Okay. Uh, getup. com forward slash James Montemagno forward slash DungeonQuest. DungeonQuest, copyright trademark. Someone probably already has it. Uh, Probably, but I made this 20 plus years ago. Oh, I got to use a passkey. Hold on. Hold on, everybody. I'm, I'm passkeying. Okay. Secret side tangent. Um, passkey, passkey on your phone. Okay. Like if I'm on my phone, the pretty great. Because it's like, it just like, I'm signing into a website. [00:12:37] Frank: All right. [00:12:38] James: It just like logs in with my face. That's pretty cool. Um, passkey on like your computer. Not so great. Cause you gotta like bust out your phone. You gotta like scan a QR code. You gotta do your thing. It's not that great. All right. Dungeon Quest. It's live. It's live people. I have [00:12:55] Frank: access to it. I clickety clacked. You wrote this seven months ago. This is when you learned a program. [00:13:01] James: So this is when I, so I used to have all these files up on my, uh, private, uh, FTP that I used to have. Uh, and that was actually because all of these files came off of floppy disks. So I have a floppy disk reader and I have a stack of floppies. And I transferred the, the files. So I worked with Psy. Uh, they helped me. Get this working inside of Visual Studio 2022. [00:13:28] Frank: Yeah. [00:13:29] James: I had a few things to, to, to work around the, the key with this project is at least, I don't know if it works on, it's a C file. I have no idea if it works on a Mac, but on windows, I had to, I had to run it in the legacy council. I couldn't run it in like a new terminal because of the spacing, the spacing of the, of the, if you go to the header files, you'll see how I did it. There's a lot of C outs. Oh, [00:13:55] Frank: this is fine code. This is honestly really fine code. I almost wish it was in C instead of C plus plus it would have been a little easier for you. But, um, I, I love all your hard coded, um, I believe those are the escape codes. I don't know. I don't have all this stuff memorized at the hexadecimal level, but C9, Cd, Cd, Ba, Ba, 7f, 7f. Ooh, 7f. That's a crazy one. Okay. That must be the, uh, control. Uh, hilarious. Thank you for doing this. Um, I will get it compiling and running on the Mac. Okay. Uh, that's necessary. I will have a PR to you. Some point tonight. God. So, I think you've just demonstrated, uh, why we need libraries for outputting good looking console apps, but I really appreciate that you, uh, typed all this in. There's a lot of typing. Copy and pasting was power, was, uh. [00:14:54] James: Yes. [00:14:55] Frank: Painful, I imagine. [00:14:57] James: It was not great. There's, there's a whole game here, Josh. I know we have, um, uh, I like my favorite part is in the top of the CPP file. There's a copyright 2005. So this is almost 20 years ago. Um, we started in January. We finished in May. So this is a. Five month project. Um, I like that I had a make believe company called PM Media and that Josh also had a make believe company called Code Warriors and, um, great names, great names, uh, in general. So, uh, sorry, Jason. My little hacking [00:15:29] Frank: group was called Code Alliance back then. So yeah, I mean, these are the kind of names you come up with at that age. So that's fine. [00:15:37] James: So let's get into how I could have made this application much prettier. Had I one written in, in C sharpen. net and two used an awesome library. You stumbled upon, I've known about this library for a while, but you've stumbled upon, you know, me, I'm just one with the [00:15:53] Frank: community. You're the hipster. You're the hipster of NET libraries. The library I stumbled upon is called Spectre. console. It's quite a mysterious title. I love it. Turns out it is a NET Foundation library. So I really, really should have known of it. And honestly, like the name was familiar, but I never bothered to click any links and look into it. But it's an open source MIT licensed library. Specifically designed to help you make your console apps look a little bit better. So, um, at the simplest version, it makes setting colors really easy. So it has its own little markup language. It's not bad. It's like square brackets and you can say red or underline, you know, things like that. So just by, instead of using a console class that we're all console. WriteLine, you just do. And C console, dot write and write line and a million other things that it can do. Um, but fundamentally you just write and C console. And if you're using the fancy, like what C sharp modern stuff, you can like probably global using this and get it really kind of crazy. Yeah. Just right. [00:17:12] James: Yeah. Right. Mark. [00:17:14] Frank: Yeah. Over. Markup line. Get them all into the global namespace, but I don't know if I would do that. Anyway, ANSI console, a beautiful library. Let's start with number one, setting colors on things, but it can do so much more. It can do UIs. We'll get to it. [00:17:30] James: I think that the setting colors and like. You know, having it, you know, I'll put nice things in the library is like very nice, uh, as far as like little helper things. I do like that. There's like some mysterious thing. It's like, Hey, it's just, it's almost right. You're writing markup, uh, online. But I think the biggest thing when it comes to these things is the widgets or the, as I like to call them controls that you might output specifically. Because to me, what, why we love UI kit and we, Put up with Android, the widget system in general is and windows, you know, as well as like, when you think of wind forms, like you're thinking of the tool, the toolbox, right, what's in the toolbox. And I think that is why folks adopt UI frameworks is, is because of that. And when I look at the web, there's a bunch of stuff built in HTML. Sure. But then there are great libraries like, like fluid UI and like other things like that, like, you know, material design UI, UI, and then you can basically import a Toolkit into your web app that enables you to do cool stuff. So if me as a gooey gooey developer really appreciates that part of it, cause I don't want to. Learn that. I don't want a canvas. Okay. I don't want to draw on a canvas. Frank will draw on all the canvases. I will not. So what I liked about this is that, yeah, there's not only widgets, but there's other things that normal GUI applications to do like prompts, for example, um, and then I would say the widgets also would, um, Uh, extend into displaying like grids of data, for example, or doing progress or status like you're talking about, right? Like nobody wants to figure out how to do that or draw that on the display, but you do want to do it. Basically, I think of when I'm a good example of this is, uh, I am, Uh, making a Docker container and I'm uploading it, right? It's like doing all the layers and it's like, all these layers and things are happening and you want, you want that UI to give some sort of representation of what's going on, even if it's just compiling or uploading or doing something, you don't want to just have a little nothing. You don't want to, the worst, as we know, even in mobile applications is the user does something and then nothing happens. Right. Something has to happen in the application. [00:19:52] Frank: Well, it's a little bit funny because the old Unix philosophy was that if everything goes well with the execution of a command line app, then the output should be blank. It's just an old thing, but I'm glad we're past that. No, these days you put animated emoji, bouncing on a progress bar, doing, doing all the things. Um. At first, I was always a little bit against them to, um, again, an old timer, because often I would, like, stream the output of these apps to logs, and you don't want to get a bunch of antsy drawing code in your logs. You just want text in your logs. Um, so, another good reason for using Good library, instead of rolling all this stuff yourself, is a lot of these libraries do detection of the terminal to see whether they're supporting, um, color output and things like that, and what they're capable of. So that when you are just streaming it to a text file, hopefully you won't get all the, uh, uh, color codes and all that stuff. Anyway. I just wanted to mention that because that was always kind of a pet peeve of mine of why I don't add a lot of animation, or at least why I tell myself I don't add a lot of animation to my terminal apps, uh, in case you want to actually capture it. Uh, but I do have to go, you, you, you're going ahead with the panels and the fun things and the UI things, but I have to mention one more fun color thing, which just everyone should just use. They have a special way to just print out exceptions and it colorizes the exception nicely. [00:21:29] James: That's nice. [00:21:30] Frank: I was saying earlier that I like to do like console dot, you know, console foreground color red. Uh, that was always for printing out exceptions and they have a much prettier exception printer use their much prettier exception printer. Just import this library and use it. At least I'm, I'm saying that to myself. Future Frank, use this for all your exception printing. [00:21:51] James: I like that. Yeah. You know, I think those little sort of shortcuts are super duper nice. Like I was saying, you know, Hey, we could write an entire text prompt or a single selection prompt or things like that, but they have a great prompt system. That's like, you know, give me a selection prompt, give me a title, give me the choices, um, text, and here's the choices that you display and it'll output it very nicely and then return something back to you. Very similar to the entire system of. UI kit and Android and windows of like, let me get a message box and it just handles it for you automatically. Right. I think as. All right. We're back. Let's go to the next subject. Before we get into today's, uh, topic, uh, there is no audio, so we're going to be talking through a variety of stuff, which is going to be a lot of functionality and ideas. languages can be used with Xamarin. And so, whatever we're going to be talking about today, we're, we're going to be looking at, uh, the, the, the new Xamarin. Forms. As a user, if I'm going to run it. [00:22:45] Frank: Yeah, absolutely. Um, I mean, they just have fun things like the charts. Uh, so you can do a little bar bar graph real easily. I I've coded bar graphs in ANSI before. They're the worst. So it's wonderful to just have that. You have things like word wrap. You won't believe it but I actually like, it's really nice to have word wrap, to have something um, that can contain the text so it's not always sprawling across the entire console. And the most important control they have is um, Tables, so that you can actually just, you know, classic HTML styling. Now we can do it at the console, build out your UI using tables, which dynamically size themselves and fit to the console correctly in all the ways that you think they should. Because, because there's pro programmers versus library and programmers, we all want to do our layouts with tables. It's just easier. And so you can do all that very easily. Um, but all that. is kind of like the um, still the one time script execution style. Like, we start with some inputs to the thing, we do some processing, maybe we do some progress bars, and we output stuff, and we output stuff, and then we get to the end and we stop outputting. Uh, they also have, though, and this is what you want, James, this is, this, this has your name written all over it, is AnsiConsole. Live, I believe they call it. And this is where you can start mutating objects, and now where it starts acting like a proper user interface. So you can create a table object. Tell it to go live, and now you can start messing around with that table, and it will update the screen just like a GUI should. So I think that, like, all the color stuff, I want to give full props, because that stuff is the stuff I will use day in and day out. But this live mode changes everything. The live mode, uh, lets you build actual interactive apps and things like that. And I do keep skipping over prompting, but I love this live mode. [00:24:55] James: No, live mode is like really, really neat. Yeah. I mean, I, I think that being able to have something that looks and feels like an Part of an application inside the console when you're using it is a big benefit, uh, at the end of the day. [00:25:13] Frank: Yeah, because you know, at some point, what's the easiest UI element you want? You want a progress bar. I've, I've written so many apps that I'll put a dot just, just so I know the thing is alive and beating and all that kind of stuff. Um, If I'm feeling really fancy, I try to calculate the actual percentage and put it up there. But instead of that, they actually just have like a little spinner control. And you can say, you know, here, just, you know, ANSI console, I forget the exact syntax. Sorry. I just, I'm still reading the manual. ANSI console dot something output, little activity indicator. And that'd be wonderful for me because I really just need to know, are you still alive? Are you still functioning? I don't need a full GUI. I just need that heartbeat there. [00:26:01] James: Yeah. Donuts thing. Exactly. Yeah. And I think that it's like super, you know, nice. And, and not only like, as we were talking through this, like, you know, And works across all different consoles, like on Mac windows and Linux. Right. I think that's the other part too, is yeah, you know, system. Our console does, but like you were saying earlier is there's obviously different intricacies between different terminals across. Different operating systems. So actually streamlining that into a single library makes a lot of sense. Just sort of like, you know, Maui or Flutter react, you know, basically like what's the abstraction on top of the different UI is inside of it. But, you know, my favorite part actually of the Spectre console is actually just the website. So spectreconsole. net we'll put in the show notes. My favorite part of it is actually the. A little, uh, example that they have because it's like an example that just shows a bunch of stuff. Like here's like tables and trees and here's charts and here's the exceptions. And like, here's the colors that we can output and here's like word wrapping. And here's like, you know, uh, rows and columns, you know, I think that's like really neat. And here's emojis and you know, all these nice little things that are inside of there. So being able to just see that as a high level is pretty mind blowing. [00:27:13] Frank: Yeah. I, one of the funniest ones, well, there is canvas. So like you said, you can draw, so I can be in my happy place and I can draw my own custom UIs, but they also have just like nice abstractions for, I think it's called like iRenderable or something like that, where you can, uh, make your own objects, uh, draw themselves or output themselves to the console. So nice. Nice little niceties like that baked in. And then they have ridiculous things. Just truly ridiculous where you can render an image to the console. I used to do that as like a fun little hack and like, look at me, I'm, I'm fancy. I can render an image to the console and it's just baked into this library. Kind of hilarious that it's all just there. Go ahead. I'll put images to the console. Why the heck not? [00:28:11] James: Yeah. I think that it's pretty amazing just the sort of technology that's built in and the type of widgets that are available. Because. Not only are there things like you said, like canvas and canvas images, but there's other things, like there's an entire calendar, for example, there's a breakdown chart, right? Like, why don't we have a calendar? It's [00:28:29] Frank: crazy. I almost talked over there. I'm like, it has a calendar control. How weird is that? I don't know how, um, UI control it is because they are playing this fine line between, are we just outputting data or are we, um, a fully user interactive UI system because we have a friend, Miguel. Ring, ding, ding, ding the bell. Um, Miguel de Acasa has written a library, uh, Terminal. GUI. I think that's what it's currently called. Um, it's, it's, it, it takes a very different approach, but that was always. 100 percent UI focused. So you have text boxes, and check boxes, and buttons, and things like that. That is definitely going 100 percent into I am building a full blown user interface for my console app. Whereas this LibrarySpectre console, uh, is, is writing that fine line between you can do some interactive stuff, but mostly output, but some of it can be interactive. Good luck, buddy. Yeah. And I, and I kind of like that. I like that it's like, um, it's lighter weight, uh, because Miguel's library, you kind of like, you go into his mode, the screen turns all blue, and then you can't remember how to get out of it. That, that's, That was always my problem, at least. Uh, whereas this, you're just putting some shiny yellow borders around a table, and it's a good place to start. [00:29:58] James: Well, I mean, I think that's the cool part, the flexibility part of it. We're like, yeah, like Miguel's, uh, I guess it's the GUI CS team, I would say now, like you said, they have, you know, color pickers and combo boxes unless you use them in your bars and matches boxes. And like, it's like basically a, it's basically wind forms, but in the GUI and in a terminal, basically inside of there, which is pretty cool. And, uh, so it's like, how far do you need to go? Right. What's the flexibility that you need? What are you building? And if you did need something like this is more reminiscent of those. Finance applications or grocery store applications that you just see. It's like a big, you know, blue background or gray background as like press F12, click, you know what I mean? Like the old, you know, like I said, old terminal type of applications that people built, but I think it's pretty neat. Like there's all sorts of, yeah, like keyboard listening events and. You know, tapping around and it's just like also works everywhere, which is really neat. Um, and you could tell some of the inspiration, obviously like Miguel being a big UI kit fan and a big iOS fan, there's has to be some inspiration there also like MonoTouch. Dialog, for example, which, you know, maybe a lot of listeners don't know at this point. Uh, MonoTouch. Dialog was the like OG abstraction over TableView, which is one of the, uh, maybe best controls. built. Whatever. Maybe. I think, uh, I think UI table view might be the best control ever built. It's, it's, it's up there. It's, it's, it's top top three. [00:31:30] Frank: Well, we'll make this argument, in its favor, the macOS settings app has become table view. Yeah. We're, we're still writing basically [00:31:41] James: that. It's everywhere. The table view is everywhere. Um, and if you're, you know, It was an [00:31:47] Frank: innovation and it's stuck around. [00:31:50] James: It's true. I mean, there's always been a list view. Always been a list view. List view is solid. It's a solid control, but UI table view, bam, it's, it's, it's way up there. It did a lot of things that were super hard, especially when I was doing Android development and iOS development, UI table view is just so streamlined and that's. In fact, almost every settings application, every app I ever built that has settings in it, use monotouch. dialog, because it was like so good to be able to do that. And the whole idea was the settings view, uh, the settings, uh, application on, um, iOS is basically just only UI table view. It's like basically the entire app is only UI table view, and that's, that's it. So, um, I don't know who all built monotouch. dialog. I don't know if it's just Miguel and other people contributed to it later, because I'm pretty sure it was in his, in his, uh, GitHub name for a while. But monotouch. dialog was this great abstraction that enabled you to like, Rapidly build a UI table view without having to learn UI table. You got like abstraction over it that was only for iOS, which funnily enough, but it really, uh, was really cool, but it also enables you to add like attributes, kind of like if you're using SQL light dash net, you can add like primary key attributes as well as that you can basically say, Hey, here's my class, here's a monkey. Here's attributes of what I want you to do and just like generate the UI table view for me and it would just do it. So that was pretty neat. So anyways, to this point, I kind of feel like there's a lot of inspiration happening here, in my opinion. [00:33:17] Frank: What we want, what I want, James, is the quickest and easiest way I can put a half good looking UI up. Because the moment it takes any effort to build a UI, I just don't do it. I start console dot write lining, almost done. Dot, dot, dot. Almost, almost more done, dot dot dot, um, because, I don't know, it's not lazy, it's not laziness, because what it really is, is a lot of these scripts are one off, so you're gonna use it for a day, or you're gonna use it for two days, and it's okay if it just floods the console with a bunch of blah blah blah, um. Because the alternative is you spend two days writing a UI for it and now you spent four days instead of what should have been two days. So we want quick ways to write UIs. MonoTouchDialog, um, it was great because not only did it look like a half decent UI, iOS app, because they were all table view based. Uh, but it was really easy to write. You could write a pretty complicated UI in very few lines of code. It was a well designed library. And I think that's what we're saying about, um, Spectre console here. And, uh, Terminal. GUI. I'm going to remember that name one of these times, Terminal. GUI. [00:34:39] James: Terminal. GUI. Yeah. Cause it used to just be GUI CS and I did change it. So that's good. Well, I just am glad that there's things out here in the world that are happening. So that's cool. [00:34:50] Frank: Colors in the terminal. I have way too many terminals open. Yes. More colors. Please, everyone. Let's, let's all take a dependency on Spectre console. Just put in your directory dot props. [00:35:05] James: Yes. Uh. All right. Well, I think it's going to do it for our console base. I mean, maybe now I'd love consoles, so maybe I love terminals. We'll, we'll see. Uh, I do think that we, well, I think we need to do a hackathon where we convert DungeonQuest into Spectre console app. [00:35:23] Frank: Could we please use math so we don't have to redraw the map? For, yeah, of course. Yeah, we can use math. That'd [00:35:29] James: be, it'd be super sweet. It'd be like, there, there'd be a class that's called like a map, map. cs. And it's just like, it'll draw the map. Yeah. You're passing an X, Y done. Done. Yeah. It'll do it. It'll it'll use the cool border property. It'll be awesome. And then it could like give you live updates to where you are. Like, Oh, I'm in a swampy area. I'm in. Nutria or wherever, like the towns are like, I don't even, I don't, I may have written all the texts, but I was like 16, 15 years old, so I don't know if I. I didn't write good story. I [00:35:59] Frank: can't wait to play. I'm going to get the PR up that gets a compiling on a Mac. I can't wait. We'll get playing. [00:36:07] James: Um, last thing I want to talk about is that we, um, have been using the Adobe Podcast Enhanced Speech for just over a year. One podcast so far. And we're going to use it again for this podcast. It is that if someone texts me, uh, Eric that said, Hey, did you do some, uh, did you do some processing on the audio? It feels like the speed is upped, but then Eric said, no, actually he checked into Spotify and his, he was at 1. 2. So it wasn't me. I was that, so we should be there. What I'm doing is, so here's a, inside baseball is like Adobe podcast, podcast. adobe. com. There's an enhanced mode. And what I've been doing is I've been taking the video. And I've been taking in the audio, uh, and I've been. Uh, not doing any post processing on it on my end at all. I've just been shoving it in Adobe podcast. Now, um, I am lowering the percentage on Adobe podcast because Frank and I already have good mics. Uh, so the default is 90. I've been lowering it to 75. So do you want your feedback? Feel free to leave feedback by writing into the show, hitting us up on Twitter, um, or on this YouTube video at youtube. com forward slash average You can also leave a comment on it and let us know what you think of the audio. I know we already have good mics. I, uh, previously for, again Hello Hello. We have decent mics. Uh, uh. Before what I would do is very minimal post processing. I would bring it into audacity. I would add the bumpers. I would take my audio and I would do a little bit of reverb removal on it. Cause I have like kind of a room that isn't relatively padding. It depends on where I'm at. And then I would do some limiting, uh, on, on me and Frank in case there were any spikes, cause we do have better mics, but I didn't really do a lot of. Post processing and Zencaster does a little bit of post processing mostly for leveling, but I would take the raw files and kind of output them there. So anyways, that's what I've been doing. Let us know what you think in the somewhere, anywhere on the internet. Just let us know what you think and we'll go. Sound good, Frank. [00:38:12] Frank: Sound good. Is that a pun? Um, we'll, we'll find out if it sounded good. I, I, sorry, I do have to interject cause I, I, I love the advancement of the technology here. Back when I was, um, Leveling audio. I used NPR at an app out there called the Levelator and I always used NPR's Levelator. So I like that we're using a Adobe now. [00:38:36] James: I recently, uh, installed Levelator 2, which exists onto the, still exists on the internet. It's like a Windows app. Now, I did use this recently because I was doing some, uh, processing of some audio where it was a bunch of different people. So it was a bunch of, uh, different folks and they were like back to back to back. So it was like kind of demo one, demo two, demo three. So they're all doing these using different mics. So I took all their audio and I put it into a wave file, just. Back and then I leveled it and then it took that file and then I put it in the enhanced speech and then I brought it back and I sliced it up. It was like a big process. But, uh, one thing that Zencastr does do is it does levelize our audio, which is great, uh, and, and very helpful. But yeah, level later, I, I mean, I've used level later for so long, somebody great, uh, podcasting things, but a lot of stuff is just built in now, under the hood, which is wild. How advancement it is. It's like. Click a button post process done. All right, that's gonna do it for this week's Merge Conflict. So until next time, I'm James Montemagno. And I'm Frank Krueger. Thanks for watching and listening. Peace.