 Hi, good evening everyone. Thank you for having me. Actually, my name is Paul. I'm from Jakarta. I work in Zenith Education, which is an active company from Indonesia. And, yeah, I came to this meetup. I think this is my third time. Well, it happens to be as a speaker. I know a few faces around, but yeah, it is a new experience. And when Melinda asked me to share my experience, our experience as a company using Clojure, expecting that probably I can share a little bit of using the library of this or that library. But we're not really experts in one sort of library or that library, but probably we want to share the use of Clojure in this educational space, a tech space and our experience in probably not experience, but how to get Clojure into production. And yeah, I think that's the thing. And yeah, so that's my topic, Clojure or Clojure Script in Educational Technology. And our mission as a company, we're there to promote science and reason with the help of 10% to alien technology. If you're not familiar with alien technology, I mean, why we chose Clojure is because me and my colleague, the CTO, we were both a common whisper. Anyone familiar with common whisper? Anyone ever quoted? Okay, good one, common whisper. So yeah, my background, personal background, I was studying in artificial intelligence background and naturally at that time we're using common list and that's what happened to my CTO too. But then I founded the company in 2004 actually and I stopped, totally stopped programming and just started programming in 2013 when my CTO introduced me to Clojure. Okay, so that's, we see Clojure as the list for the 20% list, so that's modern list. All right, so okay, so this is just an introduction for a company and yeah, our goal is to promote science and reasons in Indonesia with a country with large population but a bit lack of critical thinking and all. So yeah, that's quite difficult, that's quite a challenge and in education ranking in terms of education, Singapore always ranked at the top of the PISA test. There's this OECD ranking like 80 countries tested on math, reading, math, reading and science. I think they tested the 10th grader for math, science and reading and Singapore always ranked at the top for all categories. Vietnam somehow ranked in the top quarter, that's kind of anomaly for the Asian and the other Asian countries were basically a bottom dweller. So the challenge is how to provide quality education in Indonesia at first but then we're moving to, planning to expand into Vietnam and Philippines. And yeah, so naturally there are some problems, low speed internet connection in rural areas especially and in the cities somehow we have unstable or poor signal or internet connections in the schools. I don't know probably the architecture of the school or something makes it very poor signal or something. So yeah, it's a bit of a challenge. And okay, a little background with the ZNews. It was founded, incorporated actually, incorporated into 2007. We started operation in 2004. Right now we have like 100 plus employees and our main site, this is the ZNews.net launch in 2010. Yeah, built using PHP, so we made that foolish mistake. And now in ZNews.net we have I think, okay, yeah, 66,000 videos there built in-house videos. Right now, last year actually, we have almost 8 million unique visitors and 80 million videos played. And yeah, it's still, you know, the main site, it's still built on PHP and we're shifting for disclosure parts by parts. The migration process, I think it's been for the last two years. And yeah, hopefully we'll be done in one year, one more year. Yeah, this is a traffic goat of the site. So yeah, I think we need to make it faster because yeah, video streaming, those sort of things, there's a little bit of problems in the background. Okay, so we have two developer teams in total 10 to 16 depending on how you define developers. And the first team, the main job of the first teams mostly migrating from the old sites, the old PHP into Clojure, that's a lot of work. And we kind of underestimate actually the amount of work required to do so. So yeah, this is in progress. But then we are in the process of building the second product. The second product, there's this new development team and I personally in charge for this new product. So I'm going to talk about this new product because the main site that's not really my thing so I will share my experience in building this new product. Okay, oh yeah, we're moving to Clojure since 2013. Okay, so why Clojure? Because it's less and it runs on GVM. That's the first thing that when my CTO told me that, okay, why should you sleep? We have alternatives. At that time probably Python or Scala. But he basically said, okay, this is sleep. This is less running on GVM. So okay, enterprise level, that's good. And run on browser too. At that time Clojure script was not really a thing. But somehow, okay, you can run, compile to JavaScript, that's a good way. And then on nodes, so we can do scripting using Clojure script too. And I never tried personally, but since, you know, are you guys familiar with React Native? React Native, so yeah, it's also runs on mobile OS using this React Native. Oh, by the way, I make an assumption that this meetup will be consisting of probably people in Clojure that has experience of, let's say, two years or something. To check whether my assumption is correct, how many are you having, you know, at least two years experience in Clojure? Okay, so how many of you? Less than six months? Okay, right, so a bit, yeah. But okay, hopefully no problem. So yeah, that's the first reason. Being a list is really a big thing for us because a second part is code can be treated as data. This is, as you will see in the next slides probably, code can be treated as data. This is really important for us because the nature of our system, we want the applications to run whereas we can add more code into the application in life, you know, running life. Okay, and somehow, okay, this is a bit out of topics. As a teacher, I'm also a teacher. As a teacher, I teach programming to high school kids as well as the college. And most of our students, when learning programming, they learn programming as the, you know, they are first programming. These are my courses, mostly as the, you know, the first programming course they take. So I've tried several different languages to teach these kids programming. But the programming part that I teach is not like application building, but mostly to solve mathematical problems or physics problems basically to help them, you know, grasp their own courses in schools but using more, you know, automated process. And somehow, compared to Python, closure is better in being grasped by the first timer. That's actually, well, it's actually surprising because we tend to think that Python is probably the basic language or the easiest one or something like that. But somehow, the students is those who are not exposed to the procedural algorithmic kind of programming, somehow they see functional programming as straightforward. You ask for this, you ask for this input. And, you know, the output is not like procedurally or step-by-step doing step-by-step manipulation of data, but it's transforming this data into another form of data. That's somehow natural to, that's what I see at least in my students, it's natural to the way they're thinking. But although Haskell tends to be much easier for them. Haskell, because Haskell is very straightforward and the notation, similar to the mathematical notation, so it's easier when they use Haskell to solve physics or math problem. But when it, you know, comes to a bit more complex, Haskell is going to be very, very difficult. So, yeah, the dynamic part of closure actually wins in that part. And why is it, why this is important for us? Yeah, for, yeah, the next slide we will talk about both of these things and why that is important. And, yeah, of course, great community. Somehow the community works. I mean, really helpful. I see a lot of experts there. And the growth of the libraries, the environments, the IDE, I'm using, personally I used IntelliJ using cursive as a plug-in. But there's this, I don't know whether you're familiar with, Nightcode. Nightcode is a beginners-friendly IDE, basically IDE for beginners in closure. So, yeah, the tools and everything's been great. People are very, very helpful. And for us as a company, I think it's a vision of software development that we actually, we buy into this. It's not only about tools, right? I mean, it's about the vision and what kind of constraint the community put into the way, the direction of this software development. And that is somehow a big, big thing for us. And, yeah, that's, I think some other companies have a different reason for adopting closure. But mainly for us, or at least for my project, my current project, these are the main reasons. So, what are the challenges? What are the projects? The government, Indonesian government, enforces computer-based tests for the national exam. This is a huge challenge because there are 76,000 schools that need to use this in like every part of, Indonesia is very large with 13,000 islands, more and more. And, yeah, they want to do it in all the schools, at the middle schools, left on high school levels. There are 76,000 of them. And I think the project, not the project, the government enforced it to use 100% of the school to use the computer-based test application in 2019. Well, it's still a long way to go actually. I think it's only 35% of the schools currently using that. So, yeah. And somehow the problem creation and scoring the tests are tedious process for the teachers. Imagine one teacher in Indonesia probably needs to teach around three to four classes. That means 150 to 200 students at this particular academic year. So, scoring tests, creating problems and questions that would be tedious and time-consuming, not tedious. Time-consuming problems for these teachers. And, yeah, naturally students cheating during the test because it's on paper, it's easily, you know, the system is, not the system. Somehow the classroom and the way the sitting arrangement and something, that's very easy if you do these things, if they do these things on paper. Yeah, and then sometimes teachers complaining because there's this somewhat question-and-asked websites, like Quora-type websites to ask problems, to ask, you know, asking help for homework. And somehow the students can actually get the exact same problems and they just, okay, just copy all the whole answer there. That's homework cheating is always a big, big problem. And, yeah, yeah, okay, this is 76,000 schools, actually, in different settings, different area, some with good internet connections and many of them are not really, really, well, in fact some of the schools do not have, you know, a stable power supply. So, yeah, this is the condition. Okay, so the solution is to create a problem bank application, problem generator, which is an exam builder application. So basically we create problem templates. Problem templates for mathematics, physics, chemistry and some other subjects that are tested by the government. And so each of the problems will, each of the problem template could generate probably hundreds of, or thousands of similar problems, similar problems, but with different, let's say, for different numbers, different numbers, different wording, some variation of, let's say, for English. By the way, it's not only for randomly generated numerical randomness, but we can use it for, let's say, English test, random generation of sentences, different, you know, different subjects, different verbs, past tense or present tense, something like that. Or for chemistry, for example, yeah, well, it's easy for chemistry. You have, like, this, all this molecules or atoms, I'm not a chemistry teacher, so I'm not really familiar with the detail. But by combining this and, you know, the number, the atoms' numbers, the mass of each atom, you can combine it to be a certain kind of molecules. And you get this problem generator that could be, you know, very, very versatile in generating millions of, millions of problems. So, yeah, using this model, we solve, at least, you get a similar, similar kind of difficulties for each problem set. Because teachers could choose the problem template, not the problem per se, but the problem template. Choose this one, this one, this one. And each of the problem template would be having a similar difficulty level. Yeah, see, leave similar difficulty level and it's very important to keep order in place, to keep the problem the same for, the same sequence for each of the students. But each problem, its instance of the problem should be unique. It can be the same for each of the, for, let's say, students. So, every student will get this unique set of problems, but similar in difficulty level, similar in topics, and so on. Okay, basically a computer-based test application. This is, this is the problem generator part, the application. And this is the, the application to actually do the test. That's, well, that's nothing, nothing unique there. It's just typical test. And the other one is learning app. This is for specifically for learning part and homework assignment. And yeah, so these are the, this is the test, this is the learning app, learning application, and they use the same problem bank, but with a different set of, this is problems for test, this is problem for the homework or practices with a little bit of, you know, difference between the problems app. Okay, so that's the solution. This is a stack. I think for the, for the most part, it's a typical closure stack for a web, for a web-based application. We're using pedestal. You guys using any pedestal here? No? How about composure? Okay, composure. So yeah, we chose pedestal over composure because I think it's more explicit instead of composure, lots of, I think a lot of magic happens there that we don't really understand. So pedestal for us is more explicit. And obviously the database... What's pedestal? Well, sorry, yeah. It's a routing library for closure. So typically people do use composure, but yeah, you have other alternative, which is pedestal actually developed by Cognite. So that's the routing application. And I think for the server, we use JT, JT or Immutant, I think both. And yeah, Shelmer, but are you guys familiar with Shelmer? Shelmer normally used for templating. It looks like a Django or a Mustache, if you're familiar with HTML injection string extrapolation, but we don't use it for HTML generation. We use it for problem generator. So yeah, so the teachers would create all these problems with HTML and then inject the data, the closure data into this HTML using this Shelmer application. So we use it differently basically. For the closure script, this is interesting. We use reframed, reagent, react-material. Well, I think this is the most relevant one. Personally, I prefer region. At that time when we made the decision, we prefer region over home. Region is actually a wrapper around React. React.js, which is, I think, well, I think the closure community already settled in that part that okay, React is probably the one that's most suitable for the functional programming on the front end. So there are several wrapper for this React. There's om, created by David Nolan. My CTO actually insists on using the om, but for us, I think region is, I don't know, it's more, in om, we see that most of the manipulation happens around function, but in region, it's more like a data, a sector-based model, which is, I think, better. But then comes om.next, om.next, something like that, and I think, well, okay, that's probably better, but yeah, we already chose region for that. And for the framework, mostly the framework of this closure script development region, we chose reframe. I think we, the last time I came to this meetup, there was a talk about reframe, it's as if logic script framework. So reframe is a functional programming, no, a reactive, functional reactive programming model. It's similar with the old elm, that's Haskell-like language for JavaScript, and yeah, we use reframe for that, because it's, I think, it's not simpler, but actually easier for me, because yeah, for our team, because they're mostly familiar with this functional reactive model. And for the actual UI, we use React Material UI based on Google Material Design. So basically it's for the mobile application, designed by Google as a suggestion, I think. And yeah, that's the closure script stuff, and we use single-page application version for all the apps, because yeah, obviously that's what the use of this, all this reframe region and all. Okay, now the interesting stuff, at least for us, this is the experience, teaching teachers to code enclosure. So far we have 8,000 problem templates. So okay, I think there are six or eight teachers that do not have any programming experience at all that we need to train using closure to generate these kind of problems, problem generator, because the problem would be a data that I said before previously that the problem generator would be closure codes that randomly generates numbers or sentence or whatever, and we need to teach teachers for that. And surprisingly, for some of them, it's only a month. It takes them only a month to code in closure, and at most it's three months. But don't imagine that we code for application building. It's only to use at least to solve, I think, 100 or 120 for closure problems. I'm just familiar with foreclosure. Foreclosure solving, of course. And I think the way we do training is, okay, solve 120 problems in foreclosure as well as probably 50 problems in project Euler. Project Euler.net if you're familiar. It's very mathematical sort of things. And surprisingly, one to three months. No programming experience at all. And yeah, that's what we do. And that's one fun part. And probably there will be more teachers in the next batch, 20 to 30 in January or February. And apart from the teachers, we also teach the interns, some of the interns coming from our ex-students, actually. Okay, so treating problem template as data. So each of the teacher creating a closure function, basically. An anonymous function producing, randomly producing map, closure map with several keywords. And the HTML for the actual presentation of the problem. That's the presentation part, HTML. And closure function, anonymous function as the data that's supplied using a Selmer library that I mentioned earlier. Yeah, so. And somehow this data, the teachers develop all these problem templates using different methods. And we put it into some sort of back office, back end, in the admin mode for the teachers. So they can add problems live into the system, using some sort of... It's not like live, per se, because it would be very dangerous. But we have some sort of integration test process. We're using semaphore, CircleCI. And so whenever the teachers commit to GitHub, the test will be run to make sure that every kind of problems they have doesn't have any error or typical error that we check, like division by zero or something like that. And yeah, that's treating problem template as data. And then you can supply this data into the actual database of our application where our application could generate problems every time they're asking for problems. Another possible solution would be generate probably hundreds of different problems stored into the database and just randomly pick, like, among all these 100 problems, instance of a problem. Okay. And yeah, of course, I mentioned earlier, problems are for each student, but the same set of topics on difficulty level. Probably for those of you who are not in education, that's not really interesting, but for us in education, that's super cool, because you have random, not on non-unique problems, but in a similar difficulty level, the same order. Yeah. And of course, the datomic part. Since the nature of our application is, the nature of the problems is, it's basically a template. So whenever it generates an instance of the problem, we store it in the datomic, and we can record all this typical database recording, but immutability of datomic somehow helps for this, I don't know, probably in other area too, but for in our case, we can store exact answer for each student, the homework, exact answer at this point in time and probably next time analyze all this progress and the change in answer and whatsoever. So yeah, that's the data part. Okay, this is actual code example, a typical, not a typical generator, but probably using easier to read. This one is created by a teacher, one of the teacher to create, this is what we call the generator function, as a closure function. That's an e-max sort of shortcut for function fn. So yeah, they do it somehow that way. So what happened here is that the code randomly generated these numbers, random choices between 1, 2, 3, actually they can use this random integer there, but somehow yeah, you can please keep in mind that this is created by a teacher only with probably one or two months experience in closure, right? Okay, so and then generating the answer with the condition, if this condition and that condition, oh by the way, this is in Bahasa Indonesia and shuffling the options, I think this is for the options, for the options of, I mean the choices of the answer, this is a multiple selection, multiple choice problems. And then after this one goes here, the result of this generator function is an instant of a problem, which is data, which is a map, a closure map with all this q, NH3, I think probably it's nitrogen, hydrogen, something, Kc, qc, java, it's probably the answer for the problem and these are the alternative, the choices for, the options for the choices of the problems. And that's this closure part of the problem generator and this is the HTML part of the problem, of the problem generator, we have, yeah, this, if you're not familiar with this dollar sign, there's actually a latex sign, math jacks, to present mathematical notation, mathematical symbol, or some chemical symbols in the HTML format. And this, what do you call this one? The bracket, that's the string injection. So, if you can see here, this is a keyword, NH3, and the way Schelmer works, it will inject this data into the string and you're looking for something NH3, with NH3 there, I think this is NH4, Kc, and yeah, there's something, there might be something there. Okay, no, okay, this one, yeah, so the string, this is the way Schelmer do strings, injection from the data there, and this is the choice of these, the choices for the problems. Through Answer, so from the getting from data from the answer variable and the false problem for different options. And yeah, basically it's actually, it's not that, I don't know, it's not that original of this idea, but somehow this does a little miracle in our educational operations because it gives, it saves teachers, millions of teachers a lot of work load and all. So, and what's the roadmap for the short term? Our software actually installed in local server in school with one local server for one school, they require Wi-Fi connection, Wi-Fi network, and probably in January, we need to launch the online version of the software, online server, so probably we need to solve the SEO issue to spa. So yeah, and from local to online, we rely heavily on one JavaScript files to be the application for, since it's a single page application, probably we need to break apart the JavaScript part. And okay, this is the hardest challenge, make the app runs on Raspberry Pi or similar devices. Okay, the situation in 84% of the schools, actually they don't have Wi-Fi network, so we cannot put one server into, to serve all the students in the schools. So we need to have one server for each class and that would be very expensive. So our solution and there's another guy doing, not similar thing, but doing things for the teacher, they use Raspberry Pi with a router on top of it, so they call it EduBox. So this EduBox serves 40 students without any Wi-Fi network, but they need, we need one server on Raspberry Pi for each of class. So probably we need to either make our application smaller, change the atomic into my scale, probably to fit into Raspberry Pi, or at least something, I think Orange Pi or something that is probably bigger RAM. Or we could port it all together into Node.js mode. So yeah, using Node.js probably smaller than GVM, so that's one way, a possible way to do that. And okay, this is the short term in few months. Sure, mobile app, native or react-native. Does anyone try to use Code U script to actually build react-native because this is actually I'm asking an honest question here because I'm considering whether to use native or react-native because we don't want to use other languages, other than Code U if possible. Anyone using Code U script for react-native? No, okay. So probably I'll come for the next meetup when you guys have this one. Alright, mid and long term. The government requires some sort of mapping of all these schools. We have 34 provinces with 500, I think, 500 municipal level 2 districts in Indonesia. So we need to collect all this data and doing geographical analysis for the school performance. That means data analysis, data science, what's not and visualizing it all. So yeah, your thing would be interesting. There. And yeah, adaptive dynamic learning using our video and problem libraries. Basically we have 66,000 videos and probably more in the next few years. And we have problem libraries already there. Now we want the student. The student have different ability to solve certain problems and they have different set of skills and here and there. Our system to adjust to the student's ability to solve problems. Let's say this is to fast for him or her so we could provide problems that is easier and take it more step by step. And basically how to extract all these libraries or these videos or these articles or problems and to adapt to the needs of the student. And that obviously requires some machine learning which is the area that would be probably in 8 to 12 months. And the technical skill dependency is this data-driven curriculum design. Which is actually this is one of the big, big issue in educational technology because naturally, normally, traditionally we design curriculum for physics or for mathematics or for bilers or something like that. And this is the steps that we think student needs to master before. This is the requirements, this is the topic and this is the sequence in order how students should learn about each subject. That's the traditional way of thinking. And I don't know how far we are into this thing but the way we see it is that actually when you solve mathematical problems, let's say what's the worst problem in mathematics, probably you need other area of other subject skills like say reading capabilities or reading comprehension skills. So we want to develop some sort of dependency amongst different subjects, different topics, different skills. And analyze from their ability to solve certain kind of problems whether they have solved one topic in physics, let's say whether they can solve one topic in physics if they haven't do this part of math or this part of math and create a network of dependencies between certain kind of knowledge. That's one big challenge I think but I can see that this is totally required in our educational process because we can just assume that okay if you want to do physics this is the requirement only in physics but actually sometimes they need different kind of sets not only in physics probably in reading skills in mathematical skills in graphics or something like that. So that's the long term plan out of this topic. And okay, so yeah. Okay, that's me, Zedis Education and by the way we're hiring if you're interested. Yeah, sure. We need experts if you're interested in full time, part time, remote basis or if you're a company doing odd sources yeah, obviously we need a lot of help in this department. Okay, any question? Yes. I have a question. I'm just curious why did you decide it's better to train teachers to write closure rather than creating some tool for them that's like as a PV UI, easy to use and they can just generate their problems from templates. Yeah, yeah. Because learning closure is like taking the long way. I'm all in favor of learning training teachers to use closure. I think they'll be very beneficial but at the same time there's more time. Yes, sure. Well, that's a good question. First, I'm sure there are several other companies doing actually Khan Academy if you're familiar they're using the templates to generate the problem using just put it in. But it turns out that kind of process is tedious for the teachers. It's not really motivating if you put this, somehow using learning new skills in your closure we got several other side effects. Say teachers who learn closure maybe they have better performance in logical skills and somehow debugging skills increase their capability of scientific method because debugging in a way is a scientific process. It's like a research testing this part to find which error, which things that generate error. Was your main goal to train your teachers? No, no, exactly. Our main goal is obviously to generate more problems, right? But we haven't been able to create the template yet, the UI for the generator. So at first we tried to use it in a traditional way. I mean like, okay, just teach the teachers closure and see what happens. And so the interesting part of that is that hey, we found another effect impact to the teachers cognitively to the teachers. And first it happens to be more fun for the teachers being learning new things. Okay, it takes, it consumes probably one or two months more in the beginning. But then after that it's more fun for them. And I think it's compared to the way UI and you just putting this variable and this one somehow more fun for them. And also the way if you choose this template mode in UI we have so many different possibilities. Let's say that one is generating chemicals, I don't know, molecules or something. But for probably for the English teachers they need to, or Bahasa Indonesia teachers they need to generate sentences. So it's so many different types of UI need to be created and said, okay, just doing this in closure and teachers have fun. And it's easier for us too. That's... Have you thought about creating some kind of a repository for the teachers to submit their templates and share with other teachers something like that? Actually yes, we do have that in a private repo. We actually, it's been a year now the private repo for that because the problems development is still in-house. We haven't shared it to the public yet. So probably in the future, yes, that would be the direction to go and some of the teachers already created common libraries to make things easier. And these libraries can be used by other problem generators too. Yeah, well, thank you. Yeah, at the moment it's only for our own teachers, in-house teachers. We are thinking about making this into a more public sort of thing. So currently we see ourselves as a content company. So most of the things we created are in-house. But in the next step that we would do is when we want to expand it to Vietnam and Philippines, right? And our potential partner is actually asking about what if we do this as a platform and where the teachers can, you know, coming from all different schools or different companies they're not necessarily part of the company. That's one way, that's one alternative way to do expansion to the other countries. But we're still considering the drawbacks because basically they put codes into the system. So probably if we put it into, you know, in the middle or something that makes sure that everything's safe, well, we can do that. Yeah. Why do you choose Siamese? Instead, why don't you provide them some DSL, like, better masks for the teachers? Somehow because the teachers are already familiar with HTML. HTML is something that already, you know, they write blogs, there's something like that. So yeah, they're familiar with HTML. Now, okay, just the string injection part that they need to do with Siamese. I have one more question. So it seems to me that a lot of your content is videos. A lot of your content that you produce is videos. And at the same time, you mentioned some parts of Indonesia don't have human electricity, let alone the good connection. So wouldn't that mean that a lot of potential your central users are missing out on your content because they can't have a screen video either fast enough or just don't have time? Yeah. Well, a very important question, actually. Our video is not, it's not a typical, you know, full blown video, high resolution or something like that. And we use, I think until three years ago, we use six frames per second with a small size. With background, it's more like Khan Academy type. We've been creating that kind of video, I think, actually since 2004 because we knew at that time that small, small size video is very, very important. And so we chose the kind of video that is, you know, using only background, back-back word, only handwriting from the tutors and the voice. And somehow the size, it's only two megabytes per one minute. So it's very, very small, only six frames per second. But now we move into 12 frames per second with a little bit higher audio quality too. Somehow the video problem is, the video is not really a problem because of this local server model. So we have, actually we have two sites. We have two products. The main sites, online, the GeniusNet, that's the site for competitive tests, some student-centered learning, focused on students, no intervention from schools, mostly for national, you know, college entrance exam. And that one, it's, yeah, that's the one that we need to be concerned about video. This one, it's for the local server. Currently it's local server only. And yeah, compared to other content developers out there in Indonesia, our one advantage is the way we engineer the small size of the video. So yeah. Anything else? Actually I do have a question about the buy server. So have you actually done some sort of field testing in terms of, you know, actually measuring its performance with an actual, like, teaching session? Which one, this? No, no, actually that's the next roadmap in there. Okay, so we haven't been able to solve the problem yet. So we do like to hear from you if you get any suggestion what's the best way to do this thing. Anything else? You say you randomly generate numbers and sentences. How do you defend sentences like grassy stuff? So yeah, that's actually the way, you know, adjustment from the teachers. It's not that we randomly generate sentence. It's the function can be any kind of closure function, you know, written by these teachers. So the teachers can decide, say, okay, these are the subjects, these are the verbs. Not only, not like, okay, this is like all this a thousand type of subject, probably only 10, 12 different, you know, comments, you know, there is logical sentence, something like that. Well, that's a good question, though. I mean, for the numerical parts, we can, we have done all these tests like to, you know, to prevent division by zero or something like that, not make sense, but doesn't make sense, but for, yeah, contextual part, you know, something like semantic part, that's, yeah, we haven't done any test for that. Yes, thank you. Okay, thank you. Thank you for having me. Thank you for the invitation.