live from New York, it's Asus Engineer. Hey everybody and welcome to Asus Engineer. It's me, Lady Aida, the engineer with me, Mr. Lady Aida on camera control. We're broadcasting live from downtown Manhattan in the secret underwater headquarters, I don't know. Do you ever watch SeaQuest? Do you remember that show? I do remember SeaQuest. That's cool. Yes, I have a submarine. We're under the boat. So we had a same show for you tonight, lots of new products, lots of videos, lots of tutorials, a lot of guides went live this week. News and more, including some amazing, it's not out yet in preview vids. So stay tuned till the end, of course we answer questions then as well. Mr. Lady Aida, tell them what's on tonight's show. On tonight's show, the code is back and for you 10% off in the first store all the way up to 11.59 p.m. or whenever you remember to turn off the code. Talk about our eight fruit live shows including show and sell. Thanks, Lizzy, just hosted.  JP's product pick of the week highlight. Very special mailbag. We have the continuation of Marchintosh with some RetroTech. We've got some Main New York City, advanced manufacturing, factory footage.  New products, organize your questions. We do that over on Discord, adafruit.it slash discord head on over. We answer those during the show and of course at the end of the show. All that and more on, you guessed it, ask an engineer. Sue, Lady Aida, remember code is packet fruit and we have free stuff. So in addition to the code, when folks add stuff to the cart to get free things, the first tier that they'll notice is, I think we still have $9 and more, half-sized promo-proto breadboards, a little bit running out. They might already be out, but $9 and more, if we haven't been stopped, you'll get a half-sized promo-proto, great for taking your Settles breadboard projects and making them permanent. We do have plenty of KB2040s, I know, because I just checked stock. Pink circuit boards with an RP2040, eight megabytes of flash, STEMIQT buttons, USB-C, a great microcontroller. Upgrade your ProMicro projects with this dual-core 133 Cortex M0 chip. Ooh, fancy. $199 or more, you get free PSGraph shipping in the Continental United States. And $299 or more, we have, yes, once again, the Circuit Playground Express, our all-in-one dev board with LEDs, buttons, sensors, chips and more that runs Arduino, Matecode, code.org, CS Discoveries, Circuit Python, and even MicroPython these days, as well as other exciting platforms. So great to see the SAMD 21 back in stock.  We do these every single week. We just wrapped up Show and Tell. Like I said, thank you, Liz, for hosting. There's a whole bunch of things that you can watch on Show and Tell, hard to pick one. However, you know, we were watching it because even when we're not hosting, we're watching. I did like Mark's project that showed a mag tag that you can blow out a candle on the screen and it actually blows out the cupcake on the screen in real life on a, sorry, a fun house on the mag tag. It was really cool. So do check that out and you'll see some projects from our team and then also projects around the community. And if you wanna see a really weird retro device that we're modding to turn into a musical instrument, check out this computer perfection thing. And then find- Okay, the ad is- And then find the ad, which is really fun. It's super weird. Okay, we did a desk of Lady Aida and for the folks who've watched it, this was the intro. That's right. You can talk about what was in the beginning of the show, but part of it was, and I'll play the little snippet of our kiddo. Who killed the cactus. Interacting with this cactus. Yes. But we did do a teardown for this pretty popular like TikTok toy. It's called a mimic and cactus. Yeah, it's a mimic dancing cactus and you're like, how do they do this? And I was like, I don't know. We'll like buy an extra one, we'll skin it alive and take it apart and see what's up. And so yeah, it's got this chip by Jay Lee. You can see it in the video. We kind of like figure out what chip it is. It's like a little microcontroller with like an 8051 core or something, but it has built-in microphone amplifier, built-in Class D or Class AB speaker driver and some GPO, just enough memory to basically run a demo where it records audio and then plays it back at a higher speed. And then we talked a little bit about audio projects and how you could remake this with a chip that you didn't have to buy from. We also did a low power demo for the new ink feather, just showing how I calculated and verified the low power usage using Circuit Python where we have deep sleep support and then verified it with a Nordic PPK2. So here's a video that we showed. We're not putting our kit on the internet. You know, like pictures of her face and stuff. So I blocked out the area, but you can see how what this is and you can hear her. So here I'm gonna show you a little video, it's cute. And then we did the great search. This is brought to you by Digikey and Adafruit. They did user powers of engineering to help you find what you're looking for on digikey.com. What did you help people find on lady at a desk? Well, doing this cactus teardown reminded me of so many of the projects I did in school where we didn't have microphones that could do audio, like having, you know, we had like 2K of RAM at the most. That was sort of like super amazing and huge. So the chips now that can, you know, buffer and read audio and playback are amazing. But what you would do at the time is if you wanted to make projects that had audio prompts or like you would record and it would playback sound effects, what you would use is an ISD chip. And these are chips that were specialized for recording and playing back audio. And they could record and playback like, you know, 30, 60, 90 seconds of audio. And you could also sometimes have like within that memory you could sub clip it so you could have like five clips. And it was GPIO control. So you didn't even need a microcontroller. They're really easy to use and they work really, really well and the quality is like good enough for like audio or some simple sound effects and props. And so I realized a lot of people don't remember to know about the ISD chip series and went to Digikey. It was like, wow, there's still like thousands of these and stuff, they're very popular. And a lot of options are used, including one that was like 60 minutes long. So check it out. If you want to make like a prop and you just want to record an audio effect or even send it over SPI, right? You can use a microphone on the board or you can send the data raw. And then all it does is playback that audio without any external chips or even like external components, it's like dead simple. Check out the ISD series. The company was purchased by Nuvaton. So that's the current maker of them. And then of course, there was JP's product pick of the week. I sent JP and you link to an article. So Amazon tried to do, and also TikTok in the US tried to do the, they're calling like the Chinese style of selling things online. And it turns out it didn't work. Like Amazon had live videos during shopping. TikTok kind of does. But they were trying to reproduce a style of video that was happening overseas, which is you're watching from a product page, essentially a live video. And as people are buying and doing things, the price might change. The number of accessories that you might get with something might change. And it's a very interactive live. It's even, it's like, whatever you think, it's QBC, but times a million. And so Amazon is like, we're gonna do this. And I've been watching other entities in the, you know, e-com space. Kickstarter had a video, a live video that I think I wrote about and then I didn't see anyone use it or even talk about it or anything. And that was a neat idea I thought because if it's a Kickstarter, you really wanna do lots of updates for your backers. And then I think Etsy had something, we're using Tumblr live, but they're, you know, they have a store interface. But there really isn't a US version of what happens in other countries with this live thing. And we have our little corner of the world, which is Adafruit. And it's the closest thing I think because JP's broadcasting live from the product page. The product that we're talking about is on sale. You don't have to put any codes in. And the community's interacting with what's going on for that particular project with the maker there. So anyways, you know, kind of interesting, you know, we're trying to always figure out ways like how do we be an innovative company that sells stuff that can stay independent, not put ads on our site, not take venture capital or loans or anything.  But we really wanna keep our open source values and everything. So we keep experimenting with this stuff. And so far, it looks like the product page and this show and a lot of other things we do seems to make a lot of sense. It can be very popular. I mean, sometimes we sell, we try to reserve about a hundred pieces. We'll sell it out in a few minutes. So anyways, you know, sometimes we have a maker business segment, but one of the things that we get asked almost on a daily basis is like, hey, I'm thinking of starting, I have like a little product that I wanna sell and it's like, what should I do? I'm like, publish, publish, publish, publish something every day. Maybe it's a code, maybe it's a story about how you're shipping stuff. But one of the things that we do is from one of our product pages have a live video. So take it away, J.P., this week's product pick of the week. It is the NeoKey BFF. This is a little best friend forever add-on for a QT pie. So take your QT pie, take your BFF, marry them together. This one allows you to take a Cherry MX compatible mechanical key switch, plug that into the socketed receptacles for the two pins there. And now you have a mechanical key switch. I've put it in a very minimalist configuration with header pins. So it's just plugged right onto the bottom. It has a reverse mount NeoPixel and then it has the sockets for a mechanical key switch to plug in. But you can see it in action. When I press it, it is glowing red and it's also sending USB HID command to my broadcast software to bring on a delicious plate of NeoKey. It is the NeoKey BFF. Thursday, jump or church up and Friday's deep dive with Tim. Mailbag. We can treat them. This week is kind of a special mailbag because this is really nice. It was a long day and we got this email in and we have a weekly. It was nice. Yeah, we have a weekly all company meeting. Some of it's in person, some of it's virtual and it's called Stay as a Fruit. We read this right away because we're like, this is great. So this is from Brian. Brian says, I just have to say you single-handedly through all the many hands at Adafruit helped me make almost all of my most favorite things I've made from your amazing tutorials to your products, to your community, to the form of Discord. I literally could not be where I am without you. There is not a single entity out there in the world that's been more consequential for my professional work than you all. And I didn't have, and I can't thank you enough for being exactly who you are. Thank you from the bottom of my heart. That's really nice. Very nice. That was great. That felt good. We like nice emails like that. That was a nice email. Yeah, that was nice emails. Let's do some retro. And at no point at the end of the email that you say, so send me a Raspberry Pi. Yeah. But by the way, I really want a Raspberry Pi. Yeah. Here we go. Most emails are like that now, I guess. Yeah, I got a voicemail and someone's like, I absolutely must have a Raspberry Pi. You absolutely must give me one now. It's just like, yeah. I'll be at your place. Yeah, it's like I'm standing outside your window. It's like, oh, okay. Let's do some retro. Okay, retro tech. This is when we look around and maybe look back to build a better future. It's like it's tentable but only backwards. Yeah. So this is still Marchantosh just for a couple more days. Oh, we're getting into Marchantosh. And this is all retro Mac stuff. And so this week, and you can check out these. This is the Apple II, this is the Apple II Plus. And do you have one of these? Do you have one of these? Oh man. I didn't have one at home, but we had them at school. Yeah. Boy, did I type many Apple basic, sorry, Apple logo and PrintShop Pro. Well, it's a PrintShop Pro. It's a PrintShop Pro and I played a lot of We're in the World with Carmen Sandiego. It was like Carotica, that was one. Was Carotica? Yeah, it was like a karate. That's cool. Yeah. A lot of good games for the Apple II. Yeah. And so that was part of our retrospective. You can tell this from a school because that's like that security. Yeah, yeah. And then this is- My favorite. This is your favorite? My favorite. My favorite. It's the best. I could still, like I could actually probably still do a majority of my work on a Mac SE30. This was a bitchin' machine. This was a good machine. Yeah. Yeah. It was a 16-30, right? I think that was the end of the 30 we stood for. It had the expansion slot. Look at this. Yeah. Which you could connect an external large monitor. It had SCSI. Go back. Go back to the ports. You wanna go back to the ports? Let's go to the ports. Okay. You had the expansion slot. You had the disk controller, SCSI, modem, ADB, keyboard, mouse. You could connect to the internet with this. Yeah, so this was 1989. Came out January of 1989 and then all the way to October, then you went, yeah. And this was the fastest model, the original black and white. That's right. Compact style. It was really good. Yeah, and you could get internal hard drive, I think. And up to 128 megabytes of RAM, which is like even like, it's a lot for what this is. Yeah, and a 1.4. What was the speed? I don't remember what the megahertz was. I think it was like 40 megahertz. Yeah, this thing was cool. And you know, the other thing that it was kind of known for was it was used to publish, I think, there was a magazine, a newspaper specifically, like they did it all on one of these machines. Yeah, no, you have this. You could connect a radius portrait. Yeah. Remember those? This monitor weighed like 80,000 pounds. But you could rotate it from portrait to landscape. It was amazing. Yeah. Yeah, I remember when my dad, my dad had one for his, when he did his writing, and then it passed down to me. And then I remember like in my high school, we did, we ran Quark Express on it. And that's how we did the high school newsletter. We did Page, maybe it was PageMaker. We did PageLayout again on this portrait display. 60 megahertz. And then next up, so we have a poster from Susan Care. And I wanted to make an observation. Yeah. This is Marchantash and everything. And you always hear about Mac and design and Jonathan Ivey and from back in the old Mac days, you hear about Dai Kawasaki. But you don't really hear about Susan Care. And she's responsible for the entire, she's a creative director during this Mac time and then also at Next. Great icons. Yeah, fantastic. I kind of still an artist doing these things. But these are like the iconic things of computer science, computer history. And so I dug up and it was like a mini ad with her in it. And then a little five minute interview with her on computer chronicles because it's Women's History Month. And also when you think about like Apple, there's only like two or three names and it's usually not hers. So I thought, well, maybe we can remind folks or maybe they don't even know. Like where did these cool icons come? Like who made that floppy icon? Like a lot of things that we kind of take for granted there was someone who designed these. So I was gonna play those and then we'll do a Python on hardware after this. Move. If you're an artist and you're skilled with media, this is a new medium that offers great control turning off. There's a thousand little dots in half an inch and you have the capacity either real or magnified to turn off and on each one of those dots. So in a screen that's fairly big or a piece of paper eight and a half by 11, you've just got so many scads of dots. There's nothing really that you can't present on that screen. All you do to print, unlike most computers where you hit a control key and a print key sequence, you just hit one button. It says print and it prints. And you can actually billmate it so you can watch on the screen the whole document gradually being printed and follow your progress. It's pretty nifty. Certainly I think one of the best experiences is seeing a person who's never used a Lisa before or a Mac before, even never used a computer before. It is possible, easily possible, to teach most people to use one of these computers in about 20 minutes. And a lot of that is because you can explain what an icon means and a person can remember it easily. So we certainly use Lisa as a jumping off point and making just some refinements and additions for some new features. What you see now is the image, the icon that you get when you just plug Mac in and turn it on. It prompts you with a picture of the diskette. So you're saying I need something so that all you do is, it only fits in one way so there's no way you can break it or make a mistake. Just pop it in. You get an image of a content Mac so you know that everything is okay. And you're welcomed. It's just so that the person using Mac gets information all the time visually so nothing has to be translated.  Things are happening. You've replaced the salt timer. Yeah, we're moving into the 80s. So what do we have now? So what we have now is an image on the screen of the diskette that we put in the slot. And it can be with the mouse. It can be moved. And it's already showing you the name of that disk. Right, and it's highlighted in the sense that it's inverted so that Mac knows that you want to do something to this diskette and your choices of what you might want to do are listed in hidden menus that operate a little bit like window shades when you move your cursor, right, that are choices. We could find out something about this diskette or we can just open it or we could eject it. But if we open it, just say open, and immediately you get what we call a window that displays graphically and in words what is contained on the diskette and the machine. So you can see there's a picture of a hand painting which symbolizes a paint program and a handwriting for the word processor and a couple of memos that were already written. Some folders, if say you want to store a document or two in a folder, it's analogous to life. You just put the piece of paper in the folder. Now you've got something to go to control panel here. Show me what that is. Always available to you are a number of desk accessories. So you move the cursor to control panel, let go of the bounce button. So this, which looks a little bit like a dashboard, lets you fine tune the system in a number of ways to your comfort level or just your personal preferences. The computer will work no matter what setting. So say, here's a little volume control, you can see the speaker. So every now and then you hear a beep with Mac when you turn it on or sometimes during applications. If you're at home by yourself and you're listening to the stereo, you might want to know that you'll always hear those beeps. If you're a student working in the library, you can move it so that just the bar will flash so there's no noise at all. Say some of the other features let you adjust keyboard repeat rate or a menu flash or the amount of time between double clicks which might vary with the age of the person. Pop the control panel away by just clicking on it. And notepad lets you, while you're working in any application as well as just this, what we call the finder which is like a directory, be able to grab the keyboard and write a note to yourself. Remember to read page 12. And you could say put this away or you could move it over. You can go to page two or it says another note one left for oneself, flip to page three, up to eight pages of notes that could help you in your work or just remind you of social events. One of the items was Scrapbook. Right, Scrapbook lets you keep literally, you're only up to 256. You're only limited by how much memory you have free. Pictures or messages or documents always available for the terms we use are cutting and pasting. So say to open a word processor application, you could click on Mac write and say open. If you wanna get right to a document which automatically launches the application, same procedure which is why it's easy to use. Reloading the word processor and to the specific document that we can, isn't an old little bit of sample text. This is how the word processor appears to you. A ruler lets you set formats which is certainly a familiar object. Say you wanna go from single to double space, just click on the wider image if you want. And you can justify or center, we're not gonna have time actually, but you could have pulled up pictures from Mac Paint from the Scrapbook and then insert them into the document. Paste them in just by saying paste from the document. If you want to change a word to be bold, just say bold, change your font to something like Old England. All right, it's Python on hardware time. This week, Lady Aida, we've got a lot going on in the world of Blinka, circuit Python and more. Let's go over to our newsletter. So this week, one of the things that we did last week was talk about the 100 libraries in the community of bundles. So that was breaking news last week. I do wanna thank everyone who's in our Discord. We're up to 37,000 people. Thank you. It's one of the biggest open discords. Thanks for keeping it a good safe place for everyone. And this is kind of a neat project. We're starting to see a lot of, especially Python based projects that use hardware with chat GPT. And again, our point of view, in case you're all wondering, is this is a fantastic thing to generate gobs of text for fiction. So this is kind of neat. This is a Raspberry Pi that'll pretend to be clippy and move around and say things. So if you wanna paper clip the talk, chat GPT might be for you. And then we watched some of the Arduino, it was Arduino day and it was also Hackaday, Berlin, a lot going on, I think it was Saturday, even with time zones. And there's a new Arduino, Uno R4, unclear. Theoretically, it could run MicroPython. It could run MicroPython. It's ARM Cortex, which is good. And it's got a 32K of RAM, which is enough. I mean, that we have the SAMD 21 with 32K of RAM. So it's not a ton, but it's comparable to the SAMD 21. What's interesting about this chip, it's a Cortex, sorry, it's a Cortex M4. So it's much more powerful than the SAMD 21. And it's a five volt logic microcontroller, which is a rare thing, right? Not a lot of my controllers that are ARM Cortex would run at five volts and have USB. So it'd be interesting if there was a lot of demand for five volt logic level support. This would be like the chip you could use it with. Yeah, we'll see if folks want this. This is a different direction for Arduino, we shall see. And then some new firmware for MicroBit, a good comparison on some hobby PC vendors. I asked Ann to put this in the newsletter this week because we get asked a lot. It's like, oh, I wanted to send out my PCBs, which ones, and like, you know, we have, we like Oshpark, but then someone went through and just like, here's the one from Digikey, here's Oshpark, here's this one, here's this one. And all of the PCBs, also I really like that, that pastel purple joystick color. Yeah, it's kind of cool. Ann was on the Hackster Cafe. And then I wanted to have you, Lady, to talk about the new things that we just added, we're adding in Circuit Python, there's the GIF thing and then the IMX. Yes, we've got a couple good things. It's like today. An old translucent. I really like this, this is a very comfy green shirt. So, sorry. I know I always wore black, but. Adafrit is so transparent. That's so transparent. You can see right through here. Okay, so number one, GIFIO is now merged into the latest builds and will be in the beta one release. Thanks, I think Mark and Ann and Dan, Jebler who all helped out getting GIFIO in. So it's cool you'll be able to play GIFS natively from within Circuit Python to any display. Super cool. And we also have optimized memory management now so you can switch up GIFS because it's like GIFS are kind of weird. So you can play them from disk. And also Jebler did a bunch of work to add I2S and PWM output for the IMX RT series, which is also really neat. You can play, he did some tasks. I was like, okay, this is a 500 megahertz processor with a Cortex M7 and like, you know, it has all the FPU DSP commands that come with the Cortex M7. So it should be able to play a lot of audio very quickly. So I can currently I think play four to eight concurrent WAV files off of an SD card where the SD card is clocked at 25 megahertz. So I think it's limited by the speed of the SD card and there's no SDIO support on. For at the same time, that's pretty cool. Yeah, four to eight. You'll be able to do. Yeah, which is pretty good concurrent WAV playback. So the next thing would be to, you know, if you're limited by the disk size, actually wonder if MP3 might be a little bit better because with MP3, it's a 10th of the disk size but there's no more CPU requirements. So like, it kind of depends on whether it's CPU bound or if it's disk bound, I might have Jebler try that out next.  Yeah, of course. But I'm very excited about those two things. All right, so check that out. The newsletter comes out every single week we deliver it to your inbox. Just go to AdafruitDaily.com, separate site. We don't want anything to do with your email address. So we put it over there and it has nothing to do with your online store. We don't do pop-ups or any of that nonsense because we don't like that either. All right, next up. We're an open source hardware company to prove it. We put all of our code online. We put on an open source hardware license and open source software license. Put up all these guides. Do everything we possibly can to help you and everyone out there make stuff using our stuff. So we have these guides. Okay. So we have six new guides to start going down so I'll start from the bottom.  So go check it out. Sounds beautiful. You can make your own robotic harp without needing a whole harp.  Okay, so new this week from knowing Pedro is in a little bit health of Liz. For code is the air quality monitor case. So this uses an SCD-41 and a PMSA-3IS something. Both STEMIQT plug and play sensors for air quality, particulate, CO2, humidity and, sorry, temperature, humidity, CO2 and particulate matter. Right. All those sensors with an ESP32-S2 TFT built in. Basically all in one, portable, battery-powered, all environmental sensor that doesn't even require soldering which I think is kind of neat. We're getting really close fill to this. Like no, saw our future. We talked to the good Chris. Yeah, Chris Anderson, a million years ago, Chris Anderson, wired Chris Anderson. He was the editor-in-chief of wired. The good one. I say that because it's funny. He was an evil one. I think there's one that runs 10 Talks. He's a good one. I don't know if that's true.  He was doing a maker company while he was on his way out of wire doing an open-source drone company. But he had said, you know, the future is kind of like where we are now. Lots of things like Stemma that plug together and a lot of places, whether it be a office environment or even a school environment, they're just not soldering as much. So we needed to have options for people. So we're getting closer and closer and closer to that. Yeah. There's still room for all those things but I remember he said, because when he was running a business it was like, kids weren't really one of the things that the demand was shrinking where things like breakout boards and things that you plug in together more like, I don't want to say Legos, but like things that are more modular. Yeah. They, you know, like Capsula is like one of my favorite toys as a kid. So it's like stuff that snaps together. And you'll see like a lot of, not every board, but more and more boards that come from us and sensors are plug and play thanks to the quick format from Sparkfun and just a clever use of social components. Yeah. We have a chart with Grove, Quick, Stemma. There's a couple of those that we tried to make sure. There's a gravity, there's a couple. So we're, you know, we're moving there. We tried to make sure whatever we did was the most compatible. Liz did two guides on our new can peripheral boards. One is the can bus feather wing. So it can add can bus to any microcontroller or the feather format because it uses SPI. And then we also have the can pal, which is four boards that have a transceiver built in. So like the ESP32 series basically and the STM32F405 and the SAM E51. Not a ton of boards have built in can peripherals or twi, TWAI as ESP calls them. But if you do, you can just use the can pal. You don't need to get the SPI feather wing. So we have two options. And I guess what I use when I, with the videos of me testing them, I test them against each other. Philby wrote an awesome guide about the new Pico DVI Arduino library. So the RP2040 can do a lot of cool tricks with PIO. And one of them is you can have DVI output that works on HDMI monitors. But the Pico DVI library, you know, normally require using the Pico SDK, which is, you know, amazing and powerful, but a little challenging for people. The Philby wrote a wrapper library for Arduino that takes Pico DVI kind of does all the work for you. So you could treat it just as a frame buffer display that's 320 by 240, and it will automatically, like magically come out the Pico pins.  So we have a DVI feather coming out soon. There was a little silk screen error and I wanted to get the boards remade. But once that's out, it'll work magically with this library. So you can really easily make projects that connect to a monitor and anything with HDMI input. So you can also do screen captures of Arduino or microcontroller projects, which I think is really cool because you get like beautiful pixel perfect rather than trying to like video with your phone or whatever. It's gonna capture what you actually like capture. And everyone has these, you know, lifeless black rectangles that have taken over all of our homes called TVs. And you could make something for them now, like you can make your own little art things. Yeah, and we have a little video from Todd too. Yeah, and it doesn't like, you know, communicate with a server somewhere. It's all local. Yeah, and you don't wanna let it, there's no legs.  That's five bucks. It's like, well, first of all, you can't get there. A second, it's running limits. And it's like a whole thing. All you need is to change the kernel. So yeah, we'll get accused of making art too easy. Too easy. Next up from Dan Halbert, we've got a deep sleep with Circuit Python. This got updated. We had a couple of pages that Lucien had written about deep sleep and realized that they never went live. Those pages are now live. And also if you have like an RB2040, you wanna do deep sleep like I wanted to over the weekend. We have a page on that. So check it out. We actually have pretty good deep sleep numbers in Circuit Python. You'd be surprised. We get as good as it gets. And it works really easily. Like when you're on USB, it doesn't actually go to sleep so that you can continue to, pretends to go to sleep. But when USB is disconnected, it knows that it actually uses the low power because USB is connected. We've got Hexpad, which is a really cool project. I think you sent me someone built like a honeycomb, like a large honeycomb Hexpad. And I was like, oh, maybe we can make a little teeny one with custom hexagonal key caps. So None Pedro and JP worked together to model hexagonal key caps for chalk keys, super skinny keys. Have them sent out to a service so we can get like next resin prints, but also you could just print them on your FDM printer and uses a QDPI for HID control. You can do, you saw the little video it does like a MIDI control as well. So we've made a lot of key cap keyboard stuff, but we hadn't made one that had hexagonal keys. I love hexagons. And for the last one, I have a video. Okay, let's watch the video. This is Jebler's ChatGBT project. And again, because I think, knives are out, everybody's like, let's sign a petition, no more AI for six months. And then some folks are like, this is just a language model. It's a string words together. Don't, it's not alive. Like stop saying that. It's really good for fiction. Yeah, no, if you want to make up stuff. It is so much fun for fiction. If you like having, so you can have it like a kid's story and all that there's so many fun things that you can do another fun trick. And we might do a video of some things it doesn't do. Because folks are like, oh, it can make schematics. Don't worry, if you're an engineer, this thing is not coming for your job. But one of the things you can do, which is kind of funny, is you can tell it, I think it's called like system message.  I'm gonna ask you questions and you have to reply back with lyrics from cure songs. And you have to put the lyric, the song name and then the album.  Should I wear a raincoat and tell you lyrics song, excellent and stuff like that. It's kind of like an advanced form of horoscopes because you're kind of going into it with things that you want to hear anyways. Or things that you kind of remember. So like for trivia and stuff like that, it's a lot of fun. So anyways, here's an example of good use we think of it which is a lot of just unending like. Kind of nonsense, but it's using the Pico W and Strikot Python, which is cool. Yeah. Hey, it's Jeffler here with my new project called press button, get superpower. It uses a circuit Python on the Raspberry Pi Pico W and connects to open AI's chat GPT. Each time you press the button, a request is made to chat GPT and the response is streamed on the OLED display. Not every response is a winner, but many of them are charming and funny. And if superpowers aren't your thing, don't worry. Just edit the settings.tunnel file in any text editor and write your own original prompt in plain English. For example, maybe magical universities or what you're more interested in hearing about. I like how this project invites endless customization even for non-coders. And for those of you who aren't learning to code, I hope it also provides a good example of using chat GPT together with circuit Python. Check out my new guide on the Adafruit learning system today. And here's the back to your footage. Let's do some 3D print and then go back to back. First, we're going to do the air quality wearable, so Pedro, and then we're going to do a speed up and then we're going to see you on the other side for AI and MPI. You can build a compact air quality monitor with an Adafruit Feather and circuit Python. This is powered by the Adafruit Feather ESP32-S2 with a reverse TFT and uses two environmental sensors. It's got a PMSA003I sensor for monitoring the particular air quality around you and the SCD41CO2 for monitoring CO2, temperature, and humidity. Sensor data is displayed on the color TFT so you can easily read sensor values like the particulate matter, CO2 levels, temperature, and humidity. Everything is housed in a compact 3D printed enclosure with a swappable faceplate so it can be used as a desktop monitor or a portable wearable. New pixel LEDs light up as a visual cue letting you know the PM2.5 air quality levels in the area. The built-in ventilation allows for proper airflow so you can get accurate sensor readings. Take this on the go and monitor the environment when exploring your new destination. Circuit Python makes it easy to display sensor data on a TFT screen with ready-to-use drivers and libraries. You can turn this into an internet-connected project with Adafruit I.O. and log your sensor data to a custom dashboard. To get Circuit Python on your dev board, head on over to CircuitPython.org and search to download the latest firmware. You can get the parts from Adafruit to build this project, links are in the description. Download and 3D print the parts in your favorite filament to build the snap fit enclosure. Start by mounting the PMSA003i sensor to the 3D printed bracket with machine screws. A short STEMAQT cable connects the feather to the sensor and a JST cable plugs into the NeoPixel stick. Then secure the feather and NeoPixel PCBs to the mounting bracket with screws. A separate bracket secures the SCD41-02 sensor to the back of the bracket. The whole assembly can then be installed into the 3D printed case along with your choice of faceplate and back cover. An additional bezel for the TFT display snap fits and keeps electronics dust-free. This faceplate features slots for strapping on a wristband so you can wear it. We brought this on a tryptic Galaxy's Edge and gained lots of insights from the sensor readings. It was really interesting to see the air quality change when moving between locations. We hope this inspires you to use circuit Python and parts from Adafruit to build your next environmental project. Before we go over to IonMPI, don't forget the code is, back to where we're going to do IonMPI in the new product. So let's kick it. IonMPI every single week. Did you key in it for bring you this? This week it is from? XMOS. I don't think we've covered XMOS before so I'm kind of excited. Yeah, no, I like to always check out some companies that we haven't before. I've seen XMOS stuff for a bit and they've been very popular on social media but I've never actually investigated their chips and so I was like, hey, this is a good excuse. So this week's IonMPI, it's an available board but really it's the X2 316 series which is their latest Core.ai, their XCore.ai model of chips. Comes available in BGA and also this QFN which looks like it has some pretty sweet ground and power planes on the bottom. I like that they make that chips that are available in QFN for manufacturability. Kind of seems like everything these days is BGA. Okay, so the XCore is not an ARM Cortex, right? Which is, you know, we covered a couple of what is called like cross over microcontrollers, ultra powerful microcontrollers from NXP, the IMX series a couple of weeks ago. These are also what we call cross over but they're not Cortex series. Instead it's XCore, it's their own Core chipset and you see there's basically, it's kind of like two processors but it's like two multi-core processors. So there's two tiles, what they call and each tile, maybe you can make this bigger so you can see the text. Yeah, I can do that. I just need a second here to scale it up. Oh no, just the window bigger. Oh, you wanted to see, you didn't want to use it. Yeah, you just wanted this. Yes, thank you. Okay. I wanted to read all the details. Okay, so in each tile left and right, they've got the ALU and they also have their own internal 512 kilobytes of SRAM and then there's like this communication, the switch and like packet messaging system in between and each one has five to eight cores. So you'll see like when we go through the list of processors, some of like, some are like 2,300 mps and some are like 300, 3,500 mps. That basically depends on how many cores you've got. They're, each has 500 megahertz clock rate and then of course they've got peripherals and they also have their own IO banks. So you'll see at the top, the IO pins are per core. So you can actually have both cores going at the same time doing IO control without interfering with each other, which is a common thing when you've got like a mic control and dual core, often the IO pins are on a shared bus and so you can't have both cores messing with the IO at the same time, but here, you know, go to town. What you're getting is, you know, 10 to 16 cores, all clocked really fast. And this is like a super, super powerful chip. Reminds me, you know, it's not at all related to but it kind of is evocative to me of this, like a super ultra-powered propeller chip for folks who remember that custom chip from Parallax also had, you know, eight cores, special GPIO functions and was like, you know, a non-arm cortex chip. But gotta give them credit because they wanted to do a chip that was really good at audio processing. It was kind of like the combination of a very powerful mic controller, multi-core, lots of IO capabilities, DSP and now they've added some AI acceleration as well. So basically it's just really, really, really fast, but it's a mic controller. You have a free RTOS running on it, but you're not dealing with Linux, you're not dealing with QNX or whatever, no operating system that takes time to boot. It's instantaneous, which means it's great for appliances, devices, cars, et cetera. And not only is it really good audio, it's also got pretty good video and camera interface as well. And you can also attach external RAM if you want even more processing capability, like you want more space to move in. Flash isn't built in, you attach flash with like USB flash or something similar, but basically very, very fast and here's just like another, this one, I liked because it showed that, you know, the 512 or 12 kilobytes of RAM. The MIPI is interesting, two lanes, so you can do camera in or display out, both are supported. Actually on the dev board, you'll see there's a 15 pin, like Raspberry Pi compatible camera interface, high speed USB fi, so you can do host or peripheral, and then in the middle is that, you know, packet switching circuit interface, you can send data back and forth, and yeah, you can have external memory as well, LPDDR RAM, and there's ones with tons of pins, so you can connect a fairly big package of memory. Next up for the processor itself comes either 60 pin QFN again, manufacturable. There's also a chunky BGA, but with a 0.8 millimeter pitch, so, you know, not too bad to manufacture. They've got an interesting TensorFlow light from microcontroller, but they've kind of got like a workflow setup where you can train your TensorFlow models in light, you know, the Python API, and then convert it into a TensorFlow micro runtime using their like online tools. So, you know, optimized TensorFlow light for microcontrollers, if you actually do need to have a fairly good processor, I feel like, you know, eight cores running 500 megahertz, you have a chance of it. I'm actually kind of surprised they couldn't run TensorFlow light directly, since you can run it on, you know, single board computers that are about the same MIPS capability.  And you know, this is kind of their money shot graph, where they're like, hey, you know, if you had an ARM Cortex M7 running at 600 megahertz, look, we have so many more cores, and we're so much more optimized. You don't mention what this mystery ARM Cortex M7 at 600 megahertz is, but I'm betting it's probably the STM32H7 or F7, which is good because a lot of people like to use that chip, that's kind of highest end microcontroller you can get these days, but they've been hard to get because of the chip shortage. And also, I love competition. I want to have more chips of that power capability available to people. So, you know, we're not just only buying one chip, we have multiple options. So I'm very psyched to see more pressure at the high end of microcontrollers, bring that price down and you'll see that the price here is very comparable.  IO voltage can vary. That's one thing I noticed, 1.8 or 3.3 volts. They all have the same amount of RAM. They all have the same number of cores. They have different number of IO based on whether you have the 60 pin QFN or the 265 pin FPGA. Some do and do not have the external memory and MIPI capability, which makes sense. If you're doing graphical display stuff with a nice MIPI display that maybe is 1024 by 720 or something, you'll probably want the external memory to do the frame buffer. And of course, the key is a supplier. They also have some very cute dev boards. This is one for the X-Core AI series. You know, pretty simple, just has the camera connector, which again looks suspiciously likely, Raspberry Pi camera, Wi-Fi, native USB, debug USB, and of course audio because they're very specialized audio. You can see on the left, there's the, left and the right, there's the GPIO banks. Probably the left-hand side is one core and the right-hand side is the other core. This is the dev board that is actually featured for the X-U316 series. And you can tell that it's like, hey, are you designing some sort of like DJ mixer or synthesizer or something, which does would be a really good job for. Got two MIDI interfaces. I've rarely seen devices that have too many, two RCA, eight IO, sorry, analog outputs, line outputs through looks like four different, four, yeah, four different on the right, I2S, ADC DAC combos. I think it's the TITVP series, power supply in the bottom, USB external power, all that good stuff. But you know, one thing I think that they're definitely going after is the family of like, since DJ equipment, smart speakers, they've already kind of gone after that market a lot. I think also control panels for home devices or for automotive or industrial equipment where you have a noisy background and maybe you want to have speech recognition or you want to do stereo control. Yeah, what's that right there? That's clock in. I think that is if you want to, you know, you usually have a crystal for clocking the chip, but I mean this, they don't really brag about the power, low power usage because it's got like 16 cores in it. So probably you want to mess with your clock frequency to see if you can tweak your power usage or maybe for precision, you have to have a good steady clock if you want to have your audio coming out at exactly 44 point, about one kilohertz. So that's a, yeah, go sync signal. You can download the schematics for their explorer board which I found kind of handy because it kind of shows you all the capabilities. Again, lots of audio functionality and also how they split up the power supply which is again, have a pretty beefy power supply needed for these chips. Software tools are available. It's basically they say use free RTOS. Everything is running under free RTOS. You do need their compiler because it's not on Cortex, you're not going to use ARM GCC, but they have tool chains available for Windows, Mac and Linux. And they've got on GitHub a lot of their libraries. This is just a couple of their libraries. They have like, you know, 76 of them. They have a library for everything that you can do with their chipsets. And I looked at some of the code. All of it looked like I had lots of good example code. You know, one of their things is clearly they're trying to make it very easy for people to transition from using ARM Cortex to using their chips. So they have to go a little bit above and beyond with their SDK offerings. And one thing I thought was cool is like, oh, it's USB and I bet they saw something TUSB and when I see TUSB, I'm like, oh, I bet they use TUSB. And they do. And I would like to point out how cool it is that the TUSB stack is licensed so freely that Silicon vendors are now using TUSB and they're adding support for their chipsets because we do not restrict who gets to use TUSB. So good, even the big ins use it. Yes. So very neat. You know, it's, again, it's a transition because a lot of people using these kind of high-end chipsets that they tend to be using ARM Cortex.  Maybe it's a licensed thing, I don't know, but, you know, XCore owns their own IP for the Silicon. So they wanna toss 16 cores in there, go for it. Available on DigiKey. And totally in stock. And you can see the pricing. It's really quite reasonable, considering that you get the RAM built in, you don't have to add external RAM. It's almost completely fully built. Like there's not, you don't really need a lot of accessories, you need a crystal and maybe some Q-Spy memory. And you're good to go. Lots of peripherals, lots of functionality. Maybe good for your next audio project. I did notice when I Googled around for this part, a lot of audiophile DAX, like stereo drivers, use this X-mon series, yeah. All right, we're gonna play a video and then we'll see you on the other side for new products. Voice enriches experience. I'm right, zoom set to screen. We're being pushed back. Game, find more players. Here are the other players online. I need them, that we need some help. Now we're talking. Yeah, level smashed. Game pause. New upgrades are available. Do you want to check your options? Yeah, let's see them. Emma, here are your options. Okay. Dan, here are your options. No, I'm good. My option too. Do you want to use your game credits, Dan? Yes. Dan, purchase confirmed. Are there any other options you want to look at? Game t-shirts are on offer today. No, thank you. Ready? Ready. Game start. Stand horizon.  MPI.   A lot going on. Okay. Can't get, because last week we skipped. Okay, this week we've got an update to the 2.7 tri-color ink display. It looks basically the same as this. It's got that long update to get the red color in. But it's basically a new chipset, the EK79686, the previous one, which was like the IL7368 something. Doesn't exist anymore. This is what we got. So this necessitated, it's a little bit of an update to the board anyways, because the flex connector changed the length. And so we had to revise the board and wish we were rising the board, we might as well add an iSpy connector. So now you can connect to this with our iSpy cables, which are 18 pins and kind of like a solderless version of an SPI cable. Good for when you want to wire and mount an ink display elsewhere, but you don't want to have a lot of long wires. So still it's got the built-in SRAM, so you can use this even with a small RAM microcontroller like an Arduino Uno, level shifting for three or five volt microcontroller. Again, iSpy has been added, SD card for storing files that you want to display on your ink. We've got two upcoming devices from Espressif. This is the ESP32 H2 series. This series of chipsets are, you know, developer use only right now. They're still going through certification. These chips are not Wi-Fi. They have Bluetooth and 2.4 gigahertz radius, so 802.15 for, you know, sometimes used for ZigBee or point-to-point or mesh communication. So not Wi-Fi, but probably going to be a lot lower power and really good if you just want to do Bluetooth. So they're kind of trying out new chipset options. This is the RAM module and we've also got the dev board. This chip has native USB, but there's also a UART cable, UART add-on for debug, two USB-C ports. There's a NeoPixel. There's like, I think a power measurement jumper. Let's go back over here. Yeah, I think that's a power measurement jumper, NeoPixel, USB serial converter, reset and boot and a nice power supply. All the pins brought out. So I think probably this is designed to target things that are going to run matter or thread or other, a ZigBee slash Bluetooth slash 2.4 gigahertz non-Wi-Fi communications for home automation. It'll probably be a good competitor to the ESP32C3, maybe lower power use. And so far, Bluetooth on expressives hasn't been their priorities in Wi-Fi, so it's going to be good to see them, focusing on Bluetooth, maybe getting a low power usage for Bluetooth with better lower numbers. Next up, we've got two more UU gear, Wi-Fi boards. They've been all updated to the Wi-Fi 4 series. So this one is the L3V7 and the 3V7 isn't version 3V7, it's Wi-Fi 4. The 3V7 means that thing on the left there is meant for LiPoly batteries. You can plug in any 3.7 volt nominal, 3.7 to 4.2 volt.  So it's kind of like an uninterruptible power supply, UPS, plus a real-time clock, plus a control. It's kind of like a power management tool for your Raspberry Pi. It comes in the Bonnet or FAT or Micro FAT, whatever mini hat size, but you can use it with any Raspberry Pi that has a two by 20 connector. It comes with a couple accessories. Oh, here's all the GPIO. There's another, there's a micro controller on board, by the way, there's an AT Tiny 814, I think, that is used to, over I squared C, to send commands and control it. So if you go, sorry here, I just wanna note one thing. This is kind of designed to plug in directly into like your Pi Zero or Pi Zero W and you see how the socket on the top, the pins of the Raspberry Pi plug through the board and up to it. Now you could use this with a Pi 4 or any Pi with a two by 20 connector, but you'll want one of the stacking header that extends the pins up because otherwise it won't be able to, only the Pi Zero is flat enough for this to sit around the bottom. So you may need to get an extension header, which we stock in the shop and we point down the description to lift it up above. Well, if you have a Pi Zero and you wanna keep it nice and slim, the style is good. There's also the Wittie Pi 4, which is, which comes with extension headers so you can plug it into your, the Raspberry Pi 4, Raspberry Pi 3, A plus, B plus, whatever. This is a good demo because it shows it's, this doesn't have a battery booster. It has a buck converter, so it's good for if you're running off of like a double A battery pack or something. It has a real-time clock with a coin cell backup. The coin isn't included because otherwise it's really hard to ship internationally or you know, anywhere. So we do have the coin cells sold separately if you want to add it, but you know, we don't include in the package for ease of shipping. But again, a power manager with real-time clock and buck converter for any Raspberry Pi on off switch on the right-hand side. So they do a really good job with the real-time clock and battery management. So we have a couple of different options. But again, if you want LiPoli recharging, boosting, use that, we pay Mini, this one doesn't do LiPoli. It's a buck converter, so it takes I think six to 12 volts or six to 20 volts and converts it down to five. So it's different uses for different needs. And this one is a normal hat size. That said, it's still plugging to a Pi zero. It'll just stick out kind of overhanging. This is coming out soon, but I want to mention it because the next product is similar and I knew people were going to ask, when are you going to get the Laura version? This is a Feather RP2040 with a Laura 900 megahertz module that you can use to run on Laura WAN stack or just Laura, which is its own protocol. You don't need to run Laura WAN, which is a type of software stack that runs on Laura. 900 megahertz means you can tune it down to 868 or up to 915 and then just pick the right antenna and you're going to still get about 20 dBm output You have all the Feather pins that you expect for analog pins, I think like 20 total GPIO, Stem EQT on the end there, you can plug in sensors, OLEDs, whatever, Neopixels, eight megabytes of flash, that nice RP2040 core, which will work great with MicroPython, CircuitPython or Arduino, UFL antenna and the FCC IC certified SX1276 based SEMTECH Laura module. So this is coming soon, but I want to mention that we have it because the next product, Sorry, show up besides you lady, our community, our customers, our staff, everyone who makes this thing go is the Adafruit Feather RP2040 with RFM 69 packet radio. So this is- Packet fruit. It's a packet fruit, it's not a Laura radio, it's an RF69, what's the difference? The RF69, which sounds so similar to the RF95, which is the Laura, this version doesn't do Laura or Laura when because it doesn't, they don't pay the licensing fee. However, it's great for sending packets of data back and forth between modules, you can get easily 500 feet without much effort and you can get kilometers with really good antennas and directional gain antennas. But if you wanted to make a simple, low cost radio node that can go much farther than 2.4 gigahertz, these are great to use the ISM band in North America. Check your location to make sure that 900 megahertz is your ISM band. We'll have the 433 megahertz version later. It has the RP2040 with 264 K of RAM. So wonderful for running circuit Python or Feather M0, RFM69, people were like, this is such a great thing, but you designed this before circuit Python or MicroPython, you went out of memory before, you can really do anything, so only has 32 K of RAM. This one has 264 K, so you can use interpreted languages like circuit Python or MicroPython and to your packet radio and have sensors and have data and you're not, you don't run out of memory instantly, yay. Eight megabytes of flash, you can store data, do data logging, send or receive packets. A couple of antenna options.  It's one solder. Let's say you're like, I don't even want a solder, I want a really good antenna. There is a onboard UFL connector. You can use a low cost UFL to SMA adapter and then plug in any antenna you wish. That's 868 to 915 megahertz and boom, you can have a panel mount antenna without any soldering that can go very, very far.  And then on the right, you can, you get headers. You can plug it into a breadboard or to all our feather wings. You get I-squared C, SPI, four analog pins, power supply, lipo battery, recharging, regulator, reset and boot, buttons, Neopixel, eight megabytes of onboard flasher. You mentioned that. And on the very right, there's a STEMI QT port so you can plug in all your sensors, you want an OLED. You can actually make fairly complicated sensor nodes with no soldering, which was the goal here, is like as much as possible make it so people can get going, but if you wanna solder, you can add a lot more power and accessories. So this is our first board of the series where we're trying to kind of replace the Feather M0 and 32-4 line, upgrade them, because those are kind of now six to 10 years old. Give them a refresh with the RP2040 chip which is less expensive than those chips but much more powerful. So we'll still carry the old ones for compatibility, but I really think, you know, if you're just looking for a new packet radio board, I would push people towards getting the RP2040, it's a nice solid chip, I'd again, less expensive and more powerful. That's a match. Okey-dokey, don't forget the code is packet fruit, you get all that free stuff. We're gonna do some top secret while you put up any questions. I have some of them ready to go. We're gonna stop secret and then we're gonna answer your questions over on Discord, so here we go. Okay, first up, we're gonna play two videos. These are top secret things that we're up to and then, oh, top out doesn't care. Sent, taught out a DVI Feather way, that's cool. So you did something neat with it, so we're gonna play that and then do you wanna show anything else or do you wanna do the questions? Let's do the questions, cause we can do a really big, or we can do a top secret video later and post it. We'll just post it later so I wanna get to the videos and then I got it. Okay, cool. What is this? This is me designing the tester for our new RP2040 Feathers with radio modules on the end. This is a Laura 900 megahertz RFM95. We've also got the version over here. Oh, you have an antenna soldered on. The RFM69 is the packet radio version. So the tester brains uses the Pico with an SD card which has the firmware and then it connects to one of the modules. I usually would use like a breakout but I only have a feather wing on hand. I gotta go to the office and grab one of the modules that matches the right frequency. And then over here is the feather. And so what it does, if you back out a bit, we can see everything. The tester programs the test firmware onto here which tests all the GPIO and checks the voltages and everything and then communicates back and forth with this radio to make sure that the radio and the antenna is working and you can see I've got a little faux antenna, just a basic antenna that connects to the Pogo pin here. And then on success, you get okay test. All right, lady, what is this? Well, this is a circuit playground classic which you might remember is our ATmega32U4 based circuit playground. This was the first version and we didn't make them for a while because we couldn't get ATmega32U4s but hey, chip shortage is over so let's make some more. We also decided to let's redesign this tester board. Originally this used a Arduino M-Zero Pro like yeah, ancient which we can't really get anymore. So we're gonna update it to our RP2040 brains board which does the AVR programming and also can do the USB host enumeration check. So the board tests itself and then after it's done enumerates programs the flash can do the whole thing in about like 10, 15 seconds which is great and then when it's done you get a nice little rainbow. So it's completely for the rainbow. Yeah, so look for the rainbow and then once these are all tested we'll get them back in the shop. And this is a little preview. We sent this up to Todd Bot and Todd Bot delivered. This is something that you made. Yeah, I know he said this on the call. Yeah, so this is a little video sent with using the Arduino Pico DVI library which is neat because again, it's always been so hard to do DVI output without using a Raspberry Pi or their single board computer which don't get me wrong, they're cool but like there's a lot, it's a lot of heavy lifting to get it going. What I like is how light it's instant. You turn it on and it's immediately displaying whatever you want over DVI. So looks cool, it's a little chunky but I kind of like it too. It's got a little bit of that like video toaster. Yeah, this'll be in our store very soon. Okay, we're gonna go right into questions so we have some lined up right away and then there's some that just came in. Lady Aida, how about you speed around these so we can feed you and convert soup into electronics? Yeah, pretty much. Yeah, first up, someone has a matrix portal. It's a great device. What's the best way for them to display their local time? It's actually really hard to display local time. You think it's like, how hard is it? Just look at the clock, but your clock changes twice a year. If you have daylight savings time. So what I actually recommend is if you have a matrix portal use the Adafruit IO time service, which is free. You do need time to count but that's just so we don't get abuse. And forever and ever you will be able to get your time based on either your IP address or that you tell what time zone you're in and it will always give you the correct time that adjusts for daylight savings and all that good stuff. Yeah, I think this question was referring to like the STEMMA quick and stuff. Have we ever thought about working with the company to create standards? Yeah, sort of kind of. I mean, one of the things that happened in the maker world seed had grove, spark fun had quick and then we had STEMMA. We just, we reached out to the different companies. I think this is as good as it's gonna get right now as far as compatibility. Like we decided let's make sure our thing is the most compatible, but it would be good. You know, Arduino has a totally different thing you're doing. It would be nice for all of us to have a way. I kind of look at groups like the Open Hardware Association. That's where I would hope that would come from is like, hey, we're noticing here is what everyone's using in the industry. Could we help you come up with a spec? Kind of like we did with the Open Hardware definition because like for some companies they'll come up with their own standard. So you're stuck with their thing. We said, well, you can use anything. I feel like, you know, quick and STEMMA and, you know, PicoDiva or whatever have all, the basic, there is a standard now and it's getting picked up by other companies. I think it's tough because there is no coalition to create standards.  And I think it's right now we have to kind of open market of ideas. You know, like we created the Feather Standard and a lot of people make Feather Compatibles and it's cool, whatever. Like, you know, I think that if we'd gone together and tried to committee it would have taken years to hammer out details. I think, you know, we kind of have a more free form market right now, but it's working out because everyone's got these open standards not patented. I do think that if you make something everyone wants like teeny USB, it kind of gets adopted and. Yeah, whatever's free is of course. And I'm glad it's coming from us because we did a good job and we made a really good open license. Next up, any updates on the status of matter? So there's some like infighting with some of the different entities and matters. So we're just kind of watching. We can always spin up a board, but we're kind of figuring out what's going to happen next. Wait, wait. Will you still need an airlift to get it on Wi-Fi? Have you tested it with airlifts yet? I think just for the. I would actually go with an ESP32 Feather and then add an RFM Feather Wing on top because for Wi-Fi, you're best off having native Wi-Fi. You're going to get the best performance because the pack area is much slower. Okay. We're to like questions ideas, a phased array IR transmitter work, IR to CDMA encodings. There is such actually such a thing as a phased array IR transmitter. That's what PIXMob uses for their light up bracelets. So you can check out what PIXMob does. Okay. Could one running private Lora win over a mesh packet reduce? Well, these are not Lora. These are packet. Like Lora is a is a patented standard that SEMTEC owns a licensing for. You have to pay more for it, but you can absolutely make any kind of mesh network address network point to point network with packet radios. No problem. Okay. The eight box drop. Could you be interested in talking about the saga of parsing to redesign parsing? Absolutely. Yeah. As we ship eight of boxes, we're probably going to be filming us shipping them and we'll probably just do like a deep dive and like what's happened over the last couple of years. Could we stop doing our chip shortage videos because it's changing, but boy, it's been a journey. Yeah. Someone designed a cellular IOT RP2040 device with a SIM 808, 3.5 touchscreen TFT breakout and the high max HMO one B zero color imaging module has a writing or less to make intent on the top. And it's kind of both in my question is what do I heck do I call it? This is like chunk cell. I would chunk it. Ring ring, chocophone. Chocophone. I asked chat GPT. It could be, it could actually come with some pretty good product. I have a chunky phone. What do I call it? Yeah. Next up, the RP2040D Viborg. Can you give an idea of how much the process to output the DVR display would take up as a CP of memory? Will there be tons of room to do some big projects? There's not a lot of room for it. It uses one core. I think it uses either one or both the PIOs. Maybe I use one. So there's one PIO available. And then it uses to 160 K of RAM. So it's a lot, it's beefy and it's overclocked. So it uses a lot. So you can do some basic projects. I wouldn't, I'm not sure that the code will run on like a Pico W. I think it doesn't right now because the other PIO is used for communicating with, the allocation isn't done right for the wifi. So it's more of a toy. Think of it as like a DVI toy, not like, oh my God, I really do have like HDMI output for any usage. You can call that phone Cinder Block. There was that really fat cat that they had to put on like a water treadmill for a while and they're like, cats have a Cinder Block. Anyways, them's the questions. So thank you so much everybody for hanging out with us this week. We're in a little late, but we're gonna get you some food. And we'll see everybody during the week. We have lots of videos. We're gonna post some cool coming soon and prototype stuff since we're gonna have time tonight. We'll see everybody next week. Special thanks to Jessie Mae behind the scenes. Thanks, Jessie Mae. Running some things. And this has been an aid for production. This is your moment of zener. Bye everybody. Bye everybody.


Okay. Hi everyone, I'm Gregor. I will be talking about building, writing simple DSLs in Ruby. I work for this. Okay. Thanks. I work for this company called Collegio Travel Solutions. We are building different products that are related to traveling and to loyalty, to loyalty currencies. So today I'll be talking about something that is closely related to what I've been working on recently. When I was preparing this talk, I noticed that there were related talks recently here in Singapore. One of them was at the Ruby Meetup I think two months ago, and it was about writing a DSL, which was very different from the DSLs that I will be showing you, but you could check it as well. And the second one was at the Red Dot Ruby conference last month, and it was a talk about metaprogramming, which is very useful to understanding how you can write DSLs in Ruby.  This abbreviation stands for domain-specific language, and that's where the easy part ends, because to understand what really is DSL is not so easy. Like when I show you a language, it's not easy to determine if you can call it DSL or not. So first example, which is easy is a make. It's a tool for building programs, for compiling, for executing some programs, and make itself parses files that are written in certain language. And this language was created only to be parsed by this program and only to be understood by this program. It's definitely a domain-specific language. Then we've got CSS, which I don't think that anyone thinks of it as a domain-specific language, but it is language, and it has just one domain. It has only one application, right? It is supposed to be parsed by a browser and to format the content that the browser displays. Then the third example, this is more complicated. So Veeam, the text editor, has built-in language that is called Vinscript, and I'm not sure if it's a DSL or not, and I will explain you why in a moment. Then we've got the last two examples. Here are languages specific, kind of specific to Ruby. So first one is Gerkin. It's a language that is understood by a library called Cucumber, which is a testing framework. And then the last one, I think all of you know what is RSpec, and that the RSpec syntax doesn't really feel like Ruby syntax. So it's also a DSL. So the first example that I mentioned was Make, and I'm sure that whoever of you ever written some more complex program in CRC++, something more complex than just one file, you know that it's not easy to link all these files to compile them one by one, etc. So we use the tool called Make, and it reads the file called Makefile. And this Makefile is written in a DSL that has certain constructs that a language may have. In this case, we've got rules and macros. So it's a very simple language. It has just two basic constructs. There are no more constructs in this language. Then Vinscript, which I mentioned that is more complex, it's actually like a full language. It has variables, it has loops, it has the if conditional, etc., etc. You can write a full program in Vinscript. The thing is that you will not use it anywhere outside of VIM. You will just use it... I haven't seen any example of Vinscript being used for something different than extending the VIM editor. So I'm not really sure if it's a DSL because it's like a... It's a full language. You can write any program in Vinscript. But on the other hand, it has just one application. Now, DSLs can be either external or internal. And this is a huge difference because the internal DSL is limited to the language in which it is written. So even though RSpec code, the RSpec code that you are writing doesn't feel like Ruby because you do not define directly any methods or classes, it still needs to be a valid Ruby syntax. And the code that you write in this DSL is simply a part of the program that you are executing. While the external DSLs, like for example CSS, are parsed and executed by some external program. So CSS doesn't have to be written in the same language than the program using it is written. And the last one, the last example is Gerkin. So I think that I have an example of Gerkin here. Yes, I'm not sure if you see it well. But Gerkin is not a valid Ruby syntax. If you try to parse Gerkin, if you try to parse this block on the left by Ruby parser, it will tell you that it's invalid. And on the other hand, you've got a library called CUDA, which is an alternative to Gerkin. So you can use Cucumber with both of them. And one of them is the external DSL because it needs to be parsed. It cannot be parsed as a Ruby code. While CUDA, even though it does the same, it is a valid Ruby code. And therefore it is easier because you do not need to write a specific parser for it. So it's easier to use such language. But on the other hand, it is not as nice. The first one, the Gerkin on the left, looks much easier to read, especially for non-programmers. This is some internal DSL that looks, the first line looks almost like SQL language, just a very weird type of SQL, but actually this is a valid Lisp code. So I think it's written in common Lisp. So Lisp is extremely flexible language, and it allows you to define, to build a DSL that doesn't really look like Lisp. Well, it probably recognizes that it is Lisp because of the parentheses. But it doesn't feel like very much Lisp code, and it allows you to build something like this. And the second one, it looks very easy because it's just a loop which we know from lots of other languages, but Lisp doesn't have native loop structure. This is actually a DSL that is written in the language itself. So this is something that I don't think that you could achieve something like this in Ruby, but I don't know, maybe someone tried to implement the for loop, not using the native for loop in Ruby. Okay, so once again, the external DSL is like a separate language. It is not part of the language which is reading it. So it is easy to use, sorry, it is more difficult to use because you need to write a parser of this language. You need to write a separate program that will parse your language, but it is extremely flexible. You can define any grammar rules. You can define the language to look whatever you want it to look like. On the other hand, the internal DSLs are limited because they need to be a valid syntax of the language that holds this DSL. But because of that, it is much easier to define the internal DSL because you don't have to write a parser for it. So if you check the RSpec code, it doesn't have any specific parser. The RSpec code is just parsed by the same Ruby parser that you use for running your programs. Now, in Ruby, there are basically three components that you need to understand in order to start building DSLs. The first one is a block, and I think that everyone using Ruby knows what a block is. The second one is executing the block in different contexts. So you can use the keyword yield here that just executes the block that you passed to a function. You can use the instanceEvo, or you can use blog.co. I will explain the difference between the instanceExec and instanceEvo soon. And the last concept is metaprogramming. So you need to just understand very basic components of metaprogramming in Ruby, like define method, which allows you to define a new method basically from string. So you define a method from a data, not from a piece of code. And the last one, which is method missing, which is basically a function that is executed when you try to call a function that doesn't exist in your code. There's, of course, more about metaprogramming in Ruby, and if you don't know how it works, you should definitely check one of the talks that I mentioned earlier. Okay, now I will show you a few very, very simple DSLs. Now I'll explain you how they work. I will not be writing DSLs. I already have the code. Is it big enough? No? Okay, so first I want you to just focus on this. So this is my DSL. I want to basically copy factory guy, but instead of doing it in 300 or 400 lines of code, I want to do it in 50 lines of code. So basically I want to be able to define factories that will be used later for testing so that I can easily create the user or some other object. Normally if I want to create an object for the purpose of my test, I need to do user.new and pass all the parameters that are required. And in order to make it simpler, I just want to have a factory that will already fill this user object with some default values of the parameters. Okay, so I define the factory code user and later I will do something like factory. Okay, and this is my DSL. It just needs to consist of two public functions. So let's start by how this defined method works and then I will explain how create works. Okay, so my class factory has one internal variable called factories so that I will keep the collection of created factories. And when I define a factory, what I do is that I take the name and I create a new factory that will have this name, so this one will be called user, and it will have some body. The body here is a block. So I'm passing this block here, all these three lines, I'm passing to this function under the name block. And now we have this function called initialize. So first what I do is I need to know what kind of object this factory, this specific factory will be creating. So I'm taking my name which is the symbol user. I'm changing to string. I capitalize it so the first letter is a capital letter. And then I try to get the constant from there. Of course, if this constant is not defined, then my factory will fail. And now here's where the magic happens. Here's where I need to use the instance evil, one of the methods that I mentioned before. I basically take this body, the block, I'm defining it, I'm executing it inside my factory. So I'm going line by line and I'm just calling something like this. I'm calling first name with the value Michael. And now what is first name? My factory here which calls this block doesn't have a method called first name. So what I'm doing is that right now the method missing will be executed. And the method missing tells me what name, what is the name of the function that I try to call, and with what parameters I try to call it. So in this case the name will be first name and these attributes will be an array with just one element which will be Michael. So I'm assigning this value Michael to the default attributes hash that I have here under the key first name. And now it's the same with the other ones. I go through last name Jordan and with this I'm going through this email. And now after this my default attributes which started as an empty hash is filled with all these three values. So it looks like this. So these are my default attributes. And now that's it. That's what this function does. That's what defining factory does. And now my factory is ready and it's added to the small storage of factories. So when I call this method here, when I call factory.createUser, it just checks what is a factory registered under the name user and it calls method createOnIt. And this method is extremely simple. It just creates a new object of this class that I saved before and it initializes this object with default attributes or with attributes that I can use to override it. So this is extremely simple. This DSL is just 26 lines of code and it's a very basic version of factory girl. Now I have a similar example here that doesn't use, let me show them next to each other. This example here doesn't use instanceEvil. It uses yield instead. And now also my factory will look a bit different here in this case. My DSL, as you see, takes one argument to a block. And now I call the first name, last name and email on this attribute. What is this attribute? What am I passing here? I'm passing self. So I'm passing to the block, I'm passing factory under the name f and then I call factory.firstName, factory.lastName and factory.email. Now why do I need to do it this way? Let me show you how both of them will work and then you will see the difference. Okay, so I create my factory user and it works and here I have one change. Instead of passing the string here, I will want to pass my last name. So I have an instance variable called lastName and as you see, what happens here is that my last name is nil. So why is it nil? It's nil because I call this thing using instance evil and instance evil executes the block that I passed in my current context and the current context here is the factory object. So now this block, what happens here in this block is that cell is the factory object and the factory object doesn't have an instance variable called lastName. Okay, so in this case, using instance evil, I am not able to use the variables that are outside of my context here of this factory. Instead, if I had variable called lastName here, this would work because this variable exists then in the context of this factory. So this is a limitation of instance evil and now if I do the same using the yield, this works fine. See that the last name is here. That's because this block is still executed in its normal context. So yield, the difference between yield and instance evil is that yield just doesn't change the context of the block. It uses the context in which the block was initially created while instance evil, it kind of overwrites cell. So this is one example of a very simple DSL. Now there is one more method like these two that I mentioned a moment ago and the last one is called instance exec. And instance exec is basically the same as instance evil. It also overwrites cell and the only difference is that it allows you to pass arguments. So here yield, it allows me to pass itself as an argument but I can also pass something else here. I can pass user or whatever I want to pass to this block as an argument. Instance evil takes only one argument which is a block but if I do instance exec then I can pass self as an argument and only the last argument is the block that I will be executing. So here I can also define like this. I can do f which will be the factory and I can have it like this. So to sum up this difference, you should use yield when you want to have access to the functions and variables from the original context where the block was created. Then instance exec, you should be using it when you want to have access to the current context when you want to use variables or functions from the object which will be calling the block, not the object that created the block. And instance evil, well basically there is no reason to use it because it's the same as instance exec except that it's limited. It doesn't accept additional arguments. Before I get to this question, I want to show you another small DSL. So I have this CSV generator. Sometimes at KaliGo we need to generate a lot of different files that we are sending later to our partners because lots of companies that we work with, they do not have REST APIs in their systems. How it works is that you generate the file, you send it to their SFTP or sometimes you have to upload it manually via web interface and then you wait three days and then they upload the handbag file on your SFTP or they don't do that because they forget because there's lots of manual process involved there. So we need to generate files and sometimes these files are in CSV format, sometimes they are in fixed-width format which is basically the format where each row needs to have the same amount of characters in each line. So here I just want to generate a very basic CSV file and I accept the records or orders as my argument to the object and I have a small DSL that defines the header, how the first line of the CSV file will look like and I define the body and the body is different for each row. For each order has its own row, has its own line in the file. So now this DSL is extremely simple and it's just like 50 lines of code. So let's have a look on how it works. First thing that you may notice is that I'm including the CSV generator here and when I include it, I need to enable some instance and class methods. So to do it in Ruby, I need to include the instance methods module and I need to extend my current class with the class methods module. So now class methods that I have here, so this is a class method because as you can see, this is code in the context of the class. So I've got a header and a body and header, basically what it does is that it takes a block and it passes it to a class called part generator and it happens, it's exactly the same with body. So I just take this block, it's not executed right now, it's just captured and I pass it somewhere and I will execute it later when I'm generating the file and the same with body. And now the block that I'm passing to a header takes one argument which will be the header generator because I don't need any additional information here. I'm only adding the columns with some hard-coded strings. But the second one takes additional argument which is the order because each row will have some information taken from this order. And now my method, sorry, my CSV generator has one method called generate, so I'm calling something like this. And that method called generate basically executes the block, first it executes the block that I pass to the header generator and adds it to the CSV file in the beginning and then it goes through all the records that I have and for each of them it calls the block that I passed to the body generator passing this record there and also it adds it to this CSV file. And now what do this header generator and the body generator do? They are also very simple. So my part generator that will later generate either the head or the body takes a block and it has a collection of values. And this collection is initially empty. It needs to be an array because that's how CSV is represented. It's just an array and each row in the CSV file is just an array of some values that are later connected with comma or some other character. And now when I call this block, when I call this generator, I can take any number of arguments here. This is not so nice part because some block will take zero arguments, some block will take two arguments, but I cannot define it here. I need to be able to take any number of arguments so I don't have any control over that. And then I call the block that I captured before passing cell first and then I pass the argument. And now what I do is that I go through these lines and I basically called generator.column and here generator.column with address, here generator.column with price. And what happens is that when I call column method, it's executed here in this generator. And this will give me an array like ID, price, etc. And here I iterate over the records and each of them generates one array of three elements. First element will be the order ID, second will be some string, and the third one will be a total amount. Let me show you that it actually works. I've got this variable called orders here. And the output is one string that is just all this. This is the first row, here we've got the new line, this is the second row, here we've got once again new line and the third row. So I just generated a valid CSV string that I later can save to a file. Here once again, I use the block.col, block.col, I'm calling the block here and I use this syntax where I'm passing the builder here and I'm calling this method explicitly on a builder. That if I call it this way, it's implicit that I will be calling it, I might be calling it in some different context. But here I just wanted to explicitly say that this column needs to be called, needs to be called on this builder. So this is extremely, this is the same, but here I will be using, sorry, in the, yes. No, where do I have it? Yes, so here I just wanted to show that I can actually do similar thing, just I can use yield and pass self instead of doing block.col. Oh, sorry, it's not this one, it's here. Okay, yes, this one, this one. So here I was using block.col, which is the same as yield and here I'm using the instance exec and I'm just passing first the arguments that I'm getting and then I'm passing the block. And here the DSL looks a bit different. It just doesn't take this other argument to a block. Okay, and the last example that I want to show you is a config that I'm often using in some applications when I need to do some configuration that I don't want to keep in the database. Why wouldn't I keep the configuration in the database if I can do it? First, because sometimes I've got configuration that changes extremely rarely and I just don't need to keep it in the database. And the other reason is that my changes in database are not tracked as well as the changes in the code. So whenever you change something in the database, it's already there. Whenever you change something in code, you need to push, you need to have code reviewed so that someone can notice that, hey, this change shouldn't be there. So I define very simple configuration files that are just Ruby code. So this code on the left and the code on the right are exactly the same. And I just wrote a very small library, which is just one method that allows me to write it like this. So what it does is that the basic class, the class called application defines free configuration values. The first one is root path. The second one is supported formats. The last one is authentication. And what happens here is that the root path doesn't have a default value. Therefore, if you try to call it, it will just raise an error, the same as you see here. The second one called supported formats has a default value, which is an array that consists of two elements. And the last one, the default value here is a block. So if you try to call it, it will just execute this code here. So by default, my application, when you call dot authentication, it will return your calls. But the admin application that inherits from that overrides this value. And when you try to call authentication, it will try to call a service called admin authentication. Now, how does this one function work that I mentioned you?  So it is terrible for many reasons. One of them is that it took me just like 20 minutes to write it. But the other is that I wanted to make it look very nice and very easy to use.  So we have just one method called config. When you call this method called config, it takes a name of the configuration and it defines a singleton method. Define singleton method basically defines a class method. And it defines this method in a class. So if I say config rootpath, then my class gets a method called rootpath. And if I call this method called rootpath, then I will define the method with the same name on an instance. So let me show you how this code works in practice. Oh, no. It doesn't work in practice. Why doesn't it work in practice? So I've got adminapplication.new, which is my app now. And app I can call root to rootpath. It should be app. So I basically create an instance of the class, of the admin application class, and this instance has access to the rootpath method. So if I call rootpath in context of a class, I just define the value and then instances can use this value. So this is an extremely simple example of what you can do in Ruby that doesn't even... I'm not even sure if it's a DSL. It's just a small change that doesn't look like Ruby anymore, but this is still an example. This is still a working Ruby code. So I'm using this just to make my configuration files more readable. I could do it using JSON, I could do it using YAML, I could do it using JSON or YAML. I cannot override it with a working code like this block here. If I do it in database, then other people can change the values and I don't have control over it. Unless I add some triggers in the database that will inform me about it, et cetera. So this is how I write config files that are both... They are both pushed to the code and they are also easily extendable. Okay. So these were the examples that I wanted to show you today. Another question is if these examples are really, really domain-specific languages. I have some examples of random comments or by random people on the Internet that are bitching about it, saying that, oh, it's not DSL because it's just syntax abuse and the only real DSLs are at least blah, blah, blah. Here's some more. And one comment that brought my attention was that it is not really writing a DSL. You're not writing a new language, you are just abusing the existing syntax to make your code look like it's not written in this language. And then I thought that actually it's not an insult that abusing language can be a beautiful thing. And I wanted to show you some examples. So this is a valid Ruby code. This is a monad code maybe. And it's a part of library code. I don't even know how to pronounce it. But what brings... What draws my attention here? What is unexpected is this operator that is the greater than dash greater than characters. I tried to create method like this. And it's impossible. Ruby doesn't allow you to do it. So then I'm thinking like, wow, I'm using a method that I cannot define. How do they do that? And it appears that these guys just created a method called greater than. It's just one character. And then these dash and greater than is a syntax for lambda. So you see this code here, line four, this line. Now look how it can look like also. It's this. So is it a DSL? I don't know. Is it abusing language? Definitely. Is it beautiful? I really love it. So it's an example of something that Ruby allows you because it's so flexible. Other languages, except for least maybe not necessarily. Another abusing of the language syntax. It's from the same library. I didn't know that I could parse this code in Ruby. But actually you can do that. You do not have to put character dot character. You can put as many spaces between them as possible. And I'll show you that it really works. I read about it just yesterday and I'm still surprised. So let's say that I have a string and I want to capitalize it. And it works. So you can just write it like this. And you can create the functions with capital letters. So the first thing that you think of when you see a constant with capital letter is that it's a class but it doesn't have to be. Oh no. Oh no. It doesn't work in this case. Now why? Where? Yes? Oh yes. Okay. Thanks. Thank you. So Ruby first tries to, if you don't put parenthesis explicitly, it tries to find a constant. Say hello. But in case of this library, this maybe is both a function and it's a class. So it's once again an abuse that probably you don't want to do in your code. But I think it's just fascinating that you can do something like this. So once again, are these examples that I show you DSLs? Probably not. Because they are not real languages.  So to make a Ruby code not look like Ruby, to make it more readable. But I think that it's just amazing things that we can do something like this. Now the question is should you create new DSLs? The answer is no. Yeah, that's, if you ask yourself should I create a DSL? Then probably the answer is no. You see that there is a case where you're so convinced that you want to write DSL. Then maybe, maybe the answer is yes. So I've been writing Ruby for a couple of years. I wrote maybe two or three DSLs that I'm still using. And in other cases I just stick to standard methods. Because even though the DSLs are very readable for you, the author, they are not readable for new programmers, for your users. We have plenty of DSLs in Ruby, in the Ruby community. We have like Factorial, we have RSpec and a few more. And some of them are good ideas. But any of them, any DSL requires a lot of learning. So to understand RSpec, it's not enough to understand Ruby. You have to learn RSpec separately. And actually you can understand RSpec not knowing Ruby almost at all. And you can know Ruby very well, but not understand RSpec. So that's why I think that DSLs are fine in certain cases. In certain, probably extreme cases, but not for everyday use. That's it for today. Once again, my name is Czegorz. I work for a company called Kaligo Travel Solutions. We're hiring. We're writing lots of Ruby code. We're writing lots, writing lots of Elixir code. We use Hanami Framework that you heard about at the red dot RubyConf. We use it in production. It's awesome. You can join us and check how it works in production. Yeah, thank you very much for listening.