Hello everyone. First things first, I'd like to thank you for coming because I know it's late, I know it's the last day essentially of LinuxCon and you still came, so thank you very much for that. My name is Tom. I work at Intel in Gdańsk. We are a team which is devoted to persistent memory programming basically. As you can hear, I'm not really in full health. I did everything I could so that I could stand up here and give you this speech. I've literally taken all the drugs I could take. And by drugs, I mean ibuprofen and something from a sinuses and not crack. That actually was a multi-layer joke. If you're interested in the bottom layer of the joke, come to me later. So the ideal way I see this presentation panning out is that I show you a couple of slides, not too many. I'll give you some specifics. Then you start arguing, talking and then 45 minutes later, without me actually doing anything, we can go grab a beer and then we can talk about persistent memory again. That's probably not going to happen, unfortunately. So how many actually of you have heard of persistent memory programming before LinuxCon? I'm not talking about you guys because you work with me. So three of you, four, okay. Not bad, not bad. So the follow-up question is how many of you have actually tried persistent memory programming? You know, written code that actually works with persistent memory? Yeah, that's still not counting you guys. So persistent memory is hard and I'm going to try and explain some of the things to you as we go. If you have any questions, don't wait until the end of the presentation. Just shout it out. If I don't know the answer, I'll just ignore it. Pretend I didn't hear it. And if I do, I'll try to answer it. So feel free to ask. We're going to start off with a mandatory slide. I'm sorry. I know if you have been to the previous talks by Machio or by Piotr, you've already seen this slide twice, but I have to do this. These are the rules. I have to show it to you. The next slide isn't going to be about C or C++ as the presentation would, the topic would suggest. It's going to be the model devised by SNEA, which is the organization for storage and networking. So they do with standards, basically. If you want to know more about SNEA and what they do, go to their website. Easy to find. So this is the slide. And it presents a couple of persistent memory programming models. We're basically interested only in this one, in the memory type of programming. What this model says is, basically, if you have a persistent memory aware file system on top of a driver, on top of a persistent memory device, and you map a file to your virtual memory inside of your process, you can basically do loads and stores and flashes onto the memory device without really involving the kernel or the file system. Now, that's in theory. I don't know how many of you followed the Linux scholar mailing list. I reckon, all of you. There's been a discussion there that maybe this is not the best way to do this. And my answer to that is, this thing, the whole programming model, the changes that the nonvolatile memory brings, it's supposed to be a revolution, not an evolution. So maybe we need to go the extra mile to make this work. As I mentioned before, I'm part of the NVML team. We have a set of libraries which were initially designed to work on Linux. They tackle the problem of persistent memory programming, which is not the trivial one. And we tend to make it easier for the end user, for the applications to use persistent memory correctly. This is another one of the mandatory slides I have to go through. This is what comprises of the NVML library. We've got Leap PMEM, which is basically the bottom building block. It has all the low-level memory manipulation primitives. These two, Leap VMEM and Leap VMEM malloc, they are designed for volatile use of persistent memory, because obviously that's a thing. Leap PMEM block, it's a very specific usage. It gives you block access to a memory pool. Easy as that. It's atomic with respect to persistence. PMEM log is an append-only file implementation, and this would raise a flag, because it's written append mostly. The mostly thing is because you can rewind the log. But other than that, it's just append-only. And the most interesting library, the most versatile one, is Leap PMEM which is an object store, as my colleague pointed out earlier during one of the presentations. It's not only transactional, because we also have an atomic API, but it's mostly transaction. This is the last slide, without diving into specifics. This is the last general slide, I promise. This is how Leap PMEM looks like. We have a transactional API and an atomic API, and the transactional API is infinitely more versatile than the atomic API. So we're not going to talk about atomic. As I mentioned, Leap PMEM sits on the bottom side of almost all of the libraries. We have internally lists, which we make available for the user if you want to use lists. There's an allocator, which is at the heart of Leap PMEM option, and it's a very interesting topic in itself, and I'm not going to talk about it at all. If you have questions about the persistent memory allocator, because it's a fun piece of code, ask Piotr. Exactly, that's the allocator guy in NVML. If you have questions to the allocator, ask him. And that's basically it. So I'm going to tell you a story, because I think that presentations should be a story. It's late, and I don't want you sleeping here, so I'm going to tell you a story from C to C++, because this is a C++ presentation. But without telling you the pain points of the C implementation, you won't really understand why we bothered with the C++ version. So before we start, there's one thing. Sorry, I'll be drinking a lot. There's one thing I have to mention beforehand. There's this concept in programming that we always take for granted. It's pointers. And as I said, the models says that you have to mmap a file. When you mmap a file, you don't really know which virtual address it will be. You can kind of enforce it with mmapping with a fixed flag. It's not really the most elegant thing to do. And I advise you don't do it at all. So this is a pointer in NVML. This is called a persistent pointer. Actually, it's a persistent memory object identifier, because it's PMMA object. We do it with objects. Basically, this is a pointer. You have a UID of the pool, which is basically a unique identifier of the pool. So it could be a set of files. It doesn't have to be one file. It can be many files. And then you have an offset within that pool. So it's a base pointer. It's an offset. Cool. But you see that there is actually no type information in here, right? There's nothing saying what type of an object this points to. So basically, this is a void pointer. Not very useful, is it? Because you have to cast it to the appropriate type, and it doesn't give you any runtime type safety. So void pointers are cool, because there can be anything who want to be anything. You would like to. But in programming, we would like to have type pointers. And this is one of the challenges we faced during the development of the PMMA object. How do we make a type pointer? And this is what we came up with. It's basically T-O-I-D. And you give it a type. It's a macro. Because it's C. In C, we love macros. So this is a typed object identifier. The question we ask ourselves is if we cannot embed the type within the information stored within the pool, how do we provide type safety? Preferably compile time type safety. So errors. And we did it with a lot of magic, basically. We took some unicorns and rainbows and stuffed it inside the library. Truth be told, it's more of a witchcraft, actually. Because you have to prepare for it. You have to get your chalk and light your candles, draw the circles on the ground. Basically what you do is you name all your types. Not a fun thing, to be honest.  Basically this is a route. I'll talk about that later. Don't worry. You start the layout. You name all your types. Assign it to a layout. Then you can start using typed object identifiers. One thing to note is that while developing NVML, we didn't really want to change the language at all. We didn't want to provide custom compilers and add new pointer types and stuff like that. So we work with what we're given in C. And there's a lot of macros involved. I'm really sorry. We're a C programmer bunch. We love macros. So this is part of the implementation. Some of you might have noticed that we maybe took the same safety numbers a little bit too seriously here because we do store numbers. This here, this is basically a union. So you get the PMO. So this is what's stored on the medium. So a UID and an offset. And we embed the type here. And then we can use the type. We provide you with type safety. All in all, this probably isn't the best looking code I have ever seen in my life. Yeah. Thank you for agreeing with me. Yeah. But it gets the job done. So when you compile and you mess the types, you get a compile time error that you're probably not using the right type for this. And it would be fine if that were all, but it's not, unfortunately. As I mentioned before, underneath, you still have an offset and a UID. You still have a void pointer. So to get the actual type, we had to do something more. Guess what we did? Let's get us what we did. Seriously, I'm asking. I even give you a hint. Macros. We added more macros because we could. Let's see. It's not something unusual to do. This is what actual use of our library looks like. This is an example from our tree. So you declare a type pointer, and then you have these little DRO statements. What they mean is give me a direct, so a volatile type pointer of the correct type from this thing here. And RO means read-only. Kind of, yes. There's also an RW type, micro, which stands for... Everybody's asleep, really? Everyone? Read, write. Basically, this is a cost pointer. Easy. Still, I think that this code is fine. It's readable, with little to no experience in persistent memory programming. You know what's going on, right? You've got checking if the node is null. You have the reference. Everything, it looks normal. Now, the question is, why the macros? Because, obviously, we do have an API behind it, right? This is what the same example looks like using the API. Now, some of you might argue that we could make it this example more compact. And then it wouldn't look that nasty, but it wouldn't be an example, then would it? One thing to notice, I cut it off at 80 characters. I didn't really bother. It goes on and on, probably somewhere there, I don't know, a long way, either way. So it begs the question, is it at all usable? In my opinion, yes. But please do not try to nest too many of those, because if you nest two or three, and you have to reference the inner one, it gets really nasty, really fast. Since this is a C++ presentation, and I haven't mentioned C++ at all yet, let's get on to it. So we have a couple of problems, right? I define a couple of problems. And the question is, can we use C++ to somehow address those issues? And I say we can. And we did. The first one is the explicit type declarations. And frankly, I think that there is some feature in C++, which we could use templates, I think, because they're inherently type defined. So let's use templates. We're still using the C API underneath, so we do have to have a number for the type to provide. But C++ comes to help here as well, right? We have the type ID hash code, which gives us a number, a nickname number for a given type. It's what we wanted, right? C++. Good work. And the other thing is, do we really need macros? Macros is C++, right? We hate macros in C++. We love them in C. In C, they're wonderful. In C++, they're not really... There's one thing in C++ that could help us to get rid of the macros, and it's operators and operator overloading. There's a bunch of operators like member access and stuff like that. Why not use them? And so we did. This is what persistent pointer usage looks like in C++. And I dare say it looks more like programming than in C. We have an allocation function for the persistent pointer, which we also call a persistent pointer, obviously. Since we're using C++ 11 and higher, there's this feature called variadic templates. So what this does is actually call the constructor of foo and passes the arguments because we can do that. Just no real issue here. Why we couldn't? We have member access and function calling on the objects. It works fine. Here you can see that we create a bar object and give it to a foo pointer. So implicit type conversions also work. You can also do an array. Arrays are fine. For some types of arrays, we'd give runtime bounds tracking so we get runtime error if you try to go outside of the bounds of the array. There's also the allocation functions.   We tried to make it so that C++ programmers are familiar with it. So we tried to mimic, for example, the share pointer. Now, having said that, it's not really a share pointer because share pointers were designed for lifecycle management. And persistent pointer, it cannot destroy an object on scope exit, right? Because it wouldn't be really a persistent object if you destroyed it each and every time it went out of scope. So the question now is that you know all of this, right? I went through this. Is it usable? This is the same example I showed you recently. You should remember it. If you don't, go see a doctor because that may be an issue. And let's see what the same example looks like in C++. Better, right? Let's look at it again. This is normal C++ code. Sure, it has hidden this out. But this is C++ 11. Let's use the features that were given. The only hint that this is, in fact, persistent memory programming is the pool parameter, which tells you that maybe this is sort of persistent memory stuff. But other than that, it's just normal code, right? We had this nasty DOE, this null macro here. And here's just a comparison to a null pointer. You don't really need to reference it. It's just a member access operator. It does everything for you. Basically, it does more. But we'll get on to that once we get two transactions. So, question to me is, to you, sorry, from me. Is this better in C++ than it was in C? At least one of you raised a hand. Thank you. So, kind of agree. I understand the rest of you are C fans. Don't really like C++, fair enough. I say this is a win for C++, but not all that gritters is gold, so there has to be a downside. Sure there is. Basically, the main issue is we don't allow polymorphic types inside the pool. That is because V tables are runtime data. That's one thing. And second of all, there is no well-defined layout of V tables in the standard. It's implementation-specific. It could be anywhere. It could be anything. And since we don't add anything to the language and we support any compiler that does C and C++, we have no way of rebuilding the V tables on each reboot of the pool or the program. So, sorry, no polymorphic type. The thing is, it probably cannot be really because the question was, sorry, I'll repeat it. Can it be used to share the pool between Windows and Linux? And given that the alignment of structures is different in Windows and in Linux, it cannot be. Yeah. So, if you're not sharing with different ABI's, then the second issue that you pointed out at the V table is not specified in the standard, is not an issue because it is specified in the ABI. In the ABI of which compiler? So, the point is, if you have the same ABI that allows you to have same alignments of the structures, that means your V table is also specified in that ABI. I'm not going to argue about that. That might well be true, but I think it's compiler specific. I believe it's compiler specific in the implementation. So, we're talking, this is LinuxCon. All the compilers on Linux use the same ABI for C++. Yeah, right now. It would only be a problem if we stepped out of Linux. So, if you went, for example, for Solaris or... And we're not saying that cannot happen because we are doing a port on Windows. And that's one thing. And since it's not in a standard, you can't really rely on it because that might change. True, but you can't rely. The C standard doesn't specify alignment either. But we do check alignment on... My point is, you're depending on an ABI. I understand your problem and it wouldn't solve the first problem of the address anyway. So... It's far safer to just forbid polymorphic types than... Yeah, you would have to do it anyway. I understand. I'm just criticizing the second point. Okay, sure. Fair enough. There's also another issue, and this is actually taken from the standard. So, I think we're not going to argue on this one. Is that the point is that the hash code is guaranteed to be consistent within one execution of the program. And that really doesn't help us in any way. I know that right now it works this way. So, we're safe, kind of, right now. But if you wanted a permanent solution, there's some fix in the standard saying that some way of generating the hash code should be name and, I don't know, member mangled or something like that. So, there's downsides to all the stuff I just told you. Normal. There's upsides and downsides. The next thing I'm going to go through are transactions in LeapPMM Alpge. I'm going to introduce a couple of concepts and then, as always, go with C++ and see if C++ can do better. So, transactions in LeapPMM Alpge have ACID-like properties. The key point is the like here because they are atomic in respect to persistence. We provide consistency of our metadata. The consistency of your data is your problem if you mess it up. For isolation, we do provide you with primitives and an entry point where you can synchronize your access. And durability, well, this is called persistent memory, right? If we didn't have durability, then this wouldn't really make much sense. So, underneath, transactions, you see exceptions. And by see exceptions, I mean long jumps to handle the error cases. So, this is what it looks like using the API directly. You first set jumps or save your environment. Normally, this is the way you do it. You then handle the error case. You have to end the transaction in case of an error. Kind of counterintuitive. Then you can start the transaction. This is the synchronization entry point I told you about. You can provide locks here which are held throughout the whole transaction. Then you do work. It's just like about 15 lines of code of work you can do here.  And this looks bad, if I may say so myself. Because you handle the error case, then you begin the transaction, then you end it. Just it isn't the flow of the application, the flow of the logic of the program isn't nice, isn't top to bottom. It's randomish. So, you already know that we have a C implementation. We are C people. So, guess what we did? Macros. Yeah, we did macros. Because we love macros. So, yeah, it's macros. Sure. We hid the whole set job stuff in the txbegin macro. You can still provide the locks. It's fine. You can ask, what about the error cases? This is how we handle error cases. We give you an on-a-board section. And it's optional. You don't really have to have the on-a-board section. There's also an on-commit section. And finally, if you need those. The only... This looks cool. Because you hid everything and it's clean and nice. The only thing that isn't nice is the txend macro. It has to be there because this is basically a glorified switch. That's all it is. So, we have to have it here, unfortunately. We have an ugly-looking API. We fixed it with macros. Everything's fine, right? Wrong. Because even though we fixed it, it's still error-prone. I told you that underneath the transactions you see exceptions, long jumps. And this tiny thing with long jumps is that they mess up your registers in the CPU. It's most unfortunate, but it does. So, let's look at an example. Because everything is best explained. An example. You have a pointer. It's called bad example. If you expect bad example to be well-defined and usable, for example, in the on-a-board section, it's not. Because we're going to long jump. And if I were a compiler, this goes into a register. You're going to use it frequently in the function. I'll put it in a register. And afterwards, you're, like, undefined behavior land when you try to de-reference it. And the bad thing is you don't see it, right? There's no set jump. There's no long jump. It's here. We did you a favor, right? We hid the set jump in the TX begin macro. Good job, right? So, this is actually from our man pages, as an example, from our man pages. So, we have it in our man pages. We have a blog post on it. I reckon this is recorded, right? So, it's probably going to be YouTube. And frankly, I don't think there's more we could have done. I just told you about it, right? Feel warned. And I still think people are going to find this bug. And on-a-board section, this is, like, you know, 1% case where you fail transaction. Good luck debugging that. It's not an obvious one. So, how do transactions work? Oh, I have to speed up. So, how do transactions work? We basically snapshot stuff. But it doesn't happen automatically in C. So, you have to tell us when to snapshot and what to snapshot. And I think that it's probably the biggest pain point in this whole API, micro. Is this TX ad? Because you have to remember. And remembering is it something we do good. Because we're lazy people. This is a digression for me. Laziness isn't a bad thing, not in my book. You know the saying that if you have to do something more than twice, write a script. Because we're lazy people, right? Laziness is what got us here as a society. See this? This is remote control. I could be standing there and pressing space or something. But I don't. It's because I'm lazy. You know what was the prototype of this? Children. True story. You had a TV remote. Before you had a TV remote, you had children.   Were we? We invited remotes so that we didn't have to talk to our children. Lazy bunch. And it's a good thing. I say it's a good thing. We would be, you know, using sticks and stones to get our food if we weren't lazy. End of the digression. I don't have time for anymore. So basically, if you forget this and the transaction fails, this won't get reverted. You either have the change or don't have the change. It depends on cash pressure. Once again, not a really fun thing to debug. There's going to be a talk later on after this by Krzysztof. We did some work into dynamic instrumentation. So you don't know Valgrind, right? Yeah. So we wrote a tool for Valgrind to detect this stuff to help you debug these kind of errors. I think it's cool. Helps a lot. So I've been pacing a lot, haven't I? Back and forth. That's a habit. I picked up in jail. Kidding mental hospital. Cool. So I showed you the problems with C++. We'll see. Sorry. C++ doesn't have those. It has other problems. Let's see what C++ does to alleviate problems. We have three types of transactions, which are actually two types of transactions. Two of them are scope-based. One of them is function. I like to call them lambda transactions because that's how I prefer to use them with lambdas. This is an example of a manual transaction. It's called manual because you have to do the transaction commit by hand. You might ask why commit and not abort by hand. It's far easier to make the programmer handle the normal case than the exceptional case. Because if you forget this, everything fails, and you notice right off the bat that something's wrong. But in the odd-error case, if you forget to manually abort, then basically a week or two debugging or stuff. This looks nice, right? This starts a transaction. You can put locks here as well if you want. This starts the transaction, and once you're here, don't put anything after the transaction commit because I don't even know what will happen. Once you're out of here, the transaction ends. The main issue is that you don't really know how it ended because we can't throw exceptions from a destructor. That's bad behavior in any book I've read. I haven't written any book yet. We have this static function. It basically tells you whether you had an error in the transaction or not. It's ugly, but I can't do anything about it. Sorry. You can nest transactions as well. This is also available in C. And if you explicitly abort an error transaction, the outer transaction gets aborted as a whole. One of the features. So you still have to check whether it aborted or not.  Why can't we just decide when we go out of scope whether we can commit or not automatically? Well, the issue is in the standard, actually. It's well-known. It's that STD uncalled exception. It's badly designed. They fixed it in C++17. They added an S here. It's now STD uncalled exceptions, and it's fixed. You add a letter and everything is fixed. If you want to know more about this, there's a nice talk by Aleksandr Esku. There's also a standard amendment draft by Herb Sutter. Both of them very nice videos and articles, if you want to know more. So, we fixed this in C++17. If you have a C++17 compliant compiler, which has the appropriate uncalled exceptions defined, you don't need to explicitly commit anymore. But we still don't throw an exception. So, the getTXLastError call. Sorry, it's there to stay. Now, on to the Lambda version, because we got like 10 minutes.  No? Okay, let's go, because we got 10 minutes. The Lambda version, which I prefer, way nicer. This is how it looks like. I added this line because you can't really allocate outside of the transaction because it's a multi step thing. We have a different API for allocating outside of transactions. This is what it looks like. You start the transaction. This is your function. It can be normal function object. We don't really care much. Then, inside of the transaction, you make changes. Remember what I told you? That we're lazy people and we don't want to remember to TX add everything. It's going to get here done automatically. There's not only the persistent pointer. We have another template class. There's too much to talk about in 50 minutes. Basically, this is going to automatically add to the transaction, so you don't have to worry about it. All deletions can also be rolled back on a transaction abort.  This is a lock. Now, why this has to be done this way is because we're using variadic templates and they have to be the last parameter. So, you start the transaction, you do work, and then you mention the locks. Sorry. I couldn't do better. If you can, give me a... You can issue a pull request. It's on GitHub. If you can fix this, please do. If not, sorry. One more cool feature of the Lambda version is that you never really lose an exception. If in an inner transaction, something happens, this could be a library colliding. Something happens, and you get an arbitrary exception. For example, STDBedAllock. It gets waterfall outside, and you can catch it here. I think it's a cool feature, necessarily one. Nine minutes. So, to summarize, if you really want to have scope transactions, please go with C++17. It's easier. Let's have a server prompt for you. But I say go with the Lambda version. It's nicer. It's self-contained. It looks better. The only problem is with the locks. Now, this is the most interesting part. Sorry. I had to put it in the end. If I put it at the beginning, it wouldn't make much sense. We had this idea of using C++ standard library containers with persistent memory. And to do that, we need to implement the standard allocator concept, which was designed not to do allocations, but to switch pointers. Obviously. It's called the allocator to switch pointers. This needed a little bit more work. Right now, we're targeting C++ and STD C++ implementations of standard library containers. And I think I've got most of the code on our site done. And this is what it looks like to actually use this. So we have an STD vector. We provide it with our custom allocator. And then, basically, it's your regular vector. Right? You have the vector here. It's my vector in the root. This is actually working code. That's why it looks so nasty. You open a pool. You take the root object. And then you can place back, push back. You can even iterate through the whole thing and do stuff with your objects. And it works. And it works because this is a vector. Vectors are simple beasts. It's like in the GCC implementation, in the STD C++, it's like three pointers, I think, inside of the implementation. So this actually is atomic if you use it in a transaction and it survives power failure. As far as I know, this works. For other containers, not so much. Sorry. So for Leap C++, I have basically all of the containers compiling. They're not Power Failsafe, but they do work in the optimistic case. Leap STD C++, however, not so much. I don't know if you can see this. There's a little asterisk here, which means that someone somewhere is expecting a normal pointer. And normal pointers, they don't understand persistence. They don't survive power failures. So Leap STD C++ needs a little bit more work. But that's nothing we can do, right? We send people to the moon and back. It's like 60 years ago, 50. This is software, right? We can do this. I believe in us. Okay, so the main pros for this approach, containers are free. They're there. It would be a shame not to use them. So we decided we use them. It's not really free because as I showed you, it doesn't really compile all the time. And we had to modify the implementation a bit for this to work. But it can. And I think it should. You got a familiar interface. Everybody knows containers for C++. Everybody who's written more than hello world in C++ basically use the container of some sort. The implementation is well-tested, not for persistence. Obviously, we have to add some tests for persistent usage. But other than that, containers have been used widely by almost everyone. And they work. And there are issues. This is unfortunate. I'm going to get more water for this one. So there are containers which have internal data structures, like colors of the red-black tree for the nodes. And those metadata, they don't understand persistence. They don't know that they have to snapshot themselves before they change. So we have to introduce this knowledge of persistence into other containers somehow, preferably in a standard way. By standard, I mean the standard. As I showed you, there's also cases when there's a simple pointer used instead of the allocator trades pointer, which I think needs to be fixed either way, even if this doesn't make any standard or isn't widely adopted by the community. Yes, I'm sorry. I made a test in my tree that used almost all of the containers from C++ 11. The vector works both for C++ and C++. Thank you for noticing. I didn't say that. No, it doesn't. It could do a rebind to a different type. It could use the allocator rebind. That's what lib C++ does. But thank you for noticing. Those are good questions. Thank you very much. The other thing is we need some sort of layout versioning because we're going to keep it in persistent memory. There was no notion of persistent memory. And the standard doesn't say anything about layout versioning. So if you change the internal implementation of one of the containers and you open up the pool, it's not going to work. It's undefined behavior land, as far as I'm concerned. So that has to also be addressed in some standard way that we can check the layout version of the implementation. And lastly, we are currently working only on x8664 because that's our target. You see this? Intel? What can I do, right? But this is open source. If you want this to be ported to a different architecture, please do. You're more than welcome. We will look at the code. We will merge it. If everything's fine, it doesn't break anything. So if you need this on PowerPC, sure. Maybe you do. And I've got like two minutes left. God, thank you. This is the last slide. Thank you very much for listening, for coming this late on the last day of LinuxCon. This is pretty much all I have right now. No, I have this one. These are some links. If you want to play with the implementation, this is my private branch because obviously I cannot upstream this into NVML because it doesn't work yet. This documentation and there are some blog posts on some of the stuff I mentioned. We also have a Google group. If you want to ask a question, participate in any way, please do. So thank you again. One minute on spot on. Thank you.


Sheba 1000 here. Today I'm standing beside the 1969 John Boat. It's titled as a 14-foot. It doesn't give a just you know it's a V-Haul. It doesn't give what brand it is or anything like that. Now what I'm coming up with when I researched this the closest thing I can come up with what it looks like to me is a CNIM and I've seen a lot of CNIMs around. I haven't seen a 69 but I've seen a lot of CNIMs around and it kind of looks more like that than anything. The guy we bought it from he was guessing it was like a Starcraft or something like that. But the back end of them look a little different back in those years. But anyway first thing we're gonna do is try to get this engine to fire. We'll see what's wrong with it. I know on the work order it said it didn't have spark. They cleaned the points and that didn't help so they put a put a new set of points and condenser in. I believe this has two sets. So did they put one set in or two sets in?  Alright guys let's get that checked out first before we do anything else to see what we're looking at. We're gonna probably check the controlling motor and make sure it works. So we'll go from there. Sit tight, get you some cold drink, relax for a few minutes. Let's see what we can do with this old girl. Okay guys also something I need to do is I need to check this motor out a little bit more. Now I've seen a lot of them on YouTube and stuff that were 68's which they're thinking that's what this is but usually the 68's would have this this part right here would have an 18 on it a big one eight. So I'm gonna have to run these numbers and see there's also little differences in them. This one's got three things up here. One's a choke, one's a slow to lean out your slow mixture and one's a fast. It adjusts your air fuel mixture for like a higher rpms. A lot of the smoke well all the 68's I've seen on YouTube that were confirmed to 68 only had the choke and the slow speed mixture on it out front here. So this one's got the high speed out here so it may be a 63. I'm gonna get some numbers off here and check it out and I'll let you know. Right down in here right in this part right here there should be a little thermostat in there. Now there was another guy that was showing how to put a pist tube in here and bring it out. So there should be a thermostat right down in here. Now his was a 68 so I'm not exactly sure what is going on here and also it doesn't it doesn't open wide open so it'll get close it'll get about three fourths throttle and that's it. So I've checked that out and this is pretty pretty stiff here for some reason so the throttle but it does look like they may have put new plugs in it and you really can't get them mixed up because this one says up right on it right there on that little tag. So the first thing we're going to do I think we're going to check this thing for spark because it said it didn't have spark. Okay now whether they got spark after that I don't know because he said that they told him it was running beautiful it was running great. He took it out put it on the water and it wouldn't start. So what I'm guessing since it was in there fiddling around with them points I'm pretty sure it has dual points. Did they did they adjust them both? Did they replace them both? Did they replace one set? I don't know. It feels like it's got good compression but anyway it's going to tell us something when we pull these plugs out of here so they are tight so let me go get a wrench we'll pull the plugs out we'll check it for spark. Okay these are 13 sixteenths I'm just going to use a wrench they might just going to use a wrench so I don't break them as easy because these uh both motor spark plugs are a little different now I guess not they use regular plugs in them which I'm going to be changing that I don't like the idea of these plugs in here. Usually they're really weird looking to keep moisture off of them that one looks a little fouled out looks a little fouled out. Let's pull it over and see okay now I want to try to see if I can see any spark. This is up it could be something stupid it could be something serious it's kind of hard to do here but I'm not seeing any spark on that one try number two or the down wish I had electric start sounds like it but okay this one has some spark because I just felt it and I'm in the sunny part of the day here okay this one I'm feeling spark through here so is it getting fuel it looks like it is there's fuel in there and down here in Florida you got three times a day it's either ass busting hot it's either raining or it's dark so I'm gonna just stick this in here right now and I'm gonna go get my spark tester and put on here and maybe we'll see it a little bit better hang tight okay you can see I got my tester on here now you know maybe it just didn't start maybe flooded it I don't know but see the problem is it's kind of hard to pull that rope and look at that at the same time we're looking for this to like lighten up brighten up and I can't see it lighten up but it's dark there it's also bright out here let's go ahead let's pull it over a couple times and see if we can get it fire if we get it fire we will put it in some water what they call a tank test maybe I can do this without getting shocked let's see yeah it's a very weak spark very weak I can feel it let's just pull it over a couple times and see see if we can get it to fire these are auto light plugs and I don't like them I like the Bosch I'm gonna turn this over this way make sure it's in neutral should be neutral what you guys looking at here and you can see the motor okay I think all right it's got some fuel could be flooded it's real slow it's shift let's go to start I think what I'm gonna do I'm gonna pull this off the top of it off there I won't check in points we'll check the points see why we're getting a as I can feel a spark but it's not lighting my tester up and it's not sparking a plug so let me go get some tools figure out what's going on with this thing okay guys I went in to get some tools as you can see I don't have any tools out here well that's because I realized I didn't have the choke on so there's choke I got it on I got the throttle on the start let's see what happened give it some maybe flooded now let's get it in some water okay guys I'm gonna do this for you again I did it once it didn't hit record so we're gonna be wanting to see water spit out these out of this hole right here okay so see if it'll start first thing we need to do is this throttle it's really hard to really hard to turn so I think I'm gonna take out a part and see what's going on with that oil it up whatever see what's happening with that so what I'm gonna do guys pretty hot out here I'm gonna grab a screwdriver I'm gonna take that screw out see what see if this comes off I'm I'm not sure I never had one of these ones off of here before but it's really it's really hard to turn so let me go grab a screwdriver and I'm gonna pull that screw out there and I'll get back with you because this camera is not liking heat so let me get that screw out of there get that apart and I'll show you what I did okay guys this is what I got here this is part of the throttle what I did was I started taking the handle apart all the way back through there and everything was fine up until I got to this part which just goes up in here like this it hooks on to there and it's got a funny little clip and that's you know that it will operate the throttle through this it'll turn this and that opens and closes your throttle now I got to looking at this thing because I thought well it doesn't want idle well that's because you couldn't turn it up because someone has broke the bolt off not just there but there too somehow so well okay here's my culprit because this was real hard to turn with everything else unhooked it goes right in here and it was real hard to turn okay so what this does this piece goes on here like that and this piece was getting stuck down in there it didn't want to turn you can see how shiny that is there it was binding up well I should just slide right up out there of course it didn't I barely put any pressure on it and it broke so I got to go source one of these out I think that that's my idle issue it is pumping water so I gotta go see if I can find one of these I random numbers the engine numbers are right there and that that first number 18 302l okay the 18 is how many horse it is this is a 302l makes it 1963 so let me go ahead and let's go see if we can find one of these on the internet if I doubt if I could find one around here so let's go ahead and find one of these yeah that was really well so shiny that is it was just binding up there all right find one of these on the internet and I'll let you know what I found out okay guys so this is what I got well I just got tied up with my shit okay damn okay this is what we got going on here I got that broken bolt out there it was just plastic okay so I found one that fits that I've got one of these ordered it was only 30 bucks okay now what I'm gonna try what I did was I drove that out okay and I stuck a bolt in there this is the original thing so we're gonna take it out and try to put it on because I want to I want to get that get the carburetor adjusted the way it should be and that well that just fits in there just perfect okay so what I want to try to do is get it on there enough to where I can you know at least run it and get the carburetor the way it should be so I know that bolt's too long I've got a shorter one over here if that one's too long I do have a shorter one that can go in there so let's take this out I'll throw it on and we'll see if it if it's gonna work for us okay guys I think I got it pretty close it's still gonna be it's still gonna need adjusted when it's under a load when it's in the water but you can do that up here with these knobs here I'll show you in a minute so let's go ahead and start this up we're getting there guys monkey's on our way back so let's go in house cool down a little bit well first let me show you this is what I did there it stuck a bolt down in it that would work in a pinch it's working all right now I mean I wouldn't trust it go on a trip with it but there's a controls them I was telling you about rich and lean that's your your fast your high speed this is your low speed rich and lean here's your choke and there's your kill switch all right it's going to house man it's hot out here again so there it is guys it's a runner I I don't know if he wasn't if he just didn't choke it and kept pumping the ball because if you pump them bulbs there's a floating in carburetors if you pump them too much it'll actually force the float down you know so it can get past the seat and it'll flood out so maybe he did that and it wasn't choked I don't know I think maybe it was just flooded because I was gonna go ahead and pull the flywheel off I'm glad I didn't because it would have been a waste of time I couldn't see a spark but it was so bright out there I couldn't see my tester light not but again it was so bright when I go every footage I might see it but you know you guys might have seen it better than me but I can feel it when I barely pulled it and touched it I can feel it running through my arms so I knew it had a good spark and then I just got to thinking I said you know what let's try it let's choke it so that's when we went back out and tried it with a choke and wide open and it started firing in and then kicked over I I'd say he just had it flooded so so my part will be in next week it'll be in next to the Monday or Tuesday yeah Tuesday 15th ish 14th or 15th it should be in so and I'll get that put back on the way it's supposed to be and that throttle will will work nice and smooth it's working pretty smooth now but there's some movement in that gear so kind of you know like I said I wouldn't trust it if I went with one more size bigger bolt it'd probably work I could probably put a dowel rod in there there's ways you can fix that stuff but you know for 30 bucks I just went ahead and bought a new one and it is new believe it or not I went on one website that's $128 but it was a marine website so no way I ain't paying no more than 40 or 50 bucks monkey just pulled in so I found that one for 30 free shipping so it'll be here next week so tomorrow maybe we'll check out the trawling motor make sure all the gears working in I think it's a five speed and I'll check on some hubs they're usually 30 or 40 bucks a piece so you know we're still under the 414 hundred you know we got it for 1200 which was prepared to pay the 1400 but so we're still under the price of what we was actually prepared to pay for the boat he's paying that you know needs a little stuff like that the main thing we get the engine all the transmission does work I did put it forward and reverse and the prop did spend both ways and neutral works and as you see in this piss of water like it should so anyway guys monkey serious I'm gonna get off here and I'm gonna show you shit I'm gonna say she better to met the man legend start her boat up for her so she near run she'll be happy thanks for watching guys appreciate it and we'll chat soon enjoy the rest of your week bye bye guys take care


This is Think Tech Hawaii, Community Matters here. Good afternoon. My name is Retsu Chiyama for another exciting show on business in Hawaii. It's a sultry, hot, humid afternoon in the tropical city of Honolulu, the capital of the state of Hawaii. And it's going to be an exciting show because I share this dialogue on entrepreneurship, on education, on giving young people a chance in college with a younger version of myself who graduated from the same high school, Wallace Ryder Farrington High School, in the beautiful neighborhood of Kalihi Palama adjacent to downtown and a census tract of over 40,000 residents, which means that compared to the little island of Molokai with 7,500, wow, Kalihi Palama by itself is many times larger and has a long history that dates back before the war, World War II, and currently has a very vibrant, multi-ethnic, multi-religious makeup. And my guest name is Trayvon Watase, and welcome to the show, Trayvon. Thank you so much for having me.  Am I correct? Yeah, let's hope so. I mean, that's definitely the path that we want to go down, so. Okay. So why don't you tell me or tell the others the origins of the journey? I guess I don't know where you can start with your childhood or with your, you know, in middle school, and where did it really start that was a spark or the background to leading to an entrepreneur's journey? So for me, it was basically just seeing a problem. So I'm, like you said, I graduated from Farrington, and when I went to Farrington High School, I applied for scholarships, and unfortunately I didn't do so well in my first two years in high school, and my last two years I did really well. But that averaged out to a low GPA, so it was really hard for me to apply to colleges and apply to scholarships. And I felt that a lot of scholarships, the way that they were, they didn't really listen to my story. They had this, oh, you need a 2.5 GPA or 3.5, whatever it is, in order for us to even hear out your story. So I decided to create a scholarship on my own. I decided to eat peanut butter and jelly sandwiches for one week out of every month, just to save 50 bucks, so I could pay for a $500 scholarship. And then, you know what, $500 in my hand, this was right out of high school, you know, three, four years ago. Yeah, actually a little bit longer than that now. You know, no one would take my money because the dollar amount was too little, and that's when I just was kind of at all about, like, there's people out there who want to give out $500, $5,000 scholarships, but there's no chattel for them to do so, and it's not like kids don't need the money. So you were trying to create efficiency in a marketplace of getting people to meet each other, right? People who want to donate a scholarship and people who want a scholarship. Exactly. And I started out by trying to give out my own scholarship and stumbling into that problem. It was inefficient. It was ineffective. You faced an obstacle. Exactly. So that's just how it started. I just stumbled into it. I had no plans. My goal in life, as soon as I graduated from Farrington, was to become a CPA and, you know, go to Shidler, get my master's degree in accounting and go to the CPA firm. But then I just stumbled into it and that's how I got started. Okay, so after you made this discovery or insight, suddenly you saw what was out there was not so efficient and that there was a gap, you know, that you wanted to fulfill in this marketplace. What did you do? Did you go to mentors? Did you seek out people who did scholarships or startups? What exactly did you start to do? So I was very lucky. So one of the scholarships I got right out of high school was a Rotary scholarship and it was specifically, it was called the Diamonds in the Rough scholarship. They didn't look for a high GPA and I was really lucky where, you know, they connected me with the local Rotary Club. They're actually located in this building. And then, you know, they kept on inviting me to the, I mean, the breakfasts. And I got to meet a lot of people there. So that was like my first mentor network that I just got early access to. And basically because we were starting a website and I didn't have any computer science background, no technological background at all. It took me a year and a half just to finally get the first site up. So while I'm, you know, talking to developers and things like that and learning on my own, there was really all I could do was kind of pick the brains of other people. I don't know. So you're actually going to school and doing a startup at the same time? That's correct. Okay. All right. Anybody come to mind who gave you the best advice or I know that you were meeting people at the Rotary, which would expose you to all kinds of business people in downtown, right? Local business people. But you needed something more, I think, in your special app. I mean, so it wasn't, it isn't that everybody in downtown are doing mobile apps or e-commerce. Where did you go for more in-depth kind of focus? So I got really lucky and I brought that up because there's great mentors that I got from Rotary, but not a lot of great mentors when it came to like, it's how you build an app, right? I got really lucky. I joined a co-working space. So you know, I just went to the traditional route, which was like, okay, go to India, hire developers there. And then that didn't work out and then try and find some money and things like that. It just didn't work out. So you did actually go to India? Yeah. I didn't like fly to India, but you know, we used an online site. Right, right, right. So you contacted people in India to do some coding for you, I guess, for your app. Okay. So that's very, so you're going to places where people take years to go to, but you're like doing shortcuts in a sense. Yeah, definitely. But yeah, that, I mean, those things didn't work out, unfortunately. Lots of money there or quite a bit of money there. And what he called out, I joined a co-working space here in Hawaii and I started working out of there. This guy from D.C. was just like, oh, I'm going to go on vacation in Hawaii and I'm going to get some work done and work at this co-working space. Nia's the same, me and him connected and he built his, he actually comes from a technical background and he comes from a startup background. He's raised money from multiple of his companies and he's doing quite well and he really took me under his wing and to this day we talk quite often and talk about whatever problems come with the business. So you had an idea, but you needed, I guess, technical resources in a way. But you found a person who had kind of technical resources plus a business background, I guess, and then that you put it together at that point. Yeah, exactly. And this is just cool where it was. So I spent a year and a half trying to build a website. This guy, we're talking for a while, but he spends one late night with me of just building out the entire site and he just shows me the ins and outs, do it. All I needed was that one, you know, was that five hours or something to actually kickstart to get everything going. So when, exactly when was that breakthrough moment about a year and a half ago? Maybe two years. So a year and a half ago, suddenly things began to open up? I mean, like what I said, we spent five hours on it. It was not a nice looking site. It was. Actually, how we first started off our site was we just like had something to be equivalent to like a Google form. So the student would make their account through a Google form and me or someone else on my team would actually manually input every single entry into the database. It was not the best thing. Very primitive. Yeah. All right. So you had a beginning there. You could see the ending, but you had to get there. You could have at least a beginning on the journey there. So what happened next? Did you look for more advice or training or background for startups? So I was lucky to wear our school. So I was at this time, I went to, I was at Leeward Community College. And then Pacific Asian Center of Entrepreneurship at the University of Hawaii, Manila-Sharla College of Business, I got connected with them and they offered a lot of resources. They had multiple business plan competitions they sent me out on, you know, other resources, professionals and residents and all those things. We also got access to the Shilor students. They assembled a team of interns to help out with the operations of it. Now you're at the same age as them, or they're even older than you. Yeah. Yeah. They were MBA students, in fact. We didn't pick up for a MBA student until recently, but you know, undergrads. Right. Right. Or recent graduates. Yeah. That was the next step for us is actually getting connected to PACE and they provided resources and a little bit of capital too. So you had a base or shell to work on for a while. Definitely. Okay. So that's great. So that moved your journey a bit more to make your product more robust or something that you could put up and people could see and kind of give you more input. So what was the next phase after that? The next phase after like PACE, specific entrepreneurship is, you know, I got connected to, went up to San Francisco. I was just going there for a conference. I met up with this Hawaii guy, McKinley, grad, and he's doing a startup, talked to him, and convinced me to move up to San Francisco within five weeks. Oh, sure. So when you're young, you can make these, you know, instant decisions. But I think in retrospect, you know, it led you into the whole new world of Silicon Valley. Definitely. So that was the next step for me. So I was living in San Francisco for the past year now. Oh, wow. And, you know, I got connected to just a lot more people and just different, like people doing the same thing. And everywhere you turn in like a coffee shop or something like that, you maybe see a venture capitalist or someone right now talking about like a multimillion dollar deal and how they're building this app with AI or blockchain or something. And it's like, you don't hear those conversations. So getting exposed to those conversations also helped. Well, you're correct. What we call the ecosystem, you know, the venture capital, the money, the Stanford and Berkley's, the universities, the ideas and immigrants, as you know, from China, India, all merged together and they talk each other, especially, as you know, the Sandhill Road Starbucks. And that's a place where I used to hang out too. You're correct that they would invest or also know the talent pool, which is very deep. And so venture capitalists can provide or refer to C-level people who can be inserted, embedded into startups and really get things going or the technical resources, the CTOs and engineers and so forth. And not only in the valley, but also leveraging talents abroad, you know, in China or India or Russia, wherever they are. So you're correct that that whole heady atmosphere doesn't exist in many other places. So you've been there a year and you're back and forth in Hawaii, often I would think. So what are you trying to do next? Have you built your app to a point that is robust enough to really take it further along the line? What needs more to do? So we definitely want to make the app more robust. We want to add more features to make it more attractive to other schools and just give really the next thing we're working on is giving college counselors the tools that they need to actually help their kids see where their kids are at with the scholarship process, help them out throughout that application process. You know, we're delving into the product itself and I want to return to that and really explore it in depth after this important break. This is Think Tech Hawaii, raising public awareness. Hello everyone, I'm DeSoto Brown, the co-host of Human Humane Architecture, which is seen on Think Tech Hawaii every other Tuesday at 4 p.m. And with the show's host, Martin Desbang, we discuss architecture here in the Hawaiian Islands and how it not only affects the way we live, but other aspects of our life, not only here in Hawaii, but internationally as well. So join us for Human Humane Architecture every other Tuesday at 4 p.m. on Think Tech Hawaii. We are back exploring the heady atmosphere of Silicon Valley and how does a primary graduate really become successful in his journey as a startup entrepreneur? But first, in order to become really successful, well, you have to have a product. You have to have a product that appeals to the customer. That's what the Googles, the Facebooks, the Amazons, many companies out there really strive for to differentiate a self in a sea of products, very similar ones sometimes, and how to rise up and of course dominate the market and monetize it and survive in the long run. And that's the economy, the e-commerce, the digital economy in many, many ways. So we are here now to kind of come back and really define the product itself that Travis has been developing and kind of see where it is in the, what category it falls under and who are the customers and sometimes who are the channels or who are the people who really can promote the product in the economy, in the digital economy. So we go back again to your Scholars app. What is it all about and who are the customer? So Scholars app, first and foremost, is on a mission to send one million more students to college by streamlining the scholarship process. That's what we're all about. That's the outcome, that's the goal. That's the outcome, that's the goal and it's to be quite frank the reality of it. Our kids last year got over $1.2 million from our application. We helped to generate thousands of dollars of new scholarship money and we are helping donors actually create new scholarships. So there's more students got scholarships this year than last year in Hawaii. Right, yeah. So our end customers are scholarship donor. So we connect students, we connect donors and we even give tools to college counselors at the local high school to actually be able to monitor their kids and assist them with the application process. But even then when there's not even a lot of scholarships, we give away for free too. And can you say that you are well on the show? No, scholarsapp.com. Okay, scholarsapp.com, very easy to remember. So what is your app, your product in the market? Are there other products out there that are competitors? What is the market that you're trying to succeed in? Yeah, so I mean there's a ton of other competitors. I mean you can hear about other scholarsapp search engines out there, there's scholarship management softwares. There's even tools already built for college counselors to kind of manage the scholarships at their high school. We're bringing all those different parties together into one place and we're taking a significant market share behind that. So in Hawaii, we just got word that almost all Hawaii high schools were at 95% already signed up and other high schools already emailed me that they'll be signing up shortly are all using scholarsapp here, public, private and charter. We have a good portion, I think we're coming up on two to five million dollars of exclusive money that you can only apply through our app. So that's how we differentiate from competitors. We take over the market. Now you're starting, we're talking about Hawaii, the state of Hawaii market. Are you doing this in every other state in all 50 states of the union? So we are signing up our first schools already on the Pacific Northwest of the United States. We're hoping to expand more into the continental United States and we're doing small test trials in the different regions right now. What are the, you know, the scale and I think that's what you're trying to do, scale up. Are you looking at it just for the US or globally? Right now our only focus is the US but there's definitely other markets in there that have inefficient scholarship processes that we'll like to go into. But right now just trying to be focused on the US for right now. And what do people say to you? The donor comes to us and says, thank you very much. You helped me do what? Get more applications. So we market the scholarship application. We help students apply online. This is generally the first time students can apply online for these specific scholarships that we're not taking over. But at the end of the day, we help tailor the students' story and help them submit their application and obviously a bunch more. So the donor actually gets more qualified and completed applications and a better pool to select the recipients from. And in most cases, actually we're finding out where because they're getting more applications, they actually decide to give them more scholarship money. And how does it help the student? You say that it makes a student shine and it really makes the student narrative much more clear. What exactly does the app do? It really kind of shine the light on their background and what they're capable of in the future. So let me just answer what we do for the kids first. We match them to scholarships. It's also, you know, it's a pretty accurate match as well. So all these different scholarships, I know that they all require different things. We get it down to pretty much almost a 90% match to upward majority of the time it's a 100% match. And we will tell the students, hey, because you entered X, Y, and Z, or X, Y, and Z things, you are 100% match for the scholarship. So we help them all with that to make sure that they get the entire list of where they want to go to and what scholarships to apply to. Then, you know, there's simple autofill stuff. So like, you know, you upload a transcript to our website from the college counselor that transcript can be used for every single scholarship. And we autofill their data. Small stuff like that, but you know, it kind of automizes it and makes it easier to fill out. Yeah, you don't have to write. The other option is writing this on a paper and mailing it in. So you have this app going on. What are your next steps? Are you scaling this in order to monetize it? In what way? So I mean, we charge the scholarship donors. So if you are below a certain threshold, you're free. And then obviously the bigger ones for bigger mono applications, they pay us. Okay, so there's a way to really provide a service but you, as the developer, it gets compensated for providing a service. Oh yeah. Okay, okay. And you have won awards for this scholarship, this idea and proposal out there. Tell me about your experiences out there competing against others. So like, in what way? Like you're talking about like the UH at the Business Lab? Yeah, yeah, go ahead. I mean, yeah, we won a couple of awards. So we got one from Leeward Community College, the Business Lab competition. We got one from PACE in the Breakthrough Innovation. And also you went to California, remember? Yeah, that one, that was the big one. And tell me about what was that competition all about? Oh man, that was quite the challenge. So PACE asked me if I want to fly it, represent UH for the California Dreaming Competition. For my understanding, it's one of the biggest college business-like competitions in the United States. And I was one of the only undergrad, let alone community college students there. The first people I would walk into, they're rocket scientists developing the new fuel and I was like, what did I sign up for? Remember, I attended HEC and KCC after parenthesis, but go ahead. Yeah, I mean, but it was just rocket scientists. Yeah, talk to computer guys, yeah, that last one. It was definitely a shocker.  But looking back in high school, of course, in college, if there's other people following your footsteps, other people, what would you tell them or what would you like to see in terms of courses or mentorship or advice? Or how do you nurture more of you out of Kalihi, out of Farrington, out of our neighborhoods? So I personally think that they're already coming. And I have the luxury of having a scholarship application where one of the things that we ask is, what is your career goal? And I'm seeing a lot more saying that I want a small business, I want to have an ice cream parlor, I want to do something in entrepreneurship. So I think they're definitely coming. I think how do you get them to the next level? Just everything what everyone needs is, in my case, I need access to technical resources. And then we need access to capital and then the mentorship. All those things combine. But it's exciting to see that there's already students with the drive and the intent to do it. So now when you put the resources out there, those pillars that went over it. Well, let's be more specific. Like in high school, would you have benefited by more courses that would teach you how to make a company, interest rates, loans, venture capital, stocks, bonds, IPOs, would that have helped you? Maybe not the IPO part, because I think right now it's just early stage, we're just trying to find product market fit. But I definitely think a computer science class. OK, OK. That would help me a lot. All right, all right, that's what we're working on. We don't have AP computer science yet. But we have ICS 110, in fact, taught by an HEC instructor at Farrington today. But there's only one CS instructor for the entire school of 2,000 students. There's something wrong there. You're absolutely right. There should be, and going back to Kalakau and Dole, well, other middle schools, you have to introduce programming so that they'll be able to succeed in computer science courses in JavaScript or Java or C++ or Python in high school. But you're absolutely right. That is something that we have to work on. You're absolutely right. And because that will, you don't have to code, but you know what coding is about. So you can work with engineers. You can then ask the right questions to develop your app. I mean, if you don't know the coding, you don't know what the questions they ask. And then that's when I worked at Google, at Google, the product managers were at the same level technically as the engineers. You're absolutely right. In order to make the product at Google. But this is a really exciting area because I think, what do you want to do, though? Do you want to remain in Silicon Valley or return to Hawaii and do something? And what is that something you're going to do back in Hawaii? So we are definitely considering moving back to Hawaii. We're now definitely, there's some variables that come into place that we'll find out within the next couple of months. But there's a strong possibility that scholars will be headquarters on Hawaii as of January next year. Oh, great, great. Well, that's, again, that's the dream of the diversification of an economy to grow new jobs in Hawaii, in the tech field. But it takes people like yourself who have an idea and attract capital and then can create the marketing department, the engineering department, the product management department and so forth. And it needs local talent. And like you say, if they're coming behind us, I hope that those are the people who can fill in jobs. And some of them may launch their own startups, which will be really exciting. And that's the real dream, which I used to be involved with back in the 80s. And now we're here in 2018. And I'm especially glad that you as a representative from our high school, the greatest high school in the state, Sarrington. And there's people like Ben Cantano, a governor, former governor, Alan Oshima, a HECO president, many people who are quite successful. But we need more entrepreneurs and to create the new digital economy. So we're running out of time. And we will take all that you said. And I think these are words of inspiration for the next generation or current generation of young people to move ahead. Any last words from you? No, just thanks for having me on. And this is a great opportunity. You're welcome. But yeah, best of luck and congratulations on your journey and hope to catch up with you in late 2019 to see where you are and how successful you've become within a scholarship that really helps not only the donors, but in a marketplace to match with students, even more opportunities to study through increasing the donor pool, all kinds of new scholarships, and will create a better society for all. This is Ray Tsuchiyama. Thank you very much. Business in Hawaii.