Hello there everyone. Welcome. This is Melissa Arma with The Stock Swoosh, and I am doing a Change Your Life special this week for people that are interested in taking the March Gold and Gap course. So it is an interesting time right now to trade the market. Again, I've been trading for 15 years now, hard to believe, but the fact is that we go through different times in the market, times of the market's bullish, times of the market's bearish. My strategy that I designed and figured out all on my own, which is what I teach in the Golden Gap course, I actually figured it all out, which is mainly focused on shorting during a bullish market, which many people do not realize. But the nice thing about what I do is you can use my Gap strategy to trade during bullish markets and bearish markets. So the special is called Change Your Life because I think this is a good time of the year to change your life, change your trading, getting into the seasons, the spring and we're starting in spring in a few weeks. And again, it's a good time to get on a new footing, get a new path. If you've been trading January and February and you haven't had a good start to 2023, you still have plenty of time left in this year to actually change your life, change your trading and do something new and do something different. So if you have questions, you'd like more information, email me on the list at thestockswish.com. You can also call me at 929-3200 Gap. You can follow me on Twitter, Facebook, YouTube or Skype. So it's a new year and a new you. If you've been trading for a long time and you have not been successful, but you really want to be successful, it's never too late. It's never too late to start a new path. It's never too late to start a new strategy. I always tell people that again, beginning of the year is a great time to start something new. Have a positive optimistic attitude that you can in fact do it. And again, we're getting into the point where it's going to be a crazy volatile market this spring, which means for a lot of big moves. And that means what? If you play the move on the right side, if you're long in the market rallies, if you're short in the stock falls, you will make money. Volatility is a good thing if you know how to play it, which again, I make the determination based on what? Based on the gap. And again, this is everything that I teach in the Golden Gap class. So the class from March, the special I'm doing this week is for the class from March. So you have plenty of time to plan your schedule. This special is going on through March 10. And it's a big deal because it gives you one year free of the Gap Options newsletter included with the price of the class, which is normally 69.99. Everyone pays the same one year free of the live trading room, which is again, 12 months takes you into March of 2024. Hard to believe it's a long time away, but this gets you all the day trades, all the options trades for one year. You can start trading if you want before the class, or you could wait off the class. It's up to you. But the class itself is March 25 and 26, 9am to 5pm extra time. Class is online. It could be anywhere in the world and take it. Email me and Melissa at thestockschoolsh.com. If you want to sign up, do not miss this offer. It's a fantastic deal. And again, you have plenty of time to trade before the class. So spring is coming, like I said, it's a good time for renewal. It's a good time to get on the right path for your trading. And trading ultimately is about making money. You've got to do that, but you've got to learn what to do first. You don't know what to do. You're going to lose money. Even if sometimes you make money, ultimately you will lose if you're not consistent. It's consistency. That is the key. So this was a trade. Again, if you sign up for this special, you will get the options newsletter. It was a trade that was emailed out at 10.14 in the morning Tuesday, February 21st. It was a spy putt. So we did the 400 putts that expired February 24th. Okay. Now I'm going to show you actually what the date was that that was the 21st here. So the market closed your gap down. What will you learn in the golden gap course? You'll learn how to rate this gap to determine that it's going to fall, which it did, or rally, which it did not. So this fell. You take the trade. When you get the trade, get in, get out, boom. And again, you could have done a day trading this could have done the put in this depends on what type of account you have. You could have done both. Okay. If you're in the live room, I'm calling trades live in the room and the trades are not the same. So, you know, it's good to have a have both. So you can determine if you want to do both and which one you prefer. So for an advanced trader risk, the cost was 220. This was cheap. 40 contracts cost 8,800 sold at 575 profit, 14,200. Again, we're doing the weight place. 161% return investment is a really, really nice trade. You could have got out in the first flush, you could have got the second drop. Either way, a profitable trade. You saw the way this fell. Again, this put is a short boom. Okay. And actually, if you held this the last day, you would have made the most money. You can see here, take it to the right where this dropped into here fell into 395, 394 fell, broke it. But again, I think the fast quick trade was the best one. I always think that way. If you took five contracts with 1100, could have made 1775. That is a good solid trade. And again, this is not the best exit. I don't think, I think that your goal is to make money. My goal is to make money. Okay. You can't let a gift hearse in the mouth when you get a move like this. Again, holding into the last day is not a good idea to do all the time. You don't have to be so far through the strike to do that. This was a nice move. You take it, you get in, you get out, you chunk it, chunk it, chunk it, chunk it out. I always say that in the live room.  You can do it for your family. Many times people want to change careers too. So they're doing it for that reason. But the fact is you can make money in the market. You just need a good strategy to do it. And a lot of people don't have a good strategy. So they're not consistent. I have a good strategy. It consistently works. Again, some trades we take lose, but we have more winners and losers. That's how you can put together a week, a month, and a year of trading. But it is about working for yourself. It's about the idea of being financially independent. And in today's economy, it's really the only way to survive. So what you will learn is the process, the rating system that I go through. One, two, three, four, five, it's 26 points. I go through, I rate the gap every single day. I rate every gap I do, even on the options newsletter too. If the gap rates 20 points or more, I take it in the direction of the gap. If you decide you want to come and take the class, this is the meat and potatoes, what you're going to learn. It's a whole day on Saturday. And you will learn my system. Sunday then is the entries. I teach 60. The class is for March, March 25th and 26th, 9 a.m. to 5 p.m. Eastern time. Class tuition is 69.99 US dollars. If you'd like to sign up, you must email me for sign up forms. And again, this deal is only going on for the special through Friday. Again, it's a new year, a new year. Change your life special. Think about it. If you have questions, you can email me. You get the options newsletter until March of 2024, the trading room to March of 2024. And you'll learn the system. The system is the most important thing. That means you'll be able to learn how I rate the gaps and you could do it without me. But I think getting my trades for one year is a huge, huge benefit. And suddenly it will help you get on your feet, start making money trading, and again, learn the system for yourself. If you'd like to sign up, don't miss out. Again, the special ends Friday, March 10th. Have a great day, everyone.


And I've heard about how basically we went from shipping code about say once or twice a month shipping code every single hour and how the journey and how we got there. So, you know a bit about Haptic itself. Haptic started out as a customer assistant application from the app store and from there it's home to a full grown chat board development platform. The app store out there going strong from the high area apps in India. The entire platform now processes about 1.4 million messages every single day. And we have more than 14-50 plus boards deployed now across multiple aspects of the business. So, the BPP aspect where we make chat boards and we deploy them directly for consumers and businesses. And the application itself, the Android and iOS apps, as well as most packages which are deployed in other partner apps like Dynzo India and Nordic Dynzo. So, around across these, all of these applications we have already chosen 20 million users and are giving the DAO that's another scale we see. So, you have to give an idea of the problem that we faced when we were trying to build these boards and ship features to the platform itself. I thought I'd talk just briefly about basically how the teams are operating. So, you have certain teams over here which are completely independent. The machine learning guys are working by themselves on the models and making the board smarter figuring out ways to build smarter chat boards. The app scene is shipping out the SDK which works independently of the chat models themselves. As well as there are certain product teams building out the chat boards. And they are shipping, each single team here are shipping its own set of board, its own set of features. So, across the entire companies there's about 7 or 8 different feature lines that are being built. Multiple boards are being built at the same time. And everyone has sort of their own release cycle, their own set of timelines, everything that they need to ship, you know, to kind of get it done. So, what used to initially happen was that everyone kind of, there'd be a release date set, everyone kind of pushed into one big release and that would create this one massive release that had to go out on a single day. And as you can imagine, that was a whole lot of problems and we actually took that away. So, we're making a Python workshop. There's a lot of tracing messages and message processing. View Saturday as a consumer for Lab at MQ. There's a message delivery system. We have a few different databases, Mongo, Elasticsearch, MySQL. So, it's a pretty deep text line in that sense because we, as a chat board, we have to kind of be present in every sort of platform. So, that should be iOS, Android, web, that should be on Facebook, Slack, a whole bunch of other platforms, right? So, in that sense, in a lot of technologies, we have to deal with those quite a bit. So, this is where we started out, that the event is my only release is happening where eight or seven or eight teams put together their own staging environment and they're trying to get things stable and QH trying to test things so that we can ship it. And when so many teams commit so much to the same, they all emerge at the same time. You can see that something's broken. It's extremely hard to figure out now who's going to roll over. And then you're trying to debug multiple, each other trying to roll back ones that don't work. So that, you know, you have like some feature which is delaying everyone else's release now. But this is always used to fix things on staging to release of production. You would see, hey, now, let's find other things that are broken. And it's a lot of firefighting, sort of all kinds and all that used to happen when we released code. And even after the production release was done, you'd realize that someone on some other team has included some other package, someone has included some other, put in some OS level dependencies, and other teams now don't know about it. And when they pull master back into their branches, they realize, now the development environment's out of sync and they're breaking as well. So, it's actually going to clear us about some realize, you know, hey, we've got to do something about this. We've got to make sure that we can shift forward faster and hold up easier than it is now. So, you know, when we started out, we said, okay, what are we going to achieve here? What are the goals that we want for this entire system, right? So, first thing that we started out with, it had to have a CEO and everything. Migration, be what it may. It just, it's not expected of us as a company. Even in the middle of the night, we have certain number of users online and we take their service in there. We want to change from, you know, those batched large releases to a lot of high-frequency lowest deployments. And that, that kind of results in the third point, fourth point, right? Which is basically your integration problems get minimized. If you're shipping code a lot faster, you realize, okay, this is, it's just my code that's on our plate right now and, you know, whatever went wrong can actually be related to that. Not related to five other things that went live at the same time. So, the moment you shift faster, your integration problems also immediately kind of get minimized over there. Other things also, you're going to manage all the dependencies and have that present somewhere in the legacy in place. All the installations that we did, the OS level installations that we did, that also have to be automated. If someone else in some other team installs something, it should be available to everyone now. It should be documented somewhere, it should be available. Last point is actually something more of a thought process, you know, that happens. So engineers, you know, would just build something, they pass it on and throw it over the fence and give it away as easy as it's not a problem anymore. And that's just, you know, culturally not something that we want. We want people to be responsible and owning that code right on conception, right with the moment it goes into production. And that creates some culture of ownership. That day, even if something went wrong in production, it could be an internal problem, it could be anything, right. I'm still responsible for it now. I broke this code and I'm responsible for shipping this code now. And that sort of mindset needed to come in. So we looked at it and this is kind of the first version now of what we did with our background for the ACF. Like, as you can see, the gate needs to be available, their own sort of side-load development environment. So, we did a lot of demonstrations about the level of dependencies. We did on S3, so anyone in any configuration, they just go in and add it there. Anyone else could just go in and come to the latest version of the network and push it up there. What you see here in the purple arrows, are actually the configurations of the environment itself. So, say for example, you just go in and on each glue it and we both, so we didn't perform testing and that just f***** up your level, right. It's just, we're just shipping more and more, it's staging more and more, and it just, and I actually think it initially made things a little more worse. This was a very immediate realization, right. You just can't have CI without tests. You can't port at that level of frequency on an hourly basis without having testing in which one you haven't broken anything else. And this didn't even be kind of a problem for us, right. Because here we have this very large orbit, so right now, how do you go back and start writing coverage and also writing tests to increase the coverage. How do you bring in that coverage of, hey, this is the value of S right now. And it's not just a developer right now. You are going to get PM, who's that man, instead of a factory. Your shift now has to have a testing philosophy where it has to have not just both their chips, but also a set of tests with it. So we actually had to start going backwards now and start writing tests, or at least for key components, payment, user registration, but it was a good thing. Key point that we missed out on was the focus of each of our own data that was being incorporated across multiple environments. One of the key things was chat data, basically. So the machine learning models that we had, the data that was being changed on, would have to be re-entered across every environment or a developer that could figure out how to manually move that across. So the board would then end up in this hair-facing environment. Even the configuration data of the board or what are the responses, I mean sort of move across environments and the problem, especially for us, we had to realize that shipping and shipping data are actually on the same level. Sometimes you just need to ship a new model, you just ship new responses, and it was just as important as the board. It was the first class that had to move across the environment where you build this sort of pipeline. And there was stage introduction, but then I came back to them as, again, other people are building other features, other data's going in, that has to be available now. And we also made sure that, you know, there are no conflicts. If two people are working on the same thing and they can make the same edits from different places, you can't have that data collide with each other and suddenly there are multiple versions of the same thing. There has to be some sort of conflict resolution for all this data as well. So, you know, data has to be given that level one importance to it. It's not just about all moving from A to B, the data has to move with it. So, this is kind of the learnings from the first one. That sounds sort of an observable perspective that, I mean, it's just processes and they need to ship in this fashion and make sure that they develop this in block for some other release. In a few months or so, we've been set up, maybe we've been set up with some sort of sanity, that we've run and then we've just run the environment and it's fairly open. So, we just have that, we just have to focus on having the current set of environments working the way this is that it has to give you confidence. It shouldn't make you more nervous that, you know, more people are shipping code. We have to have the confidence to say that, hey, you know, this code that's going out, it's shipping, actually, faster than what we're raising it up. And if it requires some sort of personal involvement, like, hey, this isn't working, that isn't working, it's not going to work out. So, let's see what we need to focus on and build upon from the peers. So, the first thing was obviously, we had to build our test, right? We had to have test-blocking, or just test-blocking releases and really testing anything before it went. We could kind of just not worry about anything and be hands-off for this entire thing. You'd be hands-off in terms of what goes on at a very strict level, because you don't know, you don't know. The second was we were going to ship a mill of each. So, we developed our devolved staging environment where the request for the test was run and the results of the test were actually attached to the PR along with cold coverage, where the coverage had increased or decreased based on the cold and the test added in that PR. Now, you can see all the labels. This actually created a huge psychological impact for this college. And suddenly, they can see who's PR is adding coverage, who's PR is reducing coverage. That made everyone more motivated to write more tests. Hey, I'm contributing to improving the college. The idea is PR is going to go, it's not going to break anything. We could then automatically deploy and we could just deploy that port automatically in staging. So, we didn't have to use deploying to the staging at that point where it would just deploy and we didn't have to worry about it. I mean, the service was focused. So, I don't know if you guys are familiar with what needs to be paid. It's great. All servers on AWS can take these servers back from you at any point. So, you can just before having servers come up and down it's a great, great way to save cost. And what Spontance does to you is that it will wait for these servers to be automatically. You say, I need 10 servers running at any time. Spontance goes wait for these servers to be at the lowest cost again. It deploy these servers to you. The moment a server goes down you get about 30 seconds notification of the servers when it goes down. It will wait for another server for you and replace the existing server that just went down. So, it will maintain a certain level also, these things for you. It can handle scaling it handles building deployments to make sure you don't have downtime things outside the box there. And also, saving a whole lot of money. So, you say that there's a set of servers that are compatible for your application to make the cheapest among those based on the value. So, we put it in Spontance to release two productions and it will just kind of make sure that deployments I think deeper in the deployment itself in a bit, to how that sort of will go in there and just put in the latest and make sure that it is just a simple index point for all the configuration. So, staging will be that you would actually enter all the data for our ports all the models. And then we transfer it to production. So, you could actually not change anything in production like you have to first go back to staging change what you have already made and then transfer it to production. So, it became sort of a sandbox on testing environment for us. Now, let's say you have a certain question, a certain phrase for which the bot is not able to provide any service which would then be presented to all assistants in operation or even across all of the boards. They'd be like, hey, the bot is not replying because this data is missing, this data is not back correctly. They would automatically just create a legacy entity and then again push that back to staging. They would test the new model on staging and then create the same way after that in the production. The structural configuration piece for us remains actually the same that was working fairly well now. We've moved into a recently a new service for E&V that has just come out. We have managed the environment piece across management and it has a fairly nice console and security configuration to hide that those environment feeds from anyone who goes into the service. This is the deployment process that we've been checking to go in and create the deployment. We have one in the 2100 and it's those which are at the end. And all this, all and I will be open spawnage. There will be one on-demand server which was a template of that entire ICO server. So if you have your web servers, you have one on-demand server for your web servers. You have one on-demand server for your sales facility workers which are running separately. So every ICO server has one on-demand server. Now, where do you want to make the deployment? You take that one server and you take another load balance or you have a delivery that is not doing the install or the requirement so any sort of packages that you have that need to be installed that information was now pushed to the depository itself. You go on with the data score on that so if there are any migrations that are not in the load balance or this is not taking any production workload you just want to run basics and clear that point of view and when you push for the production now it's good, it's solid and when you test the real thing the production is good. If you pass it to Sparkins it will start shucking, it will start bringing it on so once those servers activate your on-demand server so I mean the game actually you just want a one-demand server that those tests were done and so because the database in the night they wouldn't see him and you know like the creation test and you know they would just test out this current status or whatever features out there and test this, and test that so one thing we realized that was component size. What do you mean? Challenge for us was actually testing the entire chatbot itself that was that's something I think industry might not be that struggling but that each time you make changes to something fundamental that's extremely time consuming you can see 70 bots now it's not possible but I'm not talking about changes just to that particular bot or that particular chat flow there are some changes which are more fundamental so when you change, that's what I'm already using that's what it's in fact that takes days absolutely against this because you can't just test input and values against output because that's also changing those are being constantly tweaked by product managers, by content guys see what works there so you're not relying on those copies as well so if you're going out of the way we give a little bit of test the flow or based on just logic and keeping aside we'll just say hey I can post the next step and keeping a full text input why I would prefer basically draft flow or the main chat flow just the chatbot works we can just test it see this is still working and be sure you know nothing based on production so these are things that kind of work for us largely I mean at least have completed their own independent release cycles they are able to shift forward wherever they want I do have a follow up it's like I said there's dates and I say we'll get the release part in a day in that case when something goes wrong when he's shifted that forward he's going to be on top of it he's going to make sure this one's good or improve that sort of cold quality sometimes is then it's taking the information also completely out of every sort of single release perhaps as I mentioned hardy every day goes to machine learning you know you're fully on it try all different sort of modules to make sure that this is still working and you start that flexibility of trying different so you know this is also one of the three takeaways and we focus on it should I use Jenkins, should I use this, should I use that, it's use what works for you it all works fantastically well it all works great and don't get bogged down by these tools of like answers, movies, etc focus on how you're actually taking and the culture that takes CIF maybe how you actually are shifting this talk to lunches to engineers but also everyone else involved in the process because they are also impacted their timelines are impacted and they just happen the tools just pick your favorite and you have this is just sort of where we are right now so I think a couple of things are striving for what it was and not a functional coverage as I like to call it not just coverage for the sake of coverage a unit test should be testing against something of actual business value it's actually like validating something not just checking that things are not getting from your favorite perspective that needs to be done this is something that you have on stage where you know you just really have to buy your own and just reduce it that would be great to have in production as well once we have that further development and testing and not make that and then further the valuation that nothing is going to come and this is something that I've actually been thinking of in terms of actually growing intelligence and using the responses that we fetch out from a historic data that we have and we just throw it at the wall we just randomly keep throwing things at the wall to make sure that nothing is breaking the set of answers that we have and the question that we have just are constantly growing those sort of chaos among each other or through a thing is what we are doing


Micro pollutants are from anti-baby pills, hormone-active substances, to dichlofenac, to pharmaceuticals, to pesticides. So there is a huge and a broad range of different kind of substances and they all do influence our water and our water qualities. So I think micro pollutants probably gonna be the next wave of investment into both technology and plants. And a lot of the time the regulation goes off to the big guys, which is the utilities. But utilities receive it at the Westward-Rugin plant in small quantities, but they get mixed into the very large quantity of water. So if you decide to treat and remove this micro pollutants at the level of utility, it's quite a significant investment you need to make. But instead, what you could do is a lot of the time pharmaceutical companies and hospitals, you can remove pollution before it hits the wastewater treatment plant. And that's where we see opportunities and technology companies coming in, not only trying to deliver the technology that helps to remove micro pollutants, they're actually trying to improve efficiency and improve the way the wastewater is processed today.


Hi, I'm Divya. I am a developer advocate at Netlify. Netlify does hosting and deployment of static sites. I'm not currently based anywhere, but Netlify is based in San Francisco, and I spend most of my time in the US. So you can talk about that later. You can find me on the interwebs at Shortdiv pretty much everywhere on GitHub and Twitter. We can talk about why I'm called Shortdiv later as well. So this talk is actually a little deviation from what I initially wanted to talk about, which was input masks, but it's not entirely different. Because I was very inspired by CopyJS, and if anyone has gone to copyjs.org, you'll see that there is a form builder for building your own copy.  I'm a local, but I spend a lot of time abroad and so my Singlish cannot make it sometimes. So I need to remind myself how to call something Coby. So essentially, let me move to the demo. This is going to be a live demo, so we'll see how this goes. But essentially what I'm trying to create is, this is really ugly. This is a nicer version of it, but this is essentially what we're trying to build, which is it allows you to pick the milk, the strength of your coffee, the sweetness of it, and the temperature. And then it gives you the corresponding name for it. And if this is wrong, let me know. Because again, I singlish cannot make it. And so we're going to build this in the 10 minutes that we have. But first things first, how many of you have done anything view-related? One, two, couple. So I'll do a high-level overview of you and then I'll dive into code and demo. And I'm actually okay with you asking questions as I'm demoing. So if you have questions, just lob them at me. That is fine. So view is very different from react, in a sense, very much different. But one of the key factors of view is that there is single file components. And a single file component is essentially that your templates and your JavaScript and your styles are all within the same file. So this is essentially what a view file, a dot view file looks like. It just has a template with a div or whatever template-y things you want. And then it has a script tag, which is where you can instantiate your view instance. So that's like the high level of how it works. So with that, I'm going to just jump straight into the demo. So I don't have internet and I'm not going to try to get internet. So what we're going to do is... We are going to go to master, get status.  I'm really sorry I should have done this earlier. So I'm going to go back to my master file and essentially you don't have to know anything about what's going on. But what we're going to do is we are going to serve that file. So essentially what I'm trying to do now is I am creating open Visual Studio Code. So this is like a very, very example basic view application. If you do like view CLI or if you create a new view application, it just has like a source file which is where you'll be working off of mostly. It has a components which is where you put your single file components and then it has an app.view which is where you include your components and you tell your app what you want to include. Very, very high level. So I did an NPM run start. This should change, yes it does. So that's what you see when you start a new view application, like super, super basic. So what we're going to start with in our copy builder is we're going to start with like creating a form. Firstly I'm going to start with milk because I don't know just it's the first thing. And so that essentially consists of three radio buttons. So we're going to create some radio buttons very quickly. So I'm going to go into, I'm going to create a new component called like, I don't know, copyoptions.view. Also if I have a spelling mistake, mistake let me know because live demos tend to be like that. So I'm going to create a new view single file component. I'm going to call it copyoptions. Super basic, there's nothing more to it.  So there's like a label with an input, I can spell, we're going to make it radio. And then I'm going to put a span for like the actual name of the thing. So for now, I'm just going to say that there is no milk. It's of name, milk, because it's of type that. And of course, like if we go back to our app, nothing changes because I didn't include it in my app. So app doesn't know that it exists. So I'm going to go back to app. I'm going to get rid of this hello world nonsense because we don't need it. Well, okay. And of course, I'm going to create a new V import. So we call that copyoptions, right? So I create a new options. And then in components, I'm going to create that specific thing. So now it knows that it exists. So very similar to how React does things. Now you can use copyoptions as a tag because it works. And so if I go back, well, what? Okay. I knew this was going to happen. You import it and you save it. Wait, what is there? Can't resolve components in view. Let's see. Wait, which one? I don't think that is needed. Okay. Oh yes, yes, yes, yes. Wait, what was that? It is not in the components folder. That is correct. Thank you. Okay. So we have our thing.  Okay. So we have our thing and like this is perfect. So what we can do next is we can essentially, we want like three options, right?  We can change it. So like, I don't know, you can choose whether you want condensed milk in it or you can choose if you want. I think the other one is evaporated milk, right? So we have those options, which is great, but like it doesn't really do anything. There isn't a default, which is really dumb. And so what we're going to do is we're going to create, ah, yes, before I go to default and everything, this is kind of tedious and we want to create an iterator because that is the nice thing about programming. So we're going to create a like a data property called like milk options, let's say. And then within that we can put in like the various options that we have. So like there's no milk, there's evaporated milk. I'm really bad at typing. And then there is condensed milk like that. And so now that we have all of the data in an array essentially, what we can do is we can use in view, they call it a v4, which is an iterator. So you can use v4 and I'm just going to say milk in milk options. And so with that, I can now do string interpolation, which uses two curly brackets and then put in milk and like, oh, comma, there we go. So now we have our like iterated thing, which is really great and awesome. And so the other thing that we haven't done is that our input isn't doing anything. So the input just kind of lives by itself and like it doesn't have a concept of what is checked like a default because that's essentially what radio button should have. It always should have a default. And so what we're going to do is we're going to create, first of all, in addition to having a default, a radio button also has a value because the value is essentially what the radio button needs to know is its value. And so we're going to give it a value. The colon is just a way of telling it that it's not hard coded. So in this case, because we're using an iterator, it changes each time. So we're going to say milk is the value. And then so that's fine and well. And then the next thing we're going to do is that the checked element essentially. And checked needs to do an equality check, right? Because we need to tell the radio buttons like, hey, this is the default. Click this if no other options have been selected. And so essentially that's an equality. So there is no sense of what the default is. So I'm going to create a new property called milkiness, which like is condensed milk, right? That's the default. I'm going to say yes it is. And so now what I'm going to do is I'm going to in the checked essentially check that milk equals the milkiness. And so when you refresh, you get condensed milk as the default, which is really good. But the problem now is I'm going to pull up the view console so that you see what is happening. So this is the view console. If you've never seen it, it's really great. It's similar to the react console because it allows you to look at data and how data changes. And so you see that as we're clicking it, the milkiness doesn't change as we're clicking through, which is a problem because if you select something, you want the milkiness, the status quo to change. Yes. And so what we're trying to do is if you're familiar with input buttons, there's the on change event, right? So it's like on change do something. So in view, there's this v on, which is for handling all kinds of inputs. And so you do a v on. And in this case, it's called input because it's an input event. And so what we can do is we can grab that specific event and then we can pipe it to do something else, like whatever. And in this case, what we're trying to do is we're trying to change that milkiness. And because it's an event, you have to grab the target value. And so that changes that specific property, I hope. So if we go down here, it updates if you look at this specific thing down here. Can everybody see this? Is this okay? Yeah, so we get exactly what we need. And so the thing is this is useful and really cool, but we still don't know the name of the copy that we want, which is like the whole point of this app. So what we're going to do next is we're going to create a new file. It's in the right folder this time. We're gonna call it copy order. And all copy order does is tell you the name of that copy based on an option selected. So for now, it's gonna have an H1 and I'm just gonna call it copy. And then I'm going to name it copy order in this case. And then I will include it in my import statements, like so. So it knows that it exists. And then you always have to put it in your components, which is a very common mistake. And then I will put it as a sibling element because it's fine. It works that way. So now we have the input elements and then we have the thing selecting and then we have the copy at the bottom. But again, the siblings don't know about each other's data. So the radio buttons are being selected, but the sibling, which is copy order, doesn't know that they have been selected. And has anyone done React before? Yes. So it's similar because in React, you would do an emitter so you emit up to the parent because siblings can't talk directly to each other but they talk to each other indirectly through their parent. So one specific component tells the parent, hey, like my data has changed and then parent is like anyone else listening, this data has changed. So that's what we're gonna do now. We'll go back to copy options and we're going to change the VON input event because there's gonna be more things that, so we're gonna refactor it. We're gonna call it like, I don't know, set milkiness.  And then we're doing the same thing, which is setting target.value and then it grabs the event. So I'm gonna check that that worked because it could easily break. What? Oh, did I? Oh, yes, yes, yes, thank you. Yes, yes, yes, yes, thank you. Perfect, I like this, pair programming or many to one programming. And so I just wanna check that everything worked so milkiness is updating as appropriate so like our refactor didn't break anything except for my typo. And so now what we're gonna do is we create, we're going to create an emitter so that our options emits that change up to the sibling element. So I'm gonna do like this.dollar emit milk selected. And then I'll pass it a single property which is like the milkiness property, yes. And now in my app, essentially options can tell its parent that things have changed via von, right? I'm gonna cheat little, actually nevermind, I'll just do von. And then it'll be milk selected. So it's like on this specific event. And then it will do something else which I'm gonna call set milk. So set milk is a method that I need to create in my main app here. And so now the parent element is grabbing that child event and it's gonna do something with it. So I want it to set the base milk to whatever value that gets passed through. And so there needs to be a data property called milk. So I'm gonna create that. The default is empty. And so now let's go back to our app and we'll see the parent element has this data property called milk. And so when it gets updated, it gets updated appropriately, which is really nice. But again, the sibling element still doesn't know about that. So does anyone know how we can pass data to a specific component? That's like super, super, super, super simple. No, okay. Well, you pass it through a prop. It's fine. So I'm gonna pass it through as a prop like so. And so it's very simple. It's similar to React. You just pass it straight up as a prop. And then in my order, I'm gonna tell the components to expect that prop. So in React you also have to, you can tell your component that these are the props to be to expect. So I'm going to tell my component to expect like a milk prop. And then view has a ability for you to tell your component. You don't have to, but I think it's common practice where you would tell your component what the prop is and what that type is. So you would do a number of Boolean and so on. And so it allows you to do that type checking, which is pretty nice. So we have the milk that gets passed through hopefully, but we're gonna check just to see. So we have milk and then it gets updated. Perfect. And so now we can do some kind of like string interpolation magic like so. And so we have like Copino milk. But again, as I said, my Singlish cannot make it. And this is not how you open up. You don't go to the auntie and you're like, hey, copy evaporated milk, show me what you're talking about. So what we're gonna have to do is we're gonna have to refactor all of these properties so that the option will still say no milk. But when it converts, it will say like oh, see or whatever the abbreviation is. So what we'll do is we will grab all of, blah, we'll grab all of these. And I'm going to call it type. So it's like of type thing. I don't know, you can call it whatever you want. And then I'll say like name. So each of them will have like name associated with it. So, okay, this is the part where I might mess up. So I think no milk is O and then evaporated milk is C. Is that correct? That's correct? Okay, cool. Sweet. Oh, it's a big O. Oh, that's fine. That doesn't matter. I think I missed the comma. Yeah, okay, cool. So it kind of works, but now we have objects because we're dealing with objects and not strings. So we need to change that. So what I'm gonna do is I'm gonna firstly change the span element so that you get the actual type of the milk. So voila, okay, type. So we get no milk, whatever, but Copey still gets object objects. So obviously we need to refactor some more. So for value, I'm going to grab the name element. And for checked, I'm gonna check the name element again because now milkiness is, if you look at it, milkiness is condensed milk as, and it changes as needed. But if you realize the default of options is condensed milk, which is wrong, because now we're checking the suffix. So because condensed milk has no suffix, essentially, we're going to just do an empty string. And so that should work. Yes, yeah, it works. So now our default option is still condensed milk and so on. And then it changes too. So we didn't have to do anything because we just refactored it a little bit and then we get exactly what we want to see. So this is all fine and good and we can obviously copy this to do sugar and so on. And I'm not gonna do that because it's repetitive. But what we're going to do is I'm gonna introduce you to what is really cool in view, just two-way data binding. And all of this, which is the input event, the checked and the value, is a lot of hard coding, which is fine, but the magic of view is in the two-way data binding. So there's this thing called the model. If you've done any view, you would know what that is. But essentially what V-Model does is you're tying a specific element to a data property. And anytime that data property changes, the element knows to change itself or change the data associated. So what I'm gonna do is I'm going to, because essentially what is changing is milkiness, I'm gonna get rid of the checked and that. And that should work. Oh, darn. Oh, I know why. Okay, so, okay, I'm gonna, okay. So milkiness, as you see, is updating, right? So what's not happening is that the sibling element doesn't know that that is changing anymore because previously if you realized we were leaning on this method called set milkiness, we're not using that anymore. And so the emitter is not being called. So the sibling has no idea that things are changed. That single element does. And so what is super nice about view is that there's this concept of watchers. It's similar to, it's just a life cycle hook, essentially. And so you can hook into a specific change in data. In this case, milkiness is changing. And so I'm gonna grab that. I'm going to copy this. Whop. And then that should work. Ta-da. And that's pretty much like two-way data binding, which is really cool. And then watchers, which is also really cool. And then I'm gonna show you one last thing because I think I'm actually out of time. But this is kind of ugly, especially if you have to do it for multiple different things. So what I'm gonna do is I'm gonna create a computer. And a computer allows me to do string interpolation without having to do it in my template itself. So I'll call it, I don't know, order name. And then here I can create a, essentially the same thing that I did earlier, which is this. And so I can get rid of all of this. And then I can just call it order name. And then that gives me, voila. Oh man. Oh, I know why, because it's not milkiness. It is order. There you go. So, and that's pretty much like a high-level idea of how ViewWorks, and hopefully this encourages you to use it, and I'm happy to take questions. Any questions on View? Nah, I'm kidding. Oh, thanks for the live demo. Cool. It's really cool. Yeah. What's your view of the best advantage of View over other frameworks I react? That's a really good question. I will not start a flame war, but I actually, I've used both, and I think the learning curve of View is much smoother because it appeals to a lot of people who don't, so React is very, very, very JavaScript heavy, and most web developers come in with like, you would learn HTML, CSS, and JavaScript, and React kind of forces you to use JSX. Not necessarily, you don't have to, but a lot of applications use JSX. And so that is a really steep learning curve, and I think if you reach an advanced level and React is, it's a wonderful framework. But I think View is very catered towards like onboarding people very quickly because it's essentially just HTML, CSS, and JavaScript. And there's like some sugar syntax and extra stuff to it, but I think that's like the biggest sell. And then the other thing, which is like my personal opinion is, I think the community is very strong and vibrant, and that's a result of it being very new. Because View has only been around since 2015, I think. Yeah, and so the community is very small and super open source and very scrappy, and people are very willing to help others. And so I think that's only gonna get better. Who knows, like at a high scale that might change, but for now I think it's a really good time to learn it. Yeah. Is there a name for whatever you're writing, like React, you're writing GSX, and you're doing the right type of business? Is there a name for this as well? So there isn't, we call it single file components, but that's not a View specific thing. Yeah, there really isn't, because like this is just like View syntax essentially. So we don't have what they, we have what we call like View bindings, which is very similar to Angular bindings, where you're writing templates, but you can bind it using Von or like Vmodel, which is what I did earlier. So that's the only difference, but essentially it's straight up HTML and CSS and JavaScript, yeah. And is more stars than React? Currently yes, it does. But I think stars aren't a good indication of anything really, because I think the contributor's list of View is still much smaller than React's. Hopefully that will change, I think it will. I'll give you the first result, and she's on Twitter, but the handle there is shot dead.


Can you hear my voice at the back? No. Hello? Okay. Good evening, guys and gals. So my talk is regarding web components that works everywhere. So I assume most or majority of here are front-end developers. And these front-end developers are working for several tools and JavaScripts like React, Angular or Vue. And then some of us is working on calendar, like to example calendar. So we can create calendar for React and then we can create a calendar for Angular and Vue.js. And then when I try to search date picker in NBM, I found 1,532 packages. So there are packages for React, there are packages for Vue.js and packages for anything. So what if our date picker is the same functionality with the input and button. So we can place this in our React, we can place this or we use it into Vue.js and then everyone is happy, right? So by the way, I'm RJ. My name is RJ. You can call me RJ. And then I'm front-end developer working in a bank and then I have an open source project also, a lead custom element. I'm currently starting it. And then I have create custom elements. So most of our open source are working on web components. So what is web components? I highlight is it can be used with any Java save library or framework that works with HTML. So if you're working with CSS, HTML and JavaScript, web components is there. So basically it's standard for our browser. So there are four specifications for web components. So this is founded by W3C or the web components org. So these icons or images, first is custom elements. And then the second one is shadow DOM. The third one is HTML templates. And the last one is the new one is ES modules. So since I have 30 minutes, I can tackle or discuss two, which is the most important, which is custom elements in shadow DOM. So I will talk first the custom elements. What is custom elements? Custom elements is provides a way to the authors to build their own custom elements or DOM elements. So it's just like input or button you can create on your own elements like RJ dash element, something like that. And then it can render a button with the color of blue, something like that. So on how you create your custom elements, this is the way how you create. So HTML elements is just the base class, HTML element is just native to the browser. So you can found it in Firefox, Chrome, Safari, or even though the opera. So just create a class and then extends the HTML element and then you can create a constructor and then have a property. The next one is we can create our own render. So we can do this, this that in our HTML and then we can do hello this name. And then next one is we can custom elements or native custom elements has their own lifecycle also. So when the DOM or element is append to the DOM the connected callback will be the one to execute. So that's the time it will execute this render method. So for example, I will create my custom element as hello name and then it will append to the body. It will call or also it will call the connected callback. We can also have since custom elements has features also that you can create your own properties. So you know this value, name, you can create this. So by doing this, you can static get observe attributes. So by the way, this is a standard you can found it in web components org. And then every time the property will change it will have attribute callback change. So it will execute this. So the same thing with the reactor it's a lifecycle also in the view also there's a lifecycle. So getter and setter. So since we are doing ES6 class base custom elements has features of getter setter. So you can do this like for example, you can query by selector and then set the property we can do that. So this is the way how you can declare it. And after that I just slightly modify our code something like in connected callback. So I just find all the properties or yeah, the property attributes and then set if we have this initial value. So for example, hello name and then I have name hello Jane something like that. So I will set that. And then this is how you declare your custom elements. So custom elements that you find and then hello name and you can pass the function or the class. And then this is how you put in your HTML. So there's hello name. This is the property or attributes that we have and then it goes to Jane. And then this is the one additional markup. And then this is how your custom elements render. So it says that hello and then the name Jane. Five components everywhere. So as I see there's a property also right. So you can do this also document query selector hello name. You can set also something like that. So it will change it will trigger that attribute change callback and then it will render. That's a pretty short definition on how to create a custom elements. Next one is a ShadowDom. So this is another important or the most important specification of the web components. So what is ShadowDom? So ShadowDom is defines how to use encapsulate style and markup in your web components. Have you tried notice that if you create your own component and then you have a bootstrap CSS right and then that bootstrap CSS can override your styles. So you have noticed that it will change the color or it will change the spacing in padding. So the ShadowDom will trap or will prevent this doing the changing of your styles and elements. So how you do that? So custom elements you can do in the constructor these that attach shadow and then you can do open. And then we can change slightly on our code that since there's a shadow we can do this that shadow root and then have this element in tags. So this is how this our custom elements render. So you notice that there's a shadow root. So it will prevent or guard of your element inside the shadow root. So we can change slightly our code. So in the head I will have find all the p or paragraph and change the color of thread. So you notice that only the this web components works everywhere is the change the color. So it doesn't affect inside the shadow root. So it says that no, I will not allow to change any of my elements inside the shadow root. So this is also one of the good features of the custom elements or the web components. So we can do also add styles to our custom elements. So I put style and then I will color all the paragraphs inside my shadow root and then make it a blue. So you notice that only my custom element change the color. So it doesn't change outside my custom elements. It doesn't change the color outside my custom elements. So as I said that custom element guard you of modifying any styles and DOM manipulation inside your shadow root. So I see that document the query selector I will query all the p or paragraph it returns only one. So meaning that it cannot find any paragraph or any other paragraph inside my shadow root. So to summarize this is our source code to have a shadow root. So first constructor render and then I have a connected call map and I gather. So this is a native to the browser. So you don't need to use any other frameworks for this to create your own custom elements. By doing that why should I care? So why should I use this? Because I use React, I use Vue.js, I use Angular. It's really cool. So in some other enterprise company like I work in a bank so we have a lot of teams and a lot of projects. So some team A using React, team B is using Angular. Because team A and team B are productive to this framework. So one of the advantage of this is brand consistency. So consistency of your branding because in our enterprise company they have their branding colors fonts. You need to follow all of these things. So with this web components you can create your one web components, custom elements and reuse to other frameworks. And then business perspective. It can save money, right? So you don't need to repeat or create like for example what I said is calendar. You need to repeat it. In Angular you need to create in React, you need to create in view. So why not create one calendar or one date beaker and reuse it. And then developer experience. The code will be more consumable. Code can be shared between teams more easily. So if one team is using date beaker they can reuse this also in their project also. So they don't need to rewrite it. So the next one is even use these things. The answer is yes. Because most of our modern browser are supported custom elements. So rather than the edge. So IE it's dead now. So don't do that. Anyway HTML elements, Shadow DOM and ES modules all are supported in Safari in Firefox, recently in Firefox supported. In Edge they use polyfill to run your custom elements. But I think recently they announced that they're using Chromium. So Chromium is based on Chrome. So since Chrome is supported custom elements so usable. So my last part is demo. So I have created for demos using Angular, React ViewJS and then native VanillaJS. So I create input element and reuse this to various framework. Red is Angular. So blue is React. And then I have green. Green is ViewJS and the black one is native one. So for this I have the input element is a custom element. And then the card itself is they build on their own library or framework. So you can see that it's almost the same right? So you can reuse this. I just create a script tag and then put a source of my custom elements and then I can reuse it. So it's the same thing. I can search and then also in ViewJS I can search also. So this is created in the... I already placed the URL so that you can take a look if you want. I use code signbacks to do the coding and then stack leads of the coding for the custom elements. So I think that's all. Sorry. You showed us the list of all the desktop browsers. How is that where the mobile browsers to the custom element work there already? In my experience it's Chrome. I tried. So I'm not sure of other. So maybe I can test when I get them. So you demo different framework. Yup. Which I think is... And you also mentioned that different teams use different framework already. Yup. So like which parts you see going down? You see frameworks providing the capability to compile or transpile their component things into web components. Or do you see going the other way around where people will write web components and then they'll have a react wrap up for it or an angular wrap up for it? For me, you can do vote because if you are productive with, for example, there's angular elements so you can create your web components into angular and then convert it. And then you can do that in Vue.js also. You can create what you call that web components in Vue.js. The only thing is there's an additional bundle that you can integrate it. So while the native one is just or the browser already provided it to you. So why not use the browser provide a browser API that you or they provided it to you. So for me, because in our previous my previous employer, we use angular elements also and then later on we decided that what if we can convert these angular elements to the web components. So we converted half of our angular elements to native one and then the bundle is almost half. The bundle is almost half the size. So since we're doing I don't know because the bundle size matters to us because we're using some other places are like 2G or something like that. They're using 3G only a network. So bundle size matters. So back to your question some other teams or some other company preferred using Vue.js to for example convert to share their components to other teams. So if you're not planning to share it it will just in your team why you convert to web components, right? At least web component used in Vue.js So the last I know is Stencil.js I haven't it's just for the hybrid only. So I'm not sure for the react native. So because react native is just another layer for the hybrid. So I'm not sure for that. I haven't tried. Do you have any any example for event handling? Yeah I love that. I still love that. For the for the web components, right? Your question? So this is me and my colleague create some like custom element TS so we just have something like sort behind the scenes we create a decorator to make the developer easy to to use. So we have this what do you call that? I have input, right? So input so I have this dispatch and then dispatch mean in web components is just exposing exposing events to to the developers. So for example like for example this is ar.change I will expose this event to the developers. So when they listen to this event it will trigger. So I have created also we will created a listen so meaning it will listen to any event. So you can see that we listen to the key up and then the other parameter is just like the input or the input field that you want. So what in native is just a simple this that add event listener and then for the native for dispatching it to create an event is this that dispatch. So we just we just convert this to to more presentable and then easy to use. So we have this dispatch decorator and then we have a prop. So meaning it's a prop is just like a toy binding when you change when you change this property it will watch watch and prop will be combination. So prop is just like when you change this the property that you need to expose property and attribute you need to expose to the developer when you change this you need to implement a watch. Sorry. Sorry for that. I can see right. Okay. So I have a prop right. Prop is just the one you need to expose to the developer. So if this will change you need to trigger a watch. Watch is just watching your attribute and property. So as you can see that when the value change I will execute this. One last question. If you have company how can we pass data from company you can use dispatch or you can use an event. So in a native event there is a bubble you can sit to bubble to true and then there's a compose to set to true to make it up. So it's just like rxjs that you need to to bubble up. So you can need to dispatch it. You can pass all through attribute also. So you can pass it through attribute or you can pass by event. Event is a global so you can dispatch it and then listen so if your child is listening it will it will receive your data. Yup.